sspd_rts.h 8.1 KB
Newer Older
A
ArcherChang 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199
/*****************************************************************************
 *
 *            Copyright Andes Technology Corporation 2007-2008
 *                         All Rights Reserved.
 *
 *  Revision History:
 *
 *    Mar.16.2008     Created.
 ****************************************************************************/

/*****************************************************************************
 *
 * FILE NAME                                         VERSION
 *
 *      sspd_rts.h
 *
 * DESCRIPTION
 *
 *      SPI digital serial interface protocol header for resistive
 *      touch screen controller.
 *
 * DATA STRUCTURES
 *
 *   None
 *
 * DEPENDENCIES
 *
 *   None
 *
 ****************************************************************************/
#ifndef __SSPD_RTS_H__
#define __SSPD_RTS_H__

/*****************************************************************************
 * Configuration Options
 ****************************************************************************/

/* Non-zero to enable 16-clock per conversion mode, otherwise 24-clock cycle is applied. */
#define RTS_16CLK_CONV_CYCLE    1

#define RTS_LISR_VECTOR		INTC_HW0_BIT		/* AG101 connects #PENIRQ to hw0 vector */

/* polling loop counter for waiting hw-reset */
#define RTS_RESET_WAIT		(0x300000)

/* CPU polling counter to avoid bouncing signals of previous RTS operation */
#define RTS_DEBOUNCE_WAIT	(0x30000)

/* polling counter for serial data in */
#define RTS_DIN_TIMEOUT		(0x30000)

/* HISR definitions */
#define RTS_HISR_PRIORITY	0		/* 0: highest, 2: lowest */
#define RTS_HISR_STACK_SIZE	2048		/* Please align to 32-bit */

#define RTS_HISR_AS_TOUCHED	0x00000001	/* Activate HISR for touched interrupt */


/*****************************************************************************
 * Resistive Touch Screen Digital Interface Definitions
 ****************************************************************************/

/* Definitions for ADS7846 */

/* Control Byte Bits */
#define RTS_ADS7846_PD_MASK	0x03		/* Start Bit (MSB) */
#define RTS_ADS7846_PD_SHIFT	0
    #define RTS_ADS7846_PD	0x00		/* power down between conversion, #penirq enabled */
    #define RTS_ADS7846_ADC	0x01		/* ref off, adc on, #penirq disabled */
    #define RTS_ADS7846_REF	0x02		/* ref on, adc off, #penirq enabled */
    #define RTS_ADS7846_PW	0x03		/* power on, ref on, adc on, #penirq disabled */

#define RTS_ADS7846_SER_MASK	0x04		/* Single-Ended/#Differential-Reference Register */
#define RTS_ADS7846_SER_SHIFT	2
    #define RTS_ADS7846_DF	0x00		/* differential */
    #define RTS_ADS7846_SE	0x01		/* single-ended */

#define RTS_ADS7846_MODE_MASK	0x08		/* Conversion Selection Bit */
#define RTS_ADS7846_MODE_SHIFT	3
    #define RTS_ADS7846_12_BITS	0x00		/* 12 bits conversion */
    #define RTS_ADS7846_8_BITS	0x01		/* 8 bits conversion */

#define RTS_ADS7846_MUX_MASK	0x70		/* (A2 ~ A0) Control the setting of multiplexer input */
#define RTS_ADS7846_MUX_SHIFT	4

    #define RTS_ADS7846_DF_X	0x05		/* [A2:A0] 101b, Driver: X+ X-, Measure Y+ */
    #define RTS_ADS7846_DF_Y	0x01		/* [A2:A0] 001b, Driver: Y+ Y-, Measure X+ */
    #define RTS_ADS7846_DF_Z1	0x03		/* [A2:A0] 011b, Driver: Y+ X-, Measure X+ */
    #define RTS_ADS7846_DF_Z2	0x04		/* [A2:A0] 100b, Driver: Y+ X-, Measure Y- */

    #define RTS_ADS7846_SE_X	0x05		/* [A2:A0] 101b */
    #define RTS_ADS7846_SE_Y	0x01		/* [A2:A0] 001b */
    #define RTS_ADS7846_SE_Z1	0x03		/* [A2:A0] 011b */
    #define RTS_ADS7846_SE_Z2	0x04		/* [A2:A0] 100b */
    #define RTS_ADS7846_SE_BAT	0x02		/* [A2:A0] 010b */
    #define RTS_ADS7846_SE_AUX	0x06		/* [A2:A0] 110b */
    #define RTS_ADS7846_SE_TEMP0	0x00	/* [A2:A0] 000b */
    #define RTS_ADS7846_SE_TEMP1	0x07	/* [A2:A0] 111b */

#define RTS_ADS7846_START_MASK	0x80            /* Start Bit (MSB) */
#define RTS_ADS7846_START_BIT	7
    #define RTS_ADS7846_START	1

/* Supplimental Macros */
#define RTS_ADS7846_PADDING_BYTE	0	/* Padding byte feed after the command byte to continue serial clocking */

#define RTS_ADS7846_CTRL_BYTE(mux, mode, ser, pd)                            \
    ((((uint32_t)(mux) << RTS_ADS7846_MUX_SHIFT) & RTS_ADS7846_MUX_MASK) |    \
     (((uint32_t)(mode) << RTS_ADS7846_MODE_SHIFT) & RTS_ADS7846_MODE_MASK) | \
     (((uint32_t)(ser) << RTS_ADS7846_SER_SHIFT) & RTS_ADS7846_SER_MASK) |    \
     (((uint32_t)(pd) << RTS_ADS7846_PD_SHIFT) & RTS_ADS7846_PD_MASK) |       \
     (uint32_t)RTS_ADS7846_START_MASK)

