GPIO 使用

BM1684 芯片包含 3 组 GPIO 控制器,每个控制 32 根 GPIO,与 Linux 的设备节点对应如下:

GPIO控制器 Linux设备节点 GPIO 物理编号 GPIO 逻辑编号
#0 /sys/class/gpio/gpiochip480 0到31 480到511
#1 /sys/class/gpio/gpiochip448 32到63 448到479
#2 /sys/class/gpio/gpiochip416 64到95 416到447

比如要操作 GPIO6,则需要:

  1. 编号转换:物理编号是 6, 对应的逻辑编号是 (480 + (6 - 0)) = 486,这里的 0 代表 GPIO 物理编号的开始

  2. 导出该 GPIO, 以 root 用户运行:

    echo 486 >/sys/class/gpio/export
    
  3. 操作 GPIO,设定读取输入或输出指定值:

    cd /sys/class/gpio/gpio486
    # 设置输入模式
    echo in >direction
    cat value
    
    # 设置输出模式
    echo out >direction
    # 输出低电平
    echo 0 >value
    # 输出高电平
    echo 1 >value
    

有以下几点注意事项:

  • 如果 GPIO 已经被其他驱动申请了的话,是无法导出 (export) 成功的,也就无法进行后续的读写操作。

  • 涉及到 IO 功能的复用,如果该引脚的功能已经是 GPIO 的话,才可以用上面的方法;否则要在设备树里指定 pinctrl 状态。

一般来说,如果要简易地在用户层操作 GPIO,可在设备树里添加为 GPIO-LED。详情请参考 linux-linaro-stable/arch/arm64/boot/dts/bitmain/bm1684_firefly.dtsi