summaryrefslogtreecommitdiff
path: root/firmware/target/mips
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/mips')
-rw-r--r--firmware/target/mips/ingenic_jz47xx/onda_vx747/backlight-onda_vx7X7.c93
1 files changed, 29 insertions, 64 deletions
diff --git a/firmware/target/mips/ingenic_jz47xx/onda_vx747/backlight-onda_vx7X7.c b/firmware/target/mips/ingenic_jz47xx/onda_vx747/backlight-onda_vx7X7.c
index 72e469977b..391af0acb7 100644
--- a/firmware/target/mips/ingenic_jz47xx/onda_vx747/backlight-onda_vx7X7.c
+++ b/firmware/target/mips/ingenic_jz47xx/onda_vx747/backlight-onda_vx7X7.c
@@ -27,84 +27,50 @@
27#define BACKLIGHT_GPIO (32*3+31) 27#define BACKLIGHT_GPIO (32*3+31)
28#define BACKLIGHT_PWM 7 28#define BACKLIGHT_PWM 7
29 29
30/* TODO: use HW PWM */ 30/* PWM counter (PWM INITL = 0):
31#define SW_PWM 1 31 * [0, PWM half rate[ -> backlight off
32#if SW_PWM 32 * [PWM half rate, PWM full rate[ -> backlight on
33 33 * [PWM full rate, PWM full rate] -> counter reset to 0
34static bool backlight_on; 34 */
35static int old_val;
35static void set_backlight(int val) 36static void set_backlight(int val)
36{ 37{
37 (void)val; 38 if(val == old_val)
38} 39 return;
39 40
40bool _backlight_init(void) 41 /* The pulse repetition frequency should be greater than 100Hz so
41{ 42 the flickering is not perceptible to the human eye but
42 __gpio_as_output(BACKLIGHT_GPIO); 43 not greater than about 1kHz. */
43 __gpio_set_pin(BACKLIGHT_GPIO);
44
45 backlight_on = true;
46 44
47 return true; 45 /* Clock = 8192 Hz */
48} 46 /* 1 <= val <= 30 */
47 int cycle = (MAX_BRIGHTNESS_SETTING - val + 1);
49 48
50void _backlight_on(void) 49 __tcu_disable_pwm_output(BACKLIGHT_PWM);
51{ 50 __tcu_stop_counter(BACKLIGHT_PWM);
52 if(!backlight_on)
53 __gpio_set_pin(BACKLIGHT_GPIO);
54
55 backlight_on = true;
56}
57 51
58void _backlight_off(void) 52 __tcu_set_count(BACKLIGHT_PWM, 0);
59{ 53 __tcu_set_half_data(BACKLIGHT_PWM, cycle-1);
60 if(backlight_on) 54 __tcu_set_full_data(BACKLIGHT_PWM, cycle);
61 __gpio_clear_pin(BACKLIGHT_GPIO);
62
63 backlight_on = false;
64}
65 55
66#else 56 __tcu_start_counter(BACKLIGHT_PWM);
57 __tcu_enable_pwm_output(BACKLIGHT_PWM);
67 58
68static int old_val;
69static void set_backlight(int val)
70{
71 if(val == old_val)
72 return;
73
74 /* Taken from the OF */
75 int tmp;
76 tmp = (val/2 + __cpm_get_rtcclk()) / val;
77 if(tmp > 0xFFFF)
78 tmp = 0xFFFF;
79
80 __tcu_set_half_data(BACKLIGHT_PWM, (tmp * val * 1374389535) >> 5);
81 __tcu_set_full_data(BACKLIGHT_PWM, tmp);
82
83 old_val = val; 59 old_val = val;
84} 60}
85 61
86static void set_backlight_on(void) 62static void set_backlight_on(void)
87{ 63{
88 if(old_val == MAX_BRIGHTNESS_SETTING) 64 set_backlight(old_val);
89 return;
90
91 __tcu_start_timer_clock(BACKLIGHT_PWM);
92
93 set_backlight(MAX_BRIGHTNESS_SETTING);
94
95 __tcu_set_count(BACKLIGHT_PWM, 0);
96 __tcu_start_counter(BACKLIGHT_PWM);
97 65
98 __tcu_enable_pwm_output(BACKLIGHT_PWM); 66 __tcu_enable_pwm_output(BACKLIGHT_PWM);
67 __tcu_start_counter(BACKLIGHT_PWM);
99} 68}
100 69
101static void set_backlight_off(void) 70static void set_backlight_off(void)
102{ 71{
103 __tcu_stop_counter(BACKLIGHT_PWM); 72 __tcu_stop_counter(BACKLIGHT_PWM);
104 __tcu_disable_pwm_output(BACKLIGHT_PWM); 73 __tcu_disable_pwm_output(BACKLIGHT_PWM);
105 __tcu_stop_timer_clock(BACKLIGHT_PWM);
106
107 old_val = -1;
108} 74}
109 75
110bool _backlight_init(void) 76bool _backlight_init(void)
@@ -113,17 +79,17 @@ bool _backlight_init(void)
113 __tcu_start_timer_clock(BACKLIGHT_PWM); 79 __tcu_start_timer_clock(BACKLIGHT_PWM);
114 80
115 __tcu_stop_counter(BACKLIGHT_PWM); 81 __tcu_stop_counter(BACKLIGHT_PWM);
116 __tcu_disable_pwm_output(BACKLIGHT_PWM);
117
118 __tcu_init_pwm_output_low(BACKLIGHT_PWM); 82 __tcu_init_pwm_output_low(BACKLIGHT_PWM);
119 __tcu_select_rtcclk(BACKLIGHT_PWM); 83 __tcu_set_pwm_output_shutdown_graceful(BACKLIGHT_PWM);
120 __tcu_select_clk_div1(BACKLIGHT_PWM); 84 __tcu_enable_pwm_output(BACKLIGHT_PWM);
85
86 __tcu_select_rtcclk(BACKLIGHT_PWM); /* 32.768 kHz */
87 __tcu_select_clk_div1(BACKLIGHT_PWM); /* 8.192 kHz */
121 88
122 __tcu_mask_half_match_irq(BACKLIGHT_PWM); 89 __tcu_mask_half_match_irq(BACKLIGHT_PWM);
123 __tcu_mask_full_match_irq(BACKLIGHT_PWM); 90 __tcu_mask_full_match_irq(BACKLIGHT_PWM);
124
125 old_val = -1;
126 91
92 old_val = MAX_BRIGHTNESS_SETTING;
127 set_backlight_on(); 93 set_backlight_on();
128 94
129 return true; 95 return true;
@@ -138,7 +104,6 @@ void _backlight_off(void)
138{ 104{
139 set_backlight_off(); 105 set_backlight_off();
140} 106}
141#endif /* !SW_PWM */
142 107
143#ifdef HAVE_BACKLIGHT_BRIGHTNESS 108#ifdef HAVE_BACKLIGHT_BRIGHTNESS
144void _backlight_set_brightness(int brightness) 109void _backlight_set_brightness(int brightness)