pinctrl子系统
以IIC为例,通常有两种状态:default和sleep状态,在对应的状态下需要把引脚配置成对应的功能,例如在default状态需要把引脚配置成IIC模式,在sleep状态下需要把引脚配置成GPIO模式。在SOC中各个引脚与各个模块之间是通过IOMUX进行控制,如何将引脚配置成我们需要的作用就需要用到pinctrl来驱动IOMUX。
在设备树文件中可以看到不同设备对应的pinctrl信息如下:
在该文件所包含的pinctrl设备树文件中找到对应的不同状态的pinctrl引脚和复用功能信息如下:
在总线驱动设备模型中当驱动和设备匹配成功之后在调用probe之前就会将引脚进行配置
对于不同的单板其引脚的配置方式不同;
对于imx6ull而言,是利用在头文件中定义的宏来设置相关寄存器的地址信息,然后利用芯片厂商提供的工具获得引脚的地址信息
而对于树莓派而言则直接使用的是数字作为引脚信息
GPIO 子系统
GPIO模块通常可以不写pinctrl,可以直接对其进行配置,有时内核源码考虑到整体性会将GPIO模块同样使用pinctrl。对于GPIO而言在设置引脚信息的时候只需要关注方向和值两个重要信息。
gpios中通常为gpios = <GPIO控制器 pin脚 flag>
在树莓派中:
在imx6ull中:
写一个含有pinctrl和GPIO设备结点步骤:
以LED为例:
1.根据原理图可以看到LED所接引脚信息,使用GUI工具生成pinctrl相关信息,并放入需要引用的pinctrl结点的pins中;
2.构造设备树节点,在设备树节点中指向生成的pinctrl相关信息,并根据原理图添加GPIO,默认状态和触发方式等。
对于复杂的接口:
以网卡为例:
1.确定pinctrl名。先根据原理图总引脚名搜设备树,参考相关代码进行修改,
在imx6ull原理图中看到网卡引脚名为ENET2_XXX,在内核目录下搜索该引脚名:
任意打开一个设备树文件:找到pinctrl名为pinctrl_enet2
2.根据pinctrl名找到对应结点
找到了该节点就可以进行修改,从而编写自己想要的设备树。
learned from:韦东山
版权声明:本文为CSDN博主「基尔霍夫原来是码农」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cha1290878789/article/details/121676426
暂无评论