/* * Copyright (C) EdgeTX * * Based on code named * opentx - https://github.com/opentx/opentx * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #include "opentx.h" #include "i2c_driver.h" #include "tp_gt911.h" #if defined (RADIO_T18) const uint8_t TOUCH_GT911_Cfg[] = { GT911_CFG_NUMER, // 0x8047 Config version 0xE0, // 0x8048 X output map : x 480 0x01, 0x10, // 0x804A Y ouptut max : y 272 0x01, GT911_MAX_TP, // 0x804C Touch number 0x0C, // 0x804D Module switch 1 : bit4= xy change Int mode 0x00, // 0x804E Module switch 2 0x01, // 0x804F Shake_Count 0x18, // 0x8050 Filter 0x28, // 0x8051 Larger touch 0x0F, // 0x8052 Noise reduction 0x50, // 0x8053 Screen touch level 0x3C, // 0x8054 Screen touch leave 0x03, // 0x8055 Low power control 0x0F, // 0x8056 Refresh rate 0x01, // 0x8057 X threshold 0x01, // 0x8058 Y threshold 0x00, // 0x8059 Reserved 0x00, // 0x805A Reserved 0x00, // 0x805B Space (top, bottom) 0x00, // 0x805C Space (left, right) 0x04, // 0x805D Mini filter 0x18, // 0x805E Strech R0 0x1A, // 0x805F Strech R1 0x1E, // 0x8060 Strech R2 0x14, // 0x8061 Strech RM 0x87, // 0x8062 Drv groupA num 0x29, // 0x8063 Drv groupB num 0x0A, // 0x8064 Sensor num 0x4B, // 0x8065 FreqA factor 0x4D, // 0x8066 FreqB factor 0xD3, // 0x8067 Panel bit freq 0x07, 0x00, // 0x8069 Reserved 0x00, 0x00, // 0x806B Panel tx gain 0x19, // 0x806C Panel rx gain 0x02, // 0x806D Panel dump shift 0x10, // 0x806E Drv frame control 0x32, // 0x806F Charging level up 0x00, // 0x8070 Module switch 3 0x00, // 0x8071 Gesture distance 0x00, // 0x8072 Gesture long press time 0x00, // 0x8073 X/Y slope adjust 0x03, // 0x8074 Gesture control 0x00, // 0x8075 Gesture switch 1 0x00, // 0x8076 Gesture switch 2 0x00, // 0x8077 Gesture refresh rate 0x00, // 0x8078 Gesture touch level 0x00, // 0x8079 New green wake up level 0x32, // 0x807A Freq hopping start 0x73, // 0x807B Freq hopping end 0x94, // 0x807C Noise detect time 0xD5, // 0x807D Hopping flag 0x02, // 0x807E Hopping flag 0x07, // 0x807F Noise threshold 0x00, // 0x8080 Nois min threshold old 0x00, // 0x8081 Reserved 0x04, // 0x8082 Hopping sensor group 0xAE, // 0x8083 Hopping Seg1 normalize 0x36, // 0x8084 Hopping Seg1 factor 0x00, // 0x8085 Main clock adjust 0x94, // 0x8086 Hopping Seg2 normalize 0x40, // 0x8087 Hopping Seg2 factor 0x00, // 0x8088 Reserved 0x7E, // 0x8089 Hopping Seg3 normalize 0x4C, // 0x808A Hopping Seg3 factor 0x00, // 0x808B Reserved 0x6D, // 0x808C Hopping Seg4 normalize 0x59, // 0x808D Hopping Seg4 factor 0x00, // 0x808E Reserved 0x5D, // 0x808F Hopping Seg5 normalize 0x6A, // 0x8090 Hopping Seg5 factor 0x00, // 0x8091 Reserved 0x5D, // 0x8092 Hopping Seg6 normalize 0x00, // 0x8093 Key1 0x00, // 0x8094 Key2 0x00, // 0x8095 Key3 0x00, // 0x8096 Key4 0x00, // 0x8097 Key area 0x00, // 0x8098 Key touch level 0x00, // 0x8099 Key leave level 0x00, // 0x809A Key sens 0x00, // 0x809B Key sens 0x00, // 0x809C Key restrain 0x00, // 0x809D Key restrain time 0x00, // 0x809E Large gesture touch 0x00, // 0x809F Reserved 0x00, // 0x80A0 Reserved 0x00, // 0x80A1 Hotknot noise map 0x00, // 0x80A2 Link threshold 0x00, // 0x80A3 Pxy threshold 0x00, // 0x80A4 GHot dump shift 0x00, // 0x80A5 GHot rx gain 0x00, // 0x80A6 Freg gain 0x00, // 0x80A7 Freg gain 1 0x00, // 0x80A8 Freg gain 2 0x00, // 0x80A9 Freg gain 3 0x00, // 0x80AA Reserved 0x00, // 0x80AB Reserved 0x00, // 0x80AC Reserved 0x00, // 0x80AD Reserved 0x00, // 0x80AE Reserved 0x00, // 0x80AF Reserved 0x00, // 0x80B0 Reserved 0x00, // 0x80B1 Reserved 0x00, // 0x80B2 Reserved 0x00, // 0x80B3 Combine dis 0x00, // 0x80B4 Split set 0x00, // 0x80B5 Reserved 0x00, // 0x80B6 Reserved 0x0A, // 0x80B7 Sensor CH0 0x0C, // 0x80B8 Sensor CH1 0x0E, // 0x80B9 Sensor CH2 0x10, // 0x80BA Sensor CH3 0x12, // 0x80BB Sensor CH4 0x14, // 0x80BC Sensor CH5 0x16, // 0x80BD Sensor CH6 0x18, // 0x80BE Sensor CH7 0x1A, // 0x80BF Sensor CH8 0x1C, // 0x80C0 Sensor CH9 0xFF, // 0x80C1 Sensor CH10 0xFF, // 0x80C2 Sensor CH11 0xFF, // 0x80C3 Sensor CH12 0xFF, // 0x80C4 Sensor CH13 0xFF, // 0x80C5 Reserved 0xFF, // 0x80C6 Reserved 0xFF, // 0x80C7 Reserved 0xFF, // 0x80C8 Reserved 0xFF, // 0x80C9 Reserved 0xFF, // 0x80CA Reserved 0xFF, // 0x80CB Reserved 0xFF, // 0x80CC Reserved 0xFF, // 0x80CD Reserved 0xFF, // 0x80CE Reserved 0xFF, // 0x80CF Reserved 0xFF, // 0x80D0 Reserved 0xFF, // 0x80D1 Reserved 0xFF, // 0x80D2 Reserved 0xFF, // 0x80D3 Reserved 0xFF, // 0x80D4 Reserved 0x00, // 0x80D5 Driver CH0 0x02, // 0x80D6 Driver CH1 0x04, // 0x80D7 Driver CH2 0x06, // 0x80D8 Driver CH3 0x08, // 0x80D9 Driver CH4 0x0A, // 0x80DA Driver CH5 0x0C, // 0x80DB Driver CH6 0x1D, // 0x80DC Driver CH7 0x1E, // 0x80DD Driver CH8 0x1F, // 0x80DE Driver CH9 0x20, // 0x80DF Driver CH10 0x21, // 0x80E0 Driver CH11 0x22, // 0x80E1 Driver CH12 0x24, // 0x80E2 Driver CH13 0x26, // 0x80E3 Driver CH14 0x28, // 0x80E4 Driver CH15 0xFF, // 0x80E5 Driver CH16 0xFF, // 0x80E6 Driver CH17 0xFF, // 0x80E7 Driver CH18 0xFF, // 0x80E8 Driver CH19 0xFF, // 0x80E9 Driver CH20 0xFF, // 0x80EA Driver CH21 0xFF, // 0x80EB Driver CH22 0xFF, // 0x80EC Driver CH23 0xFF, // 0x80ED Driver CH24 0xFF, // 0x80EE Driver CH25 0xFF, // 0x80EF Reserved 0xFF, // 0x80F0 Reserved 0xFF, // 0x80F1 Reserved 0xFF, // 0x80F2 Reserved 0xFF, // 0x80F3 Reserved 0xFF, // 0x80F4 Reserved 0xFF, // 0x80F5 Reserved 0xFF, // 0x80F6 Reserved 0xFF, // 0x80F7 Reserved 0xFF, // 0x80F8 Reserved 0xFF, // 0x80F9 Reserved 0xFF, // 0x80FA Reserved 0xFF, // 0x80FB Reserved 0xFF, // 0x80FC Reserved 0xFF, // 0x80FD Reserved 0xFF // 0x80FE Reserved }; #else //GT911 param table const uint8_t TOUCH_GT911_Cfg[] = { GT911_CFG_NUMER, // 0x8047 Config version 0xE0, // 0x8048 X output map : x 480 0x01, 0x10, // 0x804A Y ouptut max : y 272 0x01, GT911_MAX_TP, // 0x804C Touch number 0x3C, // 0x804D Module switch 1 : bit4= xy change Int mode 0x20, // 0x804E Module switch 2 0x22, // 0x804F Shake_Count 0x0A, // 0x8050 Filter 0x28, // 0x8051 Larger touch 0x0F, // 0x8052 Noise reduction 0x5A, // 0x8053 Screen touch level 0x3C, // 0x8054 Screen touch leave 0x03, // 0x8055 Low power control 0x0F, // 0x8056 Refresh rate 0x01, // 0x8057 X threshold 0x01, // 0x8058 Y threshold 0x00, // 0x8059 Reserved 0x00, // 0x805A Reserved 0x11, // 0x805B Space (top, bottom) 0x11, // 0x805C Space (left, right) 0x08, // 0x805D Mini filter 0x18, // 0x805E Strech R0 0x1A, // 0x805F Strech R1 0x1E, // 0x8060 Strech R2 0x14, // 0x8061 Strech RM 0x87, // 0x8062 Drv groupA num 0x29, // 0x8063 Drv groupB num 0x0A, // 0x8064 Sensor num 0xCF, // 0x8065 FreqA factor 0xD1, // 0x8066 FreqB factor 0xB2, // 0x8067 Panel bit freq 0x04, 0x00, // 0x8069 Reserved 0x00, 0x00, // 0x806B Panel tx gain 0xD8, // 0x806C Panel rx gain 0x02, // 0x806D Panel dump shift 0x1D, // 0x806E Drv frame control 0x00, // 0x806F Charging level up 0x01, // 0x8070 Module switch 3 0x00, // 0x8071 Gesture distance 0x00, // 0x8072 Gesture long press time 0x00, // 0x8073 X/Y slope adjust 0x00, // 0x8074 Gesture control 0x00, // 0x8075 Gesture switch 1 0x00, // 0x8076 Gesture switch 2 0x00, // 0x8077 Gesture refresh rate 0x00, // 0x8078 Gesture touch level 0x00, // 0x8079 New green wake up level 0xB4, // 0x807A Freq hopping start 0xEF, // 0x807B Freq hopping end 0x94, // 0x807C Noise detect time 0xD5, // 0x807D Hopping flag 0x02, // 0x807E Hopping flag 0x07, // 0x807F Noise threshold 0x00, // 0x8080 Nois min threshold old 0x00, // 0x8081 Reserved 0x04, // 0x8082 Hopping sensor group 0x6E, // 0x8083 Hopping Seg1 normalize 0xB9, // 0x8084 Hopping Seg1 factor 0x00, // 0x8085 Main clock adjust 0x6A, // 0x8086 Hopping Seg2 normalize 0xC4, // 0x8087 Hopping Seg2 factor 0x00, // 0x8088 Reserved 0x66, // 0x8089 Hopping Seg3 normalize 0xCF, // 0x808A Hopping Seg3 factor 0x00, // 0x808B Reserved 0x62, // 0x808C Hopping Seg4 normalize 0xDB, // 0x808D Hopping Seg4 factor 0x00, // 0x808E Reserved 0x5E, // 0x808F Hopping Seg5 normalize 0xE8, // 0x8090 Hopping Seg5 factor 0x00, // 0x8091 Reserved 0x5E, // 0x8092 Hopping Seg6 normalize 0x00, // 0x8093 Key1 0x00, // 0x8094 Key2 0x00, // 0x8095 Key3 0x00, // 0x8096 Key4 0x00, // 0x8097 Key area 0x00, // 0x8098 Key touch level 0x00, // 0x8099 Key leave level 0x00, // 0x809A Key sens 0x00, // 0x809B Key sens 0x00, // 0x809C Key restrain 0x00, // 0x809D Key restrain time 0x00, // 0x809E Large gesture touch 0x00, // 0x809F Reserved 0x00, // 0x80A0 Reserved 0x00, // 0x80A1 Hotknot noise map 0x00, // 0x80A2 Link threshold 0x00, // 0x80A3 Pxy threshold 0x00, // 0x80A4 GHot dump shift 0x00, // 0x80A5 GHot rx gain 0x00, // 0x80A6 Freg gain 0x00, // 0x80A7 Freg gain 1 0x00, // 0x80A8 Freg gain 2 0x00, // 0x80A9 Freg gain 3 0x00, // 0x80AA Reserved 0x00, // 0x80AB Reserved 0x00, // 0x80AC Reserved 0x00, // 0x80AD Reserved 0x00, // 0x80AE Reserved 0x00, // 0x80AF Reserved 0x00, // 0x80B0 Reserved 0x00, // 0x80B1 Reserved 0x00, // 0x80B2 Reserved 0x00, // 0x80B3 Combine dis 0x00, // 0x80B4 Split set 0x00, // 0x80B5 Reserved 0x00, // 0x80B6 Reserved 0x14, // 0x80B7 Sensor CH0 0x12, // 0x80B8 Sensor CH1 0x10, // 0x80B9 Sensor CH2 0x0E, // 0x80BA Sensor CH3 0x0C, // 0x80BB Sensor CH4 0x0A, // 0x80BC Sensor CH5 0x08, // 0x80BD Sensor CH6 0x06, // 0x80BE Sensor CH7 0x04, // 0x80BF Sensor CH8 0x02, // 0x80C0 Sensor CH9 0xFF, // 0x80C1 Sensor CH10 0xFF, // 0x80C2 Sensor CH11 0xFF, // 0x80C3 Sensor CH12 0xFF, // 0x80C4 Sensor CH13 0x00, // 0x80C5 Reserved 0x00, // 0x80C6 Reserved 0x00, // 0x80C7 Reserved 0x00, // 0x80C8 Reserved 0x00, // 0x80C9 Reserved 0x00, // 0x80CA Reserved 0x00, // 0x80CB Reserved 0x00, // 0x80CC Reserved 0x00, // 0x80CD Reserved 0x00, // 0x80CE Reserved 0x00, // 0x80CF Reserved 0x00, // 0x80D0 Reserved 0x00, // 0x80D1 Reserved 0x00, // 0x80D2 Reserved 0x00, // 0x80D3 Reserved 0x00, // 0x80D4 Reserved 0x28, // 0x80D5 Driver CH0 0x26, // 0x80D6 Driver CH1 0x24, // 0x80D7 Driver CH2 0x22, // 0x80D8 Driver CH3 0x21, // 0x80D9 Driver CH4 0x20, // 0x80DA Driver CH5 0x1F, // 0x80DB Driver CH6 0x1E, // 0x80DC Driver CH7 0x1D, // 0x80DD Driver CH8 0x0C, // 0x80DE Driver CH9 0x0A, // 0x80DF Driver CH10 0x08, // 0x80E0 Driver CH11 0x06, // 0x80E1 Driver CH12 0x04, // 0x80E2 Driver CH13 0x02, // 0x80E3 Driver CH14 0x00, // 0x80E4 Driver CH15 0xFF, // 0x80E5 Driver CH16 0xFF, // 0x80E6 Driver CH17 0xFF, // 0x80E7 Driver CH18 0xFF, // 0x80E8 Driver CH19 0xFF, // 0x80E9 Driver CH20 0xFF, // 0x80EA Driver CH21 0xFF, // 0x80EB Driver CH22 0xFF, // 0x80EC Driver CH23 0xFF, // 0x80ED Driver CH24 0xFF, // 0x80EE Driver CH25 0x00, // 0x80EF Reserved 0x00, // 0x80F0 Reserved 0x00, // 0x80F1 Reserved 0x00, // 0x80F2 Reserved 0x00, // 0x80F3 Reserved 0x00, // 0x80F4 Reserved 0x00, // 0x80F5 Reserved 0x00, // 0x80F6 Reserved 0x00, // 0x80F7 Reserved 0x00, // 0x80F8 Reserved 0x00, // 0x80F9 Reserved 0x00, // 0x80FA Reserved 0x00, // 0x80FB Reserved 0x00, // 0x80FC Reserved 0x00, // 0x80FD Reserved 0x00 // 0x80FE Reserved }; #endif bool touchGT911Flag = false; volatile static bool touchEventOccured = false; struct TouchData touchData; uint16_t touchGT911fwver = 0; uint32_t touchGT911hiccups = 0; tmr10ms_t downTime = 0; tmr10ms_t tapTime = 0; short tapCount = 0; #define TAP_TIME 25 I2C_HandleTypeDef hi2c1; static TouchState internalTouchState = {}; static void TOUCH_AF_ExtiStop(void) { SYSCFG_EXTILineConfig(TOUCH_INT_EXTI_PortSource, TOUCH_INT_EXTI_PinSource1); EXTI_InitTypeDef EXTI_InitStructure; EXTI_StructInit(&EXTI_InitStructure); EXTI_InitStructure.EXTI_Line = TOUCH_INT_EXTI_LINE1; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = DISABLE; EXTI_Init(&EXTI_InitStructure); NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TOUCH_INT_EXTI_IRQn1; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 9; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /* Not used as 4 bits are used for the pre-emption priority. */; NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE; NVIC_Init(&NVIC_InitStructure); } static void TOUCH_AF_ExtiConfig(void) { SYSCFG_EXTILineConfig(TOUCH_INT_EXTI_PortSource, TOUCH_INT_EXTI_PinSource1); EXTI_InitTypeDef EXTI_InitStructure; EXTI_StructInit(&EXTI_InitStructure); EXTI_InitStructure.EXTI_Line = TOUCH_INT_EXTI_LINE1; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TOUCH_INT_EXTI_IRQn1; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 9; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /* Not used as 4 bits are used for the pre-emption priority. */; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } static void TOUCH_AF_GPIOConfig(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = TOUCH_RST_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(TOUCH_RST_GPIO, &GPIO_InitStructure); GPIO_ResetBits(TOUCH_RST_GPIO, TOUCH_RST_GPIO_PIN); GPIO_InitStructure.GPIO_Pin = TOUCH_INT_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(TOUCH_INT_GPIO, &GPIO_InitStructure); GPIO_ResetBits(TOUCH_INT_GPIO, TOUCH_INT_GPIO_PIN); } void TOUCH_AF_INT_Change(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = TOUCH_INT_GPIO_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_Init(TOUCH_INT_GPIO, &GPIO_InitStructure); } void I2C_Init_Radio(void) { TRACE("I2C B1 Init"); hi2c1.Instance = I2C_B1; hi2c1.Init.ClockSpeed = I2C_B1_CLK_RATE; hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_16_9; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c1.Init.OwnAddress2 = 0; hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; if (HAL_I2C_Init(&hi2c1) != HAL_OK) { TRACE("I2C B1 ERROR: HAL_I2C_Init() failed"); } // Configure Analogue filter if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK) { TRACE("I2C B1 ERROR: HAL_I2CEx_ConfigAnalogFilter() failed"); } // Configure Digital filter if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK) { TRACE("I2C B1 ERROR: HAL_I2CEx_ConfigDigitalFilter() failed"); } } bool I2C_GT911_WriteRegister(uint16_t reg, uint8_t * buf, uint8_t len) { uint8_t uAddrAndBuf[258]; uAddrAndBuf[0] = (uint8_t)((reg & 0xFF00) >> 8); uAddrAndBuf[1] = (uint8_t)(reg & 0x00FF); if (len > 0) { for (int i = 0;i < len;i++) { uAddrAndBuf[i + 2] = buf[i]; } } if (HAL_I2C_Master_Transmit(&hi2c1, GT911_I2C_ADDR << 1, uAddrAndBuf, len + 2, 100) != HAL_OK) { TRACE("I2C B1 ERROR: WriteRegister failed"); return false; } return true; } bool I2C_GT911_ReadRegister(uint16_t reg, uint8_t * buf, uint8_t len) { uint8_t uRegAddr[2]; uRegAddr[0] = (uint8_t)((reg & 0xFF00) >> 8); uRegAddr[1] = (uint8_t)(reg & 0x00FF); if (HAL_I2C_Master_Transmit(&hi2c1, GT911_I2C_ADDR << 1, uRegAddr, 2, 10) != HAL_OK) { TRACE("I2C B1 ERROR: ReadRegister write reg address failed"); return false; } if (HAL_I2C_Master_Receive(&hi2c1, GT911_I2C_ADDR << 1, buf, len, 100) != HAL_OK) { TRACE("I2C B1 ERROR: ReadRegister read reg address failed"); return false; } return true; } bool I2C_GT911_SendConfig(void) { uint8_t buf[2]; uint8_t i = 0; buf[0] = 0; buf[1] = 1; bool bResult = true; for (i = 0; i < sizeof(TOUCH_GT911_Cfg); i++) buf[0] += TOUCH_GT911_Cfg[i];//check sum buf[0] = (~buf[0]) + 1; if (!I2C_GT911_WriteRegister(GT_CFGS_REG, (uint8_t *) TOUCH_GT911_Cfg, sizeof(TOUCH_GT911_Cfg))) { TRACE("GT911 ERROR: write config failed"); bResult = false; } if (!I2C_GT911_WriteRegister(GT_CHECK_REG, buf, 2)) //write checksum { TRACE("GT911 ERROR: write config checksum failed"); bResult = false; } return bResult; } void touchPanelDeInit(void) { TOUCH_AF_ExtiStop(); touchGT911Flag = false; } bool touchPanelInit(void) { uint8_t tmp[4] = {0}; if (touchGT911Flag) { TOUCH_AF_ExtiConfig(); return true; } else { TRACE("Touchpanel init start ..."); TOUCH_AF_GPIOConfig(); //SET RST=OUT INT=OUT INT=LOW I2C_Init_Radio(); TPRST_LOW(); TPINT_HIGH(); delay_us(200); TPRST_HIGH(); delay_ms(6); TPINT_LOW(); delay_ms(55); TOUCH_AF_INT_Change(); //Set INT INPUT INT=LOW delay_ms(50); TRACE("Reading Touch registry"); if (!I2C_GT911_ReadRegister(GT_PID_REG, tmp, 4)) { TRACE("GT911 ERROR: Product ID read failed"); } if (strcmp((char *) tmp, "911") == 0) //ID==9147 { TRACE("GT911 chip detected"); tmp[0] = 0X02; if (!I2C_GT911_WriteRegister(GT_CTRL_REG, tmp, 1)) { TRACE("GT911 ERROR: write to control register failed"); } if (!I2C_GT911_ReadRegister(GT_CFGS_REG, tmp, 1)) { TRACE("GT911 ERROR: configuration register read failed"); } TRACE("Chip config Ver:%x", tmp[0]); if (tmp[0] < GT911_CFG_NUMER) //Config ver { TRACE("Sending new config %d", GT911_CFG_NUMER); if (!I2C_GT911_SendConfig()) { TRACE("GT911 ERROR: sending configration failed"); } } if (!I2C_GT911_ReadRegister(GT911_FIRMWARE_VERSION_REG, tmp, 2)) { TRACE("GT911 ERROR: reading firmware version failed"); } else { touchGT911fwver = (tmp[1] << 8) + tmp[0]; TRACE("GT911 FW version: %u", touchGT911fwver); } delay_ms(10); tmp[0] = 0X00; if (!I2C_GT911_WriteRegister(GT_CTRL_REG, tmp, 1)) //end reset { TRACE("GT911 ERROR: write to control register failed"); } touchGT911Flag = true; TOUCH_AF_ExtiConfig(); return true; } TRACE("GT911 chip NOT FOUND"); return false; } } bool I2C_ReInit(void) { TRACE("I2C B1 ReInit"); touchPanelDeInit(); if (HAL_I2C_DeInit(&hi2c1) != HAL_OK) TRACE("I2C B1 ReInit - I2C DeInit failed"); // If DeInit fails, try to re-init anyway if (!touchPanelInit()) { TRACE("I2C B1 ReInit - touchPanelInit failed"); return false; } return true; } #if defined(SIMU) || defined(SEMIHOSTING) || defined(DEBUG) static const char* event2str(uint8_t ev) { switch(ev){ case TE_NONE: return "NONE"; case TE_UP: return "UP"; case TE_DOWN: return "DOWN"; case TE_SLIDE_END: return "SLIDE_END"; case TE_SLIDE: return "SLIDE"; default: return "UNKNOWN"; } } #endif struct TouchState touchPanelRead() { uint8_t state = 0; if (!touchEventOccured) return internalTouchState; touchEventOccured = false; uint32_t startReadStatus = RTOS_GET_MS(); do { if (!I2C_GT911_ReadRegister(GT911_READ_XY_REG, &state, 1)) { //ledRed(); touchGT911hiccups++; TRACE("GT911 I2C read XY error"); if (!I2C_ReInit()) TRACE("I2C B1 ReInit failed"); return internalTouchState; } if (state & 0x80u) { // ready break; } RTOS_WAIT_MS(1); } while(RTOS_GET_MS() - startReadStatus < GT911_TIMEOUT); TRACE("touch state = 0x%x", state); if (state & 0x80u) { uint8_t pointsCount = (state & 0x0Fu); tmr10ms_t now = get_tmr10ms(); internalTouchState.tapCount = 0; if (pointsCount > 0 && pointsCount <= GT911_MAX_TP) { if (!I2C_GT911_ReadRegister(GT911_READ_XY_REG + 1, touchData.data, pointsCount * sizeof(TouchPoint))) { //ledRed(); touchGT911hiccups++; TRACE("GT911 I2C data read error"); if (!I2C_ReInit()) TRACE("I2C B1 ReInit failed"); return internalTouchState; } if (internalTouchState.event == TE_NONE || internalTouchState.event == TE_UP || internalTouchState.event == TE_SLIDE_END) { internalTouchState.event = TE_DOWN; internalTouchState.startX = internalTouchState.x = touchData.points[0].x; internalTouchState.startY = internalTouchState.y = touchData.points[0].y; downTime = now; } else { internalTouchState.deltaX = touchData.points[0].x - internalTouchState.x; internalTouchState.deltaY = touchData.points[0].y - internalTouchState.y; if (internalTouchState.event == TE_SLIDE || abs(internalTouchState.deltaX) >= SLIDE_RANGE || abs(internalTouchState.deltaY) >= SLIDE_RANGE) { internalTouchState.event = TE_SLIDE; internalTouchState.x = touchData.points[0].x; internalTouchState.y = touchData.points[0].y; } } } else { if (internalTouchState.event == TE_SLIDE) { internalTouchState.event = TE_SLIDE_END; } else if (internalTouchState.event == TE_DOWN) { internalTouchState.event = TE_UP; if (now - downTime <= TAP_TIME) { if (now - tapTime > TAP_TIME) tapCount = 1; else tapCount++; internalTouchState.tapCount = tapCount; tapTime = now; } } else if (internalTouchState.event != TE_SLIDE_END) { internalTouchState.event = TE_NONE; } } } uint8_t zero = 0; if (!I2C_GT911_WriteRegister(GT911_READ_XY_REG, &zero, 1)) { TRACE("GT911 ERROR: clearing XY register failed"); } TRACE("touch event = %s", event2str(internalTouchState.event)); return internalTouchState; } extern "C" void TOUCH_INT_EXTI_IRQHandler1(void) { if (EXTI_GetITStatus(TOUCH_INT_EXTI_LINE1) != RESET) { touchEventOccured = true; EXTI_ClearITPendingBit(TOUCH_INT_EXTI_LINE1); } } bool touchPanelEventOccured() { return touchEventOccured; }