pinctl和GPIO子系统

pinctl和GPIO子系统

不管什么外设驱动,GPIO 驱动基本都是必须的,而 pinctrl 和 gpio 子系统又是 GPIO 驱动必须使用的。

pinctl和GPIO子系统_第1张图片
想让 pinA、B 用于 GPIO,需要设置 IOMUX 让它们连接到 GPIO 模块;想让 pinA、B 用于 I2C,需要设置 IOMUX 让它们连接到 I2C 模块。
pinctl和GPIO子系统_第2张图片
pinctl和GPIO子系统_第3张图片
pinctrl 子系统重点是设置 PIN(有的 SOC 叫做 PAD)的复用和电气属性,如果 pinctrl 子系统将一个 PIN 复用为 GPIO 的话,那么接下来就要用到 gpio 子系统了。
gpio 子系统顾名思义,就是用于初始化 GPIO 并且提供相应的 API 函数,比如设置 GPIO为输入输出,读取 GPIO 的值等。gpio 子系统的主要目的就是方便驱动开发者使用 gpio,驱动开发者在设备树中添加 gpio 相关信息,然后就可以在驱动程序中使用 gpio 子系统提供的 API
函数来操作 GPIO,Linux 内核向驱动开发者屏蔽掉了 GPIO 的设置过程,极大的方便了驱动开发者使用 GPIO。

设备树中添加 pinctrl 节点模板
1、创建对应的节点

pinctrl_test: testgrp {
	fsl,pins = <
		MX6UL_PAD_GPIO1_IO00__GPIO1_IO00 config /*config 是具体设置值*/
	>;
};	

2、添加GPIO子系统设备信息

->gpio 子系统 API 函数
①gpio_request 函数
gpio_request 函数用于申请一个 GPIO 管脚,在使用一个 GPIO 之前一定要使用 gpio_request进行申请

②gpio_free 函数
如果不使用某个 GPIO 了,那么就可以调用 gpio_free 函数进行释放

③gpio_direction_input 函数
此函数用于设置某个 GPIO 为输入

④gpio_direction_output 函数
此函数用于设置某个 GPIO 为输出

⑤gpio_get_value 函数
此函数用于获取某个 GPIO 的值(0 或 1)

⑥gpio_set_value 函数
此函数用于设置某个 GPIO 的值

->与 gpio 相关的 OF 函数
在驱动程序中需要读取 gpio 属性内容,Linux 内核提供了几个与 GPIO 有关的 OF 函数
①of_get_named_gpio 函数
此函数获取 GPIO 编号,类似<&gpio5 7 GPIO_ACTIVE_LOW>

pinctl和GPIO子系统_第4张图片
pinctl和GPIO子系统_第5张图片

->设备树中添加 gpio 节点模板

test { 
	pinctrl-names = "default"; 
	pinctrl-0 = <&pinctrl_test>;
	gpio = <&gpio1 0 GPIO_ACTIVE_LOW>;

①在根节点“/”下创建 test 设备子节点
②添加 pinctrl 信息(描述了 test 设备所使用的 GPIO1_IO00 这 个 PIN 的信息)
③添加 GPIO 属性信息 添加 GPIO 属性信息,表明 test 所使用的 GPIO 是哪个引脚

你可能感兴趣的:(pinctl和GPIO子系统)