如何通过设备树自动导出XR17V358的Exar GPIO?
问题分析
你的观察完全正确:exar-gpio驱动目前不支持设备树绑定,核心原因如下:
gpio-exar.c驱动代码未实现设备树(OF)匹配逻辑,既没有声明用于设备树绑定的compatible字符串,也没有从设备树读取exar,first-pin、ngpios等属性的代码。- Exar的GPIO控制器实例并非由设备树节点触发创建,而是由
8250_exar.c(Exar串口驱动)在初始化UART硬件时主动生成的,GPIO的基础参数(如引脚数量、起始编号)来自硬件寄存器或串口驱动的硬编码配置,与设备树无关。
你参考的内核文档gpio-exar.txt可能是早期规划文档,与当前驱动的实际实现不匹配。
替代解决方案
既然无法通过设备树自动绑定,你可以通过以下方式实现开机自动导出GPIO并配置为LED:
1. Sysfs脚本+Systemd服务
编写初始化脚本并通过systemd管理,实现开机自动配置:
步骤1:创建GPIO初始化脚本
创建/usr/local/bin/exar-gpio-init.sh:
#!/bin/bash # XR17V358的gpiochip base为472,引脚2对应全局GPIO编号472+2=474 GPIO_NUM=474 # 导出GPIO(如果未导出) if [ ! -d /sys/class/gpio/gpio$GPIO_NUM ]; then echo $GPIO_NUM > /sys/class/gpio/export fi # 设置为输出方向,默认关闭 echo out > /sys/class/gpio/gpio$GPIO_NUM/direction echo 0 > /sys/class/gpio/gpio$GPIO_NUM/value # (可选)映射到leds类统一管理 mkdir -p /sys/class/leds/led1 echo "gpio$GPIO_NUM" > /sys/class/leds/led1/trigger echo 0 > /sys/class/leds/led1/brightness
添加执行权限:
chmod +x /usr/local/bin/exar-gpio-init.sh
步骤2:创建Systemd服务
创建/etc/systemd/system/exar-gpio-init.service:
[Unit] Description=Initialize Exar XR17V358 GPIO LEDs After=multi-user.target [Service] Type=oneshot ExecStart=/usr/local/bin/exar-gpio-init.sh RemainAfterExit=yes [Install] WantedBy=multi-user.target
启用并启动服务:
systemctl daemon-reload systemctl enable exar-gpio-init.service systemctl start exar-gpio-init.service
2. 使用libgpiod工具(推荐)
libgpiod是内核推荐的替代sysfs GPIO的用户空间工具,兼容性和可靠性更好:
安装libgpiod
根据发行版执行安装命令:
# Debian/Ubuntu系列 apt install gpiod # RHEL/CentOS系列 yum install gpiod
编写初始化脚本
创建/usr/local/bin/exar-gpio-led-init.sh:
#!/bin/bash # 控制gpiochip472的第2个引脚,设置为低电平(关闭LED) gpioset gpiochip472 2=0
同样通过Systemd服务管理,步骤与方案1一致。
3. 修改内核驱动(进阶)
如果具备内核开发基础,可以修改驱动添加设备树支持:
- 在
gpio-exar.c中添加OF匹配表,声明compatible字符串(如"exar,gpio-exar")。 - 修改
8250_exar.c,让其优先从设备树读取exar,first-pin和ngpios参数。 - 重新编译内核及驱动模块。
该方案门槛较高,不建议新手尝试。
内容的提问来源于stack exchange,提问作者ThKe93
相关产品推荐
相关产品推荐

