液晶显示和触摸的驱动都是存在于AiPi-Open-Kits\AiPi-Open-Kits\aithinker_Ai-M6X_SDK\bsp 目录下的。硬件的驱动都已经写好了,我们使用他的时候只需要配置io就可以使用了。
和lcd的显示一样,配置是由用户写一个touch_conf_user.h , 并在其中定义使用的触摸芯片的名称就可以了,因为上述中的bsp中都已经写好了触摸芯片的驱动,所以用户只需要关注逻辑实现就可以了。
#ifndef _TOUCH_CONF_USER_H_
#define _TOUCH_CONF_USER_H_
/* spi interface
TOUCH_SPI_XPT2046 // Not currently supported
*/
/* i2c interface
TOUCH_I2C_FT6X36
TOUCH_I2C_GT911
TOUCH_I2C_CHSC6540
TOUCH_I2C_CST816D
*/
/* Select Touch Type */
#define TOUCH_I2C_CHSC6540
/* touch interface */
#define TOUCH_INTERFACE_SPI 1
#define TOUCH_INTERFACE_I2C 2
/* touch interface pin config */
#define TOUCH_I2C_SCL_PIN GPIO_PIN_0
#define TOUCH_I2C_SDA_PIN GPIO_PIN_1
/* now do not support */
#if 0
#define TOUCH_SPI_SS_PIN
#define TOUCH_SPI_SCLK_PIN
#define TOUCH_SPI_MOSI_PIN
#define TOUCH_SPI_MISO_PIN
#endif
#endif // _TOUCH_CONF_H_
随后就是需要在主函数中去初始化触摸芯片。从bsp的代码中可以看到库已经给我们提供了两个函数调用接口:
int touch_init(touch_coord_t* max_value);
int touch_read(uint8_t* point_num, touch_coord_t* touch_coord, uint8_t max_num);
在主函数中调用初始化函数,在task循环中去轮询调用touch_read()即可得到触摸屏幕的位置读取。主函数如下:
void touchpad_read()
{
uint8_t point_num = 0;
touch_coord_t touch_coord;
if (touch_read(&point_num, &touch_coord, 1) == 0) {
printf("[touched] %d, %d\r\n", touch_coord.coord_x, touch_coord.coord_y);
}
}
int main(void)
{
board_init();
lcd_init();
touch_coord_t touch_coord = {.coord_x=320, .coord_y=240};
touch_init(&touch_coord);
lcd_set_dir(3, 0);
lcd_clear(LCD_COLOR_RGB565(0, 0, 0));
while (1) {
touchpad_read();
bflb_mtimer_delay_ms(1);
}
}
烧录程序,即可看到触摸的坐标位置了。 |