[实战]zynq7000设备树自动导出GPIO

zynq7000设备树自动导出GPIO

今天无聊,掏出我82年产的microzed玩一玩。玩啥好呢,要不点个灯吧。于是,三下五除二,通过linux sys接口以及echo,很快就点亮了。无聊按了一下复位按键,发现系统重新先加载后,灯又不亮了。这不能忍,于是继续深入,发现导出的gpio都没了。

linux sys 接口,对GPIO实行的export操作,是临时性质的,因此每次重启系统,都需要重新进行export。通常可以通过制作脚本,在系统加载后或者用户登录后自动export,但今天,我想借这个事情,聊一条怎么用linux设备树解决这个问题。

添加设备树节点

相关的基础知识,可以参考我的博客
[Linux实战] Linux设备树原理与应用详解
[实战]Zynq设备树详细教程
[实战] 深入解析Petalinux下Zynq7000设备树开发:从理论到实战

zynq的用户自定义设备树,在{petalinux工程}/project-spec/meta-user/recipes-bsp/device-tree/files/ 下,那个叫 system-user.dtsi 就是, 用文本编辑工具打开它,会发现它是这样的:

/include/ "system-conf.dtsi"
/ {
};

这是一个空文件,里面没有任何节点,用户自定义的节点,只需要添加在这里面就行。

对于gpio自动导出,只需要新建一个gpio-export节点,并设置好必要属性,具体内容如下

/include/ "system-conf.dtsi"
/ {
     gpio-export {
         compatible = "gpio-export";
         #gpio-cells = <2>;
         
         gpio47 {
             gpio-export,name = "custom_gpio47";
             gpio-export,output = <0>;
             gpios = <&gpio0 47 0>;
         };
     };
};
  • gpio-export { … }‌

‌作用‌:创建一个名为gpio-export的子节点,用于管理GPIO导出功能。

  • compatible = “gpio-export”;‌

‌作用‌:绑定Linux内核的gpio-export驱动,该驱动负责将GPIO导出到用户空间。
‌验证‌:可通过内核源码查找COMPATIBLE_STR匹配(如drivers/gpio/gpio-export.c)。

  • #gpio-cells = <2>;‌

‌作用‌:声明每个GPIO描述需要2个参数(控制器、引脚号、激活电平)。
‌背景‌:与GPIO控制器的#gpio-cells定义一致,确保语法匹配。

  • gpio47 { … }‌

‌作用‌:定义GPIO 47的导出配置,子节点名称通常与GPIO编号对应。

  • ‌gpio-export,name = “custom_gpio47”;‌

‌作用‌:指定用户空间看到的GPIO名称(在/sys/class/gpio/下生成同名目录)。
‌用户空间路径‌:

/sys/class/gpio/custom_gpio47/
  • ‌‌gpio-export,output = <0>;‌

‌作用‌:初始化方向为输入(0=输入,1=输出)。
‌扩展‌:若需初始化为输出,需添加gpio-export,init = <0/1>;设置默认电平。

  • ‌‌gpios = <&gpio0 47 0>;‌

‌作用‌:关联硬件GPIO控制器和引脚,格式为:


                
<think>嗯,用户想了解如何在Zynq7020的设备树中添加GPIO节点。首先,我需要确认自己对Zynq7000系列设备树的理解是否正确。Zynq的GPIO分为GPIO控制器和GPIO外设两部分,设备树中的节点需要正确描述这两部分。 接下来,用户可能已经有一定的设备树基础,但需要具体的步骤指导。应该先介绍设备树的基础结构,尤其是Zynq的amba节点下的gpio控制器。然后,添加自定义的GPIO节点需要考虑地址、中断等属性。 需要区分PS端GPIO和PL端GPIO的情况。PS的GPIO通常已经由Xilinx的DTG工具自动生成,但用户可能需要扩展。而PL端的GPIO需要通过AXI GPIO IP核来添加,这部分需要在设备树中手动创建节点。 还要注意compatible属性的正确使用,确保驱动能正确匹配。比如,PS GPIO的compatible是"xlnx,zynq-gpio-1.0",而AXI GPIO的则是"xlnx,xps-gpio-1.00.a"。 另外,地址映射部分,用户需要知道GPIO控制器的基地址和范围,这可能需要查看硬件设计中的地址分配。中断处理也是关键,尤其是当GPIO用于中断时,需要正确配置interrupts属性和父中断控制器。 最后,应该提醒用户编译设备树并测试,使用命令如cat /proc/device-tree来验证节点是否正确添加。可能用户在实际操作中会遇到问题,比如地址错误或中断配置不正确,需要检查dmesg日志来调试。</think>在Zynq7020设备树中添加GPIO节点需要理解以下关键步骤(以PS端MIO/EMIO GPIO为例): 1. **确认现有GPIO控制器** Zynq的GPIO控制器默认已定义在amba节点中: ```dts amba { gpio0: gpio@e000a000 { compatible = "xlnx,zynq-gpio-1.0"; reg = <0xe000a000 0x1000>; interrupts = <0 20 4>; interrupt-parent = <&intc>; #gpio-cells = <2>; gpio-controller; }; }; ``` 2. **添加自定义GPIO节点** 在设备树中添加自定义节点(示例为EMIO扩展): ```dts / { my_gpio { compatible = "custom-gpio-device"; gpios = <&gpio0 55 0>; // 使用EMIO GPIO55 interrupt-parent = <&gpio0>; interrupts = <55 2>; // 第55号GPIO,边沿触发类型2(下降沿) }; }; ``` 3. **关键属性说明: - `compatible`: 匹配驱动程序的字符串 - `reg`: 寄存器地址和范围(自动生成时一般不需要手动添加) - `gpio-controller`: 声明这是GPIO控制器 - `#gpio-cells`: 定义GPIO参数数量(通常为2:引脚编号+标志位) - `interrupts`: 中断号+触发类型组合 4. **PL端AXI GPIO扩展** 当使用PL端AXI GPIO IP核时,添加示例: ```dts axi_gpio_0: gpio@41200000 { compatible = "xlnx,xps-gpio-1.00.a"; reg = <0x41200000 0x10000>; #gpio-cells = <2>; gpio-controller; interrupt-parent = <&intc>; interrupts = <0 29 4>; }; ``` **验证步骤**: 1. 编译设备树: ```bash dtc -I dts -O dtb -o system.dtb system.dts ``` 2. 加载到开发板后检查: ```bash cat /proc/device-tree/my_gpio/gpios # 应显示类似值:0xe000a000 55 0 ``` 3. 调试GPIO: ```bash # 导出GPIO echo 55 > /sys/class/gpio/export # 设置方向 echo out > /sys/class/gpio/gpio55/direction # 输出高电平 echo 1 > /sys/class/gpio/gpio55/value ``` **常见问题处理**: - 地址冲突:检查vivado地址分配与设备树reg参数是否一致 - 中断不触发:使用`cat /proc/interrupts`确认中断注册状态 - 驱动未加载:通过`dmesg | grep gpio`检查驱动匹配情况 建议结合具体硬件设计中的GPIO分配(查看vivado生成的.xsa文件中的地址映射),通过设备树覆盖(overlay)的方式进行动态加载调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客不孤独

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值