summaryrefslogtreecommitdiff
path: root/firmware/export
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2016-05-30 16:24:38 +0100
committerAmaury Pouly <amaury.pouly@gmail.com>2016-06-01 23:09:27 +0200
commitd42a4a4eb4bc20fda41543b8b831c1970723346f (patch)
treef6ba16e95c61e441c1f110131b17a710c785285c /firmware/export
parentb2afd931e2d83ce346811a68a34ee56c48be6d35 (diff)
downloadrockbox-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.h314
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__ */