diff --git a/radio/src/gui/480x272/radio_hardware.cpp b/radio/src/gui/480x272/radio_hardware.cpp index 109a65459..edae5d7f5 100644 --- a/radio/src/gui/480x272/radio_hardware.cpp +++ b/radio/src/gui/480x272/radio_hardware.cpp @@ -428,9 +428,11 @@ bool menuRadioHardware(event_t event) case 1: pushMenu(menuRadioDiagKeys); break; +#if defined(HARDWARE_TOUCH) case 2: pushMenu(menuRadioDiagTouch); break; +#endif } } break; diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index a0cf09cd2..910b43f5f 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -209,7 +209,9 @@ set(TARGET_SRC ) if(HARDWARE_TOUCH) - set(TARGET_SRC ${TARGET_SRC} tp_gt911.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/board.cpp b/radio/src/targets/horus/board.cpp index 61a429a70..d88350ba5 100644 --- a/radio/src/targets/horus/board.cpp +++ b/radio/src/targets/horus/board.cpp @@ -103,9 +103,11 @@ void boardInit() HAPTIC_RCC_AHB1Periph | INTMODULE_RCC_AHB1Periph | EXTMODULE_RCC_AHB1Periph | - I2C_TOUCH_RCC_AHB1Periph | + I2C_RCC_AHB1Periph | GPS_RCC_AHB1Periph | - SPORT_UPDATE_RCC_AHB1Periph, + SPORT_UPDATE_RCC_AHB1Periph | + TOUCH_INT_RCC_AHB1Periph | + TOUCH_RST_RCC_AHB1Periph, ENABLE); RCC_APB1PeriphClockCmd(ROTARY_ENCODER_RCC_APB1Periph | @@ -119,7 +121,7 @@ void boardInit() AUDIO_RCC_APB1Periph | INTMODULE_RCC_APB1Periph | EXTMODULE_RCC_APB1Periph | - I2C_TOUCH_RCC_APB1Periph | + I2C_RCC_APB1Periph | GPS_RCC_APB1Periph | BACKLIGHT_RCC_APB1Periph, ENABLE); diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index f24b3dda1..bbe1235b0 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -636,21 +636,24 @@ // 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_INT_RCC_AHB1Periph RCC_AHB1Periph_GPIOH + #define TOUCH_INT_GPIO GPIOH + #define TOUCH_INT_GPIO_PIN GPIO_Pin_2 // PH.02 -#define TOUCH_RST_RCC_AHB1Periph RCC_AHB1Periph_GPIOF -#define TOUCH_RST_GPIO GPIOF -#define TOUCH_RST_GPIO_PIN GPIO_Pin_10 + #define TOUCH_RST_RCC_AHB1Periph RCC_AHB1Periph_GPIOF + #define TOUCH_RST_GPIO GPIOF + #define TOUCH_RST_GPIO_PIN GPIO_Pin_10 // PF.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_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)) + #define TOUCH_INT_STATUS() (GPIO_ReadInputDataBit(TOUCH_INT_GPIO, TOUCH_INT_GPIO_PIN)) +#else + #define TOUCH_INT_RCC_AHB1Periph 0 + #define TOUCH_RST_RCC_AHB1Periph 0 #endif // I2C Bus diff --git a/radio/src/targets/horus/tp_gt911.cpp b/radio/src/targets/horus/tp_gt911.cpp index 114329996..68b4630dc 100644 --- a/radio/src/targets/horus/tp_gt911.cpp +++ b/radio/src/targets/horus/tp_gt911.cpp @@ -38,20 +38,20 @@ void GT911_INT_Change(void) uint8_t GT911_Send_Cfg(uint8_t mode) { - u8 buf[2]; - u8 i = 0; + 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; - GT911_WR_Reg(GT_CFGS_REG, (u8 *) GT911_Cfg, sizeof(GT911_Cfg));// + GT911_WR_Reg(GT_CFGS_REG, (uint8_t *) GT911_Cfg, sizeof(GT911_Cfg));// GT911_WR_Reg(GT_CHECK_REG, buf, 2);//write checksum return 0; } -static void IIC_Config(void) +static void I2C_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; //I2C_InitTypeDef I2C_InitStructure; @@ -136,6 +136,182 @@ static void TOUCH_AF_GPIOConfig(void) GPIO_ResetBits(TOUCH_INT_GPIO, TOUCH_INT_GPIO_PIN); } +void SDA_IN(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + //RCC_APB1PeriphClockCmd(RCC_APB1Periph_GPIOB, ENABLE); + //RCC_AHB1PeriphClockCmd(I2C_RCC_AHB1Periph, ENABLE); + + GPIO_InitStructure.GPIO_Pin = I2C_SDA_GPIO_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(I2C_GPIO, &GPIO_InitStructure); +} + +void SDA_OUT(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + //RCC_APB1PeriphClockCmd(RCC_APB1Periph_GPIOB, ENABLE); + //RCC_AHB1PeriphClockCmd(I2C_RCC_AHB1Periph, ENABLE); + + GPIO_InitStructure.GPIO_Pin = I2C_SDA_GPIO_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(I2C_GPIO, &GPIO_InitStructure); +} + +void I2C_Start(void) +{ + 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_L();delay_us(6); + I2C_SCL_H();//delay_us(6); + while (READ_SDA) { + ucErrTime++; + if (ucErrTime > 166) { + I2C_Stop(); + return 1; + } + delay_us(1); + } + I2C_SDA_L(); + I2C_SCL_L();// + 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 GT911_WR_Reg(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 GT911_RD_Reg(u16 reg, uint8_t * buf, uint8_t len) +{ + uint8_t i; + + //I2C_GenerateSTART(I2C1, ENABLE); + 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(); @@ -148,21 +324,21 @@ bool touchPanelInit(void) TRACE("Touchpanel init start ..."); TOUCH_AF_GPIOConfig(); //SET RST=OUT INT=OUT INT=LOW - IIC_Config(); + I2C_Config(); TPRST_LOW(); TPINT_HIGH(); - delay_us(200); //DELAY 200US + delay_us(200); TPRST_HIGH(); - delay_ms(6); //DELAY 6MS + delay_ms(6); TPINT_LOW(); - delay_ms(55); //DELAY 55MS + delay_ms(55); GT911_INT_Change(); //Set INT INPUT INT=LOW - delay_ms(50); //DELAY 55MS + delay_ms(50); GT911_RD_Reg(GT_PID_REG, tmp, 4); diff --git a/radio/src/targets/horus/tp_gt911.h b/radio/src/targets/horus/tp_gt911.h index b8d22709a..64dfac5d6 100644 --- a/radio/src/targets/horus/tp_gt911.h +++ b/radio/src/targets/horus/tp_gt911.h @@ -115,11 +115,11 @@ typedef struct{ #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 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 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 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) diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp index 1aadf6e30..73a4948ca 100644 --- a/radio/src/targets/simu/simpgmspace.cpp +++ b/radio/src/targets/simu/simpgmspace.cpp @@ -580,6 +580,7 @@ int usbPlugged() { return false; } int getSelectedUsbMode() { return USB_JOYSTICK_MODE; } void setSelectedUsbMode(int mode) {} void delay_ms(uint32_t ms) { } +void delay_us(uint16_t us) { } // GPIO fake functions void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF) { }