目录
一、pinctrl子系统
之前做gpio驱动开发的步骤:
①、修改设备树、添加相应的节点。节点里设置reg属性,包括需要操作的寄存器。
②、获取reg属性中寄存器地址后,初始化寄存器,设置gpio复用及和电气属性。
这一套操作比较繁琐,而且容易出错,因此linux内核对于GPIO这种基本驱动引入了pinctrl和gpio子系统。
pinctrl子系统主要工作如下:
获取设备树中pin信息;
根据获取到的pin信息来设置pin的复用功能;
根据获取到的pin信息来设置pin的电气性能,比如上下拉,速度,驱动能力;
从上面可以看出,我们只需要在设置树里设置好某个pin的相关属性就可以了,其他的工作pinctrl子系统完成,很方便。
1.1、在设备树中添加pinctrl节点模板
先虚拟一个“test”的设备,使用GPIO1_IO00这个pin的GPIO功能。模仿已经存在的添加。
1.1.1、创建节点
在dts文件中的iomuxc节点中的“imx6ul-evk”子节点下添加“pinctrl-test”节点。
注意:节点前缀一定要是“pinctrl_”;
1.1.2、添加“fsl,pin”属性
设备树通过属性保存信息,属性名字一点要是“fsl,pins”;
1.1.3、在属性中添加pin配置信息
二、gpio子系统
pinctrl子系统设置PIN的复用和电气属性后为GPIO,就轮到gpio子系统了。
gpio子系统初始化GPIO并提供相应的API来操作GPIO,比如设置GPIO为输入输出,读取GPIO的值。
2.1、gpio子系统API函数
2.1..1、gpio_request
用于申请一个gpio,使用gpio之前一直要申请。
gpio标号通过of_get_named_gpio从设备树获取,返回gpio标号。
/*
@Description:申请一个GPIO
@gpio:要申请的gpio标号
@label:给gpio设置的名字
@return:0: 成功
else:失败
*/
int gpio_request(unsigned gpio, const char *label)
2.1.2、gpio_free
不使用某个gpio,要释放
/*
@Description:释放一个GPIO
@gpio:要释放的gpio标号
*/
void gpio_free(unsigned gpio)
2.1.3、gpio_direction_input
设置某个gpio为输入
/*
@Description:设置某个GPIO为输入
@gpio:要设置为输入的gpio标号
@return:0 :成功
< 0 :失败
*/
int gpio_direction_input(unsigned gpio)
2.1.4、gpio_direction_ouput
设置某个gpio为输出,并且设置默认输出值
/*
@Description:设置某个GPIO为输出,并且设置默认