/*
* Copyright (c) 2010 Jiri Svoboda
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* - The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/** @addtogroup uspace_srv_s3c24xx_ts
* @{
*/
/**
* @file
* @brief Samsung S3C24xx on-chip ADC and touch-screen interface driver.
*/
#ifndef S3C24XX_TS_H_
#define S3C24XX_TS_H_
#include <stdint.h>
#include <async.h>
/** S3C24xx ADC and touch-screen I/O */
typedef struct {
uint32_t con;
uint32_t tsc;
uint32_t dly;
uint32_t dat0;
uint32_t dat1;
uint32_t updn;
} s3c24xx_adc_io_t;
/* Fields in ADCCON register */
#define ADCCON_ECFLG 0x8000
#define ADCCON_PRSCEN 0x4000
#define ADCCON_PRSCVL(val) (((val) & 0xff) << 6)
#define ADCCON_SEL_MUX(smux) (((smux) & 7) << 3)
#define ADCCON_STDBM 0x0004
#define ADCCON_READ_START 0x0002
#define ADCCON_ENABLE_START 0x0001
/* Values for ADCCON_SEL_MUX */
#define SMUX_AIN0 0
#define SMUX_AIN1 1
#define SMUX_AIN2 2
#define SMUX_AIN3 3
#define SMUX_YM 4
#define SMUX_YP 5
#define SMUX_XM 6
#define SMUX_XP 7
/* Fields in ADCTSC register */
#define ADCTSC_DSUD_UP 0x0100
#define ADCTSC_YM_ENABLE 0x0080
#define ADCTSC_YP_DISABLE 0x0040
#define ADCTSC_XM_ENABLE 0x0020
#define ADCTSC_XP_DISABLE 0x0010
#define ADCTSC_PULLUP_DISABLE 0x0008
#define ADCTSC_AUTO_PST 0x0004
#define ADCTSC_XY_PST_NOOP 0x0000
#define ADCTSC_XY_PST_X 0x0001
#define ADCTSC_XY_PST_Y 0x0002
#define ADCTSC_XY_PST_WAITINT 0x0003
#define ADCTSC_XY_PST_MASK 0x0003
/* Fields in ADCDAT0, ADCDAT1 registers */
#define ADCDAT_UPDOWN 0x8000
#define ADCDAT_AUTO_PST 0x4000
/* Fields in ADCUPDN register */
#define ADCUPDN_TSC_UP 0x0002
#define ADCUPDN_TSC_DN 0x0001
/** Touchscreen interrupt number */
#define S3C24XX_TS_INR 31
/** Touchscreen I/O address */
#define S3C24XX_TS_ADDR 0x58000000
typedef enum {
ts_wait_pendown,
ts_sample_pos,
ts_wait_penup
} ts_state_t;
typedef enum {
updn_up,
updn_down
} ts_updn_t;
/** S3C24xx touchscreen driver instance */
typedef struct {
/** Physical device address */
uintptr_t paddr;
/** Device I/O structure */
s3c24xx_adc_io_t *io;
/** Callback session to the client */
async_sess_t *client_sess;
/** Service ID */
service_id_t service_id;
/** Device/driver state */
ts_state_t state;
/** Previous position reported to client. */
int last_x;
int last_y;
} s3c24xx_ts_t;
#endif
/** @}
*/