Edit online

添加驱动

4 Dec 2024
Read time: 3 minute(s)

本节以添加 GT911 电容屏驱动为例,介绍外设驱动的添加方法。

添加外设

  1. 获取源码

    https://github.com/RiceChen/gt911 下载 GT911 的 RT-Thread 驱动源码位,并将其解压至 bsp/peripheral/touch 目录下。

    源码结构如下:
    touch$ tree
    .
    ├── gt911
    │   ├── inc
    │   │   └── gt911.h
    │   ├── Kconfig
    │   └── src
    │       └── gt911.c
    └── SConscript
  2. 修改 SConscript 文件
    bsp/peripheral/touch/SConscript 文件中,添加对 GT911 驱动源码的引用,具体操作内容如下:
    Import('AIC_ROOT')
    Import('PRJ_KERNEL')
    from building import *
    
    cwd = GetCurrentDir()
    src = Glob('*.c')
    CPPPATH = []
    
    if GetDepend('AIC_TOUCH_PANEL_GT911'):
        CPPPATH.append(cwd + '/gt911/inc')
        src += Glob('gt911/src/*.c')
    
    group = DefineGroup('touch', src, depend = [''], CPPPATH = CPPPATH)
    
    Return('group')

    如果后续需要添加其他 touch 的驱动,可参考 GT911 模板将其添加到 SConscript 文件中。

  3. 修改 pinmux.c文件
    根据原理图,在 target/<cpu>/<board>/pinmux.c 中添加 RST、INT、SCK 和 SDA 引脚的定义:
    struct aic_pinmux aic_pinmux_config[] = {
    ...
    #ifdef AIC_USING_I2C3
        {1, PIN_PULL_DIS, 3, "PA.8"},  // RST
        {1, PIN_PULL_DIS, 3, "PA.9"},  // INT
        {4, PIN_PULL_DIS, 3, "PA.10"}, // SCK
        {4, PIN_PULL_DIS, 3, "PA.11"}, // SDA
    #endif
    ...
    };
    注:

    每个板卡的 pinmux.c都定义了各个端口的 GPIO 引脚及功能,新增接口前应检查。

    根据原理图,GT911:
    • 使用 I2C3 接口 作为驱动。

    • 除了 I2C 的 SCK 和 SDA 引脚 以外,还需要用到 RST 和 INT 引脚。

  4. 配置源码 Kconfig
    在驱动源码 Kconfig bsp/peripheral/touch/gt911/Kconfig 文件夹中,添加 GT911 驱动的配置选项。内容如下:
    $ cat Kconfig
    
    menu "Gt911 touch panel options"
    
    config AIC_TOUCH_PANEL_GT911
        bool "Using touch panel gt911"
        default n
        select AIC_I2C_DRV
    
    config AIC_TOUCH_PANEL_GT911_I2C_CHA
        string "gt911 using i2c channel index"
        default "i2c3"
        depends on AIC_TOUCH_PANEL_GT911
    
    config AIC_TOUCH_PANEL_GT911_RST_PIN
        string "gt911 reset pin"
        default "PA.8"
        depends on AIC_TOUCH_PANEL_GT911
    
    config AIC_TOUCH_PANEL_GT911_INT_PIN
        string "gt911 irq pin"
        default "PA.9"
        depends on AIC_TOUCH_PANEL_GT911
    
    endmenu
  5. 添加外设驱动 Kconfig 的引用。
    bsp/peripheral/Kconfig 文件中,添加对驱动源码 Kconfig 路径的引用:
    ...
    #--------------------------------------------
    # touch panel driver global option
    #--------------------------------------------
    
    menu "Touch Panel Support"
    source "bsp/peripheral/touch/gt911/Kconfig"
    endmenu
    
    ...
  6. 配置 menuconfig
    运行 scons --menuconfigme (OneStep 命令),打开 I2C3 并配置为 Master,使能 GT911 驱动。
    Board options  --->
        [*] Using I2c3
            I2c3 Parameter  --->
                I2c3 Master && Slave  (Master)  --->
    Drivers options  --->
        Peripheral  --->
            Touch Panel Support  --->
                Gt911 touch panel options  --->
                    [*] Using touch panel gt911
                    (i2c0) gt911 using i2c channel index
                    (PA.10) gt911 reset pin
                    (PA.11) gt911 irq pin
  7. 编译

    完成驱动添加和配置后,使用命令 scons --menuconfigm ( OneStep 命令 ) 对 SDK 进行编译。

  8. 验证

    烧写镜像,系统启动之后,通过 list_device 命令 查看设备节点是否已成功枚举,如下所示:

    aic /> list_device
    device           type         ref count
    -------- -------------------- ----------
    ...
    gt911    Touch Device         1
    ...
    

    如果列表中出现 gt911 设备,表示已成功添加该设备。