diff --git a/radio/src/gui/480x272/radio_diaganas.cpp b/radio/src/gui/480x272/radio_diaganas.cpp index ae452f7ae..19e50914f 100644 --- a/radio/src/gui/480x272/radio_diaganas.cpp +++ b/radio/src/gui/480x272/radio_diaganas.cpp @@ -19,7 +19,8 @@ */ #include "opentx.h" -#if defined(RADIO_TX16S) +#if defined(HARDWARE_TOUCH) +#include "touch.h" #include "tp_gt911.h" #include #endif @@ -71,7 +72,7 @@ bool menuRadioDiagAnalogs(event_t event) lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + 7 * FH, STR_TOUCH_PANEL); } - if (touchPanelEvent) { + if (touchPanelEventOccured()) { touchPanelRead(); lcdDrawNumber(lcdNextPos + 1, MENU_CONTENT_TOP + 7 * FH, touchState.x); lcdDrawText(lcdNextPos, MENU_CONTENT_TOP + 7 * FH, ", "); diff --git a/radio/src/targets/horus/tp_gt911.cpp b/radio/src/targets/horus/tp_gt911.cpp index 5c4929e95..3bb3ec21d 100644 --- a/radio/src/targets/horus/tp_gt911.cpp +++ b/radio/src/targets/horus/tp_gt911.cpp @@ -18,54 +18,204 @@ * GNU General Public License for more details. */ +#include "opentx.h" #include "tp_gt911.h" +#include "touch.h" + +//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 + 0x05, // 0x8056 Refresh rate + 0x00, // 0x8057 X threshold + 0x00, // 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 + }; uint8_t touchGT911Flag = 0; -uint8_t touchPanelEvent = 0; +uint8_t touchEventOccured = 0; struct TouchData touchData; struct TouchState touchState; -void GT911_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); -} - -uint8_t GT911_Send_Cfg(uint8_t mode) -{ - uint8_t buf[2]; - uint8_t i = 0; - buf[0] = 0; - buf[1] = mode; - for (i = 0; i < sizeof(GT911_Cfg); i++) - buf[0] += GT911_Cfg[i];//check sum - - buf[0] = (~buf[0]) + 1; - gt911WriteRegister(GT_CFGS_REG, (uint8_t *) GT911_Cfg, sizeof(GT911_Cfg));// - gt911WriteRegister(GT_CHECK_REG, buf, 2);//write checksum - return 0; -} - -static void I2C_Config(void) -{ - GPIO_InitTypeDef GPIO_InitStructure; - RCC_AHB1PeriphClockCmd(I2C_RCC_AHB1Periph, ENABLE); - GPIO_InitStructure.GPIO_Pin = I2C_SCL_GPIO_PIN | I2C_SDA_GPIO_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(I2C_GPIO, &GPIO_InitStructure); - - GPIO_SetBits(I2C_GPIO, I2C_SCL_GPIO_PIN | I2C_SDA_GPIO_PIN); -} - static void TOUCH_AF_ExtiStop(void) { SYSCFG_EXTILineConfig(TOUCH_INT_EXTI_PortSource, TOUCH_INT_EXTI_PinSource1); @@ -99,7 +249,6 @@ static void TOUCH_AF_ExtiConfig(void) 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; @@ -130,174 +279,158 @@ static void TOUCH_AF_GPIOConfig(void) GPIO_ResetBits(TOUCH_INT_GPIO, TOUCH_INT_GPIO_PIN); } -void SDA_IN(void) +void TOUCH_AF_INT_Change(void) { GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.GPIO_Pin = I2C_SDA_GPIO_PIN; + + 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_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_Init(I2C_GPIO, &GPIO_InitStructure); + GPIO_Init(TOUCH_INT_GPIO, &GPIO_InitStructure); } -void SDA_OUT(void) +void I2C_Init() { + I2C_DeInit(I2C); + GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.GPIO_Pin = I2C_SDA_GPIO_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + I2C_InitTypeDef I2C_InitStructure; + I2C_InitStructure.I2C_ClockSpeed = I2C_SPEED; + I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; + I2C_InitStructure.I2C_OwnAddress1 = 0x00; + I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; + I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; + I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; + I2C_Init(I2C, &I2C_InitStructure); + I2C_Cmd(I2C, ENABLE); + + GPIO_PinAFConfig(I2C_GPIO, I2C_SCL_GPIO_PinSource, I2C_GPIO_AF); + GPIO_PinAFConfig(I2C_GPIO, I2C_SDA_GPIO_PinSource, I2C_GPIO_AF); + + GPIO_InitStructure.GPIO_Pin = I2C_SCL_GPIO_PIN | I2C_SDA_GPIO_PIN; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(I2C_GPIO, &GPIO_InitStructure); } -void I2C_Start(void) +bool I2C_WaitEvent(uint32_t event) { - SDA_OUT(); - I2C_SDA_H(); - I2C_SCL_H(); - delay_us(2); - I2C_SDA_L();//START:when CLK is high,DATA change form high to low - delay_us(2); - I2C_SCL_L();// - delay_us(2); -} - -void I2C_Stop(void) -{ - SDA_OUT(); - I2C_SCL_L(); - I2C_SDA_L();//STOP:when CLK is high DATA change form low to high - delay_us(2); - I2C_SCL_H(); - I2C_SDA_H();// - delay_us(2); -} - -uint8_t I2C_Wait_Ack(void) -{ - uint8_t ucErrTime = 0; - SDA_IN(); - I2C_SDA_H(); - delay_us(2); - I2C_SCL_H(); - while (READ_SDA) { - ucErrTime++; - if (ucErrTime > 166) { - I2C_Stop(); - return 1; - } - delay_us(1); + uint32_t timeout = I2C_TIMEOUT_MAX; + while (!I2C_CheckEvent(I2C, event)) { + if ((timeout--) == 0) return false; } - I2C_SDA_L(); - I2C_SCL_L(); + return true; +} + +bool I2C_WaitEventCleared(uint32_t event) +{ + uint32_t timeout = I2C_TIMEOUT_MAX; + while (I2C_CheckEvent(I2C, event)) { + if ((timeout--) == 0) return false; + } + return true; +} + +uint8_t I2C_GT911_WriteRegister(uint16_t reg, uint8_t * buf, uint8_t len) +{ + if (!I2C_WaitEventCleared(I2C_FLAG_BUSY)) + return false; + + I2C_GenerateSTART(I2C, ENABLE); + if (!I2C_WaitEvent(I2C_EVENT_MASTER_MODE_SELECT)) + return false; + + I2C_Send7bitAddress(I2C, GT_CMD_WR, I2C_Direction_Transmitter); + if (!I2C_WaitEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) + return false; + + I2C_SendData(I2C, (uint8_t)((reg & 0xFF00) >> 8)); + if (!I2C_WaitEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTING)) + return false; + I2C_SendData(I2C, (uint8_t)(reg & 0x00FF)); + if (!I2C_WaitEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTING)) + return false; + + /* While there is data to be written */ + while (len--) { + I2C_SendData(I2C, *buf); + if (!I2C_WaitEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTING)) + return false; + buf++; + } + + if (!I2C_WaitEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED)) + return false; + + I2C_GenerateSTOP(I2C, ENABLE); + return true; +} + +bool I2C_GT911_ReadRegister(u16 reg, uint8_t * buf, uint8_t len) +{ + if (!I2C_WaitEventCleared(I2C_FLAG_BUSY)) + return false; + + I2C_GenerateSTART(I2C, ENABLE); + if (!I2C_WaitEvent(I2C_EVENT_MASTER_MODE_SELECT)) + return false; + + I2C_Send7bitAddress(I2C, GT_CMD_WR, I2C_Direction_Transmitter); + if (!I2C_WaitEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) + return false; + + I2C_SendData(I2C, (uint8_t)((reg & 0xFF00) >> 8)); + if (!I2C_WaitEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTING)) + return false; + I2C_SendData(I2C, (uint8_t)(reg & 0x00FF)); + if (!I2C_WaitEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED)) + return false; + + I2C_GenerateSTART(I2C, ENABLE); + if (!I2C_WaitEvent(I2C_EVENT_MASTER_MODE_SELECT)) + return false; + + I2C_Send7bitAddress(I2C, GT_CMD_RD, I2C_Direction_Receiver); + if (!I2C_WaitEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) + return false; + + if (len > 1) { + I2C_AcknowledgeConfig(I2C, ENABLE); + } + + while (len) { + if (len == 1) { + I2C_AcknowledgeConfig(I2C, DISABLE); + } + if (!I2C_WaitEvent(I2C_EVENT_MASTER_BYTE_RECEIVED)) + return false; + *buf++ = I2C_ReceiveData(I2C); + len--; + } + + I2C_GenerateSTOP(I2C, ENABLE); + return true; +} + +uint8_t I2C_GT911_SendConfig(uint8_t mode) +{ + uint8_t buf[2]; + uint8_t i = 0; + buf[0] = 0; + buf[1] = mode; + for (i = 0; i < sizeof(TOUCH_GT911_Cfg); i++) + buf[0] += TOUCH_GT911_Cfg[i];//check sum + + buf[0] = (~buf[0]) + 1; + I2C_GT911_WriteRegister(GT_CFGS_REG, (uint8_t *) TOUCH_GT911_Cfg, sizeof(TOUCH_GT911_Cfg));// + I2C_GT911_WriteRegister(GT_CHECK_REG, buf, 2);//write checksum return 0; } -void I2C_Ack(void) -{ - I2C_SCL_L(); - SDA_OUT(); - I2C_SDA_L(); - delay_us(2); - I2C_SCL_H(); - delay_us(2); - I2C_SCL_L(); -} - -void I2C_NAck(void) -{ - I2C_SCL_L(); - SDA_OUT(); - I2C_SDA_H(); - delay_us(2); - I2C_SCL_H(); - delay_us(2); - I2C_SCL_L(); -} - -void I2C_Send_Byte(uint8_t txd) -{ - uint8_t t; - - SDA_OUT(); - I2C_SCL_L(); - for (t = 0; t < 8; t++) { - if ((txd & 0x80) >> 7) - I2C_SDA_H(); - else - I2C_SDA_L(); - txd <<= 1; - delay_us(1); - I2C_SCL_H(); - delay_us(2); - I2C_SCL_L(); - delay_us(1); - } -} - -uint8_t I2C_Read_Byte(unsigned char ack) -{ - unsigned char i, receive = 0; - - SDA_IN(); - for (i = 0; i < 8; i++) { - I2C_SCL_L(); - delay_us(2); - I2C_SCL_H(); - receive <<= 1; - if (READ_SDA)receive++; - delay_us(1); - } - if (!ack) - I2C_NAck(); - else - I2C_Ack(); - return receive; -} - -uint8_t gt911WriteRegister(uint16_t reg, uint8_t * buf, uint8_t len) -{ - { - uint8_t i; - uint8_t ret = 0; - - I2C_Start(); - I2C_Send_Byte(GT_CMD_WR); //send cmd - I2C_Wait_Ack(); - I2C_Send_Byte(reg >> 8); //send hi - I2C_Wait_Ack(); - I2C_Send_Byte(reg & 0XFF); //send low - I2C_Wait_Ack(); - for (i = 0; i < len; i++) { - I2C_Send_Byte(buf[i]); - ret = I2C_Wait_Ack(); - if (ret)break; - } - I2C_Stop(); - - return ret; - } -} - -void gt911ReadRegister(u16 reg, uint8_t * buf, uint8_t len) -{ - uint8_t i; - - I2C_Start(); - I2C_Send_Byte(GT_CMD_WR); //send addr - I2C_Wait_Ack(); - I2C_Send_Byte(reg >> 8); //send hi - I2C_Wait_Ack(); - I2C_Send_Byte(reg & 0XFF); //send low - I2C_Wait_Ack(); - I2C_Start(); - I2C_Send_Byte(GT_CMD_RD); //send rd - I2C_Wait_Ack(); - - for (i = 0; i < len; i++) { - buf[i] = I2C_Read_Byte(i == (len - 1) ? 0 : 1); //send data - } - I2C_Stop(); -} - void touchPanelDeInit(void) { TOUCH_AF_ExtiStop(); @@ -307,61 +440,70 @@ bool touchPanelInit(void) { uint8_t tmp[4] = {0}; - TRACE("Touchpanel init start ..."); - - TOUCH_AF_GPIOConfig(); //SET RST=OUT INT=OUT INT=LOW - I2C_Config(); - - TPRST_LOW(); - TPINT_HIGH(); - delay_us(200); - - TPRST_HIGH(); - delay_ms(6); - - TPINT_LOW(); - delay_ms(55); - - GT911_INT_Change(); //Set INT INPUT INT=LOW - - delay_ms(50); - - TRACE("Reading Touch registry"); - gt911ReadRegister(GT_PID_REG, tmp, 4); - - if (strcmp((char *) tmp, "911") == 0) //ID==9147 - { - TRACE("GT911 chip detected"); - tmp[0] = 0X02; - gt911WriteRegister(GT_CTRL_REG, tmp, 1); - gt911ReadRegister(GT_CFGS_REG, tmp, 1); - - TRACE("Chip config Ver:%x\r\n",tmp[0]); - if (tmp[0] < GT911_CFG_NUMER) //Config ver - { - TRACE("Sending new config %d", GT911_CFG_NUMER); - GT911_Send_Cfg(1); - } - - delay_ms(10); - tmp[0] = 0X00; - gt911WriteRegister(GT_CTRL_REG, tmp, 1); //end reset - touchGT911Flag = true; - + if (touchGT911Flag) { TOUCH_AF_ExtiConfig(); - return true; } - TRACE("GT911 chip NOT FOUND"); - return false; + else { + TRACE("Touchpanel init start ..."); + + TOUCH_AF_GPIOConfig(); //SET RST=OUT INT=OUT INT=LOW + I2C_Init(); + + 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"); + I2C_GT911_ReadRegister(GT_PID_REG, tmp, 4); + + if (strcmp((char *) tmp, "911") == 0) //ID==9147 + { + TRACE("GT911 chip detected"); + tmp[0] = 0X02; + I2C_GT911_WriteRegister(GT_CTRL_REG, tmp, 1); + I2C_GT911_ReadRegister(GT_CFGS_REG, tmp, 1); + + TRACE("Chip config Ver:%x\r\n", tmp[0]); + if (tmp[0] < GT911_CFG_NUMER) //Config ver + { + TRACE("Sending new config %d", GT911_CFG_NUMER); + I2C_GT911_SendConfig(1); + } + + delay_ms(10); + tmp[0] = 0X00; + I2C_GT911_WriteRegister(GT_CTRL_REG, tmp, 1); //end reset + touchGT911Flag = true; + + TOUCH_AF_ExtiConfig(); + + return true; + } + TRACE("GT911 chip NOT FOUND"); + return false; + } } void touchPanelRead() { uint8_t state = 0; - gt911ReadRegister(GT911_READ_XY_REG, &state, 1); - touchPanelEvent = false; + if (!touchEventOccured) + return; + + touchEventOccured = false; + I2C_GT911_ReadRegister(GT911_READ_XY_REG, &state, 1); if ((state & 0x80u) == 0x00) { // not ready @@ -371,7 +513,7 @@ void touchPanelRead() uint8_t pointsCount = (state & 0x0Fu); if (pointsCount > 0 && pointsCount < GT911_MAX_TP) { - gt911ReadRegister(GT911_READ_XY_REG + 1, touchData.data, pointsCount * sizeof(TouchPoint)); + I2C_GT911_ReadRegister(GT911_READ_XY_REG + 1, touchData.data, pointsCount * sizeof(TouchPoint)); if (touchData.pointsCount == 0) { touchState.event = TE_DOWN; touchState.startX = touchState.x = touchData.points[0].x; @@ -399,14 +541,22 @@ void touchPanelRead() } uint8_t zero = 0; - gt911WriteRegister(GT911_READ_XY_REG, &zero, 1); + I2C_GT911_WriteRegister(GT911_READ_XY_REG, &zero, 1); } extern "C" void TOUCH_INT_EXTI_IRQHandler1(void) { if (EXTI_GetITStatus(TOUCH_INT_EXTI_LINE1) != RESET) { - TRACE("TI"); - touchPanelEvent = 1; + if (g_eeGeneral.backlightMode & e_backlight_mode_keys) { + // on touch turn the light on + resetBacklightTimeout(); + } + touchEventOccured = 1; EXTI_ClearITPendingBit(TOUCH_INT_EXTI_LINE1); } } + +bool touchPanelEventOccured() +{ + return touchEventOccured; +} \ No newline at end of file diff --git a/radio/src/targets/horus/tp_gt911.h b/radio/src/targets/horus/tp_gt911.h index 2b5f7d32c..0f9aa98ed 100644 --- a/radio/src/targets/horus/tp_gt911.h +++ b/radio/src/targets/horus/tp_gt911.h @@ -21,218 +21,22 @@ #ifndef _FT5X06_H_ #define _FT5X06_H_ -#include "opentx.h" -#include "touch.h" - #define HAS_TOUCH_PANEL() touchGT911Flag == true -bool touchPanelInit(); -void touchPanelDeInit(); - extern uint8_t touchGT911Flag; -extern uint8_t touchPanelEvent; +extern bool touchPanelInit(void); +extern void touchPanelDeInit(void); -uint8_t gt911WriteRegister(uint16_t reg, uint8_t * buf, uint8_t len); -void gt911ReadRegister(uint16_t reg, uint8_t * buf, uint8_t len); void touchPanelRead(); +bool touchPanelEventOccured(); -#define GT911_MAX_TP 5 -#define GT911_CFG_NUMER 0x6A - -//GT911 param table -const uint8_t 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 - 0x05, // 0x8056 Refresh rate - 0x00, // 0x8057 X threshold - 0x00, // 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 -}; +#define GT911_MAX_TP 5 +#define GT911_CFG_NUMER 0x6A //I2C #define GT_CMD_WR 0X28 #define GT_CMD_RD 0X29 - -#define SLAVE_Write_Address 0X28 +#define I2C_TIMEOUT_MAX 1000 //GT9147 #define GT_CTRL_REG 0X8040 @@ -257,8 +61,7 @@ const uint8_t GT911_Cfg[] = #define GT911_CONFIG_CHECKSUM_REG 0x80FF #define GT911_FIRMWARE_VERSION_REG 0x8144 -PACK(typedef struct -{ +PACK(typedef struct { uint8_t track; uint16_t x; uint16_t y; @@ -266,8 +69,7 @@ PACK(typedef struct uint8_t reserved; }) TouchPoint; -PACK(struct TouchData -{ +PACK(struct TouchData { uint8_t pointsCount; union { @@ -276,21 +78,10 @@ PACK(struct TouchData }; }); -extern struct TouchData touchData; - #define TPRST_LOW() do { TOUCH_RST_GPIO->BSRRH = TOUCH_RST_GPIO_PIN; } while(0) #define TPRST_HIGH() do { TOUCH_RST_GPIO->BSRRL = TOUCH_RST_GPIO_PIN; } while(0) #define TPINT_LOW() do { TOUCH_INT_GPIO->BSRRH = TOUCH_INT_GPIO_PIN; } while(0) #define TPINT_HIGH() do { TOUCH_INT_GPIO->BSRRL = TOUCH_INT_GPIO_PIN; } while(0) - -#define I2C_SCL_L() do { I2C_GPIO->BSRRH = I2C_SCL_GPIO_PIN; } while(0) -#define I2C_SCL_H() do { I2C_GPIO->BSRRL = I2C_SCL_GPIO_PIN; } while(0) - -#define I2C_SDA_L() do { I2C_GPIO->BSRRH = I2C_SDA_GPIO_PIN; } while(0) -#define I2C_SDA_H() do { I2C_GPIO->BSRRL = I2C_SDA_GPIO_PIN; } while(0) - -#define READ_SDA GPIO_ReadInputDataBit(I2C_GPIO, I2C_SDA_GPIO_PIN) - -#endif // _FT5X06_H_ +#endif // _FT5X06_H_ \ No newline at end of file