今天呢,我们其实是来讲pinctrl子系统的,但是为了弄清楚他的整个逻辑框架,我们必须得来讲一讲设备树是怎么跟我们的驱动程序挂钩的,还是有点难的,卡了小编挺久的,一直云里雾里的,今天来好好的总结一下:
首先呢,我们得先知道我们驱动常用的设备树有几个部分,一共有3个部分,一个部分是厂家提供的,这个也是等会我们最先开始去讲的,剩下的俩个部分都是需要我们去写的,也就是
Pin controller device(我们驱动工程师的话,一般可以通过厂家提供的tool,或者文档doc/dts_example,不然就是去看驱动源码了) Pinctrl client devices(这个需要我们去写,格式比较固定)
我们先来看看厂家给的长什么样:
这个是BSP工程师帮我搞的,我们知道,在内核里面有着极强的面向对象的编程思想,所以这部分的设备树是对应着一个结构体的:
就是这个结构体,这里面也是很有细节的,因为有个soc,就表示是芯片,也就是厂家提供的,接着我们来看这里面的每个成员是表示什么
这个里面存储的信息就是设备树里面的hoggrp-1这些来着:
这里面的name就是字符串来着,也就是子节点的名字来着,他里面还有一个imx_pin
这边还是只是在讲他存储了什么,我们接着看另一个重要的成员:
这个里面存储的是imx6ul-evk来着,这里只有一个
这里的name指的就是imx6ul-evk,那么到这里,就知道了内核这个结构体里面的每个成员是用来存储什么的,下面就来看看是怎么去存储的:
他填充的逻辑就是先找出有几个子节点,然后再遍历子节点里面的hoggrp-1这些,最后再遍历里面fsl,pins,这样子就完成了存储,但是细节还得看视频,文档的话,只是讲了中心思想和流程
接着我们来看看Pin controller device:
先来看看他应该长什么样:
需要注意的是,我们去写我们自己的Pin controller device时,也是包含在imx6ul-evk里面的,但是格式是跟厂家的那个是完全不一样的,这个里面一般都是去使用大量的宏的,一个比较简单的格式:
突然醒悟了,他那些宏其实是跟厂家的一模一样的,毕竟是iomux来着嘛,然后后面跟着的话,就是配置信息来着,格式要注意的,还是有点不一样的,接下来就看他对应的结构体了:
直接翻车了,他俩用的结构体是一模一样的,并且处理方式也是一模一样的,最后就是为了imx_pinctrl_soc_info结构体来着,
接着就剩最后一个部分了:Pinctrl client devices
这个格式就是非常的固定了:
他那个pinctrl_map其实就是Pin controller device得到的那个结构体imx_pinctrl_soc_info转换得到的:
至于是怎么去转换的,这俩个是怎么去建立联系的,里面涉及到的那些函数,等小编下篇文章再来讲解