From ccbbd413de9a6ced301f93d59e9e7053947ad327 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 7 Apr 2020 09:53:47 +0200 Subject: [PATCH] TP test started (untested) --- radio/src/gui/480x272/radio_diagtouch.cpp | 11 +- radio/src/targets/horus/CMakeLists.txt | 2 +- radio/src/targets/horus/ft5x06.cpp | 31 ---- radio/src/targets/horus/ft5x06.h | 27 --- radio/src/targets/horus/hal.h | 42 ++--- radio/src/targets/horus/tp_gt911.cpp | 201 ++++++++++++++++++++++ radio/src/targets/horus/tp_gt911.h | 126 ++++++++++++++ 7 files changed, 355 insertions(+), 85 deletions(-) delete mode 100644 radio/src/targets/horus/ft5x06.cpp delete mode 100644 radio/src/targets/horus/ft5x06.h create mode 100644 radio/src/targets/horus/tp_gt911.cpp create mode 100644 radio/src/targets/horus/tp_gt911.h diff --git a/radio/src/gui/480x272/radio_diagtouch.cpp b/radio/src/gui/480x272/radio_diagtouch.cpp index 7e1d41bba..15535d289 100644 --- a/radio/src/gui/480x272/radio_diagtouch.cpp +++ b/radio/src/gui/480x272/radio_diagtouch.cpp @@ -19,7 +19,7 @@ */ #include "opentx.h" -#include "ft5x06.h" +#include "tp_gt911.h" bool menuRadioDiagTouch(event_t event) { @@ -28,10 +28,11 @@ bool menuRadioDiagTouch(event_t event) SIMPLE_SUBMENU(STR_MENU_RADIO_TOUCH, ICON_MODEL_SETUP, 1); if (event == EVT_ENTRY || event == EVT_ENTRY_UP) { - touchAvailable = touchInit(); + touchAvailable = touchPanelInit(); + touchEventFlag = 0; } else if (menuEvent) { - touchDeInit(); + //touchDeInit(); return false; } @@ -42,5 +43,9 @@ bool menuRadioDiagTouch(event_t event) lcdDrawText(LCD_W / 2, LCD_H / 2, STR_TOUCH_NOTFOUND, CENTERED); } + if (touchEventFlag) { + touchPanelDeInit(); + popMenu(); + } return true; } diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index 92dded852..a0cf09cd2 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -209,7 +209,7 @@ set(TARGET_SRC ) if(HARDWARE_TOUCH) - set(TARGET_SRC ${TARGET_SRC} ft5x06.cpp) + set(TARGET_SRC ${TARGET_SRC} tp_gt911.cpp) set(GUI_SRC ${GUI_SRC} radio_diagtouch.cpp) add_definitions(-DHARDWARE_TOUCH) endif() diff --git a/radio/src/targets/horus/ft5x06.cpp b/radio/src/targets/horus/ft5x06.cpp deleted file mode 100644 index 9c0f6332a..000000000 --- a/radio/src/targets/horus/ft5x06.cpp +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * 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 "ft5x06.h" - -void toucDehInit(void) -{ - -} - -bool touchInit(void) -{ - return false; -} \ No newline at end of file diff --git a/radio/src/targets/horus/ft5x06.h b/radio/src/targets/horus/ft5x06.h deleted file mode 100644 index 01485d7da..000000000 --- a/radio/src/targets/horus/ft5x06.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * 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. - */ - -#ifndef _FT5X06_H_ -#define _FT5X06_H_ - -bool touchInit(void); -void touchDeInit(void); - -#endif // _FT5X06_H_ diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index 5e3ac2d1d..f24b3dda1 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -634,11 +634,26 @@ #define AUDIO_MUTE_DELAY 500 // ms #endif +// Touch +#if defined(HARDWARE_TOUCH) +#define TOUCH_INT_RCC_AHB1Periph RCC_AHB1Periph_GPIOH +#define TOUCH_INT_GPIO GPIOH +#define TOUCH_INT_GPIO_PIN GPIO_Pin_2 + +#define TOUCH_RST_RCC_AHB1Periph RCC_AHB1Periph_GPIOF +#define TOUCH_RST_GPIO GPIOF +#define TOUCH_RST_GPIO_PIN GPIO_Pin_10 + +#define TOUCH_INT_EXTI_LINE1 EXTI_Line2 +#define TOUCH_INT_EXTI_IRQn1 EXTI2_IRQn +#define TOUCH_INT_EXTI_IRQHandler1 EXTI2_IRQHandler +#define TOUCH_INT_EXTI_PortSource EXTI_PortSourceGPIOH +#define TOUCH_INT_EXTI_PinSource1 EXTI_PinSource2 + +#define TOUCH_INT_STAUS() (GPIO_ReadInputDataBit(TOUCH_INT_GPIO, TOUCH_INT_GPIO_PIN)) +#endif + // I2C Bus -#if defined(RADIO_TX16S) -#define I2C_RCC_AHB1Periph 0 -#define I2C_RCC_APB1Periph 0 -#else #define I2C_RCC_AHB1Periph RCC_AHB1Periph_GPIOB #define I2C_RCC_APB1Periph RCC_APB1Periph_I2C1 #define I2C I2C1 @@ -649,7 +664,6 @@ #define I2C_SCL_GPIO_PinSource GPIO_PinSource8 #define I2C_SDA_GPIO_PinSource GPIO_PinSource9 #define I2C_SPEED 400000 -#endif // Haptic #define HAPTIC_PWM @@ -842,24 +856,6 @@ #define TIMER_2MHz_RCC_APB1Periph RCC_APB1Periph_TIM7 #define TIMER_2MHz_TIMER TIM7 -// Touch -#if defined(HARDWARE_TOUCH) -#define I2C_TOUCH_RCC_AHB1Periph RCC_AHB1Periph_GPIOB -#define I2C_TOUCH_RCC_APB1Periph RCC_APB1Periph_I2C1 -#define I2C_TOUCH I2C1 -#define I2C_TOUCH_GPIO GPIOB -#define I2C_TOUCH_SCL_GPIO_PIN GPIO_Pin_8 // PB.08 -#define I2C_TOUCH_SDA_GPIO_PIN GPIO_Pin_7 // PB.07 - -#define I2C_TOUCH_RESET_GPIO GPIOF -#define I2C_TOUCH_RESET_GPIO_PIN GPIO_Pin_10 // PF.10 -#define I2C_TOUCH_INT_GPIO GPIOH -#define I2C_TOUCH_INT_GPIO_PIN GPIO_Pin_2 // PH.02 -#else -#define I2C_TOUCH_RCC_AHB1Periph 0 -#define I2C_TOUCH_RCC_APB1Periph 0 -#endif - // Bluetooth #define STORAGE_BLUETOOTH #if defined(BLUETOOTH) diff --git a/radio/src/targets/horus/tp_gt911.cpp b/radio/src/targets/horus/tp_gt911.cpp new file mode 100644 index 000000000..114329996 --- /dev/null +++ b/radio/src/targets/horus/tp_gt911.cpp @@ -0,0 +1,201 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * 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 "tp_gt911.h" + +uint8_t touchGT911Flag = 0; +uint8_t TOUCH_SCAN_MODE = 0; +uint8_t touchEventFlag = 0; + +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) +{ + u8 buf[2]; + u8 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; + GT911_WR_Reg(GT_CFGS_REG, (u8 *) GT911_Cfg, sizeof(GT911_Cfg));// + GT911_WR_Reg(GT_CHECK_REG, buf, 2);//write checksum + return 0; +} + +static void IIC_Config(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + //I2C_InitTypeDef I2C_InitStructure; + + /* GPIO Peripheral clock enable */ + RCC_AHB1PeriphClockCmd(I2C_RCC_AHB1Periph, ENABLE); + //RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); + + //PB6: I2C1_SCL PB7: I2C1_SDA + GPIO_InitStructure.GPIO_Pin = I2C_SCL_GPIO_PIN | I2C_SDA_GPIO_PIN; + //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + 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); + + 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_Falling; + 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_Falling; + 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 touchPanelDeInit(void) +{ + TOUCH_AF_ExtiStop(); +} + +bool touchPanelInit(void) +{ + uint8_t tmp[4] = {0}; + + TRACE("Touchpanel init start ..."); + + TOUCH_AF_GPIOConfig(); //SET RST=OUT INT=OUT INT=LOW + IIC_Config(); + + TPRST_LOW(); + TPINT_HIGH(); + delay_us(200); //DELAY 200US + + TPRST_HIGH(); + delay_ms(6); //DELAY 6MS + + TPINT_LOW(); + delay_ms(55); //DELAY 55MS + + GT911_INT_Change(); //Set INT INPUT INT=LOW + + delay_ms(50); //DELAY 55MS + + GT911_RD_Reg(GT_PID_REG, tmp, 4); + + if (strcmp((char *) tmp, "911") == 0)//ID==9147 + { + tmp[0] = 0X02; + GT911_WR_Reg(GT_CTRL_REG, tmp, 1);// + GT911_RD_Reg(GT_CFGS_REG, tmp, 1);// + + if (tmp[0] < 0X69)//ver + { + //printf("Default Ver:%x\r\n",temp[0]); + GT911_Send_Cfg(1); // + } + + delay_ms(10); + tmp[0] = 0X00; + GT911_WR_Reg(GT_CTRL_REG, tmp, 1);//end reset + touchGT911Flag = true; + + TOUCH_AF_ExtiConfig(); + + return true; + } + + return false; +} + +extern "C" void TOUCH_INT_EXTI_IRQHandler1(void) +{ + if (EXTI_GetITStatus(TOUCH_INT_EXTI_LINE1) != RESET) { + TRACE("TOUCH INTERUPT"); + touchEventFlag = 1; + EXTI_ClearITPendingBit(TOUCH_INT_EXTI_LINE1); + } +} diff --git a/radio/src/targets/horus/tp_gt911.h b/radio/src/targets/horus/tp_gt911.h new file mode 100644 index 000000000..b8d22709a --- /dev/null +++ b/radio/src/targets/horus/tp_gt911.h @@ -0,0 +1,126 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * 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. + */ + +#ifndef _FT5X06_H_ +#define _FT5X06_H_ + +#include "opentx.h" + +#define HAS_TOUCH_PANEL() touchGT911Flag == true +#define TOUCH_INT_STATUS() (GPIO_ReadInputDataBit(TOUCH_INT_GPIO, TOUCH_INT_GPIO_PIN)) + +bool touchPanelInit(); +void touchPanelDeInit(); + +extern uint8_t touchGT911Flag; +extern uint8_t TOUCH_SCAN_MODE; +extern uint8_t touchEventFlag; + +uint8_t GT911_WR_Reg(uint16_t reg, uint8_t * buf, uint8_t len); +void GT911_RD_Reg(uint16_t reg, uint8_t * buf, uint8_t len); + + +//GT911 param table +const uint8_t GT911_Cfg[]= // + { + 0x69, //ver 0x68 + 0xE0,0x01, //x 480 480X272 + 0x10,0x01, //y 272 + 0x05, //pass max count + 0x38, //bit4= xy change Int mode + 0x00, + 0x02, //press ct + 0x48, + 0x28,0x0D,0x50,0x32,0x03,0x05,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x18,0x1A,0x1E,0x14,0x8A,0x2A,0x0C, + 0x30,0x38,0x31,0x0D,0x00,0x00,0x02,0xB9,0x03,0x2D, + 0x00,0x00,0x00,0x00,0x00,0x03,0x64,0x32,0x00,0x00, + 0x00,0x1D,0x41,0x94,0xC5,0x02,0x07,0x00,0x00,0x04, + 0xA5,0x1F,0x00,0x94,0x25,0x00,0x88,0x2B,0x00,0x7D, + 0x33,0x00,0x74,0x3C,0x00,0x74,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,0x18,0x16,0x14,0x12,0x10,0x0E,0x0C,0x0A, + 0x08,0x06,0x04,0x02,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,0x13,0x12,0x10,0x0F,0x0A,0x08,0x06,0x04, + 0x02,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + }; + +//I2C +#define GT_CMD_WR 0X28 //write +#define GT_CMD_RD 0X29 //read + +#define SLAVE_Write_Address 0X28 + +//GT9147 +#define GT_CTRL_REG 0X8040 +#define GT_CFGS_REG 0X8047 +#define GT_CHECK_REG 0X80FF +#define GT_PID_REG 0X8140 //ID + +#define GT_GSTID_REG 0X814E // +#define GT_TP1_REG 0X8150 // +#define GT_TP2_REG 0X8158 // +#define GT_TP3_REG 0X8160 // +#define GT_TP4_REG 0X8168 // +#define GT_TP5_REG 0X8170 // + +#define GT911_READ_XY_REG 0x814E +#define GT911_CLEARBUF_REG 0x814E +#define GT911_CONFIG_REG 0x8047 +#define GT911_COMMAND_REG 0x8040 +#define GT911_PRODUCT_ID_REG 0x8140 +#define GT911_VENDOR_ID_REG 0x814A +#define GT911_CONFIG_VERSION_REG 0x8047 +#define GT911_CONFIG_CHECKSUM_REG 0x80FF +#define GT911_FIRMWARE_VERSION_REG 0x8144 + + +typedef struct{ + uint16_t x; + uint16_t y; +}POINT; + +typedef struct{ + uint16_t cnt; + POINT points[5]; +}GT911_POINT_DATA; + +#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 IIC_SCL_L() do { I2C_GPIO->BSRRH = I2C_SCL_GPIO_PIN; } while(0) +#define IIC_SCL_H() do { I2C_GPIO->BSRRL = I2C_SCL_GPIO_PIN; } while(0) + +#define IIC_SDA_L() do { I2C_GPIO->BSRRH = I2C_SDA_GPIO_PIN; } while(0) +#define IIC_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_