/* this is correct */
#define RTS_ADS7846_8BITS_DATA(msb, lsb)    ((((uint32_t)(msb) & 0x07) << 5) | (((uint32_t)(lsb) & 0xff) >> 3))
#ifndef CONFIG_PLAT_QEMU
#define RTS_ADS7846_12BITS_DATA(msb, lsb)   ((((uint32_t)(msb) & 0x7f) << 5) | (((uint32_t)(lsb) & 0xff) >> 3))
#else
#define RTS_ADS7846_12BITS_DATA(msb, lsb)   msb
//#define RTS_ADS7846_12BITS_DATA(msb, lsb)   ((msb >> 19) & 0xfff)
#endif

/* Pre-defined Control-Byte Constants */
#define RTS_ADS7846_CTL_RY  RTS_ADS7846_CTRL_BYTE(RTS_ADS7846_DF_Y, RTS_ADS7846_12_BITS,    \
                                                  RTS_ADS7846_DF, RTS_ADS7846_PW)
#define RTS_ADS7846_CTL_RX  RTS_ADS7846_CTRL_BYTE(RTS_ADS7846_DF_X, RTS_ADS7846_12_BITS,    \
                                                  RTS_ADS7846_DF, RTS_ADS7846_PW)
#define RTS_ADS7846_CTL_RZ1 RTS_ADS7846_CTRL_BYTE(RTS_ADS7846_DF_Z1, RTS_ADS7846_12_BITS,   \
                                                  RTS_ADS7846_DF, RTS_ADS7846_PW)
#define RTS_ADS7846_CTL_RZ2 RTS_ADS7846_CTRL_BYTE(RTS_ADS7846_DF_Z2, RTS_ADS7846_12_BITS,   \
                                                  RTS_ADS7846_DF, RTS_ADS7846_PW)

#define RTS_ADS7846_CTL_RY_PD   RTS_ADS7846_CTRL_BYTE(RTS_ADS7846_DF_Y, RTS_ADS7846_12_BITS,    \
                                                      RTS_ADS7846_DF, RTS_ADS7846_PD)
#define RTS_ADS7846_CTL_RX_PD   RTS_ADS7846_CTRL_BYTE(RTS_ADS7846_DF_X, RTS_ADS7846_12_BITS,    \
                                                      RTS_ADS7846_DF, RTS_ADS7846_PD)
#define RTS_ADS7846_CTL_RZ1_PD  RTS_ADS7846_CTRL_BYTE(RTS_ADS7846_DF_Z1, RTS_ADS7846_12_BITS,   \
                                                      RTS_ADS7846_DF, RTS_ADS7846_PD)
#define RTS_ADS7846_CTL_RZ2_PD  RTS_ADS7846_CTRL_BYTE(RTS_ADS7846_DF_Z2, RTS_ADS7846_12_BITS,   \
                                                      RTS_ADS7846_DF, RTS_ADS7846_PD)
#define RTS_ADS7846_CTL_PD      RTS_ADS7846_CTRL_BYTE(RTS_ADS7846_DF_Y, RTS_ADS7846_12_BITS,    \
                                                      RTS_ADS7846_DF, RTS_ADS7846_PD)
/*
 * DCLK
 * ---------------
 * From pp3:
 *   125 kHz max throughput rate, so ...
 *     DCLK_max = 125k * 16(16-clock-per-conversion mode) = 2.0MHz
 *
 * From table VI (p.p.14):
 *   (tch + tcl) = 400ns minimum, so ...
 *     DCLK_max = 1/400ns = 2.5MHz ?
 */
#define RTS_ADS7846_DCLK_MAX                2000000     /* adopt 2.0MHz for safe */
#define RTS_ADS7846_DCLK_DEFAULT            125000      /* 7812 data per second (3906 x-y/sec, or 1953 x-y-z1-z2/sec) */


/*****************************************************************************
 * SSP Controller Resistive Touch Screen Driver-Supplement Interfaces
 ****************************************************************************/
struct ts_data {

	int	x;
	int	y;
	int	z1;
	int	z2;
	int	pressed;

};

struct ts_dev {

	int left;
	int right;
	int top;
	int bottom;

	int lcd_width;
	int lcd_height;

	int			penirq;		/* initialize touch screen driver in #penirq mode or polling mode */
	int			penirq_en;	/* enable #penirq after initialization if penirq is non-zero */

	void			*event_obj;	/* (in) Event object to notify app about the interrupt. */
	struct ts_data		*event_data;	/* Client specified struct pointer to receive {x,y,touched} states */

	hal_semaphore_t		sem;
	struct ts_data		data;
};

extern int _sspd_rts_init(struct ts_dev *ts);
extern int _sspd_rts_probe(int *x, int *y, int *z1, int *z2, int *pressed);

extern void ts_adjust(struct ts_dev *ts, int ts_x, int ts_y, int *x, int *y);
extern void ts_raw_value(struct ts_dev *ts, int *x, int *y);
extern void ts_value(struct ts_dev *ts, int *x, int *y);
extern void ts_init(struct ts_dev *ts);
extern void ts_calibrate(struct ts_dev *ts, void (*draw_cross)(void *param, int x, int y), int count);
#endif /* __SSPD_RTS_H__ */