summaryrefslogtreecommitdiff
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
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
-rw-r--r--firmware/target/arm/imx233/button-lradc-imx233.c53
-rw-r--r--firmware/target/arm/imx233/button-lradc-imx233.h26
2 files changed, 72 insertions, 7 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}
diff --git a/firmware/target/arm/imx233/button-lradc-imx233.h b/firmware/target/arm/imx233/button-lradc-imx233.h
index d3e6ad8326..eac5517adf 100644
--- a/firmware/target/arm/imx233/button-lradc-imx233.h
+++ b/firmware/target/arm/imx233/button-lradc-imx233.h
@@ -29,10 +29,27 @@
29 * and variables: 29 * and variables:
30 * - imx233_button_lradc_mapping: target-defined table of adc values and mapping 30 * - imx233_button_lradc_mapping: target-defined table of adc values and mapping
31 * - IMX233_BUTTON_LRADC_CHANNEL: lradc channel to use 31 * - IMX233_BUTTON_LRADC_CHANNEL: lradc channel to use
32 * - IMX233_BUTTON_LRADC_HOLD_DET: define hold detection method (ignored if !HAS_BUTTON_HOLD)
33 *
34 * The available values of IMX233_BUTTON_LRADC_HOLD are:
35 * - BLH_ADC: detect hold using adc
36 * - BLH_EXT: target button driver implements imx233_button_lradc_hold() using
37 * any external method of its choice
38 * - BLH_GPIO: detect hold using a GPIO, needs to define additional defines:
39 * + BLH_GPIO_BANK: pin bank
40 * + BLH_GPIO_PIN: pin in bank
41 * + BLH_GPIO_INVERTED: define if inverted, default is active high
42 * + BLH_GPIO_PULLUP: define if pins needs pullup
32 */ 43 */
33 44
34/* special value for btn to handle HOLD */ 45/* hold detect method */
46#define BLH_ADC 0
47#define BLH_EXT 1
48#define BLH_GPIO 2
49
50/* special value for btn to indicate end of list */
35#define IMX233_BUTTON_LRADC_END -1 51#define IMX233_BUTTON_LRADC_END -1
52/* special value for btn to handle HOLD */
36#define IMX233_BUTTON_LRADC_HOLD -2 53#define IMX233_BUTTON_LRADC_HOLD -2
37 54
38struct imx233_button_lradc_mapping_t 55struct imx233_button_lradc_mapping_t
@@ -50,7 +67,12 @@ struct imx233_button_lradc_mapping_t
50extern struct imx233_button_lradc_mapping_t imx233_button_lradc_mapping[]; 67extern struct imx233_button_lradc_mapping_t imx233_button_lradc_mapping[];
51 68
52void imx233_button_lradc_init(void); 69void imx233_button_lradc_init(void);
53int imx233_button_lradc_read(void); 70/* others gives the bitmask of other buttons: the function will OR the result
71 * with them except if hold is detected in which case 0 is always returned */
72int imx233_button_lradc_read(int others);
73#ifdef HAS_BUTTON_HOLD
54bool imx233_button_lradc_hold(void); 74bool imx233_button_lradc_hold(void);
75#endif
76int imx233_button_lradc_read_raw(void); // return raw adc value
55 77
56#endif /* __button_lradc_imx233__ */ 78#endif /* __button_lradc_imx233__ */