summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/target/mips/ingenic_jz47xx/onda_vx747/button-target.h9
-rw-r--r--firmware/target/mips/ingenic_jz47xx/onda_vx747/sadc-onda_vx747.c95
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
28bool button_hold(void); 30bool button_hold(void);
29void button_init_device(void); 31void 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;
68static int datacount = 0; 68static int datacount = 0;
69static volatile int cur_touch = 0; 69static volatile int cur_touch = 0;
70static volatile bool pen_down = false; 70static volatile bool pen_down = false;
71static volatile unsigned short bat_val;
72static struct mutex battery_mtx; 71static struct mutex battery_mtx;
72static struct wakeup battery_wkup;
73 73
74const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] = 74const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] =
75{ 75{
76 /* TODO */ 76 /* TODO */
77 1000 77 1600
78}; 78};
79 79
80const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] = 80const 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 */
87const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] = 87const 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 */
94const unsigned short percent_to_volt_charge[11] = 94const 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] */
104unsigned int battery_adc_voltage(void) 104unsigned 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
127void button_init_device(void) 125void 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 */
198void SADC(void) 196void 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
297void adc_close(void) 295void 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