diff options
-rw-r--r-- | firmware/target/arm/imx233/button-lradc-imx233.c | 53 | ||||
-rw-r--r-- | firmware/target/arm/imx233/button-lradc-imx233.h | 26 |
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]; | |||
49 | static int button_idx; | 60 | static int button_idx; |
50 | static int button_mask; | 61 | static int button_mask; |
51 | static int table_size; | 62 | static int table_size; |
63 | static int raw_val; | ||
52 | 64 | ||
53 | static int button_find(int val) | 65 | static 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 | ||
111 | bool imx233_button_lradc_hold(void) | 132 | bool 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 | ||
140 | bool 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 | |||
150 | int 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 | ||
116 | int imx233_button_lradc_read(void) | 159 | int 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 | ||
38 | struct imx233_button_lradc_mapping_t | 55 | struct imx233_button_lradc_mapping_t |
@@ -50,7 +67,12 @@ struct imx233_button_lradc_mapping_t | |||
50 | extern struct imx233_button_lradc_mapping_t imx233_button_lradc_mapping[]; | 67 | extern struct imx233_button_lradc_mapping_t imx233_button_lradc_mapping[]; |
51 | 68 | ||
52 | void imx233_button_lradc_init(void); | 69 | void imx233_button_lradc_init(void); |
53 | int 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 */ | ||
72 | int imx233_button_lradc_read(int others); | ||
73 | #ifdef HAS_BUTTON_HOLD | ||
54 | bool imx233_button_lradc_hold(void); | 74 | bool imx233_button_lradc_hold(void); |
75 | #endif | ||
76 | int imx233_button_lradc_read_raw(void); // return raw adc value | ||
55 | 77 | ||
56 | #endif /* __button_lradc_imx233__ */ | 78 | #endif /* __button_lradc_imx233__ */ |