一、Pinctrl子系统
pinctrl子系统主要完成工作:
1、获取设备树中 pin 信息
2、根据获取到的 pin 信息来设置 pin 的复用功能
3、根据获取到的 pin 信息来设置 pin 的电气特性,比如上/下拉、速度、驱动能力等
pinctrl子系统源码目录:drivers/pinctrl,主要涉及 2 个对象: pin controller、 client device。
前者提供服务:可以用它来复用引脚、配置引脚。
后者使用服务:声明自己要使用哪些引脚的哪些功能,怎么配置它们
driver_probe_device()
really_probe()
pinctrl_bind_pins()
devm_pinctrl_get(dev);
pinctrl_lookup_state(dev->pins->p, PINCTRL_STATE_DEFAULT);
pinctrl_lookup_state(dev->pins->p, PINCTRL_STATE_INIT);
pinctrl_select_state(dev->pins->p, dev->pins->default_state);
pinctrl_select_state(dev->pins->p, dev->pins->init_state);
/*面朝大海0902*/
/面朝大海0902/
二、GPIO子系统
1、GPIO子系统主要工作及常见API
GPIO子系统主要是使用 GPIO 子系统的标准函数获得 GPIO、设置 GPIO 方向、读取/设置 GPIO 值。
源码目录:drivers/gpio,如下常涉及文件:
GPIO常用API函数:
2、GPIO 一般使用步骤:
1、 gpio_request 函数 //申请GPIO
int gpio_request(unsigned gpio, const char *label)
gpio:要申请的 gpio 标号,使用 of_get_named_gpio 函数从设备树获取指定 GPIO 属性信息,此函数会返回这个 GPIO 的标号。
label:给 gpio 设置个名字。
返回值: 0,申请成功;其他值,申请失败。
2、gpio_direction_input 函数/gpio_direction_output 函数 //设置GPIO方向
int gpio_direction_input(unsigned gpio)
int gpio_direction_output(unsigned gpio, int value)
3、gpio_get_value 函数/gpio_set_value 函数 //get或set gpio值
#define gpio_get_value __gpio_get_value
int __gpio_get_value(unsigned gpio)
#define gpio_set_value __gpio_set_value
void __gpio_set_value(unsigned gpio, int value)
4、gpio_free 函数 //释放GPIO
void gpio_free(unsigned gpio)
/面朝大海0902/
3、与 gpio 相关的 OF 函数
1、int of_gpio_named_count(struct device_node *np, const char *propname)
np:设备节点。
propname:要统计的 GPIO 属性。
返回值: 正值,统计到的 GPIO 数量;负值,失败。
2、int of_gpio_count(struct device_node *np)
此函数统计的是“gpios”这个属性的 GPIO 数量
np:设备节点。
返回值: 正值,统计到的 GPIO 数量;负值,失败
3、int of_get_named_gpio(struct device_node *np,const char *propname,int index)
此函数获取 GPIO 编号
np:设备节点。
propname:包含要获取 GPIO 信息的属性名。
index: GPIO 索引,因为一个属性里面可能包含多个 GPIO,此参数指定要获取哪个 GPIO的编号,如果只有一个 GPIO 信息的话此参数为 0。
返回值: 正值,获取到的 GPIO 编号;负值,失败。
/面朝大海0902/
4、sysfs 中的访问方法
节点目录:/sys/class/gpio
对于输出引脚,假设引脚号为 N,可以用下面的方法设置它的值为 1
echo N > /sys/class/gpio/export
echo out > /sys/class/gpio/gpioN/direction
echo 1 > /sys/class/gpio/gpioN/value
echo N > /sys/class/gpio/unexport