之前呢,我们讲解了在内核中pinctrl子系统是怎么实现的,今天我们来尝试一下自己去写一个pinctrl子系统:
首先呢,我们来看看一个pinctrl子系统需要做的事情:
上面的话,我们看了一个pinctrl子系统需要的三大功能以及在驱动程序中对应的三大结构体
下面我们来看看编写驱动程序时我们需要干什么:
我们是需要去搭建俩个驱动程序的,一个是pin controller设备节点的驱动程序,一个是client设备节点的驱动程序
设备树文件已经给出了,下面我们来看看驱动程序应该怎么去写:
下面我们来慢慢看:
我们先来把驱动程序的框架搭建出来:
接着就是去构建platform_deiver结构体了:
这样子在驱动程序和设备树节点通过compatible属性匹配后,probe函数就会被调用,那么在这里面,我们就需要去解析设备树,也就是需要去实现Pinctrl desc结构体:
首先就是分配pinctrl desc结构体了:
接着就是去设置了:
第一个作用就是去描述引脚了,单个引脚就只需要靠pins npins去描述就行,对于一组引脚,我们就需要去配置相应的结构体virtual_pctrl_ops去进行描述了:
接着就是实现这个结构体里面的函数指针了:第一个就是获取一共有多少组,我们这里为了图方便,这里一个引脚就代表一组吧:
所以我们这个函数只需要去返回引脚的数量就行了
接着就是获取组的名字:
一样的,我们只需要去返回pins结构体数组里面的名字就行
接着就是去获取组的引脚:
那个把设备树上面的信息转换成mapping结构体我们后面再讲,因为有点复杂,我们接着来看probe函数:
接着就是去设置pinctrl子系统的第二个功能,也就是引脚复用了,一样的,我们只需要去配置好virtual_pmx_ops结构体就可以了:
先来看第一个函数,这个是用来查看一共有多少个功能的:这里面全是静态的,是比较简单的,其实还有一种动态的从设备树里面去获取的方法
第二个就是去获取这个功能的名字了:
第三个就是获取指定功能的引脚组:
最后一个也就是最重要的,也就是去把对应的组设置成指定的功能:但是因为没有硬件寄存器去给我们操作,所以我们去打印信息就行了,毕竟只是虚拟的嘛,所以没有必要去搞的那么复杂
那么pinctrl子系统的第二个功能,引脚复用就讲完了,我们再回看probe函数:
第三个功能就是去配置引脚功能了:
这样子就大概虚拟的把指定的引脚设置成相应的配置模式了
那么我们去设置pinctrl desc结构体就搞完了,最后去注册就行了:
那么我们就只剩下怎么去从设备树中去注册一个Mapping结构体了,client驱动只需要去写一个简单的platform_driver就可以了
接着我们来看看怎么去注册mapping结构体:
那么到这里,我们就彻底讲完啦,完结,撒花(doge.)