ADS7843 cleanup

ugfx_release_2.6
Tectu 2012-08-16 12:55:18 +02:00
parent b402228265
commit 53000e3c19
1 changed files with 248 additions and 237 deletions

View File

@ -1,237 +1,248 @@
/* /*
ChibiOS-LCD-Driver - Copyright (C) 2012 ChibiOS-LCD-Driver - Copyright (C) 2012
Joel Bodenmann aka Tectu <joel@unormal.org> Joel Bodenmann aka Tectu <joel@unormal.org>
This file is part of ChibiOS-LCD-Driver. This file is part of ChibiOS-LCD-Driver.
ChibiOS-LCD-Driver is free software; you can redistribute it and/or modify ChibiOS-LCD-Driver is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or the Free Software Foundation; either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
ChibiOS-LCD-Driver is distributed in the hope that it will be useful, ChibiOS-LCD-Driver is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** /**
* @file touchpadADS7843/touchpad_lld.c * @file touchpadXPT2046/touchpad_lld.c
* @brief Touchpad Driver subsystem low level driver source. * @brief Touchpad Driver subsystem low level driver source.
* *
* @addtogroup TOUCHPAD * @addtogroup TOUCHPAD
* @{ * @{
*/ */
#include "ch.h" #include "ch.h"
#include "hal.h" #include "hal.h"
#include "touchpad.h" #include "touchpad.h"
#if HAL_USE_TOUCHPAD || defined(__DOXYGEN__) #if HAL_USE_TOUCHPAD || defined(__DOXYGEN__)
/*===========================================================================*/ /*===========================================================================*/
/* Driver local definitions. */ /* Driver local definitions. */
/*===========================================================================*/ /*===========================================================================*/
#ifdef UNUSED #ifdef UNUSED
#elif defined(__GNUC__) #elif defined(__GNUC__)
# define UNUSED(x) UNUSED_ ## x __attribute__((unused)) # define UNUSED(x) UNUSED_ ## x __attribute__((unused))
#elif defined(__LCLINT__) #elif defined(__LCLINT__)
# define UNUSED(x) /*@unused@*/ x # define UNUSED(x) /*@unused@*/ x
#else #else
# define UNUSED(x) x # define UNUSED(x) x
#endif #endif
/*===========================================================================*/ /*===========================================================================*/
/* Driver exported variables. */ /* Driver exported variables. */
/*===========================================================================*/ /*===========================================================================*/
/*===========================================================================*/ /*===========================================================================*/
/* Driver local variables. */ /* Driver local variables. */
/*===========================================================================*/ /*===========================================================================*/
#if !defined(__DOXYGEN__) #if !defined(__DOXYGEN__)
/* Local copy of the current touchpad driver */ /* Local copy of the current touchpad driver */
static const TOUCHPADDriver *tpDriver; static const TOUCHPADDriver *tpDriver;
static uint16_t sampleBuf[7]; static uint16_t sampleBuf[7];
#endif #endif
/*===========================================================================*/ /*===========================================================================*/
/* Driver local functions. */ /* Driver local functions. */
/*===========================================================================*/ /*===========================================================================*/
/*===========================================================================*/ /*===========================================================================*/
/* Driver interrupt handlers. */ /* Driver interrupt handlers. */
/*===========================================================================*/ /*===========================================================================*/
/*===========================================================================*/ /*===========================================================================*/
/* Driver exported functions. */ /* Driver exported functions. */
/*===========================================================================*/ /*===========================================================================*/
/* ---- Required Routines ---- */ /* ---- Required Routines ---- */
/** /**
* @brief Low level Touchpad driver initialization. * @brief Low level Touchpad driver initialization.
* *
* @notapi * @notapi
*/ */
void tp_lld_init(const TOUCHPADDriver *tp) { void tp_lld_init(const TOUCHPADDriver *tp) {
tpDriver=tp; tpDriver = tp;
if (tpDriver->direct_init) if(tpDriver->direct_init)
spiStart(tpDriver->spip, tpDriver->spicfg); spiStart(tpDriver->spip, tpDriver->spicfg);
} }
/** /**
* @brief Reads a conversion from the touchpad * @brief Reads a conversion from the touchpad
* *
* @param[in] cmd The command bits to send to the touchpad * @param[in] cmd The command bits to send to the touchpad
* *
* @return The read value 12-bit right-justified * @return The read value 12-bit right-justified
* *
* @note This function only reads data, it is assumed that the pins are * @note This function only reads data, it is assumed that the pins are
* configured properly and the bus has been acquired beforehand * configured properly and the bus has been acquired beforehand
* *
* @notapi * @notapi
*/ */
uint16_t tp_lld_read_value(uint8_t cmd) { uint16_t tp_lld_read_value(uint8_t cmd) {
static uint8_t txbuf[3]={0}; static uint8_t txbuf[3] = {0};
static uint8_t rxbuf[3]={0}; static uint8_t rxbuf[3] = {0};
uint16_t ret; uint16_t ret;
txbuf[0]=cmd; txbuf[0] = cmd;
spiExchange(tpDriver->spip, 3, txbuf, rxbuf); spiExchange(tpDriver->spip, 3, txbuf, rxbuf);
ret = (rxbuf[1] << 5) | (rxbuf[2] >> 3); ret = (rxbuf[1] << 5) | (rxbuf[2] >> 3);
return ret; return ret;
} }
/** /**
* @brief 7-point median filtering code for touchpad samples * @brief 7-point median filtering code for touchpad samples
* *
* @note This is an internally used routine only. * @note This is an internally used routine only.
* *
* @notapi * @notapi
*/ */
static void tp_lld_filter(void) { static void tp_lld_filter(void) {
uint16_t temp; uint16_t temp;
int i,j; int i,j;
for (i=0; i<4; i++) { for(i = 0; i < 4; i++) {
for (j=i; j<7; j++) { for(j=i; j < 7; j++) {
if (sampleBuf[i] > sampleBuf[j]) { if(sampleBuf[i] > sampleBuf[j]) {
/* Swap the values */ /* Swap the values */
temp=sampleBuf[i]; temp = sampleBuf[i];
sampleBuf[i]=sampleBuf[j]; sampleBuf[i] = sampleBuf[j];
sampleBuf[j]=temp; sampleBuf[j] = temp;
} }
} }
} }
}
}
/**
/** * @brief Reads out the X direction.
* @brief Reads out the X direction. *
* * @note The samples are median filtered for greater noise reduction
* @note The samples are median filtered for greater noise reduction *
* * @notapi
* @notapi */
*/ uint16_t tp_lld_read_x(void) {
uint16_t tp_lld_read_x(void) { int i;
int i;
#if defined(SPI_USE_MUTUAL_EXCLUSION)
#if defined(SPI_USE_MUTUAL_EXCLUSION) spiAcquireBus(tpDriver->spip);
spiAcquireBus(tpDriver->spip); #endif
#endif
TOUCHPAD_SPI_PROLOGUE();
TOUCHPAD_SPI_PROLOGUE(); palClearPad(tpDriver->spicfg->ssport, tpDriver->spicfg->sspad);
palClearPad(tpDriver->spicfg->ssport, tpDriver->spicfg->sspad);
/* Discard the first conversion - very noisy and keep the ADC on hereafter
/* Discard the first conversion - very noisy and keep the ADC on hereafter * till we are done with the sampling. Note that PENIRQ is disabled.
* till we are done with the sampling. Note that PENIRQ is disabled. */
*/ tp_lld_read_value(0xD1);
tp_lld_read_value(0xD1);
for(i = 0; i < 7; i++) {
for (i=0;i<7;i++) { sampleBuf[i]=tp_lld_read_value(0xD1);
sampleBuf[i]=tp_lld_read_value(0xD1); }
}
/* Switch on PENIRQ once again - perform a dummy read */
/* Switch on PENIRQ once again - perform a dummy read */ tp_lld_read_value(0xD0);
tp_lld_read_value(0xD0);
palSetPad(tpDriver->spicfg->ssport, tpDriver->spicfg->sspad);
palSetPad(tpDriver->spicfg->ssport, tpDriver->spicfg->sspad); TOUCHPAD_SPI_EPILOGUE();
TOUCHPAD_SPI_EPILOGUE();
#if defined(SPI_USE_MUTUAL_EXCLUSION)
#if defined(SPI_USE_MUTUAL_EXCLUSION) spiReleaseBus(tpDriver->spip);
spiReleaseBus(tpDriver->spip); #endif
#endif
/* Find the median - use selection sort */
/* Find the median - use selection sort */ tp_lld_filter();
tp_lld_filter();
return sampleBuf[3];
return sampleBuf[3]; }
}
/*
/* * @brief Reads out the Y direction.
* @brief Reads out the Y direction. *
* * @notapi
* @notapi */
*/ uint16_t tp_lld_read_y(void) {
uint16_t tp_lld_read_y(void) { int i;
int i;
#if defined(SPI_USE_MUTUAL_EXCLUSION)
#if defined(SPI_USE_MUTUAL_EXCLUSION) spiAcquireBus(tpDriver->spip);
spiAcquireBus(tpDriver->spip); #endif
#endif
TOUCHPAD_SPI_PROLOGUE();
TOUCHPAD_SPI_PROLOGUE(); palClearPad(tpDriver->spicfg->ssport, tpDriver->spicfg->sspad);
palClearPad(tpDriver->spicfg->ssport, tpDriver->spicfg->sspad);
/* Discard the first conversion - very noisy and keep the ADC on hereafter
/* Discard the first conversion - very noisy and keep the ADC on hereafter * till we are done with the sampling. Note that PENIRQ is disabled.
* till we are done with the sampling. Note that PENIRQ is disabled. */
*/ tp_lld_read_value(0x91);
tp_lld_read_value(0x91);
for(i = 0; i < 7; i++) {
for (i=0;i<7;i++) { sampleBuf[i] = tp_lld_read_value(0x91);
sampleBuf[i]=tp_lld_read_value(0x91); }
}
/* Switch on PENIRQ once again - perform a dummy read */
/* Switch on PENIRQ once again - perform a dummy read */ tp_lld_read_value(0x90);
tp_lld_read_value(0x90);
palSetPad(tpDriver->spicfg->ssport, tpDriver->spicfg->sspad);
palSetPad(tpDriver->spicfg->ssport, tpDriver->spicfg->sspad); TOUCHPAD_SPI_EPILOGUE();
TOUCHPAD_SPI_EPILOGUE();
#ifdef SPI_USE_MUTUAL_EXCLUSION
#ifdef SPI_USE_MUTUAL_EXCLUSION spiReleaseBus(tpDriver->spip);
spiReleaseBus(tpDriver->spip); #endif
#endif
/* Find the median - use selection sort */
/* Find the median - use selection sort */ tp_lld_filter();
tp_lld_filter();
return sampleBuf[3];
return sampleBuf[3]; }
}
/* ---- Optional Routines ---- */
/* ---- Optional Routines ---- */ #if TOUCHPAD_HAS_IRQ || defined(__DOXYGEN__)
#if TOUCHPAD_HAS_IRQ || defined(__DOXYGEN__) /*
/* * @brief for checking if touchpad is pressed or not.
* @brief for checking if touchpad is pressed or not. *
* * @return 1 if pressed / 0 if not pressed
* @return 1 if pressed / 0 if not pressed *
* * @notapi
* @notapi */
*/ uint8_t tp_lld_irq(void) {
uint8_t tp_lld_irq(void) { return (!palReadPad(tpDriver->tpIRQPort, tpDriver->tpIRQPin));
return (!palReadPad(tpDriver->tpIRQPort, tpDriver->tpIRQPin)); }
} #endif
#endif
#if TOUCHPAD_HAS_PRESSURE || defined(__DOXYGEN__)
#endif /* HAL_USE_TOUCHPAD */ /*
/** @} */ * @brief Reads out the Z direction / pressure.
*
* @notapi
*/
uint16_t tp_lld_read_z(void) {
/* ToDo */
return 42;
}
#endif
#endif /* HAL_USE_TOUCHPAD */
/** @} */