液晶显示和触摸的驱动都是存在于AiPi-Open-Kits\AiPi-Open-Kits\aithinker_Ai-M6X_SDK\bsp目录下的。硬件的驱动都已经写好了,我们使用他的时候只需要配置io就可以使用了。

2023-10-06_191220.png

和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);
    }
}

烧录程序,即可看到触摸的坐标位置了。