summaryrefslogtreecommitdiff
path: root/firmware/target
diff options
context:
space:
mode:
authorWilliam Wilgus <wilgus.william@gmail.com>2020-09-06 06:23:48 -0400
committerWilliam Wilgus <me.theuser@yahoo.com>2020-09-06 11:06:54 +0000
commitaf24ff1fc364343bd94a7473e48ae707936d3f7f (patch)
treec00b659ab4d0d7aa5361aa78d25b7e79600e4c3a /firmware/target
parent53142ae9f57306fb44870c8ea156892d15cb31a7 (diff)
downloadrockbox-af24ff1fc364343bd94a7473e48ae707936d3f7f.tar.gz
rockbox-af24ff1fc364343bd94a7473e48ae707936d3f7f.zip
XduooX3 Gpio reconfigure button system #2
Fix issue with first battery sample taking 30 seconds Clean up code Change-Id: If2437d241e0ab4e3d23b141f5d853b6cf3209b07
Diffstat (limited to 'firmware/target')
-rw-r--r--firmware/target/mips/ingenic_jz47xx/xduoo_x3/sadc-xduoo_x3.c124
1 files changed, 45 insertions, 79 deletions
diff --git a/firmware/target/mips/ingenic_jz47xx/xduoo_x3/sadc-xduoo_x3.c b/firmware/target/mips/ingenic_jz47xx/xduoo_x3/sadc-xduoo_x3.c
index c2ead85fb4..0f845d96d3 100644
--- a/firmware/target/mips/ingenic_jz47xx/xduoo_x3/sadc-xduoo_x3.c
+++ b/firmware/target/mips/ingenic_jz47xx/xduoo_x3/sadc-xduoo_x3.c
@@ -8,6 +8,7 @@
8 * $Id$ 8 * $Id$
9 * 9 *
10 * Copyright (C) 2016 by Roman Stolyarov 10 * Copyright (C) 2016 by Roman Stolyarov
11 * Copyright (C) 2020 by William Wilgus
11 * 12 *
12 * This program is free software; you can redistribute it and/or 13 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License 14 * modify it under the terms of the GNU General Public License
@@ -38,7 +39,7 @@
38#define PIN_KEY_INT (32*4+13) 39#define PIN_KEY_INT (32*4+13)
39#define KEY_INT_IRQ GPIO141 40#define KEY_INT_IRQ GPIO141
40 41
41#define PIN_KEY_BOP (32*3+17) /* Back Option Play */ 42#define PIN_COM_BOP (32*3+17) /* common pin for Back Option Play */
42 43
43#define PIN_CHARGE_CON (32*1+7) 44#define PIN_CHARGE_CON (32*1+7)
44 45
@@ -50,9 +51,11 @@
50#define IRQ_LO_DECT GPIO_IRQ(PIN_LO_DECT) 51#define IRQ_LO_DECT GPIO_IRQ(PIN_LO_DECT)
51#define GPIO_LO_DECT GPIO44 52#define GPIO_LO_DECT GPIO44
52 53
53/*#define ENABLE_BUTTON_COMBOS*/ 54#define KEY_IS_DOWN(pin) (__gpio_get_pin(pin) == 0)
54 55
55static volatile unsigned short bat_val,key_val; 56#define ADC_MASK 0x0FFF
57
58static volatile unsigned short bat_val, key_val;
56 59
57bool headphones_inserted(void) 60bool headphones_inserted(void)
58{ 61{
@@ -68,7 +71,7 @@ bool lineout_inserted(void)
68 71
69void button_init_device(void) 72void button_init_device(void)
70{ 73{
71 key_val = 0xfff; 74 key_val = ADC_MASK;
72 75
73 __gpio_as_input(PIN_BTN_POWER); 76 __gpio_as_input(PIN_BTN_POWER);
74 __gpio_as_input(PIN_BTN_HOLD); 77 __gpio_as_input(PIN_BTN_HOLD);
@@ -76,21 +79,15 @@ void button_init_device(void)
76 __gpio_disable_pull(PIN_BTN_POWER); 79 __gpio_disable_pull(PIN_BTN_POWER);
77 __gpio_disable_pull(PIN_BTN_HOLD); 80 __gpio_disable_pull(PIN_BTN_HOLD);
78 81
79#ifdef ENABLE_BUTTON_COMBOS
80 __gpio_as_output(PIN_KEY_BOP);
81 __gpio_disable_pull(PIN_KEY_BOP);
82 __gpio_clear_pin(PIN_KEY_BOP);
83#endif
84
85 __gpio_as_irq_fall_edge(PIN_KEY_INT); 82 __gpio_as_irq_fall_edge(PIN_KEY_INT);
86 __gpio_enable_pull(PIN_KEY_INT); 83 __gpio_disable_pull(PIN_KEY_INT);
87 system_enable_irq(GPIO_IRQ(PIN_KEY_INT)); 84 system_enable_irq(GPIO_IRQ(PIN_KEY_INT));
88 85
89 __gpio_set_pin(PIN_CHARGE_CON); /* 0.7 A */ 86 __gpio_set_pin(PIN_CHARGE_CON); /* 0.7 A */
90 __gpio_as_output(PIN_CHARGE_CON); 87 __gpio_as_output(PIN_CHARGE_CON);
91 88
92 __gpio_as_input(PIN_PH_DECT); 89 __gpio_as_input(PIN_PH_DECT);
93 __gpio_disable_pull(PIN_PH_DECT); 90 /*__gpio_disable_pull(PIN_PH_DECT); // Spurious Detections */
94 91
95 __gpio_as_input(PIN_LO_DECT); 92 __gpio_as_input(PIN_LO_DECT);
96 __gpio_disable_pull(PIN_LO_DECT); 93 __gpio_disable_pull(PIN_LO_DECT);
@@ -98,63 +95,54 @@ void button_init_device(void)
98 95
99bool button_hold(void) 96bool button_hold(void)
100{ 97{
101 return (__gpio_get_pin(PIN_BTN_HOLD) ? true : false); 98 bool hold_button = __gpio_get_pin(PIN_BTN_HOLD) == 1;
99#ifndef BOOTLOADER
100 static bool hold_button_old = false;
101 if (hold_button != hold_button_old)
102 {
103 hold_button_old = hold_button;
104 backlight_hold_changed(hold_button);
105 }
106#endif
107 return hold_button;
102} 108}
103 109
104/* NOTE: Due to how this is wired, button combinations are not allowed 110/* NOTE: Due to how this is wired, button combinations are not allowed
105 unless one of the two buttons is the POWER 111 unless one of the two buttons is the POWER
106 ENABLE_BUTTON_COMBOS when defined also allows 'Back, Option, Play'
107*/ 112*/
108int button_read_device(void) 113int button_read_device(void)
109{ 114{
110 int btn = BUTTON_NONE; 115 int btn = BUTTON_NONE;
111#ifndef BOOTLOADER 116 unsigned short key = (key_val & ADC_MASK);
112 static bool hold_button = false;
113 bool hold_button_old;
114 117
115 hold_button_old = hold_button; 118 if (button_hold())
116 hold_button = (__gpio_get_pin(PIN_BTN_HOLD) ? true : false);
117
118 if (hold_button != hold_button_old) {
119 backlight_hold_changed(hold_button);
120 }
121 if (hold_button) {
122 return BUTTON_NONE; 119 return BUTTON_NONE;
123 }
124#endif
125 120
126 bool gpio_btn = (__gpio_get_pin(PIN_BTN_POWER) ? false : true); 121 if (KEY_IS_DOWN(PIN_BTN_POWER))
127 if (gpio_btn)
128 btn |= BUTTON_POWER; 122 btn |= BUTTON_POWER;
129 123
130#ifdef ENABLE_BUTTON_COMBOS 124 if (!KEY_IS_DOWN(PIN_KEY_INT))
131 if (__gpio_get_pin(PIN_KEY_INT) && (!__gpio_get_pin(PIN_KEY_BOP)))
132#else
133 if (__gpio_get_pin(PIN_KEY_INT))
134#endif
135 {
136 return btn; 125 return btn;
137 }
138 126
139 if (key_val < 261) 127 if (key < 261)
140 btn |= BUTTON_VOL_UP; 128 btn |= BUTTON_VOL_UP;
141 else 129 else
142 if (key_val < 653) 130 if (key < 653)
143 btn |= BUTTON_VOL_DOWN; 131 btn |= BUTTON_VOL_DOWN;
144 else 132 else
145 if (key_val < 1101) 133 if (key < 1101)
146 btn |= BUTTON_PREV; 134 btn |= BUTTON_PREV;
147 else 135 else
148 if (key_val < 1498) 136 if (key < 1498)
149 btn |= BUTTON_NEXT; 137 btn |= BUTTON_NEXT;
150 else 138 else
151 if (key_val < 1839) 139 if (key < 1839)
152 btn |= BUTTON_PLAY; 140 btn |= BUTTON_PLAY;
153 else 141 else
154 if (key_val < 2213) 142 if (key < 2213)
155 btn |= BUTTON_OPTION; 143 btn |= BUTTON_OPTION;
156 else 144 else
157 if (key_val < 2600) 145 if (key < 2600)
158 btn |= BUTTON_HOME; 146 btn |= BUTTON_HOME;
159 147
160 return btn; 148 return btn;
@@ -163,15 +151,9 @@ int button_read_device(void)
163/* called on button press interrupt */ 151/* called on button press interrupt */
164void KEY_INT_IRQ(void) 152void KEY_INT_IRQ(void)
165{ 153{
166
167 /* Don't initiate a new request if we have one pending */ 154 /* Don't initiate a new request if we have one pending */
168 if(!(REG_SADC_ADENA & (ADENA_AUXEN)) 155 if(!(REG_SADC_ADENA & (ADENA_AUXEN)))
169#ifdef ENABLE_BUTTON_COMBOS
170 && (!__gpio_get_pin(PIN_KEY_BOP))
171#endif
172 ){
173 REG_SADC_ADENA |= ADENA_AUXEN; 156 REG_SADC_ADENA |= ADENA_AUXEN;
174 }
175} 157}
176 158
177/* Notes on batteries 159/* Notes on batteries
@@ -217,17 +199,22 @@ int _battery_voltage(void)
217{ 199{
218 static long last_tick = 0; 200 static long last_tick = 0;
219 201
220 if (TIME_AFTER(current_tick, last_tick + BATT_WAIT_TIME)) 202 if (TIME_AFTER(current_tick, last_tick) && REG_SADC_ADENA == 0)
221 { 203 {
222 last_tick = current_tick; 204 last_tick = current_tick;
223 REG_SADC_ADENA |= ADENA_VBATEN;
224 __intc_mask_irq(IRQ_SADC); 205 __intc_mask_irq(IRQ_SADC);
225 while ((REG_SADC_ADENA & ADENA_VBATEN) && 206 REG_SADC_ADENA |= ADENA_VBATEN;
207 /* poll for value from our context instead of ISR */
208 while (!(REG_SADC_ADSTATE & ADCTRL_VRDYM) &&
226 TIME_BEFORE(current_tick, last_tick + HZ / 20)) 209 TIME_BEFORE(current_tick, last_tick + HZ / 20))
227 ;; 210 ;;
228 __intc_unmask_irq(IRQ_SADC); 211 if ((REG_SADC_ADSTATE & ADCTRL_VRDYM))
229 if (!(REG_SADC_ADENA & ADENA_VBATEN)) 212 {
213 last_tick += BATT_WAIT_TIME;
230 bat_val = REG_SADC_ADVDAT; 214 bat_val = REG_SADC_ADVDAT;
215 REG_SADC_ADSTATE &= ADCTRL_VRDYM; /* clear ready bit by writing 1*/
216 }
217 __intc_unmask_irq(IRQ_SADC);
231 } 218 }
232 219
233 return (bat_val*BATTERY_SCALE_FACTOR)>>10; 220 return (bat_val*BATTERY_SCALE_FACTOR)>>10;
@@ -240,10 +227,10 @@ int _battery_voltage(void)
240*/ 227*/
241void adc_init(void) 228void adc_init(void)
242{ 229{
243 bat_val = 0xfff; 230 bat_val = ADC_MASK;
244 231
245 __cpm_start_sadc(); 232 __cpm_start_sadc();
246 mdelay(10); 233 mdelay(20);
247 REG_SADC_ADENA = 0; /* Power Up */ 234 REG_SADC_ADENA = 0; /* Power Up */
248 mdelay(70); 235 mdelay(70);
249 REG_SADC_ADSTATE = 0; 236 REG_SADC_ADSTATE = 0;
@@ -266,7 +253,6 @@ void SADC(void)
266{ 253{
267 unsigned char state; 254 unsigned char state;
268 unsigned char sadcstate; 255 unsigned char sadcstate;
269
270 sadcstate = REG_SADC_ADSTATE; 256 sadcstate = REG_SADC_ADSTATE;
271 state = REG_SADC_ADSTATE & (~REG_SADC_ADCTRL); 257 state = REG_SADC_ADSTATE & (~REG_SADC_ADCTRL);
272 REG_SADC_ADSTATE &= sadcstate; 258 REG_SADC_ADSTATE &= sadcstate;
@@ -274,30 +260,10 @@ void SADC(void)
274 if(state & ADCTRL_ARDYM) 260 if(state & ADCTRL_ARDYM)
275 { 261 {
276 key_val = REG_SADC_ADADAT; 262 key_val = REG_SADC_ADADAT;
277#ifdef ENABLE_BUTTON_COMBOS 263 if (KEY_IS_DOWN(PIN_KEY_INT)) /* key(s) are down kick off another read */
278 __gpio_mask_irq(PIN_KEY_INT);
279 __gpio_clear_pin(PIN_KEY_BOP);
280 __gpio_unmask_irq(PIN_KEY_INT);
281#endif
282
283 if (!__gpio_get_pin(PIN_KEY_INT)) /* key(s) are down kick off another read */
284 {
285#ifdef ENABLE_BUTTON_COMBOS
286 /* setting bit high removes BOP from ADC circuit*/
287 __gpio_set_pin(PIN_KEY_BOP);
288#endif
289 REG_SADC_ADENA = ADENA_AUXEN; 264 REG_SADC_ADENA = ADENA_AUXEN;
290 }
291#ifdef ENABLE_BUTTON_COMBOS
292 else
293 {
294 __gpio_mask_irq(PIN_KEY_INT);
295 __gpio_clear_pin(PIN_KEY_BOP);
296 __gpio_unmask_irq(PIN_KEY_INT);
297 }
298#endif
299 } 265 }
300 if(state & ADCTRL_VRDYM) 266 else if(UNLIKELY(state & ADCTRL_VRDYM))
301 { 267 {
302 bat_val = REG_SADC_ADVDAT; 268 bat_val = REG_SADC_ADVDAT;
303 } 269 }