diff options
author | William Wilgus <wilgus.william@gmail.com> | 2020-09-06 06:23:48 -0400 |
---|---|---|
committer | William Wilgus <me.theuser@yahoo.com> | 2020-09-06 11:06:54 +0000 |
commit | af24ff1fc364343bd94a7473e48ae707936d3f7f (patch) | |
tree | c00b659ab4d0d7aa5361aa78d25b7e79600e4c3a | |
parent | 53142ae9f57306fb44870c8ea156892d15cb31a7 (diff) | |
download | rockbox-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
-rw-r--r-- | firmware/target/mips/ingenic_jz47xx/xduoo_x3/sadc-xduoo_x3.c | 124 |
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 | ||
55 | static volatile unsigned short bat_val,key_val; | 56 | #define ADC_MASK 0x0FFF |
57 | |||
58 | static volatile unsigned short bat_val, key_val; | ||
56 | 59 | ||
57 | bool headphones_inserted(void) | 60 | bool headphones_inserted(void) |
58 | { | 61 | { |
@@ -68,7 +71,7 @@ bool lineout_inserted(void) | |||
68 | 71 | ||
69 | void button_init_device(void) | 72 | void 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 | ||
99 | bool button_hold(void) | 96 | bool 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 | */ |
108 | int button_read_device(void) | 113 | int 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 */ |
164 | void KEY_INT_IRQ(void) | 152 | void 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 | */ |
241 | void adc_init(void) | 228 | void 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 | } |