前面呢,我们已经讲过了GPIO子系统中的数据结构,下面我们就来看看怎么去写一个我们自己的GPIO子系统,也就是虚拟GPIO子系统:
首先呢,我们先来看看在IMX6ULL中是怎么去定义的:
先来看看他的设备树:
GPIO控制器的设备树中,有两项是必须的:
-
gpio-controller : 表明这是一个GPIO控制器
-
gpio-cells : 指定使用多少个cell(就是整数)来描述一个引脚
当解析设备节点中的GPIO信息时,需要用到上面的属性。
比如下面的led-gpios
,在#gpio-cells = <2>
的情况下,它表示的引脚数量是1。
2. 驱动程序:
2.1 分配gpio_chip:
2.2 设置gpio_chip
2.3 注册gpio_chip
分析完他的源码,下面我们来自己写一个虚拟的GPIO子系统:
虚拟GPIO子系统:
2. 编写设备树文件
设备树节点已经构建好了,那么就该去编写相应的驱动程序了,当然,这个是在server端的驱动程序来着,也就是BSP工程师已经搞好的,我们现在只是去虚拟一个简单的:
compatible需要跟设备树匹配嘛,匹配成功后会去调用probe函数:
在这里的话,我们主要是去分配,设置,注册gpio_chip结构体嘛:
首先就是分配嘛,我们接着看设置,函数指针:
这里我们都是去简单的处理了,最后就是注册了
那么到这里,其实一开始小编有一个疑惑,这里只是写了server端的,那么clien端呢,其实clien端在我们去调用API函数的时候,会自动的去解析里面的数据,但是clien端和server端肯定是有一个匹配的过程的,就跟Pinctrl子系统一样,只不过这里没有展开去细讲,后面看看找不找的到,再回来细讲吧,下一篇,我们来讲讲Pinctrl子系统和GPIO子系统的联系,完结,撒花(doge.)