summaryrefslogtreecommitdiff
path: root/firmware/target/arm/imx233/button-lradc-imx233.c
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2013-09-25 14:15:41 +0200
committerAmaury Pouly <amaury.pouly@gmail.com>2013-09-25 14:31:39 +0200
commit59094381936bba343708b26ff73593e08a0f88e9 (patch)
tree15c1fae5df2adcd254628b083bfdcc2b50bf44f1 /firmware/target/arm/imx233/button-lradc-imx233.c
parent2f5f2ba91dfe5a41551d54b7af33be42e7a27c5d (diff)
downloadrockbox-59094381936bba343708b26ff73593e08a0f88e9.tar.gz
rockbox-59094381936bba343708b26ff73593e08a0f88e9.zip
imx233: improve button lradc driver
The driver can now handle HOLD in several ways, including using a GPIO. Also add a debug routine to read the raw value of the adc. Change-Id: Ide2cb1ac58e759b4bc464e606b432f2c150ee36f
Diffstat (limited to 'firmware/target/arm/imx233/button-lradc-imx233.c')
-rw-r--r--firmware/target/arm/imx233/button-lradc-imx233.c53
1 files changed, 48 insertions, 5 deletions
diff --git a/firmware/target/arm/imx233/button-lradc-imx233.c b/firmware/target/arm/imx233/button-lradc-imx233.c
index 36c1344542..5e3b7165a6 100644
--- a/firmware/target/arm/imx233/button-lradc-imx233.c
+++ b/firmware/target/arm/imx233/button-lradc-imx233.c
@@ -21,9 +21,20 @@
21#include "button-lradc-imx233.h" 21#include "button-lradc-imx233.h"
22#include "stdlib.h" 22#include "stdlib.h"
23#include "lradc-imx233.h" 23#include "lradc-imx233.h"
24#include "pinctrl-imx233.h"
24 25
25#ifndef IMX233_BUTTON_LRADC_CHANNEL 26#ifndef IMX233_BUTTON_LRADC_CHANNEL
26#error You must define IMX233_BUTTON_LRADC_CHANNEL to use button-lradc 27# error You must define IMX233_BUTTON_LRADC_CHANNEL to use button-lradc
28#endif
29
30#if defined(HAS_BUTTON_HOLD) && !defined(IMX233_BUTTON_LRADC_HOLD_DET)
31# error You must defined IMX233_BUTTON_LRADC_HOLD_DET if you use hold
32#endif
33
34#if defined(IMX233_BUTTON_LRADC_HOLD_DET) && \
35 IMX233_BUTTON_LRADC_HOLD_DET == BLH_GPIO && \
36 (!defined(BLH_GPIO_BANK) || !defined(BLH_GPIO_PIN))
37# error You must define BLH_GPIO_BANK and BLH_GPIO_PIN when detecting hold using GPIO
27#endif 38#endif
28 39
29/* physical channel */ 40/* physical channel */
@@ -49,6 +60,7 @@ static int button_val[2];
49static int button_idx; 60static int button_idx;
50static int button_mask; 61static int button_mask;
51static int table_size; 62static int table_size;
63static int raw_val;
52 64
53static int button_find(int val) 65static int button_find(int val)
54{ 66{
@@ -77,13 +89,13 @@ static void button_lradc_irq(int chan)
77{ 89{
78 (void) chan; 90 (void) chan;
79 /* read value, kick channel */ 91 /* read value, kick channel */
80 button_val[button_idx] = imx233_lradc_read_channel(button_chan) / SAMPLES; 92 raw_val = imx233_lradc_read_channel(button_chan) / SAMPLES;
81 imx233_lradc_clear_channel(button_chan); 93 imx233_lradc_clear_channel(button_chan);
82 imx233_lradc_setup_channel(button_chan, true, true, SAMPLES - 1, LRADC_SRC(CHAN)); 94 imx233_lradc_setup_channel(button_chan, true, true, SAMPLES - 1, LRADC_SRC(CHAN));
83 imx233_lradc_setup_delay(button_delay, 1 << button_chan, 0, SAMPLES - 1, DELAY); 95 imx233_lradc_setup_delay(button_delay, 1 << button_chan, 0, SAMPLES - 1, DELAY);
84 imx233_lradc_kick_delay(button_delay); 96 imx233_lradc_kick_delay(button_delay);
85 /* compute mask, compare to previous one */ 97 /* compute mask, compare to previous one */
86 button_val[button_idx] = button_find(button_val[button_idx]); 98 button_val[button_idx] = button_find(raw_val);
87 button_idx = 1 - button_idx; 99 button_idx = 1 - button_idx;
88 if(button_val[0] == button_val[1]) 100 if(button_val[0] == button_val[1])
89 button_mask = button_val[0]; 101 button_mask = button_val[0];
@@ -106,14 +118,45 @@ void imx233_button_lradc_init(void)
106 imx233_lradc_enable_channel_irq(button_chan, true); 118 imx233_lradc_enable_channel_irq(button_chan, true);
107 imx233_lradc_set_channel_irq_callback(button_chan, button_lradc_irq); 119 imx233_lradc_set_channel_irq_callback(button_chan, button_lradc_irq);
108 imx233_lradc_kick_delay(button_delay); 120 imx233_lradc_kick_delay(button_delay);
121#if defined(HAS_BUTTON_HOLD) && IMX233_BUTTON_LRADC_HOLD_DET == BLH_GPIO
122 imx233_pinctrl_acquire(BLH_GPIO_BANK, BLH_GPIO_PIN, "button_lradc_hold");
123 imx233_pinctrl_set_function(BLH_GPIO_BANK, BLH_GPIO_PIN, PINCTRL_FUNCTION_GPIO);
124 imx233_pinctrl_enable_gpio(BLH_GPIO_BANK, BLH_GPIO_PIN, false);
125# ifdef BLH_GPIO_PULLUP
126 imx233_pinctrl_enable_pullup(BLH_GPIO_BANK, BLH_GPIO_PIN, true);
127# endif
128#endif
109} 129}
110 130
131#if defined(HAS_BUTTON_HOLD) && IMX233_BUTTON_LRADC_HOLD_DET == BLH_ADC
111bool imx233_button_lradc_hold(void) 132bool imx233_button_lradc_hold(void)
112{ 133{
113 return button_mask == IMX233_BUTTON_LRADC_HOLD; 134 return button_mask == IMX233_BUTTON_LRADC_HOLD;
114} 135}
136#endif
137
138
139#if defined(HAS_BUTTON_HOLD) && IMX233_BUTTON_LRADC_HOLD_DET == BLH_GPIO
140bool imx233_button_lradc_hold(void)
141{
142 bool res = imx233_pinctrl_get_gpio(BLH_GPIO_BANK, BLH_GPIO_PIN);
143#ifdef BLH_GPIO_INVERTED
144 res = !res;
145#endif
146 return res;
147}
148#endif
149
150int imx233_button_lradc_read(int others)
151{
152#ifdef HAS_BUTTON_HOLD
153 return imx233_button_lradc_hold() ? 0 : button_mask | others;
154#else
155 return button_mask | others;
156#endif
157}
115 158
116int imx233_button_lradc_read(void) 159int imx233_button_lradc_read_raw(void)
117{ 160{
118 return button_mask == IMX233_BUTTON_LRADC_HOLD ? 0 : button_mask; 161 return raw_val;
119} 162}