diff options
| author | Amaury Pouly <amaury.pouly@gmail.com> | 2016-05-30 16:24:38 +0100 |
|---|---|---|
| committer | Amaury Pouly <amaury.pouly@gmail.com> | 2016-06-01 23:09:27 +0200 |
| commit | d42a4a4eb4bc20fda41543b8b831c1970723346f (patch) | |
| tree | f6ba16e95c61e441c1f110131b17a710c785285c /firmware/export | |
| parent | b2afd931e2d83ce346811a68a34ee56c48be6d35 (diff) | |
| download | rockbox-d42a4a4eb4bc20fda41543b8b831c1970723346f.zip rockbox-d42a4a4eb4bc20fda41543b8b831c1970723346f.tar.gz rockbox-d42a4a4eb4bc20fda41543b8b831c1970723346f.tar.bz2 rockbox-d42a4a4eb4bc20fda41543b8b831c1970723346f.tar.xz | |
zenxfi3: rewrite mpr121 driver
The new driver uses an asynchronous architecture for touch status reading.
Change-Id: Ic75a8b91bc47ee16c3af873afde178cd70186376
Diffstat (limited to 'firmware/export')
| -rw-r--r-- | firmware/export/mpr121.h | 314 |
1 files changed, 167 insertions, 147 deletions
diff --git a/firmware/export/mpr121.h b/firmware/export/mpr121.h index 96b83ec..50c13a1 100644 --- a/firmware/export/mpr121.h +++ b/firmware/export/mpr121.h @@ -18,153 +18,173 @@ * KIND, either express or implied. * ****************************************************************************/ +#ifndef __MPR121_H__ +#define __MPR121_H__ -/** Driver for the Freescale MPR121 Capacitive Proximity Sensor */ +/** Registers for the Freescale MPR121 Capacitive Proximity Sensor */ #include "system.h" -#define ELECTRODE_COUNT 12 -#define ELE_GPIO_FIRST 4 -#define ELE_GPIO_LAST 11 - -/* gpio config (encoding: [0]=en,[1]=dir,[2]=ctl[1],[3]=ctl[0]) */ -#define ELE_GPIO_DISABLE 0 -#define ELE_GPIO_INPUT 1 -#define ELE_GPIO_INPUT_PULLDOWN 9 /* input with pull-down */ -#define ELE_GPIO_INPUT_PULLUP 13 /* input with pull-up */ -#define ELE_GPIO_OUTPUT 3 -#define ELE_GPIO_OUTPUT_OPEN 11 /* open drain low-side */ -#define ELE_GPIO_OUTPUT_OPEN_LED 15 /* open drain high-side (led driver) */ - -/* internal use */ -#define ELE_GPIO_EN(val) ((val) & 1) -#define ELE_GPIO_DIR(val) (((val) >> 1) & 1) -#define ELE_GPIO_CTL0(val) (((val) >> 3) & 1) -#define ELE_GPIO_CTL1(val) (((val) >> 1) & 1) - -struct mpr121_electrode_config_t -{ - uint8_t bv; /* baseline value */ - uint8_t tth; /* touch threshold */ - uint8_t rth; /* release threshold */ - uint8_t cdc; /* charge current (optional if auto-conf) */ - uint8_t cdt; /* charge time (optional if auto-conf) */ - int gpio; /* gpio config */ -}; - -struct mpr121_baseline_filter_config_t -{ - uint8_t mhd; /* max half delta (except for touched) */ - uint8_t nhd; /* noise half delta */ - uint8_t ncl; /* noise count limit */ - uint8_t fdl; /* filter delay count limit */ -}; - -struct mpr121_baseline_filters_config_t -{ - struct mpr121_baseline_filter_config_t rising; - struct mpr121_baseline_filter_config_t falling; - struct mpr121_baseline_filter_config_t touched; -}; - -struct mpr121_debounce_config_t -{ - uint8_t dt; /* debounce count for touch */ - uint8_t dr; /* debounce count for release */ -}; - -/* first filter iterations */ -#define FFI_6_SAMPLES 0 -#define FFI_10_SAMPLES 1 -#define FFI_18_SAMPLES 2 -#define FFI_34_SAMPLES 3 -/* charge discharge current */ -#define CDC_DISABLE 0 -#define CDC_uA(ua) (ua) -/* charge discharge time */ -#define CDT_DISABLE 0 -#define CDT_log_us(lus) (lus) /* actual value = 2^{us-2} µs */ -/* second filter iterations */ -#define SFI_4_SAMPLES 0 -#define SFI_6_SAMPLES 1 -#define SFI_10_SAMPLES 2 -#define SFI_18_SAMPLES 3 -/* Eletrode sample interval */ -#define ESI_log_ms(lms) (lms) /* actual value = 2^{lms} ms */ - -struct mpr121_global_config_t -{ - uint8_t ffi; /* first filter iterations */ - uint8_t cdc; /* global charge discharge current */ - uint8_t cdt; /* global charge discharge time */ - uint8_t sfi; /* second first iterations */ - uint8_t esi; /* electrode sample interval */ -}; - -#define RETRY_NEVER 0 -#define RETRY_2_TIMES 1 -#define RETRY_4_TIMES 2 -#define RETRY_8_TIMES 3 - -struct mpr121_auto_config_t -{ - bool en; /* auto-conf enable */ - bool ren; /* auto-reconf enable */ - uint8_t retry; /* retry count */ - bool scts; /* skip charge time search */ - uint8_t usl; /* upper-side limit */ - uint8_t lsl; /* lower-side limit */ - uint8_t tl; /* target level */ - bool acfie; /* auto-conf fail interrupt en */ - bool arfie; /* auto-reconf fail interrupt en */ - bool oorie; /* out of range interrupt en */ -}; - -/* electrode mode */ -#define ELE_DISABLE 0 -#define ELE_EN0_x(x) ((x) + 1) -/* eleprox mode */ -#define ELEPROX_DISABLE 0 -#define ELEPROX_EN0_1 1 -#define ELEPROX_EN0_3 2 -#define ELEPROX_EN0_11 3 -/* calibration lock */ -#define CL_SLOW_TRACK 0 -#define CL_DISABLE 1 -#define CL_TRACK 2 -#define CL_FAST_TRACK 3 - -struct mpr121_config_t -{ - struct mpr121_electrode_config_t ele[ELECTRODE_COUNT]; - struct mpr121_electrode_config_t eleprox; - struct - { - struct mpr121_baseline_filters_config_t ele; - struct mpr121_baseline_filters_config_t eleprox; - }filters; - struct mpr121_debounce_config_t debounce; - struct mpr121_global_config_t global; - struct mpr121_auto_config_t autoconf; - uint8_t ele_en; /* eletroce mode */ - uint8_t eleprox_en; /* proximity mode */ - uint8_t cal_lock; /* calibration lock */ -}; - -/* gpio value */ -#define ELE_GPIO_CLR 0 -#define ELE_GPIO_SET 1 -#define ELE_GPIO_TOG 2 -/* pwm value */ -#define ELE_PWM_DISABLE 0 -#define ELE_PWM_DUTY(x) (x) -#define ELE_PWM_MIN_DUTY 1 -#define ELE_PWM_MAX_DUTY 15 - -int mpr121_init(int dev_i2c_addr); -int mpr121_soft_reset(void); -int mpr121_set_config(struct mpr121_config_t *conf); -/* gpios are only implemented for electrode>=4 */ -int mpr121_set_gpio_output(int ele, int gpio_val); -int mpr121_set_gpio_pwm(int ele, int pwm); -/* get electrode status (bitmap) */ -int mpr121_get_touch_status(unsigned *status); +/* Touch status: EL{0,7} */ +#define REG_TOUCH_STATUS 0x00 +#define REG_TOUCH_STATUS__ELE(x) (1 << (x)) +/* Touch status: EL{8-11,prox}, overcurrent */ +#define REG_TOUCH_STATUS2 0x01 +#define REG_TOUCH_STATUS2__ELE(x) (1 << ((x) - 8)) +#define REG_TOUCH_STATUS2__ELEPROX (1 << 4) +#define REG_TOUCH_STATUS2__OVCF (1 << 7) +/* Out of range: EL{0,7} */ +#define REG_OOR_STATUS 0x02 +#define REG_OOR_STATUS__ELE(x) (1 << (x)) +/* Out of range: EL{8-11,prox}, autoconf err */ +#define REG_OOR_STATUS2 0x03 +#define REG_OOR_STATUS2__ELE(x) (1 << (x)) +#define REG_OOR_STATUS2__ELEPROX (1 << 4) +#define REG_OOR_STATUS2__ACFF (1 << 6) +#define REG_OOR_STATUS2__ARFF (1 << 7) +/* Electrode X filtered data LSB */ +#define REG_EFDxLB(x) (0x04 + 0x02 * (x)) +/* Electrode X filtered data MSB */ +#define REG_EFDxHB(x) (0x05 + 0x02 * (x)) +/* Proximity electrode X filtered data LSB */ +#define REG_EFDPROXLB 0x1c +/* Proximity electrode X filtered data MSB */ +#define REG_EFDPROXHB 0x1d +/* Electrode baseline value */ +#define REG_ExBV(x) (0x1e + (x)) +/* Proximity electrode baseline value */ +#define REG_EPROXBV 0x2a +/* Max Half Delta Rising */ +#define REG_MHDR 0x2b +/* Noise Half Delta Rising */ +#define REG_NHDR 0x2c +/* Noise Count Limit Rising */ +#define REG_NCLR 0x2d +/* Filter Delay Limit Rising */ +#define REG_FDLR 0x2e +/* Max Half Delta Falling */ +#define REG_MHDF 0x2f +/* Noise Half Delta Falling */ +#define REG_NHDF 0x30 +/* Noise Count Limit Falling */ +#define REG_NCLF 0x31 +/* Filter Delay Limit Falling */ +#define REG_FDLF 0x32 +/* Noise Half Delta Touched */ +#define REG_NHDT 0x33 +/* Noise Count Limit Touched */ +#define REG_NCLT 0x34 +/* Filter Delay Limit Touched */ +#define REG_FDLT 0x35 +/* Proximity Max Half Delta Rising */ +#define REG_MHDPROXR 0x36 +/* Proximity Noise Half Delta Rising */ +#define REG_NHDPROXR 0x37 +/* Proximity Noise Count Limit Rising */ +#define REG_NCLPROXR 0x38 +/* Proximity Filter Delay Limit Rising */ +#define REG_FDLPROXR 0x39 +/* Proximity Max Half Delta Falling */ +#define REG_MHDPROXF 0x3a +/* Proximity Noise Half Delta Falling */ +#define REG_NHDPROXF 0x3b +/* Proximity Noise Count Limit Falling */ +#define REG_NCLPROXF 0x3c +/* Proximity Filter Delay Limit Falling */ +#define REG_FDLPROXF 0x3d +/* Proximity Noise Half Delta Touched */ +#define REG_NHDPROXT 0x3e +/* Proximity Noise Count Limit Touched */ +#define REG_NCLPROXT 0x3f +/* Proximity Filter Delay Limit Touched */ +#define REG_FDLPROXT 0x40 +/* Eletrode Touch Threshold */ +#define REG_ExTTH(x) (0x41 + 2 * (x)) +/* Eletrode Release Threshold */ +#define REG_ExRTH(x) (0x42 + 2 * (x)) +/* Proximity Eletrode Touch Threshold */ +#define REG_EPROXTTH 0x59 +/* Proximity Eletrode Release Threshold */ +#define REG_EPROXRTH 0x5a +/* Debounce Control */ +#define REG_DEBOUNCE 0x5b +#define REG_DEBOUNCE__DR(dr) ((dr) << 4) +#define REG_DEBOUNCE__DT(dt) (dt) +/* Analog Front End Configuration */ +#define REG_AFE 0x5c +#define REG_AFE__CDC(cdc) (cdc) +#define REG_AFE__FFI(ffi) ((ffi) << 6) +/* Filter Configuration */ +#define REG_FILTER 0x5d +#define REG_FILTER__ESI(esi) (esi) +#define REG_FILTER__SFI(sfi) ((sfi) << 3) +#define REG_FILTER__CDT(cdt) ((cdt) << 5) +/* Electrode Configuration */ +#define REG_ELECTRODE 0x5e +#define REG_ELECTRODE__ELE_EN(en) (en) +#define REG_ELECTRODE__ELEPROX_EN(en) ((en) << 4) +#define REG_ELECTRODE__CL(cl) ((cl) << 6) +/* Electrode X Current */ +#define REG_CDCx(x) (0x5f + (x)) +/* Proximity Eletrode X Current */ +#define REG_CDCPROX 0x6b +/* Electrode X Charge Time */ +#define REG_CDTx(x) (0x6c + (x) / 2) +#define REG_CDTx__CDT0(x) (x) +#define REG_CDTx__CDT1(x) ((x) << 4) +/* Proximity Eletrode X Charge Time */ +#define REG_CDTPROX 0x72 +/* GPIO Control Register: CTL0{4-11} */ +#define REG_GPIO_CTL0 0x73 +#define REG_GPIO_CTL0__CTL0x(x) (1 << ((x) - 4)) +/* GPIO Control Register: CTL1{4-11} */ +#define REG_GPIO_CTL1 0x74 +#define REG_GPIO_CTL1__CTL1x(x) (1 << ((x) - 4)) +/* GPIO Data Register */ +#define REG_GPIO_DATA 0x75 +#define REG_GPIO_DATA__DATx(x) (1 << ((x) - 4)) +/* GPIO Direction Register */ +#define REG_GPIO_DIR 0x76 +#define REG_GPIO_DIR__DIRx(x) (1 << ((x) - 4)) +/* GPIO Enable Register */ +#define REG_GPIO_EN 0x77 +#define REG_GPIO_EN__ENx(x) (1 << ((x) - 4)) +/* GPIO Data Set Register */ +#define REG_GPIO_SET 0x78 +#define REG_GPIO_SET__SETx(x) (1 << ((x) - 4)) +/* GPIO Data Clear Register */ +#define REG_GPIO_CLR 0x79 +#define REG_GPIO_CLR__CLRx(x) (1 << ((x) - 4)) +/* GPIO Data Toggle Register */ +#define REG_GPIO_TOG 0x7a +#define REG_GPIO_TOG__TOGx(x) (1 << ((x) - 4)) +/* Auto-Configuration Control 0 */ +#define REG_AUTO_CONF 0x7b +#define REG_AUTO_CONF__ACE(ace) (ace) +#define REG_AUTO_CONF__ARE(are) ((are) << 1) +#define REG_AUTO_CONF__BVA(bva) ((bva) << 2) +#define REG_AUTO_CONF__RETRY(retry) ((retry) << 4) +#define REG_AUTO_CONF__FFI(ffi) ((ffi) << 6) +/* Auto-Configuration Control 1 */ +#define REG_AUTO_CONF2 0x7c +#define REG_AUTO_CONF2__ACFIE(acfie) (acfie) +#define REG_AUTO_CONF2__ARFIE(arfie) ((arfie) << 1) +#define REG_AUTO_CONF2__OORIE(oorie) ((oorie) << 2) +#define REG_AUTO_CONF2__SCTS(scts) ((scts) << 7) +/* Auto-Configuration Upper-Limit */ +#define REG_USL 0x7d +/* Auto-Configuration Lower-Limit */ +#define REG_LSL 0x7e +/* Auto-Configuration Target Level */ +#define REG_TL 0x7f +/* Soft-Reset */ +#define REG_SOFTRESET 0x80 +#define REG_SOFTRESET__MAGIC 0x63 +/* PWM Control */ +#define REG_PWMx(x) (0x81 + ((x) - 4) / 2) +#define REG_PWMx_IS_PWM0(x) (((x) % 2) == 0) +#define REG_PWMx__PWM0(x) (x) +#define REG_PWMx__PWM0_BM 0xf +#define REG_PWMx__PWM1(x) ((x) << 4) +#define REG_PWMx__PWM1_BM 0xf0 + +#endif /* __MPR121_H__ */ |