diff options
author | Maurus Cuelenaere <mcuelenaere@gmail.com> | 2009-08-21 21:35:12 +0000 |
---|---|---|
committer | Maurus Cuelenaere <mcuelenaere@gmail.com> | 2009-08-21 21:35:12 +0000 |
commit | 9f6d3a758f1536dee408b41211804312e6fabcd7 (patch) | |
tree | 6326650b8a8aa0bd909bd6010f00aca119bf7abe | |
parent | 8bff564a7cdcb6ced582720ddf16626910ee9697 (diff) | |
download | rockbox-9f6d3a758f1536dee408b41211804312e6fabcd7.tar.gz rockbox-9f6d3a758f1536dee408b41211804312e6fabcd7.zip |
* Onda VX777: add support for its single physical button
* Use real wakeup events in the battery ADC driver
* Adjust battery charge information a bit
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22458 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | firmware/target/mips/ingenic_jz47xx/onda_vx747/button-target.h | 9 | ||||
-rw-r--r-- | firmware/target/mips/ingenic_jz47xx/onda_vx747/sadc-onda_vx747.c | 95 |
2 files changed, 55 insertions, 49 deletions
diff --git a/firmware/target/mips/ingenic_jz47xx/onda_vx747/button-target.h b/firmware/target/mips/ingenic_jz47xx/onda_vx747/button-target.h index 4eb3af5e14..cadf4cc032 100644 --- a/firmware/target/mips/ingenic_jz47xx/onda_vx747/button-target.h +++ b/firmware/target/mips/ingenic_jz47xx/onda_vx747/button-target.h | |||
@@ -23,7 +23,9 @@ | |||
23 | 23 | ||
24 | #include "config.h" | 24 | #include "config.h" |
25 | 25 | ||
26 | #ifndef VX777 | ||
26 | #define HAS_BUTTON_HOLD | 27 | #define HAS_BUTTON_HOLD |
28 | #endif | ||
27 | 29 | ||
28 | bool button_hold(void); | 30 | bool button_hold(void); |
29 | void button_init_device(void); | 31 | void button_init_device(void); |
@@ -57,11 +59,18 @@ void button_set_touch_available(void); | |||
57 | .C=0xA22AA2C, .D=0x23DC, .E=0x8E3E6, \ | 59 | .C=0xA22AA2C, .D=0x23DC, .E=0x8E3E6, \ |
58 | .F=0x76CF88AA, .divider=0xFFAD4013} | 60 | .F=0x76CF88AA, .divider=0xFFAD4013} |
59 | 61 | ||
62 | #ifdef ONDA_VX777 | ||
63 | #define BUTTON_MAIN (BUTTON_POWER | BUTTON_TOPLEFT | BUTTON_TOPMIDDLE | \ | ||
64 | BUTTON_TOPRIGHT | BUTTON_MIDLEFT | BUTTON_CENTER | \ | ||
65 | BUTTON_MIDRIGHT | BUTTON_BOTTOMLEFT | BUTTON_BOTTOMMIDDLE | \ | ||
66 | BUTTON_BOTTOMRIGHT) | ||
67 | #else | ||
60 | #define BUTTON_MAIN (BUTTON_POWER | BUTTON_VOL_UP | BUTTON_VOL_DOWN | \ | 68 | #define BUTTON_MAIN (BUTTON_POWER | BUTTON_VOL_UP | BUTTON_VOL_DOWN | \ |
61 | BUTTON_MENU | BUTTON_TOPLEFT | BUTTON_TOPMIDDLE | \ | 69 | BUTTON_MENU | BUTTON_TOPLEFT | BUTTON_TOPMIDDLE | \ |
62 | BUTTON_TOPRIGHT | BUTTON_MIDLEFT | BUTTON_CENTER | \ | 70 | BUTTON_TOPRIGHT | BUTTON_MIDLEFT | BUTTON_CENTER | \ |
63 | BUTTON_MIDRIGHT | BUTTON_BOTTOMLEFT | BUTTON_BOTTOMMIDDLE | \ | 71 | BUTTON_MIDRIGHT | BUTTON_BOTTOMLEFT | BUTTON_BOTTOMMIDDLE | \ |
64 | BUTTON_BOTTOMRIGHT) | 72 | BUTTON_BOTTOMRIGHT) |
73 | #endif | ||
65 | 74 | ||
66 | /* No remote */ | 75 | /* No remote */ |
67 | #define BUTTON_REMOTE 0 | 76 | #define BUTTON_REMOTE 0 |
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 3218e9b5f7..124e81f689 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 | |||
@@ -43,7 +43,7 @@ | |||
43 | #define BTN_MENU (1 << 20) | 43 | #define BTN_MENU (1 << 20) |
44 | #define BTN_VOL_UP (1 << 19) | 44 | #define BTN_VOL_UP (1 << 19) |
45 | #elif defined(ONDA_VX777) | 45 | #elif defined(ONDA_VX777) |
46 | /* TODO */ | 46 | #define BTN_OFF (1 << 29) |
47 | #else | 47 | #else |
48 | #error No buttons defined! | 48 | #error No buttons defined! |
49 | #endif | 49 | #endif |
@@ -68,72 +68,70 @@ static signed int x_pos, y_pos; | |||
68 | static int datacount = 0; | 68 | static int datacount = 0; |
69 | static volatile int cur_touch = 0; | 69 | static volatile int cur_touch = 0; |
70 | static volatile bool pen_down = false; | 70 | static volatile bool pen_down = false; |
71 | static volatile unsigned short bat_val; | ||
72 | static struct mutex battery_mtx; | 71 | static struct mutex battery_mtx; |
72 | static struct wakeup battery_wkup; | ||
73 | 73 | ||
74 | const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] = | 74 | const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] = |
75 | { | 75 | { |
76 | /* TODO */ | 76 | /* TODO */ |
77 | 1000 | 77 | 1600 |
78 | }; | 78 | }; |
79 | 79 | ||
80 | const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] = | 80 | const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] = |
81 | { | 81 | { |
82 | /* TODO */ | 82 | /* TODO */ |
83 | 900 | 83 | 1500 |
84 | }; | 84 | }; |
85 | 85 | ||
86 | /* voltages (millivolt) of 0%, 10%, ... 100% when charging disabled */ | 86 | /* voltages (millivolt) of 0%, 10%, ... 100% when charging disabled */ |
87 | const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] = | 87 | const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] = |
88 | { | 88 | { |
89 | /* TODO */ | 89 | /* TODO */ |
90 | { 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000 }, | 90 | { 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100, 2200, 2300, 2400 }, |
91 | }; | 91 | }; |
92 | 92 | ||
93 | /* voltages (millivolt) of 0%, 10%, ... 100% when charging enabled */ | 93 | /* voltages (millivolt) of 0%, 10%, ... 100% when charging enabled */ |
94 | const unsigned short percent_to_volt_charge[11] = | 94 | const unsigned short percent_to_volt_charge[11] = |
95 | { | 95 | { |
96 | /* TODO */ | 96 | /* TODO */ |
97 | 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000 | 97 | 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100, 2200, 2300, 2400 |
98 | }; | 98 | }; |
99 | 99 | ||
100 | /* VBAT = (BDATA/4096) * 7.5V */ | 100 | /* VBAT = (BDATA/4096) * 7.5V */ |
101 | #define BATTERY_SCALE_FACTOR 1875 | 101 | #define BATTERY_SCALE_FACTOR 7500 |
102 | 102 | ||
103 | /* Returns battery voltage from ADC [millivolts] */ | 103 | /* Returns battery voltage from ADC [millivolts] */ |
104 | unsigned int battery_adc_voltage(void) | 104 | unsigned int battery_adc_voltage(void) |
105 | { | 105 | { |
106 | unsigned int dummy, timeout=HZ/4; | 106 | unsigned int dummy, bat_val; |
107 | 107 | ||
108 | mutex_lock(&battery_mtx); | 108 | mutex_lock(&battery_mtx); |
109 | 109 | ||
110 | dummy = REG_SADC_BATDAT; | 110 | dummy = REG_SADC_BATDAT; |
111 | dummy = REG_SADC_BATDAT; | 111 | dummy = REG_SADC_BATDAT; |
112 | 112 | ||
113 | REG_SADC_ENA |= SADC_ENA_PBATEN; | 113 | REG_SADC_ENA |= SADC_ENA_PBATEN; |
114 | bat_val = 0; | 114 | |
115 | 115 | wakeup_wait(&battery_wkup, HZ/4); | |
116 | /* primitive wakeup event */ | 116 | bat_val = REG_SADC_BATDAT; |
117 | while(bat_val == 0 && timeout--) | 117 | |
118 | sleep(0); | 118 | logf("%d %d", bat_val, (bat_val * BATTERY_SCALE_FACTOR) / 4096); |
119 | 119 | ||
120 | logf("%d %d", bat_val, (bat_val*BATTERY_SCALE_FACTOR)>>10); | ||
121 | |||
122 | mutex_unlock(&battery_mtx); | 120 | mutex_unlock(&battery_mtx); |
123 | 121 | ||
124 | return (bat_val*BATTERY_SCALE_FACTOR)>>10; | 122 | return (bat_val * BATTERY_SCALE_FACTOR) / 4096; |
125 | } | 123 | } |
126 | 124 | ||
127 | void button_init_device(void) | 125 | void button_init_device(void) |
128 | { | 126 | { |
127 | __gpio_as_input(32*3 + 29); /* VX777 and VX747(+) */ | ||
128 | |||
129 | #ifdef ONDA_VX747 | 129 | #ifdef ONDA_VX747 |
130 | __gpio_as_input(32*3 + 29); | ||
131 | __gpio_as_input(32*3 + 27); | 130 | __gpio_as_input(32*3 + 27); |
132 | __gpio_as_input(32*3 + 16); | 131 | __gpio_as_input(32*3 + 16); |
133 | __gpio_as_input(32*3 + 1); | 132 | __gpio_as_input(32*3 + 1); |
134 | __gpio_as_input(32*3 + 0); | 133 | __gpio_as_input(32*3 + 0); |
135 | #elif defined(ONDA_VX747P) | 134 | #elif defined(ONDA_VX747P) |
136 | __gpio_as_input(32*3 + 29); | ||
137 | __gpio_as_input(32*3 + 27); | 135 | __gpio_as_input(32*3 + 27); |
138 | __gpio_as_input(32*3 + 20); | 136 | __gpio_as_input(32*3 + 20); |
139 | __gpio_as_input(32*3 + 19); | 137 | __gpio_as_input(32*3 + 19); |
@@ -149,7 +147,7 @@ bool button_hold(void) | |||
149 | #elif defined(ONDA_VX747P) | 147 | #elif defined(ONDA_VX747P) |
150 | (~REG_GPIO_PXPIN(2)) & BTN_HOLD | 148 | (~REG_GPIO_PXPIN(2)) & BTN_HOLD |
151 | #elif defined(ONDA_VX777) | 149 | #elif defined(ONDA_VX777) |
152 | false /* TODO */ | 150 | false |
153 | #endif | 151 | #endif |
154 | ? true : false | 152 | ? true : false |
155 | ); | 153 | ); |
@@ -159,24 +157,24 @@ int button_read_device(int *data) | |||
159 | { | 157 | { |
160 | int ret = 0; | 158 | int ret = 0; |
161 | static int old_data = 0; | 159 | static int old_data = 0; |
162 | 160 | ||
163 | *data = old_data; | 161 | *data = old_data; |
164 | 162 | ||
165 | /* Filter button events out if HOLD button is pressed at firmware/ level */ | 163 | /* Filter button events out if HOLD button is pressed at firmware/ level */ |
166 | if(button_hold()) | 164 | if(button_hold()) |
167 | return 0; | 165 | return 0; |
168 | 166 | ||
169 | #ifndef ONDA_VX777 | ||
170 | int tmp = (~REG_GPIO_PXPIN(3)) & BTN_MASK; | 167 | int tmp = (~REG_GPIO_PXPIN(3)) & BTN_MASK; |
171 | 168 | ||
169 | if(tmp & BTN_OFF) | ||
170 | ret |= BUTTON_POWER; | ||
171 | #ifndef ONDA_VX777 | ||
172 | if(tmp & BTN_VOL_DOWN) | 172 | if(tmp & BTN_VOL_DOWN) |
173 | ret |= BUTTON_VOL_DOWN; | 173 | ret |= BUTTON_VOL_DOWN; |
174 | if(tmp & BTN_VOL_UP) | 174 | if(tmp & BTN_VOL_UP) |
175 | ret |= BUTTON_VOL_UP; | 175 | ret |= BUTTON_VOL_UP; |
176 | if(tmp & BTN_MENU) | 176 | if(tmp & BTN_MENU) |
177 | ret |= BUTTON_MENU; | 177 | ret |= BUTTON_MENU; |
178 | if(tmp & BTN_OFF) | ||
179 | ret |= BUTTON_POWER; | ||
180 | #endif | 178 | #endif |
181 | 179 | ||
182 | if(cur_touch != 0 && pen_down) | 180 | if(cur_touch != 0 && pen_down) |
@@ -187,7 +185,7 @@ int button_read_device(int *data) | |||
187 | #endif | 185 | #endif |
188 | if( UNLIKELY(!is_backlight_on(true)) ) | 186 | if( UNLIKELY(!is_backlight_on(true)) ) |
189 | *data = 0; | 187 | *data = 0; |
190 | 188 | ||
191 | old_data = *data; | 189 | old_data = *data; |
192 | } | 190 | } |
193 | 191 | ||
@@ -197,13 +195,12 @@ int button_read_device(int *data) | |||
197 | /* Interrupt handler */ | 195 | /* Interrupt handler */ |
198 | void SADC(void) | 196 | void SADC(void) |
199 | { | 197 | { |
200 | unsigned char state; | 198 | unsigned char state, sadcstate; |
201 | unsigned char sadcstate; | ||
202 | 199 | ||
203 | sadcstate = REG_SADC_STATE; | 200 | sadcstate = REG_SADC_STATE; |
204 | state = REG_SADC_STATE & (~REG_SADC_CTRL); | 201 | state = sadcstate & (~REG_SADC_CTRL); |
205 | REG_SADC_STATE &= sadcstate; | 202 | REG_SADC_STATE &= sadcstate; |
206 | 203 | ||
207 | if(state & SADC_CTRL_PENDM) | 204 | if(state & SADC_CTRL_PENDM) |
208 | { | 205 | { |
209 | /* Pen down IRQ */ | 206 | /* Pen down IRQ */ |
@@ -211,7 +208,7 @@ void SADC(void) | |||
211 | REG_SADC_CTRL |= (SADC_CTRL_PENDM); | 208 | REG_SADC_CTRL |= (SADC_CTRL_PENDM); |
212 | pen_down = true; | 209 | pen_down = true; |
213 | } | 210 | } |
214 | 211 | ||
215 | if(state & SADC_CTRL_PENUM) | 212 | if(state & SADC_CTRL_PENUM) |
216 | { | 213 | { |
217 | /* Pen up IRQ */ | 214 | /* Pen up IRQ */ |
@@ -221,26 +218,26 @@ void SADC(void) | |||
221 | datacount = 0; | 218 | datacount = 0; |
222 | cur_touch = 0; | 219 | cur_touch = 0; |
223 | } | 220 | } |
224 | 221 | ||
225 | if(state & SADC_CTRL_TSRDYM) | 222 | if(state & SADC_CTRL_TSRDYM) |
226 | { | 223 | { |
227 | unsigned int dat; | 224 | unsigned int dat; |
228 | unsigned short xData, yData; | 225 | unsigned short xData, yData; |
229 | signed short tsz1Data, tsz2Data; | 226 | signed short tsz1Data, tsz2Data; |
230 | 227 | ||
231 | dat = REG_SADC_TSDAT; | 228 | dat = REG_SADC_TSDAT; |
232 | xData = (dat >> 0) & 0xFFF; | 229 | xData = (dat >> 0) & 0xFFF; |
233 | yData = (dat >> 16) & 0xFFF; | 230 | yData = (dat >> 16) & 0xFFF; |
234 | 231 | ||
235 | dat = REG_SADC_TSDAT; | 232 | dat = REG_SADC_TSDAT; |
236 | tsz1Data = (dat >> 0) & 0xFFF; | 233 | tsz1Data = (dat >> 0) & 0xFFF; |
237 | tsz2Data = (dat >> 16) & 0xFFF; | 234 | tsz2Data = (dat >> 16) & 0xFFF; |
238 | 235 | ||
239 | if(!pen_down) | 236 | if(!pen_down) |
240 | return; | 237 | return; |
241 | 238 | ||
242 | tsz1Data = tsz2Data - tsz1Data; | 239 | tsz1Data = tsz2Data - tsz1Data; |
243 | 240 | ||
244 | if((tsz1Data > 100) || (tsz1Data < -100)) | 241 | if((tsz1Data > 100) || (tsz1Data < -100)) |
245 | { | 242 | { |
246 | if(datacount == 0) | 243 | if(datacount == 0) |
@@ -253,9 +250,9 @@ void SADC(void) | |||
253 | x_pos += xData; | 250 | x_pos += xData; |
254 | y_pos += yData; | 251 | y_pos += yData; |
255 | } | 252 | } |
256 | 253 | ||
257 | datacount++; | 254 | datacount++; |
258 | 255 | ||
259 | if(datacount >= TS_AD_COUNT) | 256 | if(datacount >= TS_AD_COUNT) |
260 | { | 257 | { |
261 | cur_touch = ((x_pos / datacount) << 16) | | 258 | cur_touch = ((x_pos / datacount) << 16) | |
@@ -266,11 +263,11 @@ void SADC(void) | |||
266 | else | 263 | else |
267 | datacount = 0; | 264 | datacount = 0; |
268 | } | 265 | } |
269 | 266 | ||
270 | if(state & SADC_CTRL_PBATRDYM) | 267 | if(state & SADC_CTRL_PBATRDYM) |
271 | { | 268 | { |
272 | bat_val = REG_SADC_BATDAT; | ||
273 | /* Battery AD IRQ */ | 269 | /* Battery AD IRQ */ |
270 | wakeup_signal(&battery_wkup); | ||
274 | } | 271 | } |
275 | } | 272 | } |
276 | 273 | ||
@@ -280,18 +277,19 @@ void adc_init(void) | |||
280 | REG_SADC_ENA = 0; | 277 | REG_SADC_ENA = 0; |
281 | REG_SADC_STATE &= (~REG_SADC_STATE); | 278 | REG_SADC_STATE &= (~REG_SADC_STATE); |
282 | REG_SADC_CTRL = 0x1f; | 279 | REG_SADC_CTRL = 0x1f; |
283 | 280 | ||
284 | REG_SADC_CFG = SADC_CFG_INIT; | 281 | REG_SADC_CFG = SADC_CFG_INIT; |
285 | 282 | ||
286 | system_enable_irq(IRQ_SADC); | 283 | system_enable_irq(IRQ_SADC); |
287 | 284 | ||
288 | REG_SADC_SAMETIME = 10; | 285 | REG_SADC_SAMETIME = 10; |
289 | REG_SADC_WAITTIME = 100; | 286 | REG_SADC_WAITTIME = 100; |
290 | REG_SADC_STATE &= ~REG_SADC_STATE; | 287 | REG_SADC_STATE &= ~REG_SADC_STATE; |
291 | REG_SADC_CTRL = ~(SADC_CTRL_PENDM | SADC_CTRL_PENUM | SADC_CTRL_TSRDYM | SADC_CTRL_PBATRDYM); | 288 | REG_SADC_CTRL = ~(SADC_CTRL_PENDM | SADC_CTRL_PENUM | SADC_CTRL_TSRDYM | SADC_CTRL_PBATRDYM); |
292 | REG_SADC_ENA = SADC_ENA_TSEN; | 289 | REG_SADC_ENA = SADC_ENA_TSEN; |
293 | 290 | ||
294 | mutex_init(&battery_mtx); | 291 | mutex_init(&battery_mtx); |
292 | wakeup_init(&battery_wkup); | ||
295 | } | 293 | } |
296 | 294 | ||
297 | void adc_close(void) | 295 | void adc_close(void) |
@@ -301,4 +299,3 @@ void adc_close(void) | |||
301 | sleep(20); | 299 | sleep(20); |
302 | __cpm_stop_sadc(); | 300 | __cpm_stop_sadc(); |
303 | } | 301 | } |
304 | |||