diff options
Diffstat (limited to 'firmware/target/mips/ingenic_jz47xx/onda_vx747/sadc-onda_vx747.c')
-rw-r--r-- | firmware/target/mips/ingenic_jz47xx/onda_vx747/sadc-onda_vx747.c | 93 |
1 files changed, 59 insertions, 34 deletions
diff --git a/firmware/target/mips/ingenic_jz47xx/onda_vx747/sadc-onda_vx747.c b/firmware/target/mips/ingenic_jz47xx/onda_vx747/sadc-onda_vx747.c index cd1da694b0..f750efdf57 100644 --- a/firmware/target/mips/ingenic_jz47xx/onda_vx747/sadc-onda_vx747.c +++ b/firmware/target/mips/ingenic_jz47xx/onda_vx747/sadc-onda_vx747.c | |||
@@ -26,6 +26,8 @@ | |||
26 | #include "button-target.h" | 26 | #include "button-target.h" |
27 | #include "powermgmt.h" | 27 | #include "powermgmt.h" |
28 | #include "kernel.h" | 28 | #include "kernel.h" |
29 | #include "backlight.h" | ||
30 | #include "logf.h" | ||
29 | 31 | ||
30 | #ifdef ONDA_VX747 | 32 | #ifdef ONDA_VX747 |
31 | #define BTN_OFF (1 << 29) | 33 | #define BTN_OFF (1 << 29) |
@@ -54,15 +56,16 @@ | |||
54 | (2 << SADC_CFG_CLKOUT_NUM_BIT) | \ | 56 | (2 << SADC_CFG_CLKOUT_NUM_BIT) | \ |
55 | SADC_CFG_XYZ1Z2 | \ | 57 | SADC_CFG_XYZ1Z2 | \ |
56 | SADC_CFG_SNUM | \ | 58 | SADC_CFG_SNUM | \ |
57 | (2 << SADC_CFG_CLKDIV_BIT) | \ | 59 | (1 << SADC_CFG_CLKDIV_BIT) | \ |
58 | SADC_CFG_PBAT_HIGH | \ | 60 | SADC_CFG_PBAT_HIGH | \ |
59 | SADC_CFG_CMD_INT_PEN \ | 61 | SADC_CFG_CMD_INT_PEN \ |
60 | ) | 62 | ) |
61 | 63 | ||
62 | static signed int x_pos, y_pos; | 64 | static signed int x_pos, y_pos; |
63 | static int datacount = 0, cur_touch = 0; | 65 | static int datacount = 0; |
64 | static bool pen_down = false; | 66 | static volatile int cur_touch = 0; |
65 | static volatile unsigned short bat_val = 0; | 67 | static volatile bool pen_down = false; |
68 | static volatile unsigned short bat_val; | ||
66 | static struct mutex battery_mtx; | 69 | static struct mutex battery_mtx; |
67 | 70 | ||
68 | static enum touchscreen_mode current_mode = TOUCHSCREEN_POINT; | 71 | static enum touchscreen_mode current_mode = TOUCHSCREEN_POINT; |
@@ -76,20 +79,20 @@ static const int touchscreen_buttons[3][3] = | |||
76 | const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] = | 79 | const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] = |
77 | { | 80 | { |
78 | /* TODO */ | 81 | /* TODO */ |
79 | 3400 | 82 | 1400 |
80 | }; | 83 | }; |
81 | 84 | ||
82 | const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] = | 85 | const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] = |
83 | { | 86 | { |
84 | /* TODO */ | 87 | /* TODO */ |
85 | 3300 | 88 | 1300 |
86 | }; | 89 | }; |
87 | 90 | ||
88 | /* voltages (millivolt) of 0%, 10%, ... 100% when charging disabled */ | 91 | /* voltages (millivolt) of 0%, 10%, ... 100% when charging disabled */ |
89 | const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] = | 92 | const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] = |
90 | { | 93 | { |
91 | /* TODO */ | 94 | /* TODO */ |
92 | { 3300, 3680, 3740, 3760, 3780, 3810, 3870, 3930, 3970, 4070, 4160 }, | 95 | { 1300, 3680, 3740, 3760, 3780, 3810, 3870, 3930, 3970, 4070, 4160 }, |
93 | }; | 96 | }; |
94 | 97 | ||
95 | /* voltages (millivolt) of 0%, 10%, ... 100% when charging enabled */ | 98 | /* voltages (millivolt) of 0%, 10%, ... 100% when charging enabled */ |
@@ -105,23 +108,34 @@ const unsigned short percent_to_volt_charge[11] = | |||
105 | /* Returns battery voltage from ADC [millivolts] */ | 108 | /* Returns battery voltage from ADC [millivolts] */ |
106 | unsigned int battery_adc_voltage(void) | 109 | unsigned int battery_adc_voltage(void) |
107 | { | 110 | { |
108 | register unsigned short dummy; | 111 | unsigned int val, i; |
109 | 112 | ||
110 | mutex_lock(&battery_mtx); | 113 | mutex_lock(&battery_mtx); |
111 | 114 | ||
112 | dummy = REG_SADC_BATDAT; | 115 | val = REG_SADC_BATDAT; |
113 | dummy = REG_SADC_BATDAT; | 116 | val = REG_SADC_BATDAT; |
114 | 117 | ||
115 | bat_val = 0; | ||
116 | REG_SADC_ENA |= SADC_ENA_PBATEN; | 118 | REG_SADC_ENA |= SADC_ENA_PBATEN; |
119 | for(i=0; i<4; i++) | ||
120 | { | ||
121 | bat_val = 0; | ||
122 | |||
123 | /* primitive wakeup event */ | ||
124 | while(bat_val == 0) | ||
125 | sleep(0); | ||
126 | |||
127 | val += bat_val; | ||
128 | } | ||
129 | REG_SADC_ENA &= ~SADC_ENA_PBATEN; | ||
130 | |||
131 | val /= 4; | ||
117 | 132 | ||
118 | /* primitive wakeup event */ | 133 | logf("%d %d %d", val, (val*BATTERY_SCALE_FACTOR)>>12, |
119 | while(bat_val == 0) | 134 | (val*0xAAAAAAAB >> 32) >> 1); |
120 | yield(); | ||
121 | 135 | ||
122 | mutex_unlock(&battery_mtx); | 136 | mutex_unlock(&battery_mtx); |
123 | 137 | ||
124 | return (bat_val*BATTERY_SCALE_FACTOR)>>12; | 138 | return (val*BATTERY_SCALE_FACTOR)>>12; |
125 | } | 139 | } |
126 | 140 | ||
127 | void button_init_device(void) | 141 | void button_init_device(void) |
@@ -135,11 +149,11 @@ void button_init_device(void) | |||
135 | 149 | ||
136 | system_enable_irq(IRQ_SADC); | 150 | system_enable_irq(IRQ_SADC); |
137 | 151 | ||
138 | REG_SADC_SAMETIME = 350; | 152 | REG_SADC_SAMETIME = 10; |
139 | REG_SADC_WAITTIME = 100; | 153 | REG_SADC_WAITTIME = 100; |
140 | REG_SADC_STATE &= (~REG_SADC_STATE); | 154 | REG_SADC_STATE &= (~REG_SADC_STATE); |
141 | REG_SADC_CTRL = (~(SADC_CTRL_PENDM | SADC_CTRL_PENUM | SADC_CTRL_TSRDYM | SADC_CTRL_PBATRDYM)); | 155 | REG_SADC_CTRL = (~(SADC_CTRL_PENDM | SADC_CTRL_PENUM | SADC_CTRL_TSRDYM | SADC_CTRL_PBATRDYM)); |
142 | REG_SADC_ENA = (SADC_ENA_TSEN | SADC_ENA_PBATEN); | 156 | REG_SADC_ENA = SADC_ENA_TSEN; |
143 | 157 | ||
144 | #ifdef ONDA_VX747 | 158 | #ifdef ONDA_VX747 |
145 | __gpio_as_input(32*3 + 29); | 159 | __gpio_as_input(32*3 + 29); |
@@ -213,19 +227,24 @@ int button_read_device(int *data) | |||
213 | if(tmp & BTN_OFF) | 227 | if(tmp & BTN_OFF) |
214 | ret |= BUTTON_POWER; | 228 | ret |= BUTTON_POWER; |
215 | 229 | ||
216 | if(current_mode == TOUCHSCREEN_BUTTON && cur_touch != 0) | 230 | if(cur_touch != 0) |
217 | { | ||
218 | int px_x = cur_touch >> 16; | ||
219 | int px_y = cur_touch & 0xFFFF; | ||
220 | ret |= touchscreen_buttons[px_y/(LCD_HEIGHT/3)] | ||
221 | [px_x/(LCD_WIDTH/3)]; | ||
222 | } | ||
223 | else if(pen_down) | ||
224 | { | 231 | { |
225 | ret |= BUTTON_TOUCH; | 232 | if(current_mode == TOUCHSCREEN_BUTTON) |
226 | if(data != NULL && cur_touch != 0) | 233 | { |
234 | int px_x = cur_touch >> 16; | ||
235 | int px_y = cur_touch & 0xFFFF; | ||
236 | ret |= touchscreen_buttons[px_y/(LCD_HEIGHT/3)] | ||
237 | [px_x/(LCD_WIDTH/3)]; | ||
238 | } | ||
239 | else if(pen_down) | ||
240 | { | ||
241 | ret |= BUTTON_TOUCHSCREEN; | ||
227 | *data = cur_touch; | 242 | *data = cur_touch; |
243 | } | ||
228 | } | 244 | } |
245 | |||
246 | if(ret & BUTTON_TOUCHSCREEN && !is_backlight_on(true)) | ||
247 | *data = 0; | ||
229 | 248 | ||
230 | return ret; | 249 | return ret; |
231 | } | 250 | } |
@@ -299,15 +318,17 @@ void SADC(void) | |||
299 | x_pos += xData; | 318 | x_pos += xData; |
300 | y_pos += yData; | 319 | y_pos += yData; |
301 | } | 320 | } |
321 | |||
322 | datacount++; | ||
323 | |||
324 | if(datacount >= TS_AD_COUNT) | ||
325 | { | ||
326 | cur_touch = touch_to_pixels(x_pos/datacount, y_pos/datacount); | ||
327 | datacount = 0; | ||
328 | } | ||
302 | } | 329 | } |
303 | 330 | else | |
304 | datacount++; | ||
305 | |||
306 | if(datacount >= TS_AD_COUNT) | ||
307 | { | ||
308 | cur_touch = touch_to_pixels(x_pos/datacount, y_pos/datacount); | ||
309 | datacount = 0; | 331 | datacount = 0; |
310 | } | ||
311 | } | 332 | } |
312 | 333 | ||
313 | if(state & SADC_CTRL_PBATRDYM) | 334 | if(state & SADC_CTRL_PBATRDYM) |
@@ -316,3 +337,7 @@ void SADC(void) | |||
316 | /* Battery AD IRQ */ | 337 | /* Battery AD IRQ */ |
317 | } | 338 | } |
318 | } | 339 | } |
340 | |||
341 | void adc_init(void) | ||
342 | { | ||
343 | } | ||