summaryrefslogtreecommitdiffstats
path: root/firmware
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
parent2f5f2ba91dfe5a41551d54b7af33be42e7a27c5d (diff)
downloadrockbox-59094381936bba343708b26ff73593e08a0f88e9.tar.gz
rockbox-59094381936bba343708b26ff73593e08a0f88e9.tar.bz2
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')
-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 @@
#include "button-lradc-imx233.h"
#include "stdlib.h"
#include "lradc-imx233.h"
+#include "pinctrl-imx233.h"
#ifndef IMX233_BUTTON_LRADC_CHANNEL
-#error You must define IMX233_BUTTON_LRADC_CHANNEL to use button-lradc
+# error You must define IMX233_BUTTON_LRADC_CHANNEL to use button-lradc
+#endif
+
+#if defined(HAS_BUTTON_HOLD) && !defined(IMX233_BUTTON_LRADC_HOLD_DET)
+# error You must defined IMX233_BUTTON_LRADC_HOLD_DET if you use hold
+#endif
+
+#if defined(IMX233_BUTTON_LRADC_HOLD_DET) && \
+ IMX233_BUTTON_LRADC_HOLD_DET == BLH_GPIO && \
+ (!defined(BLH_GPIO_BANK) || !defined(BLH_GPIO_PIN))
+# error You must define BLH_GPIO_BANK and BLH_GPIO_PIN when detecting hold using GPIO
#endif
/* physical channel */
@@ -49,6 +60,7 @@ static int button_val[2];
static int button_idx;
static int button_mask;
static int table_size;
+static int raw_val;
static int button_find(int val)
{
@@ -77,13 +89,13 @@ static void button_lradc_irq(int chan)
{
(void) chan;
/* read value, kick channel */
- button_val[button_idx] = imx233_lradc_read_channel(button_chan) / SAMPLES;
+ raw_val = imx233_lradc_read_channel(button_chan) / SAMPLES;
imx233_lradc_clear_channel(button_chan);
imx233_lradc_setup_channel(button_chan, true, true, SAMPLES - 1, LRADC_SRC(CHAN));
imx233_lradc_setup_delay(button_delay, 1 << button_chan, 0, SAMPLES - 1, DELAY);
imx233_lradc_kick_delay(button_delay);
/* compute mask, compare to previous one */
- button_val[button_idx] = button_find(button_val[button_idx]);
+ button_val[button_idx] = button_find(raw_val);
button_idx = 1 - button_idx;
if(button_val[0] == button_val[1])
button_mask = button_val[0];
@@ -106,14 +118,45 @@ void imx233_button_lradc_init(void)
imx233_lradc_enable_channel_irq(button_chan, true);
imx233_lradc_set_channel_irq_callback(button_chan, button_lradc_irq);
imx233_lradc_kick_delay(button_delay);
+#if defined(HAS_BUTTON_HOLD) && IMX233_BUTTON_LRADC_HOLD_DET == BLH_GPIO
+ imx233_pinctrl_acquire(BLH_GPIO_BANK, BLH_GPIO_PIN, "button_lradc_hold");
+ imx233_pinctrl_set_function(BLH_GPIO_BANK, BLH_GPIO_PIN, PINCTRL_FUNCTION_GPIO);
+ imx233_pinctrl_enable_gpio(BLH_GPIO_BANK, BLH_GPIO_PIN, false);
+# ifdef BLH_GPIO_PULLUP
+ imx233_pinctrl_enable_pullup(BLH_GPIO_BANK, BLH_GPIO_PIN, true);
+# endif
+#endif
}
+#if defined(HAS_BUTTON_HOLD) && IMX233_BUTTON_LRADC_HOLD_DET == BLH_ADC
bool imx233_button_lradc_hold(void)
{
return button_mask == IMX233_BUTTON_LRADC_HOLD;
}
+#endif
+
+
+#if defined(HAS_BUTTON_HOLD) && IMX233_BUTTON_LRADC_HOLD_DET == BLH_GPIO
+bool imx233_button_lradc_hold(void)
+{
+ bool res = imx233_pinctrl_get_gpio(BLH_GPIO_BANK, BLH_GPIO_PIN);
+#ifdef BLH_GPIO_INVERTED
+ res = !res;
+#endif
+ return res;
+}
+#endif
+
+int imx233_button_lradc_read(int others)
+{
+#ifdef HAS_BUTTON_HOLD
+ return imx233_button_lradc_hold() ? 0 : button_mask | others;
+#else
+ return button_mask | others;
+#endif
+}
-int imx233_button_lradc_read(void)
+int imx233_button_lradc_read_raw(void)
{
- return button_mask == IMX233_BUTTON_LRADC_HOLD ? 0 : button_mask;
+ return raw_val;
}
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 @@
* and variables:
* - imx233_button_lradc_mapping: target-defined table of adc values and mapping
* - IMX233_BUTTON_LRADC_CHANNEL: lradc channel to use
+ * - IMX233_BUTTON_LRADC_HOLD_DET: define hold detection method (ignored if !HAS_BUTTON_HOLD)
+ *
+ * The available values of IMX233_BUTTON_LRADC_HOLD are:
+ * - BLH_ADC: detect hold using adc
+ * - BLH_EXT: target button driver implements imx233_button_lradc_hold() using
+ * any external method of its choice
+ * - BLH_GPIO: detect hold using a GPIO, needs to define additional defines:
+ * + BLH_GPIO_BANK: pin bank
+ * + BLH_GPIO_PIN: pin in bank
+ * + BLH_GPIO_INVERTED: define if inverted, default is active high
+ * + BLH_GPIO_PULLUP: define if pins needs pullup
*/
-/* special value for btn to handle HOLD */
+/* hold detect method */
+#define BLH_ADC 0
+#define BLH_EXT 1
+#define BLH_GPIO 2
+
+/* special value for btn to indicate end of list */
#define IMX233_BUTTON_LRADC_END -1
+/* special value for btn to handle HOLD */
#define IMX233_BUTTON_LRADC_HOLD -2
struct imx233_button_lradc_mapping_t
@@ -50,7 +67,12 @@ struct imx233_button_lradc_mapping_t
extern struct imx233_button_lradc_mapping_t imx233_button_lradc_mapping[];
void imx233_button_lradc_init(void);
-int imx233_button_lradc_read(void);
+/* others gives the bitmask of other buttons: the function will OR the result
+ * with them except if hold is detected in which case 0 is always returned */
+int imx233_button_lradc_read(int others);
+#ifdef HAS_BUTTON_HOLD
bool imx233_button_lradc_hold(void);
+#endif
+int imx233_button_lradc_read_raw(void); // return raw adc value
#endif /* __button_lradc_imx233__ */