/***************************************************************
Copyright ? wq Co., Ltd. 1998-2099. All rights reserved.
文件名 : Touch_ILxxxx.c
作者 : wq
版本 : V0.0
描述 : 触摸屏驱动文件,触摸芯片为ILI2312&2511。
其他 : 无
日志 : 初版V0.0 2023/4/17 wq创建
***************************************************************/
#include "Touch_ILxxxx.h"
#include <stdio.h>
#include "gc90x_shmemmanage.h"
#include "iic_conf.h"
uint8_t ShareBuf[256];
struct i2c_msg msgs[2];
/**
* @brief GTP_ResetChip
* @param none
* @retval none
*/
void ILI_ResetChip(void)
{
GPIOA_ResetBits(GPIO_Pin_2);
Delay_ms(50);
GPIOA_SetBits(GPIO_Pin_2);
Delay_ms(200);
/*INT*/
PACLK_ON;
PA10_ALTF_CLR;
PA10_INPUT_MODE;
}
/**
* @brief GTP_Touch_Init
* @param void
* @retval none
*/
void ILI_Touch_Init(void)
{
TOUCH_IIC_GPIO_Config();
Touch_I2C_Stop();
ILI_ResetChip();
Touch_I2C_Stop();
ILI_GetPanelInfo();
}
/*******************************************************************************
* Function Name : ILI_RD_Reg_Continue
* Description : 从ILI再次接着读,适应于超过6点的情况
* Input : reg:起始寄存器地址
buf:数据缓缓存区
len:读数据长度
* Output : None
* Return : None
*******************************************************************************/
uint8_t ILI_RD_Reg_Continue(uint8_t *buf,uint8_t len)
{
int32_t ret=-1;
Touch_I2C_ReadBytes(IL_ADDRESS, buf, len);
return ret;
}
/*******************************************************************************
* Function Name : ILI_WR_Reg
* Description : 向ILI写入一次数据
* Input : reg:起始寄存器地址
buf:数据缓缓存区
len:写数据长度
* Output : None
* Return : 0,成功;1,失败.
*******************************************************************************/
uint8_t ILI_WR_Reg(uint8_t reg,uint8_t *buf,uint8_t len)
{
//struct i2c_msg msgs[2];
int32_t ret=-1;
int32_t retries = 0;
/*一个读数据的过程可以分为两个传输过程:
* 1. IIC 写入 要读取的寄存器地址
* 2. IIC 读取 数据
* */
msgs[0].flags = !I2C_M_RD; //写入
msgs[0].addr = IL_ADDRESS; //IIC设备地址
msgs[0].len = GTP_ADDR_LENGTH; //寄存器地址为2字节(即写入两字节的数据)
msgs[0].buf = ®//&buf[0]; //buf[0~1]存储的是要读取的寄存器地址
msgs[1].flags = I2C_M_RD; //读取
msgs[1].addr = IL_ADDRESS; //IIC设备地址
msgs[1].len = len ; //要读取的数据长度
msgs[1].buf = &buf[0]; //buf[GTP_ADDR_LENGTH]之后的缓冲区存储读出的数据
while(retries < 5)
{
ret = I2C_Transfer( msgs, 2); //调用IIC数据传输过程函数,有2个传输过程
if(ret == 2)break;
retries++;
}
if((retries >= 5))
{
}
return ret;
}
/**
* @brief 从IIC设备中读取数据
* @param
* @arg client_addr:设备地址
* @arg buf[0~1]: 读取数据寄存器的起始地址
* @arg buf[2~len-1]: 存储读出来数据的缓冲buffer
* @arg len: GTP_ADDR_LENGTH + read bytes count(寄存器地址长度+读取的数据字节数)
* @retval i2c_msgs传输结构体的个数,2为成功,其它为失败
*/
uint32_t LIL_I2C_Read(uint8_t client_addr, uint8_t *buf, int32_t len)
{
struct i2c_msg msgs[2];
int32_t ret=-1;
int32_t retries = 0;
/*一个读数据的过程可以分为两个传输过程:
* 1. IIC 写入 要读取的寄存器地址
* 2. IIC 读取 数据
* */
msgs[0].flags = !I2C_M_RD; //写入
msgs[0].addr = client_addr; //IIC设备地址
msgs[0].len = GTP_ADDR_LENGTH; //寄存器地址为2字节(即写入两字节的数据)
msgs[0].buf = &buf[0]; //buf[0~1]存储的是要读取的寄存器地址
msgs[1].flags = I2C_M_RD; //读取
msgs[1].addr = client_addr; //IIC设备地址
msgs[1].len = len - GTP_ADDR_LENGTH; //要读取的数据长度
msgs[1].buf = &buf[GTP_ADDR_LENGTH]; //buf[GTP_ADDR_LENGTH]之后的缓冲区存储读出的数据
while(retries < 5)
{
ret = I2C_Transfer( msgs, 2); //调用IIC数据传输过程函数,有2个传输过程
if(ret == 2)break;
retries++;
}
if((retries >= 5))
{
}
return ret;
}
/**
* @brief 使用IIC读取再次数据,检验是否正常
* @param
* @arg client:设备地址
* @arg addr: 寄存器地址
* @arg rxbuf: 存储读出的数据
* @arg len: 读取的字节数
* @retval
* @arg FAIL
* @arg SUCCESS
*/
uint32_t ILI_I2C_Read_dbl_check(uint8_t client_addr, uint16_t addr, uint8_t *rxbuf, int len)
{
uint8_t buf[16] = {0};
uint8_t confirm_buf[16] = {0};
uint8_t retry = 0;
while (retry++ < 3)
{
memset(buf, 0xAA, 16);
//buf[0] = (uint8_t)(addr >> 8);
//buf[1] = (uint8_t)(addr & 0xFF);
//GTP_I2C_Read(client_addr, buf, len + 2);
buf[0] = (uint8_t)(addr & 0xFF);
LIL_I2C_Read(client_addr, buf, len + 1);
memset(confirm_buf, 0xAB, 16);
// confirm_buf[0] = (uint8_t)(addr >> 8);
// confirm_buf[1] = (uint8_t)(addr & 0xFF);
// GTP_I2C_Read(client_addr, confirm_buf, len + 2);
confirm_buf[0] = (uint8_t)(addr & 0xFF);
LIL_I2C_Read(client_addr, confirm_buf, len + 1);
// if (!memcmp(buf, confirm_buf, len+2))
// {
// memcpy(rxbuf, confirm_buf+2, len);
// return SUCCESS;
// }
if (!memcmp(buf, confirm_buf, len+1))
{
memcpy(rxbuf, confirm_buf+1, len);
return SUCCESS;
}
}
return FAIL;
}
/*******************************************************************************
* Function Name : ILI_GetPanelInfo
* Description : 使用命令码从控制器读取X、Y分辨率。
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void ILI_GetPanelInfo(void)
{
uint8_t i;
CTP_Info.x_y_swap=0;
CTP_Info.x_mirror=0;
ILI_I2C_Read_dbl_check(IL_ADDRESS, 0x20, &ShareBuf[0], 15);
#if DEBUG_SWITCH
for(i=0;i<15;i++)
{printf("#%x#\r\n:",ShareBuf[i]);}
#endif
CTP_Info.x_max_pos = ((uint16_t)ShareBuf[1]<<8) + ShareBuf[0];
CTP_Info.y_max_pos = ((uint16_t)ShareBuf[3]<<8) + ShareBuf[2];
CTP_Info.X_Resolution=800/(float)CTP_Info.x_max_pos;
CTP_Info.Y_Resolution=480/(float)CTP_Info.y_max_pos;
#if DEBUG_SWITCH
printf("#CTP_Info#\r\n:");
printf("CTP_Info.x_max_pos=%d \r\n",CTP_Info.x_max_pos);
printf("CTP_Info.y_max_pos=%d \r\n",CTP_Info.y_max_pos);
printf("\n");
#endif
}
/*******************************************************************************
* Function Name : ILI_Scan
* Description : 扫描触摸屏
* Input : None
* Output : None
* Return : 0,触屏无触摸;1,触屏有触摸
*******************************************************************************/
uint8_t ILI_Scan( void )
{
uint8_t id ; //当前这次ID位域
uint8_t i;
uint8_t point_num;
ILI_WR_Reg(ILTK_GET_TH,&ShareBuf[0],31);
if(ShareBuf[0]==2)
{
ILI_RD_Reg_Continue(&ShareBuf[31],20);
point_num = 10;
}
else
{
point_num = 6;
}
id = 0;
#if DEBUG_SWITCH
printf("point:%d\n",(uint16_t)point_num);
#endif
if(point_num > MAX_POINT)
point_num = MAX_POINT;
for( i = 0; i != point_num; i++ )
{
#if DEBUG_SWITCH
printf("#%d \r\n",(uint16_t)i);
printf("##########################################\r\n");
printf("%02x \r\n",(uint16_t)ShareBuf[i*5+0]);
printf("##########################################\r\n");
printf("%02x \r\n",(uint16_t)ShareBuf[i*5+1]);//only support one finger
printf("%02x \r\n",(uint16_t)ShareBuf[i*5+2]);
printf("%02x \r\n",(uint16_t)ShareBuf[i*5+3]);
printf("%02
- 1
- 2
前往页