| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345 |
- /* Includes ------------------------------------------------------------------*/
- #include "Touch_driver.h"
- #include <FreeRTOS.h>
- #include <string.h>
- #include <task.h>
- #include "../PikaStdDevice/pika_hal.h"
- /* Private typedef -----------------------------------------------------------*/
- /* Private define ------------------------------------------------------------*/
- /* Private macro -------------------------------------------------------------*/
- /* Private variables ---------------------------------------------------------*/
- static uint8_t GT911_Config[] = {
- 0x81, 0x00, 0x04, 0x58, 0x02, 0x0A, 0x0C,
- 0x20, 0x01, 0x08, 0x28, 0x05, 0x50, // 0x8047 - 0x8053
- 0x3C, 0x0F, 0x05, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x8054 - 0x8060
- 0x00, 0x89, 0x2A, 0x0B, 0x2D, 0x2B, 0x0F,
- 0x0A, 0x00, 0x00, 0x01, 0xA9, 0x03, // 0x8061 - 0x806D
- 0x2D, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, // 0x806E - 0x807A
- 0x59, 0x94, 0xC5, 0x02, 0x07, 0x00, 0x00,
- 0x04, 0x93, 0x24, 0x00, 0x7D, 0x2C, // 0x807B - 0x8087
- 0x00, 0x6B, 0x36, 0x00, 0x5D, 0x42, 0x00,
- 0x53, 0x50, 0x00, 0x53, 0x00, 0x00, // 0x8088 - 0x8094
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x8095 - 0x80A1
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80A2 - 0x80AD
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x02, 0x04, 0x06, 0x08, 0x0A, // 0x80AE - 0x80BA
- 0x0C, 0x0E, 0x10, 0x12, 0x14, 0x16, 0xFF,
- 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, // 0x80BB - 0x80C7
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80C8 - 0x80D4
- 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0F, 0x10,
- 0x12, 0x16, 0x18, 0x1C, 0x1D, 0x1E, // 0x80D5 - 0x80E1
- 0x1F, 0x20, 0x21, 0x22, 0x24, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, // 0x80E2 - 0x80EE
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80EF - 0x80FB
- 0x00, 0x00, 0xD6, 0x01}; // 0x80FC - 0x8100
- static GT911_Status_t CommunicationResult;
- static uint8_t TxBuffer[200];
- static uint8_t RxBuffer[200] = {0};
- /* Private function prototypes -----------------------------------------------*/
- static void GT911_Reset(void);
- static void GT911_CalculateCheckSum(void);
- static GT911_Status_t GT911_SetCommandRegister(uint8_t command);
- static GT911_Status_t GT911_GetProductID(uint32_t* id);
- static GT911_Status_t GT911_SendConfig(void);
- static GT911_Status_t GT911_GetStatus(uint8_t* status);
- static GT911_Status_t GT911_SetStatus(uint8_t status);
- GT911_Status_t GT911_I2C_Read_Mem(uint8_t Addr,
- uint16_t mem_addr,
- uint8_t* read_data,
- uint16_t read_length);
- GT911_Status_t GT911_I2C_Write_Mem(uint8_t Addr,
- uint16_t mem_addr,
- uint8_t* write_data,
- uint16_t write_length);
- /* API Implementation
- * --------------------------------------------------------*/
- GT911_Status_t GT911_Init(GT911_Config_t config) {
- // Set X resolution
- GT911_Config[1] = config.X_Resolution & 0x00FF;
- GT911_Config[2] = (config.X_Resolution >> 8) & 0x00FF;
- // Set Y resolution
- GT911_Config[3] = config.Y_Resolution & 0x00FF;
- GT911_Config[4] = (config.Y_Resolution >> 8) & 0x00FF;
- // Set touch number
- GT911_Config[5] = config.Number_Of_Touch_Support;
- // set reverse Y
- GT911_Config[6] = 0;
- GT911_Config[6] |= config.ReverseY << 7;
- // set reverse X
- GT911_Config[6] |= config.ReverseX << 6;
- // set switch X2Y
- GT911_Config[6] |= config.SwithX2Y << 3;
- // set Sito
- GT911_Config[6] |= config.SoftwareNoiseReduction << 2;
- // Reset chip
- GT911_Reset();
- // Get product ID
- uint32_t productID = 0;
- CommunicationResult = GT911_GetProductID(&productID);
- __platform_printf("GT911 ID:%d\r\n", productID);
- // Reset chip
- GT911_Reset();
- CommunicationResult = GT911_SendConfig();
- if (CommunicationResult != GT911_OK) {
- return CommunicationResult;
- }
- GT911_SetCommandRegister(0x00);
- return GT911_OK;
- }
- GT911_Status_t GT911_ReadTouch(TouchCordinate_t* cordinate,
- uint8_t* number_of_cordinate) {
- uint8_t StatusRegister;
- GT911_Status_t Result = GT911_NotResponse;
- Result = GT911_GetStatus(&StatusRegister);
- if (Result != GT911_OK) {
- return Result;
- }
- if ((StatusRegister & 0x80) != 0) {
- *number_of_cordinate = StatusRegister & 0x0F;
- if (*number_of_cordinate != 0) {
- for (uint8_t i = 0; i < *number_of_cordinate; i++) {
- TxBuffer[0] = ((GOODIX_POINT1_X_ADDR + (i * 8)) & 0xFF00) >> 8;
- TxBuffer[1] = (GOODIX_POINT1_X_ADDR + (i * 8)) & 0xFF;
- GT911_I2C_Write(GOODIX_ADDRESS, TxBuffer, 2);
- GT911_I2C_Read(GOODIX_ADDRESS, RxBuffer, 6);
- cordinate[i].x = RxBuffer[0];
- cordinate[i].x = (RxBuffer[1] << 8) + cordinate[i].x;
- cordinate[i].y = RxBuffer[2];
- cordinate[i].y = (RxBuffer[3] << 8) + cordinate[i].y;
- }
- }
- GT911_SetStatus(0);
- }
- return GT911_OK;
- }
- // Private functions Implementation
- // ---------------------------------------------------------*/
- static void GT911_Reset(void) {
- GT911_INT_Output();
- GT911_RST_Control(0);
- GT911_Delay(20);
- GT911_INT_Control(0);
- GT911_Delay(50);
- GT911_RST_Control(1);
- GT911_Delay(100);
- GT911_INT_Input();
- GT911_Delay(100);
- }
- static void GT911_CalculateCheckSum(void) {
- GT911_Config[184] = 0;
- for (uint8_t i = 0; i < 184; i++) {
- GT911_Config[184] += GT911_Config[i];
- }
- GT911_Config[184] = (~GT911_Config[184]) + 1;
- }
- static GT911_Status_t GT911_SetCommandRegister(uint8_t command) {
- TxBuffer[0] = (GOODIX_REG_COMMAND & 0xFF00) >> 8;
- TxBuffer[1] = GOODIX_REG_COMMAND & 0xFF;
- TxBuffer[2] = command;
- return GT911_I2C_Write(GOODIX_ADDRESS, TxBuffer, 3);
- }
- static GT911_Status_t GT911_GetProductID(uint32_t* id) {
- TxBuffer[0] = (GOODIX_REG_ID & 0xFF00) >> 8;
- TxBuffer[1] = GOODIX_REG_ID & 0xFF;
- GT911_Status_t Result = GT911_NotResponse;
- Result = GT911_I2C_Write(GOODIX_ADDRESS, TxBuffer, 2);
- if (Result == GT911_OK) {
- Result = GT911_I2C_Read(GOODIX_ADDRESS, RxBuffer, 4);
- if (Result == GT911_OK) {
- memcpy(id, RxBuffer, 4);
- }
- }
- return Result;
- }
- static GT911_Status_t GT911_SendConfig(void) {
- GT911_CalculateCheckSum();
- TxBuffer[0] = (GOODIX_REG_CONFIG_DATA & 0xFF00) >> 8;
- TxBuffer[1] = GOODIX_REG_CONFIG_DATA & 0xFF;
- memcpy(&TxBuffer[2], GT911_Config, sizeof(GT911_Config));
- return GT911_I2C_Write(GOODIX_ADDRESS, TxBuffer, sizeof(GT911_Config) + 2);
- }
- static GT911_Status_t GT911_GetStatus(uint8_t* status) {
- TxBuffer[0] = (GOODIX_READ_COORD_ADDR & 0xFF00) >> 8;
- TxBuffer[1] = GOODIX_READ_COORD_ADDR & 0xFF;
- GT911_Status_t Result = GT911_NotResponse;
- Result = GT911_I2C_Write(GOODIX_ADDRESS, TxBuffer, 2);
- if (Result == GT911_OK) {
- Result = GT911_I2C_Read(GOODIX_ADDRESS, RxBuffer, 1);
- if (Result == GT911_OK) {
- *status = RxBuffer[0];
- }
- }
- return Result;
- }
- static GT911_Status_t GT911_SetStatus(uint8_t status) {
- TxBuffer[0] = (GOODIX_READ_COORD_ADDR & 0xFF00) >> 8;
- TxBuffer[1] = GOODIX_READ_COORD_ADDR & 0xFF;
- TxBuffer[2] = status;
- return GT911_I2C_Write(GOODIX_ADDRESS, TxBuffer, 3);
- }
- static pika_dev* TOUCH_INT = NULL;
- static pika_dev* TOUCH_RST = NULL;
- static pika_dev* TOUCH_IIC = NULL;
- void GT911_INT_Input(void) {
- if (NULL == TOUCH_INT) {
- TOUCH_INT = pika_hal_open(PIKA_HAL_GPIO, "P17");
- }
- pika_hal_GPIO_config cfg = {0};
- cfg.dir = PIKA_HAL_GPIO_DIR_IN;
- cfg.pull = PIKA_HAL_GPIO_PULL_NONE;
- pika_hal_ioctl(TOUCH_INT, PIKA_HAL_IOCTL_CONFIG, &cfg);
- pika_hal_ioctl(TOUCH_INT, PIKA_HAL_IOCTL_ENABLE);
- }
- void GT911_INT_Output(void) {
- if (NULL == TOUCH_INT) {
- TOUCH_INT = pika_hal_open(PIKA_HAL_GPIO, "P17");
- }
- pika_hal_GPIO_config cfg = {0};
- cfg.dir = PIKA_HAL_GPIO_DIR_OUT;
- cfg.pull = PIKA_HAL_GPIO_PULL_NONE;
- pika_hal_ioctl(TOUCH_INT, PIKA_HAL_IOCTL_CONFIG, &cfg);
- pika_hal_ioctl(TOUCH_INT, PIKA_HAL_IOCTL_ENABLE);
- }
- void GT911_RST_Control(bool high_or_low) {
- if (NULL == TOUCH_RST) {
- TOUCH_RST = pika_hal_open(PIKA_HAL_GPIO, "P5");
- pika_hal_GPIO_config cfg = {0};
- cfg.dir = PIKA_HAL_GPIO_DIR_OUT;
- pika_hal_ioctl(TOUCH_RST, PIKA_HAL_IOCTL_CONFIG, &cfg);
- pika_hal_ioctl(TOUCH_RST, PIKA_HAL_IOCTL_ENABLE);
- }
- uint32_t val = 0;
- switch (high_or_low) {
- case true:
- val = 1;
- pika_hal_write(TOUCH_RST, &val, sizeof(uint32_t));
- break;
- case false:
- val = 0;
- pika_hal_write(TOUCH_RST, &val, sizeof(uint32_t));
- break;
- }
- }
- void GT911_INT_Control(bool high_or_low) {
- if (NULL == TOUCH_INT) {
- GT911_INT_Output();
- }
- uint32_t val = 0;
- switch (high_or_low) {
- case true:
- val = 1;
- pika_hal_write(TOUCH_INT, &val, sizeof(uint32_t));
- break;
- case false:
- val = 0;
- pika_hal_write(TOUCH_INT, &val, sizeof(uint32_t));
- break;
- }
- }
- void GT911_Delay(uint16_t ms) {
- // HAL_Delay(ms);
- vTaskDelay(ms / portTICK_PERIOD_MS);
- }
- GT911_Status_t GT911_I2C_Init(void) {
- if (NULL == TOUCH_IIC) {
- TOUCH_IIC = pika_hal_open(PIKA_HAL_IIC, "IIC3");
- pika_hal_IIC_config cfg = {0};
- cfg.slave_addr = GOODIX_ADDRESS;
- cfg.speed = 400000;
- cfg.timeout = 10000;
- pika_hal_ioctl(TOUCH_IIC, PIKA_HAL_IOCTL_CONFIG, &cfg);
- pika_hal_ioctl(TOUCH_IIC, PIKA_HAL_IOCTL_ENABLE);
- }
- return GT911_OK;
- }
- GT911_Status_t GT911_I2C_Write(uint8_t Addr,
- uint8_t* write_data,
- uint16_t write_length) {
- if (NULL == TOUCH_IIC) {
- GT911_I2C_Init();
- }
- pika_hal_IIC_config cfg = {0};
- cfg.slave_addr = Addr;
- cfg.mem_addr_ena = PIKA_HAL_IIC_MEM_ADDR_ENA_DISABLE;
- pika_hal_ioctl(TOUCH_IIC, PIKA_HAL_IOCTL_CONFIG, &cfg);
- pika_hal_write(TOUCH_IIC, write_data, write_length);
- return GT911_OK;
- }
- GT911_Status_t GT911_I2C_Write_Mem(uint8_t Addr,
- uint16_t mem_addr,
- uint8_t* write_data,
- uint16_t write_length) {
- if (NULL == TOUCH_IIC) {
- GT911_I2C_Init();
- }
- pika_hal_IIC_config cfg = {0};
- cfg.slave_addr = Addr;
- cfg.mem_addr = mem_addr;
- cfg.mem_addr_ena = PIKA_HAL_IIC_MEM_ADDR_ENA_ENABLE;
- cfg.mem_addr_size = sizeof(uint16_t);
- pika_hal_ioctl(TOUCH_IIC, PIKA_HAL_IOCTL_CONFIG, &cfg);
- pika_hal_write(TOUCH_IIC, write_data, write_length);
- return GT911_OK;
- }
- GT911_Status_t GT911_I2C_Read(uint8_t Addr,
- uint8_t* read_data,
- uint16_t read_length) {
- if (NULL == TOUCH_IIC) {
- GT911_I2C_Init();
- }
- pika_hal_IIC_config cfg = {0};
- cfg.slave_addr = Addr;
- cfg.mem_addr_ena = PIKA_HAL_IIC_MEM_ADDR_ENA_DISABLE;
- pika_hal_ioctl(TOUCH_IIC, PIKA_HAL_IOCTL_CONFIG, &cfg);
- pika_hal_read(TOUCH_IIC, read_data, read_length);
- return GT911_OK;
- }
- GT911_Status_t GT911_I2C_Read_Mem(uint8_t Addr,
- uint16_t mem_addr,
- uint8_t* read_data,
- uint16_t read_length) {
- if (NULL == TOUCH_IIC) {
- GT911_I2C_Init();
- }
- pika_hal_IIC_config cfg = {0};
- cfg.slave_addr = Addr;
- cfg.mem_addr = mem_addr;
- cfg.mem_addr_ena = PIKA_HAL_IIC_MEM_ADDR_ENA_ENABLE;
- cfg.mem_addr_size = sizeof(uint16_t);
- pika_hal_ioctl(TOUCH_IIC, PIKA_HAL_IOCTL_CONFIG, &cfg);
- pika_hal_read(TOUCH_IIC, read_data, read_length);
- return GT911_OK;
- }
- /************************ (C) COPYRIGHT STMicroelectronics *****END OF
- * FILE****/
|