diff options
Diffstat (limited to 'firmware/target/arm/imx233/button-lradc-imx233.c')
-rw-r--r-- | firmware/target/arm/imx233/button-lradc-imx233.c | 53 |
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]; | |||
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 | } |