linux驱动开发 | pinctrl和gpio子系统

一、基础知识

Linux 是一个庞大而完善的系统,尤其是驱动框架,像 GPIO 这种最基本的驱动不可能采用“原始”的裸机驱动开发方式,Linux 内核提供了 pinctrl 和 gpio 子系统用于GPIO 驱动,借助 pinctrl 和 gpio 子系统来简化 GPIO 驱动开发。
传统的配置pin的方式就是直接操作寄存器,但是这种方式比较繁琐,而且容易出现pin的功能冲突,pinctrl子系统就是来解决这个问题的。pinctrl 子系统源码目录为 drivers/pinctrl。

pinctrl 子系统主要工作内容如下:
①、获取设备树中 pin 信息。
②、根据获取到的 pin 信息来设置 pin 的复用功能
③、根据获取到的 pin 信息来设置 pin 的电气特性,比如上/下拉、速度、驱动能力等。

gpio子系统用来配置gpio的输入输出等。

pinctrl配置流程:
在imx6ull.dtsi文件中,aips1节点下面,iomuxc节点定义了I.MX6ULL的外设信息

iomuxc: iomuxc@020e0000 {
	compatible = "fsl,imx6ul-iomuxc";
	reg = <0x020e0000 0x4000>;
};

在这里插入图片描述

我们自己的板子,外设信息肯定不能写在头文件里,要写在imx6ull-alientek-emmc.dts里面。通过&向iomuxc节点追加数据,每个外设都是imx6ul-evk板子的一个子节点,子节点里面包含PIN的复用功能和电气特性。
复用功能MX6UL_PAD_UART1_RTS_B__GPIO1_IO19其实是个宏定义,在#include “imx6ull.dtsi”-> #include "imx6ul-pinfunc.h"中。
在这里插入图片描述

二、如何使用pinctrl和gpio子系统

我们就以操作led灯为例,使用这两个子系统初始化led灯的引脚,分为两步,首先配置复用功能,然后在根节点创建设备节点
1.设置引脚复用,在imx6ull-alientek-emmc.dts设备树文件中,iomuxc节点中加入以下节点
在这里插入图片描述

MX6UL_PAD_GPIO1_IO03__GPIO1_IO03定义在头文件#include “imx6ull.dtsi” -> #include “imx6ull-pinfunc.h” -> #include “imx6ul-pinfunc.h”
在这里插入图片描述
这五个值代表。。。文件的注释做的比较清楚
在这里插入图片描述
mux_reg代表复用寄存器地址的偏移
conf_reg代表电气属性寄存器地址的(PAD)偏移 0X10B0就是写这里的
input_reg代表方向寄存器的地址 为0说明 没有输入功能
mux_mode代表复用模式
input_val代表写入Input_reg的值

2.在根节点中创建gpioled子节点
在这里插入图片描述
address-cells和size-cells在这里没有用,因为下面没有子节点了
pinctrl-0代表引用之前创建的pinctrl_led节点,表示gpioled设备所使用的PIN信息保存在pinctrl_led中
led-gpio表示设备所使用的gpio

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值