首先简单介绍一下Linux的gpio子系统:
Linux是一个庞大的系统,除了支持pc以外,还支持很多嵌入式的开发板。而种类繁多的开发板的GPIO驱动往往都不同,这就是使得驱动工程师不得不对于每一种开发板都设计一套GPIO驱动来,而且长此以往Linux内核会被这类无意义的代码所占据,因此Linux引入了GPIO子系统的架构来解决这个问题。
具体想要了解GPIO子系统的请参考蜗窝科技上的文章
linux内核中的GPIO系统之(1):软件框架www.wowotech.net言归正传:
如果你在驱动中注册了GPIO Controller那么我们就可以在linux系统的应用层查找到它,并且根据GPIO Controller的“base number”计算出我们要使用的引脚的真实引脚编号。
应用层我们可以通过sysfs访问GPIO(树莓派的IO控制库wiringPI 用的就是这个方法)。
具体方法如下:
- 在开发板系统的 /sys/class/gpio的目录下,找到gpiochipXX 目录,如下图
- 进入某一个gpiochipxx的目录中,查看文件lable内容,以gpiochip128为例:获取到地址为"20ac000"。
- 使用这个地址,与设备树中的地址对应,查找设备树,发现gpio5 与之对应
由此可以确定gpio5这组引脚的基准脚就是128.
如果想操作GPIO5_IO14 这个引脚的话,就需要操作gpio128这个控制器并且引脚的编号为128+14
例子:
我以我手中的imx6ull 开发板为例,举例说明如何操作这个引脚。
使用引脚是GPIO5_3,按照之前的计算,这个引脚的编号应该是128+3=131
- 导入GPIO:这个编号导入到export文件中
导入完成后会在gpio文件夹中创建一个GPIO131的文件夹,用户通过操作这个文件夹中的文件实现对gpio的控制。
- 设置方向:
- 设置LED状态:
- 卸载GPIO:将卸载编号写入unexport中
操作完成后,gpio131 文件夹自动被删除。
至此计算GPIO的编号和操作方法就讲完了。