summaryrefslogtreecommitdiff
path: root/firmware/target/mips/ingenic_jz47xx/onda_vx747/sadc-onda_vx747.c
diff options
context:
space:
mode:
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.c93
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
62static signed int x_pos, y_pos; 64static signed int x_pos, y_pos;
63static int datacount = 0, cur_touch = 0; 65static int datacount = 0;
64static bool pen_down = false; 66static volatile int cur_touch = 0;
65static volatile unsigned short bat_val = 0; 67static volatile bool pen_down = false;
68static volatile unsigned short bat_val;
66static struct mutex battery_mtx; 69static struct mutex battery_mtx;
67 70
68static enum touchscreen_mode current_mode = TOUCHSCREEN_POINT; 71static enum touchscreen_mode current_mode = TOUCHSCREEN_POINT;
@@ -76,20 +79,20 @@ static const int touchscreen_buttons[3][3] =
76const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] = 79const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] =
77{ 80{
78 /* TODO */ 81 /* TODO */
79 3400 82 1400
80}; 83};
81 84
82const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] = 85const 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 */
89const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] = 92const 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] */
106unsigned int battery_adc_voltage(void) 109unsigned 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
127void button_init_device(void) 141void 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
341void adc_init(void)
342{
343}