GPIO 开发与测试
GPIO 编号和引脚确认
不要直接从其他平台复制 GPIO 编号。先在最终设备树中确认控制器和 bank,再使用内核公开的 GPIO 描述符接口。旧式 sysfs 需要全局 GPIO 编号时,可通过控制器的 base 与 bank 偏移计算,但新项目优先使用 libgpiod。
cat /sys/kernel/debug/gpio
cat /sys/kernel/debug/pinctrl/*/pinmux-pins
cat /sys/kernel/debug/pinctrl/*/pinconf-pins
驱动中使用 GPIO
新驱动优先使用 descriptor API:
struct gpio_desc *enable;
enable = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW);
if (IS_ERR(enable))
return PTR_ERR(enable);
gpiod_set_value_cansleep(enable, 1);
设备树属性名 enable-gpios 与代码中的 "enable" 对应。中断可通过 gpiod_to_irq() 获取,再调用 devm_request_threaded_irq()。
用户空间验证
较新的根文件系统推荐:
gpioinfo
gpioget gpiochip0 14
gpioset gpiochip0 14=1
旧 BSP 仍提供 sysfs 时:
echo <GPIO_NUM> > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio<GPIO_NUM>/direction
echo 1 > /sys/class/gpio/gpio<GPIO_NUM>/value
修改完成后重新编译 kernel、反编译 DTB,并确认 pinctrl state 已进入最终产物。
统一编译与烧录流程
cd <ANDROID_TOP>/longan
./build.sh kernel
./build.sh pack
烧录后先核对本次 kernel/DTB 的构建时间和版本,避免在旧固件上判断新配置。