535 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			535 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| #ifdef __KERNEL__
 | |
| #include <linux/delay.h>
 | |
| #include <linux/module.h>
 | |
| #include <linux/fs.h>
 | |
| #include <linux/interrupt.h>
 | |
| #include <linux/vmalloc.h>
 | |
| #include <linux/moduleparam.h>
 | |
| #include <linux/platform_device.h>
 | |
| #include <linux/i2c.h>
 | |
| #include <linux/slab.h>
 | |
| #include <linux/sched.h>
 | |
| #include <linux/io.h>
 | |
| #include <linux/of_device.h>
 | |
| #include <linux/kdev_t.h>
 | |
| #include <linux/clk.h>
 | |
| #include <linux/mm.h>
 | |
| #include <kwrap/dev.h>
 | |
| #include <linux/module.h>
 | |
| #include <linux/miscdevice.h>
 | |
| #include <linux/ioctl.h>
 | |
| #include <linux/uaccess.h>
 | |
| #include <linux/gpio.h>
 | |
| 
 | |
| #include "touch_gt911.h"
 | |
| #else
 | |
| //#include "kwrap/type.h"
 | |
| //#include "kwrap/semaphore.h"
 | |
| //#include "kwrap/flag.h"
 | |
| #include "touch_gt911.h"
 | |
| #include <stdio.h>
 | |
| #include <string.h>
 | |
| #include "plat/gpio.h"
 | |
| #include "touch_dtsi.h"
 | |
| #endif
 | |
| 
 | |
| #include "kwrap/util.h"
 | |
| #include <touch_inc.h>
 | |
| 
 | |
| //#include "SwTimer.h"
 | |
| //#include <stdlib.h>
 | |
| //#include "ErrorNo.h"
 | |
| //#include "Delay.h"
 | |
| #if 1
 | |
| //#include <compiler.h>
 | |
| //#include <rtosfdt.h>
 | |
| //#include <libfdt.h>
 | |
| #include "kwrap/error_no.h"
 | |
| #include "kwrap/type.h"
 | |
| #include "touch_common.h"
 | |
| #include "touch_dbg.h"
 | |
| #include "kwrap/util.h"
 | |
| 
 | |
| #endif
 | |
| 
 | |
| #if 0
 | |
| #define __MODULE__			touch_gt911
 | |
| #define __DBGLVL__			2      // 0=FATAL, 1=ERR, 2=WRN, 3=UNIT, 4=FUNC, 5=IND, 6=MSG, 7=VALUE, 8=USER
 | |
| #define __DBGFLT__			"*"    //*=All, [mark]=CustomClass
 | |
| #include <kwrap/debug.h>
 | |
| #endif
 | |
| static TOUCH_I2C touch_i2c = {
 | |
| 	TOUCH_I2C_ID_3, TOUCH_I2C_ADDR
 | |
| };
 | |
| 
 | |
| static TOUCH_DRV_INFO g_tp_drv_info[TOUCH_ID_MAX] = {
 | |
| 	{
 | |
| 	.tp_hw.i2c_cfg.i2c_id = TOUCH_I2C_ID_3,
 | |
| 	.tp_hw.i2c_cfg.i2c_addr = TOUCH_I2C_ADDR,
 | |
| 	.tp_hw.gpio_cfg.gpio_pwr = 6,
 | |
| 	.tp_hw.gpio_cfg.gpio_rst = 132,
 | |
| 	.tp_hw.gpio_cfg.gpio_int = 7,
 | |
| 	.tp_hw.reset_time.rst_time = 50,
 | |
| 	},
 | |
| };
 | |
| 
 | |
| TOUCH_DRV_INFO* mdrv_get_touch_info(UINT32 id)
 | |
