forked from len0rd/rockbox
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
This commit is contained in:
parent
2f5f2ba91d
commit
5909438193
2 changed files with 72 additions and 7 deletions
|
|
@ -21,11 +21,22 @@
|
|||
#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
|
||||
#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 */
|
||||
#define CHAN IMX233_BUTTON_LRADC_CHANNEL
|
||||
/* number of irq per second */
|
||||
|
|
@ -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
|
||||
|
||||
int imx233_button_lradc_read(void)
|
||||
|
||||
#if defined(HAS_BUTTON_HOLD) && IMX233_BUTTON_LRADC_HOLD_DET == BLH_GPIO
|
||||
bool imx233_button_lradc_hold(void)
|
||||
{
|
||||
return button_mask == IMX233_BUTTON_LRADC_HOLD ? 0 : button_mask;
|
||||
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_raw(void)
|
||||
{
|
||||
return raw_val;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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__ */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue