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控制器和引脚,格式为:

最低0.47元/天 解锁文章
374

被折叠的 条评论
为什么被折叠?