| {
 | |
| 	id = TOUCH_MIN(id, TOUCH_ID_MAX-1);
 | |
| 
 | |
| 	return &g_tp_drv_info[id];
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| static INT32 touch_i2c_write(UINT32 addr, UINT32 data)
 | |
| {
 | |
| 	struct i2c_msg msgs;
 | |
| 	UINT8 buf[3];
 | |
| 	INT32 ret;
 | |
| 
 | |
| 	buf[0]     = (addr >> 8) & 0xFF;//(u8Reg>>8) & 0xff;
 | |
| 	buf[1]     = addr & 0xFF;
 | |
| 	buf[2]     = data & 0xFF;
 | |
| 	msgs.addr  = touch_i2c.addr;
 | |
| 	msgs.flags = 0;//w
 | |
| 	msgs.len   = 3;
 | |
| 	msgs.buf   = buf;
 | |
| 
 | |
| 	ret = touch_i2c_transfer(&msgs, 1);
 | |
| 	return ret;
 | |
| }
 | |
| 
 | |
| static UINT32 touch_i2c_read(UINT32 addr, UINT8 *data)
 | |
| {
 | |
| 	struct i2c_msg msgs[2];
 | |
| 	UINT8 buf[2], buf2[1];
 | |
| 	INT32 ret;
 | |
| 
 | |
| 	buf[0]        = (addr >> 8) & 0xFF;//(u8Reg>>8) & 0xff;
 | |
| 	buf[1]        = addr & 0xFF;
 | |
| 	msgs[0].addr  = touch_i2c.addr;
 | |
| 	msgs[0].flags = 0;//w
 | |
| 	msgs[0].len   = 2;
 | |
| 	msgs[0].buf   = buf;
 | |
| 
 | |
| 	buf2[0]       = 0;
 | |
| 	msgs[1].addr  = touch_i2c.addr;
 | |
| 	msgs[1].flags = 1;//r
 | |
| 	msgs[1].len   = 1;
 | |
| 	msgs[1].buf   = buf2;
 | |
| 
 | |
| 	ret = touch_i2c_transfer(msgs, 2);
 | |
| 	if (ret == 0) { //OK
 | |
| 		*data = buf2[0];
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 		buf2[0] = 0;
 | |
| 		*data = buf2[0];
 | |
| 	}
 | |
| 
 | |
| 	return ret;
 | |
| }
 | |
| int touch_init_gt911(void)
 | |
| {
 | |
| 	int ret;
 | |
| 
 | |
| 	ret = touch_i2c_init_driver(touch_i2c.id);
 | |
| 
 | |
| 
 | |
| 
 | |
| 	return ret;
 | |
| }
 | |
| BOOL DetTP_IsPenDown(void)
 | |
| {
 | |
|     //UINT32 uiTPCurLvl = 0;
 | |
| 	UINT8 tP_staus;
 | |
| 	UINT8 Tpbuffer;
 | |
| 
 | |
|     //uiTPCurLvl = gpio_getPin(GPIO_TP_INT);
 | |
|     //return (uiTPCurLvl == FALSE)?TRUE:FALSE;
 | |
| 
 | |
| 	touch_i2c_read(0x814E, &Tpbuffer);
 | |
| 	touch_i2c_write(0x814E,0x00);
 | |
| 	tP_staus = Tpbuffer>>7 ;
 | |
| 	//vk_pr_warn("tP_staus = 0x%x \r\n",tP_staus);
 | |
| 	DBG_IND("Tpbuffer=0x%x\r\n",Tpbuffer);
 | |
| 	if(0 != tP_staus)
 | |
| 	{
 | |
| 		if(0 != (Tpbuffer&0x0F))
 | |
| 		{
 | |
|             return TRUE;
 | |
|         }
 | |
| 	}
 | |
| 
 | |
| 	return FALSE;
 | |
| }
 | |
| //number 6:0x0D -- 0x0E
 | |
| #if 1//modify by 20210220 ljy
 | |
| UINT8 config[186]= {
 | |
| 0x5F,0x00,0x05,0x40,0x01,0x02,0x3D,0x00,0x01,0x0F,
 | |
| 0x28,0x0F,0x50,0x32,0x03,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,
 | |
| 0x00,0x18,0x1A,0x1E,0x14,0x8A,0x2A,0x0A,0x31,0x33,0xEB,0x04,0x00,
 | |
| 0x00,0x01,0x40,0x03,0x2D,0x00,0x01,0x00,0x00,0x00,0x03,0x64,
 | |
| 0x32,0x00,0x00,0x00,0x1E,0x50,0x94,0xD5,0x02,0x07,0x00,0x00,0x04,
 | |
| 0xB0,0x21,0x00,0x95,0x28,0x00,0x7E,0x31,0x00,0x6F,0x3B,0x00,0x63,
 | |
| 0x48,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 | |
| 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 | |
| 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x12,0x10,
 | |
| 0x0E,0x0C,0x0A,0x08,0x06,0x04,0x02,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
 | |
| 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x22,0x21,0x20,0x1F,0x1E,0x1D,0x1C,
 | |
| 0x18,0x16,0x00,0x02,0x04,0x06,0x08,0x0A,0x0F,0x10,0x12,0x13,0xFF,0xFF,
 | |
| 0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 | |
| 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x01};
 | |
| #endif
 | |
| #if 1
 | |
| #define TP_PRESSURE_TH      (320)     // 255 - 10
 | |
| 
 | |
| #define TP_HW_MAX_X         (1280)
 | |
| #define TP_HW_MAX_Y         (320)
 | |
| #define TP_HW_MIN_X         (0)
 | |
| #define TP_HW_MIN_Y         (0)
 | |
| 
 | |
| #define TP_PANEL_X1         (0)
 | |
| #define TP_PANEL_Y1         (0)
 | |
| #define TP_PANEL_X2         (1279)
 | |
| #define TP_PANEL_Y2         (319)
 | |
| 
 | |
| #define TP_PANEL_W          (TP_PANEL_X2-TP_PANEL_X1 + 1)
 | |
| #define TP_PANEL_H          (TP_PANEL_Y2-TP_PANEL_Y1 + 1)
 | |
| 
 | |
| #define READ_ONE_TP_ONLY    1
 | |
| 
 | |
| //Touch Panel recieved data structure // 2 points touch
 | |
| typedef struct
 | |
| {
 | |
|     UINT32 P1_TouchStatus;
 | |
|     UINT32 P1_TouchEventID;
 | |
|     UINT32 P1_CoordRecvdX;
 | |
|     UINT32 P1_CoordRecvdY;
 | |
|     UINT32 P2_TouchStatus;
 | |
|     UINT32 P2_TouchEventID;
 | |
|     UINT32 P2_CoordRecvdX;
 | |
|     UINT32 P2_CoordRecvdY;
 | |
| } TP_RECV_DATA, *pPT_RECV_DATA;
 | |
| 
 | |
| //////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| static TP_RECV_DATA     g_TPRecvdData;
 | |
| static pPT_RECV_DATA    pTPRecvdData = &g_TPRecvdData;
 | |
| //static TP_INFO          g_TpInfo;
 | |
| 
 | |
| /*
 | |
|     0:  Use AUTO Mode with Polling
 | |
|     1:  Use AUTO Mode with Interrupt (N/A)
 | |
|     2:  Use AUTO Mode with FIFO Threshold (N/A)
 | |
| */
 | |
| #define GSTP_USED_MODE      0
 | |
| 
 | |
| 
 | |
| static void DetTP_Convert2RealXY(UINT32 *pX, UINT32 *pY)
 | |
| {
 | |
| 
 | |
|     INT32 tempX=0,tempY=0;
 | |
|     tempX = *pX;
 | |
|     tempY = *pY;
 | |
|     if (tempX > TP_HW_MAX_X)
 | |
|         tempX = TP_HW_MAX_X;
 | |
|     else if (tempX < TP_HW_MIN_X)
 | |
|         tempX = TP_HW_MIN_X;
 | |
| 
 | |
|     if (tempY > TP_HW_MAX_Y)
 | |
|         tempY = TP_HW_MAX_Y;
 | |
|     else if (tempY < TP_HW_MIN_Y)
 | |
|         tempY = TP_HW_MIN_Y;
 | |
| 
 | |
|     *pX = tempX;
 | |
|     *pY = TP_PANEL_H - tempY - 1;
 | |
|     //DBG_WRN("Convert:(%d,%d) to (%d,%d)\r\n", tempX, tempY, *pX, *pY);
 | |
| 
 | |
| }
 | |
| 
 | |
| static void DetTP_GetData(pPT_RECV_DATA pData)
 | |
| {
 | |
| 
 | |
| #if (READ_ONE_TP_ONLY == 1)
 | |
| 
 | |
| 	//UINT32 recv_data[8] = {0};
 | |
| 	UINT8 recv_data[8] = {0};
 | |
| 	//get 8 byte tp data  (everytime get 4 byte)
 | |
| 	//DetTP_I2C_BurstRead (0x00, recv_data);
 | |
| 	//DetTP_I2C_BurstRead (0x04, &recv_data[4]);
 | |
| 
 | |
| 	touch_i2c_write(0x8040,0x00);
 | |
| 	touch_i2c_read(0x8150, &recv_data[0]);
 | |
| 	touch_i2c_read(0x8151, &recv_data[1]);
 | |
| 	touch_i2c_read(0x8152, &recv_data[2]);
 | |
| 	touch_i2c_read(0x8153, &recv_data[3]);
 | |
| 	//DBGD(gpio_getPin(GPIO_TP_INT));
 | |
| 	//DBG_WRN("@#1111 recv_data X is %d Y is %d   ### recv_data[4]: %d \r\n",(recv_data[1]<<8)|recv_data[0],(recv_data[3]<<8)|recv_data[2],recv_data[4]);
 | |
| 	touch_i2c_write(0x814E,0x00);
 | |
| 
 | |
| 	pData->P1_TouchStatus = 1;
 | |
| 	//TP_Press = pData->P1_TouchStatus = 1;
 | |
| 	//TP_Press=pData->P1_TouchStatus   	= recv_data[3]>>7 ;
 | |
| 	//if(TP_Press)
 | |
| 	{
 | |
| 		pData->P1_TouchEventID  	= 1 ; //recv_data[3] >> 6 ; //event flag
 | |
| 		//DBG_WRN("######### recv_data[0] %x recv_data[1] %x recv_data[2] %x r recv_data[3] %x recv_data[4] %x recv_data[5] %x recv_data[6] %x recv_data[7] %x \r\n" , recv_data[0],recv_data[1],recv_data[2],recv_data[3],recv_data[4],recv_data[5],recv_data[6],recv_data[7]) ;
 | |
| 	    //test
 | |
| 		#if 1  //ljy
 | |
| 		pData->P1_CoordRecvdX		= TP_PANEL_X2 - ((recv_data[1]<<8)|recv_data[0]);
 | |
| 		pData->P1_CoordRecvdY		= ((recv_data[3]<<8)|recv_data[2]);//TP_PANEL_Y2 - ((recv_data[3]<<8)|recv_data[2]) ;
 | |
| 		//pData->P1_CoordRecvdY		= TP_PANEL_Y2 - ((recv_data[3]<<8)|recv_data[2]) ;
 | |
| 		#else
 | |
| 		pData->P1_CoordRecvdX		= (recv_data[1]<<8)|recv_data[0];
 | |
| 		pData->P1_CoordRecvdY		= (recv_data[3]<<8)|recv_data[2] ;
 | |
| 	    #endif
 | |
| 
 | |
| 		//debug_msg("X:%d, Y:%d \r\n" , pData->P1_CoordRecvdX , pData->P1_CoordRecvdY) ;
 | |
| 
 | |
| 		//DetTP_Convert2RealXY(&TEST1, &TEST2);
 | |
| 		//DBG_WRN("Convert2RealXY  x:%d                  y:%d \r\n" , pData->P1_CoordRecvdX , pData->P1_CoordRecvdY) ;
 | |
| 	}
 | |
| 	DetTP_Convert2RealXY(&(pData->P1_CoordRecvdX), &(pData->P1_CoordRecvdY));
 | |
| 
 | |
| 	pData->P2_TouchStatus   	= 0;
 | |
| 	pData->P2_TouchEventID  	= 0;
 | |
| 	pData->P2_CoordRecvdX   	= 0;
 | |
| 	pData->P2_CoordRecvdY   	= 0;
 | |
| 
 | |
| #else
 | |
|     UINT32 recv_data[12];
 | |
| 
 | |
|     DetTP_I2C_BurstRead (0x00, &(recv_data[0]));
 | |
|     DetTP_I2C_BurstRead (0x06, &(recv_data[6]));
 | |
| 
 | |
|     pData->P1_TouchStatus   = recv_data[0] & 0x07;
 | |
|     pData->P1_TouchEventID  = (recv_data[0] & ~0x07) >> 3;
 | |
|     pData->P1_CoordRecvdY   = recv_data[1] * 16 + recv_data[3] / 16;
 | |
|     pData->P1_CoordRecvdX   = recv_data[2] * 16 + recv_data[3] % 16;
 | |
|     DetTP_Convert2RealXY(&(pData->P1_CoordRecvdX), &(pData->P1_CoordRecvdY));
 | |
| 
 | |
|     if (recv_data[6] != 0xff)
 | |
|     {
 | |
|         pData->P2_TouchStatus   = recv_data[6] & 0x07;
 | |
|         pData->P2_TouchEventID  = (recv_data[6] & ~0x07) >> 3;
 | |
|         pData->P2_CoordRecvdY   = recv_data[7] * 16 + recv_data[9] / 16;
 | |
|         pData->P2_CoordRecvdX   = recv_data[8] * 16 + recv_data[9] % 16;
 | |
|         DetTP_Convert2RealXY(&(pData->P2_CoordRecvdX), &(pData->P2_CoordRecvdY));
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         pData->P2_TouchStatus   = 0;
 | |
|         pData->P2_TouchEventID  = 0;
 | |
|         pData->P2_CoordRecvdX   = 0;
 | |
|         pData->P2_CoordRecvdY   = 0;
 | |
|     }
 | |
| #endif
 | |
| }
 | |
| 
 | |
| void DetTP_GetXY(INT32 *pX, INT32 *pY)
 | |
| {
 | |
| 
 | |
|     memset(pTPRecvdData, 0, sizeof(TP_RECV_DATA));
 | |
|     DetTP_GetData(pTPRecvdData);
 | |
|     if (pTPRecvdData->P1_TouchEventID == 1)
 | |
|     {
 | |
|         *pX = pTPRecvdData->P1_CoordRecvdX;
 | |
|         *pY = pTPRecvdData->P1_CoordRecvdY;
 | |
|     }
 | |
|     else if (pTPRecvdData->P2_TouchEventID == 1)
 | |
|     {
 | |
|         *pX = pTPRecvdData->P2_CoordRecvdX;
 | |
|         *pY = pTPRecvdData->P2_CoordRecvdY;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         *pX = -1;
 | |
|         *pY = -1;
 | |
|     }
 | |
| }
 | |
| 
 | |
| int DetTP_Init(void)
 | |
| {
 | |
| 	#if 1//touch_dtsi_FROM_FILE
 | |
| 	TOUCH_DRV_INFO *ptouch_info = mdrv_get_touch_info(0);
 | |
| 	UINT32 tp_reg_adr = 0;
 | |
| 	UINT32 i = 0;
 | |
| 	UINT8 check_sum = 0;
 | |
| 	#endif
 | |
| 	int ret;
 | |
| 	//touch_dtsi_FROM_FILE
 | |
| #if defined __FREERTOS
 | |
| 	TOUCH_DTSI_INFO touch_dtsi = { 0 };
 | |
| 	extern void *fdt_get_app(void);
 | |
| 
 | |
| 	touch_dtsi.buf_addr = fdt_get_app();//NULL;
 | |
| 
 | |
| 	strncpy(touch_dtsi.node_path, "/touch/touch_cfg/touch_gt911", TOUCH_DTSI_NAME_LENGTH);
 | |
| 	touch_dtsi.node_path[TOUCH_DTSI_NAME_LENGTH-1] = '\0';
 | |
| 
 | |
| 	strncpy(touch_dtsi.file_path, "/mnt/app/touch/touch.dtb", TOUCH_DTSI_NAME_LENGTH);
 | |
| 	touch_dtsi.file_path[TOUCH_DTSI_NAME_LENGTH-1] = '\0';
 | |
| 
 | |
| 	if (touch_common_load_dtsi_file((UINT8 *)touch_dtsi.node_path, (UINT8 *)touch_dtsi.file_path, touch_dtsi.buf_addr, (void *)ptouch_info) == E_OK)
 | |
| #else
 | |
| 	if(1)
 | |
| #endif
 | |
| 	{
 | |
| 		DBG_IND("touch load dtsi file success\r\n");
 | |
| 		touch_i2c.id = ptouch_info->tp_hw.i2c_cfg.i2c_id;
 | |
| 		touch_i2c.addr = ptouch_info->tp_hw.i2c_cfg.i2c_addr;
 | |
| 		gpio_direction_output(ptouch_info->tp_hw.gpio_cfg.gpio_pwr, 1);
 | |
| 		gpio_direction_output(ptouch_info->tp_hw.gpio_cfg.gpio_int,0);
 | |
| 		//vos_util_delay_ms(500);//电源上电时间太短TP报I2C错误
 | |
| 		gpio_direction_output(ptouch_info->tp_hw.gpio_cfg.gpio_rst, 0);
 | |
| 		vos_util_delay_ms(100);
 | |
| 		//gpio_set_value(ptouch_info->tp_hw.gpio_cfg.gpio_rst, 0);
 | |
| 		//vos_util_delay_ms(100);
 | |
| 		gpio_set_value(ptouch_info->tp_hw.gpio_cfg.gpio_rst, 1);
 | |
| 		vos_util_delay_ms(100);
 | |
| 		gpio_direction_input(ptouch_info->tp_hw.gpio_cfg.gpio_int);
 | |
| 	} else {
 | |
| 		DBG_IND("touch load dtsi file fail!\r\n");
 | |
| 		touch_i2c.id = 2;
 | |
| 		touch_i2c.addr = 0x5d;
 | |
| 		gpio_direction_output(6, 1);
 | |
| 		gpio_direction_output(7,0);
 | |
| 		//vos_util_delay_ms(500);//电源上电时间太短TP报I2C错误
 | |
| 		gpio_direction_output(132, 0);
 | |
| 		vos_util_delay_ms(100);
 | |
| 		//gpio_set_value(132, 0);
 | |
| 		//vos_util_delay_ms(100);
 | |
| 		gpio_set_value(132, 1);
 | |
| 		vos_util_delay_ms(100);
 | |
| 		gpio_direction_input(7);
 | |
| 	}
 | |
| 
 | |
| 	ret=touch_init_gt911();
 | |
| 	vos_util_delay_ms(20);
 | |
| 
 | |
| 	tp_reg_adr =0x8047;
 | |
| 	for(i=0;i<184;i++)
 | |
| 	{
 | |
| 		touch_i2c_write(tp_reg_adr,config[i]);
 | |
| 		//touch_i2c_read(tp_reg_adr, &recv);
 | |
|         //debug_msg("#### tp_reg_adr:%x value is %x\r\n",tp_reg_adr,recv);
 | |
| 		check_sum += config[i];
 | |
| 		tp_reg_adr++;
 | |
| 	}
 | |
| 
 | |
| 	config[184] = (~check_sum) + 1;
 | |
| 
 | |
| 	touch_i2c_write(0x80ff,config[184]);
 | |
| 	touch_i2c_write(0x8100,config[185]);
 | |
| 
 | |
| 	//清中断寄存器
 | |
| 	touch_i2c_write(0x814E,0x00);
 | |
| 	return ret;
 | |
| }
 | |
| #endif
 | |
| #if defined __FREERTOS
 | |
| 
 | |
| int touch_ioctl (int fd, unsigned int cmd, unsigned long arg)
 | |
| {
 | |
| 	switch (cmd) {
 | |
| 	case IOC_TOUCH_PARKING_MODE:
 | |
| 		DBG_DUMP("touch_ioctl, IOC_TOUCH_PARKING_MODE %d, arg %d\r\n", IOC_TOUCH_PARKING_MODE, arg);
 | |
| 		break;
 | |
| 
 | |
| 	case IOC_TOUCH_PARKING_SENSITIVITY:
 | |
| 		DBG_DUMP("touch_ioctl, IOC_TOUCH_PARKING_SENSITIVITY %d, arg %d\r\n", IOC_TOUCH_PARKING_SENSITIVITY, arg);
 | |
| 		break;
 | |
| 
 | |
| 	default:
 | |
| 		DBG_ERR("unknown cmd 0x%x\r\n", cmd);
 | |
| 		return -1;
 | |
| 	}
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| int touch_init(void)
 | |
| {
 | |
| 	int ret;
 | |
| 
 | |
| 	ret = touch_init_gt911();
 | |
| 
 | |
| 	return ret;
 | |
| }
 | |
| 
 | |
| void touch_exit(void)
 | |
| {
 | |
| 	touch_i2c_remove_driver(touch_i2c.id);
 | |
| }
 | |
| 
 | |
| 
 | |
| #elif defined __KERNEL__
 | |
| 
 | |
| static long touch_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
 | |
| {
 | |
| 	switch(cmd) {
 | |
| 		case IOC_TOUCH_ISPENDOWN:{
 | |
| 			BOOL pen_down;
 | |
| 			pen_down=DetTP_IsPenDown();
 | |
| 			copy_to_user((void *)arg, (void *)&pen_down, sizeof(BOOL));
 | |
| 		}
 | |
| 		break;
 | |
| 		case IOC_TOUCH_GET_XY_VALUE:{
 | |
| 			INT32 xyData[2] = {0};
 | |
| 			DetTP_GetXY(&xyData[0], &xyData[1]);
 | |
| 			copy_to_user((void *)arg, (void *)xyData, sizeof(xyData));
 | |
| 		}
 | |
| 		break;
 | |
| 		default:
 | |
| 		return -EINVAL;
 | |
| 	}
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| static const struct file_operations touch_fops = {
 | |
| 	.owner          = THIS_MODULE,
 | |
| 	.unlocked_ioctl	= touch_ioctl,
 | |
| };
 | |
| 
 | |
| static struct miscdevice touch_miscdev = {
 | |
| 	.minor          = MISC_DYNAMIC_MINOR,
 | |
| 	.name           = "touch",
 | |
| 	.fops           = &touch_fops,
 | |
| };
 | |
| 
 | |
| static int __init touch_init(void)
 | |
| {
 | |
| 	int ret=E_OK;
 | |
| 
 | |
| 	//ret = touch_init_gt911();
 | |
| 	ret=DetTP_Init();
 | |
| 	if (ret) {
 | |
| 		DBG_ERR("touch_init_gt911 fail, ret = %d\n", ret);
 | |
| 		return ret;
 | |
| 	}
 | |
| 
 | |
| 	ret = misc_register(&touch_miscdev);
 | |
| 	if (ret) {
 | |
| 		DBG_ERR("misc_register fail, ret = %d\n", ret);
 | |
| 		return ret;
 | |
| 	}
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| static void __exit touch_exit(void)
 | |
| {
 | |
| 	touch_i2c_remove_driver(touch_i2c.id);
 | |
| }
 | |
| 
 | |
| module_init(touch_init);
 | |
| module_exit(touch_exit);
 | |
| 
 | |
| MODULE_DESCRIPTION("GT911 touch");
 | |
| MODULE_AUTHOR("Novatek Corp.");
 | |
| MODULE_LICENSE("GPL");
 | |
| #endif
 | |
| 
 | 
