ADS7843 update

Same changes as the XPT2046
ugfx_release_2.6
Kumar Abhishek 2012-08-16 15:40:48 +05:30
parent a41a5911e5
commit 0b8c95ab20
1 changed files with 237 additions and 146 deletions

View File

@ -1,146 +1,237 @@
/* /*
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 touchpadADS7843/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. */
/*===========================================================================*/ /*===========================================================================*/
#define TP_CS_HIGH palSetPad(TP_CS_PORT, TP_CS) #ifdef UNUSED
#define TP_CS_LOW palClearPad(TP_CS_PORT, TP_CS) #elif defined(__GNUC__)
# define UNUSED(x) UNUSED_ ## x __attribute__((unused))
#ifdef UNUSED #elif defined(__LCLINT__)
#elif defined(__GNUC__) # define UNUSED(x) /*@unused@*/ x
# define UNUSED(x) UNUSED_ ## x __attribute__((unused)) #else
#elif defined(__LCLINT__) # define UNUSED(x) x
# define UNUSED(x) /*@unused@*/ x #endif
#else
# define UNUSED(x) x /*===========================================================================*/
#endif /* Driver exported variables. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver exported variables. */ /*===========================================================================*/
/*===========================================================================*/ /* Driver local variables. */
/*===========================================================================*/
#if !defined(__DOXYGEN__) #if !defined(__DOXYGEN__)
TOUCHPADDriver Touchpad; /* Local copy of the current touchpad driver */
#endif static const TOUCHPADDriver *tpDriver;
/*===========================================================================*/ static uint16_t sampleBuf[7];
/* Driver local variables. */ #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(TOUCHPADDriver *tp) { tpDriver=tp;
spiStart(tp->spid, tp->spicfg);
} if (tpDriver->direct_init)
spiStart(tpDriver->spip, tpDriver->spicfg);
/** }
* @brief Reads out the X direction.
*
* @notapi /**
*/ * @brief Reads a conversion from the touchpad
uint16_t tp_lld_read_x(void) { *
uint8_t txbuf[1]; * @param[in] cmd The command bits to send to the touchpad
uint8_t rxbuf[2]; *
uint16_t x; * @return The read value 12-bit right-justified
*
txbuf[0] = 0xd0; * @note This function only reads data, it is assumed that the pins are
TP_CS_LOW; * configured properly and the bus has been acquired beforehand
spiSend(&SPID1, 1, txbuf); *
spiReceive(&SPID1, 2, rxbuf); * @notapi
TP_CS_HIGH; */
uint16_t tp_lld_read_value(uint8_t cmd) {
x = rxbuf[0] << 4; static uint8_t txbuf[3]={0};
x |= rxbuf[1] >> 4; static uint8_t rxbuf[3]={0};
uint16_t ret;
return x;
} txbuf[0]=cmd;
/* spiExchange(tpDriver->spip, 3, txbuf, rxbuf);
* @brief Reads out the Y direction.
* ret = (rxbuf[1] << 5) | (rxbuf[2] >> 3);
* @notapi
*/ return ret;
uint16_t tp_lld_read_y(void) { }
uint8_t txbuf[1];
uint8_t rxbuf[2]; /**
uint16_t y; * @brief 7-point median filtering code for touchpad samples
*
txbuf[0] = 0x90; * @note This is an internally used routine only.
TP_CS_LOW; *
spiSend(&SPID1, 1, txbuf); * @notapi
spiReceive(&SPID1, 2, rxbuf); */
TP_CS_HIGH; static void tp_lld_filter(void) {
uint16_t temp;
y = rxbuf[0] << 4; int i,j;
y |= rxbuf[1] >> 4;
for (i=0; i<4; i++) {
return y; for (j=i; j<7; j++) {
} if (sampleBuf[i] > sampleBuf[j]) {
/* Swap the values */
/* ---- Optional Routines ---- */ temp=sampleBuf[i];
#if TOUCHPAD_HAS_IRQ || defined(__DOXYGEN__) sampleBuf[i]=sampleBuf[j];
/* sampleBuf[j]=temp;
* @brief for checking if touchpad is pressed or not. }
* }
* @return 1 if pressed / 0 if not pressed }
*
* @noapi }
*/
uint8_t tp_lld_irq(void) { /**
return (!palReadPad(TP_IRQ_PORT, TP_IRQ)); * @brief Reads out the X direction.
} *
#endif * @note The samples are median filtered for greater noise reduction
*
#endif /* HAL_USE_TOUCHPAD */ * @notapi
/** @} */ */
uint16_t tp_lld_read_x(void) {
int i;
#if defined(SPI_USE_MUTUAL_EXCLUSION)
spiAcquireBus(tpDriver->spip);
#endif
TOUCHPAD_SPI_PROLOGUE();
palClearPad(tpDriver->spicfg->ssport, tpDriver->spicfg->sspad);
/* Discard the first conversion - very noisy and keep the ADC on hereafter
* till we are done with the sampling. Note that PENIRQ is disabled.
*/
tp_lld_read_value(0xD1);
for (i=0;i<7;i++) {
sampleBuf[i]=tp_lld_read_value(0xD1);
}
/* Switch on PENIRQ once again - perform a dummy read */
tp_lld_read_value(0xD0);
palSetPad(tpDriver->spicfg->ssport, tpDriver->spicfg->sspad);
TOUCHPAD_SPI_EPILOGUE();
#if defined(SPI_USE_MUTUAL_EXCLUSION)
spiReleaseBus(tpDriver->spip);
#endif
/* Find the median - use selection sort */
tp_lld_filter();
return sampleBuf[3];
}
/*
* @brief Reads out the Y direction.
*
* @notapi
*/
uint16_t tp_lld_read_y(void) {
int i;
#if defined(SPI_USE_MUTUAL_EXCLUSION)
spiAcquireBus(tpDriver->spip);
#endif
TOUCHPAD_SPI_PROLOGUE();
palClearPad(tpDriver->spicfg->ssport, tpDriver->spicfg->sspad);
/* Discard the first conversion - very noisy and keep the ADC on hereafter
* till we are done with the sampling. Note that PENIRQ is disabled.
*/
tp_lld_read_value(0x91);
for (i=0;i<7;i++) {
sampleBuf[i]=tp_lld_read_value(0x91);
}
/* Switch on PENIRQ once again - perform a dummy read */
tp_lld_read_value(0x90);
palSetPad(tpDriver->spicfg->ssport, tpDriver->spicfg->sspad);
TOUCHPAD_SPI_EPILOGUE();
#ifdef SPI_USE_MUTUAL_EXCLUSION
spiReleaseBus(tpDriver->spip);
#endif
/* Find the median - use selection sort */
tp_lld_filter();
return sampleBuf[3];
}
/* ---- Optional Routines ---- */
#if TOUCHPAD_HAS_IRQ || defined(__DOXYGEN__)
/*
* @brief for checking if touchpad is pressed or not.
*
* @return 1 if pressed / 0 if not pressed
*
* @notapi
*/
uint8_t tp_lld_irq(void) {
return (!palReadPad(tpDriver->tpIRQPort, tpDriver->tpIRQPin));
}
#endif
#endif /* HAL_USE_TOUCHPAD */
/** @} */