爱游戏-什么是Pinctrl子系统与GPIO子系统?

甚么是Pinctrl子系统与GPIO子系统? 时候:2024-12-27 17:37:51 手机看文章

扫描二维码随时随地手机看文章

之前我们已经由过程几篇笔记来进修点灯了:

【Linux笔记】LED驱动法式

【Linux笔记】LED驱动尝试(总线装备驱动模子)

【Linux笔记】装备树实例阐发

但之前的点灯尝试我们都得去跟一些寄放器打交道,如:

我们要设置装备摆设寄放器,必定得去浏览参考手册查看相干的寄放器,如:

和寄放器打交道是一件费时吃力而收成较小的工作,换句话说就是性价比太低了。

我们在进修STM32的时辰,ST城市给我们供给各类各样的库,这些库就是对寄放器操作的一些封装,我们挪用那些库函数便可以间接地操控寄放器。

我们就根基不消去查参考手册了,最少点个灯是不消去查手册的。

这些寄放器相干的代码一般都是芯片原厂的工程师给我们写好了,我们只要拿来用便可以了。

一样的,在嵌入式Linux开辟中,像上面几篇笔记中的那几种led驱动体例(与寄放器打交道)根基上是用不上的,我们只是为了进修而进修。

Linux内核供给了pinctrl 和 gpio 子系统用在引脚的驱动,如许我们可以免与寄放器打交道。

熟悉pinctrl、gpio子系统

这两个子系统是软件上面的概念,属在Linux内核的一部门。但终究要用起来,都是要与现实硬件挂钩,好比:

在前几个led驱动尝试中我们知道我们要操控一个引脚,我们需要设置装备摆设两个模块的寄放器:GPIO模块和IOMUXC模块。

IOMUXC模块是用来设置装备摆设引脚功能和一些引脚参数(引脚速度、上下拉等);GPIO模块用在设置装备摆设引脚的输入输出等。

此中,pinctrl子系统治理的是IOMUXC模块;gpio子系统治理的是GPIO模块。

下面简单看一下这两个子系统在装备树代码中的表现(以百问网的装备树文件100ask_imx6ull-14x14.dts为例):

1、pinctrl子系统

可以看到这里有两个节点:iomuxc节点与iomuxc_snvs节点,它们都是用来描写IOMUXC模块的。

其实这两个节点是在imx6ull.dtsi文件中被建立的,这是NXP官方供给的。在 100ask_imx6ull-14x14.dts文件中向这两个节点追加内容。

追加的内容就是现实引脚功能的设置装备摆设和引脚参数信息设置装备摆设,下面以一个led的节制引脚为例简单阐发一下:

这个宏中前三个值是寄放器的偏移地址,后两个是寄放器的值,另外一个寄放器的值就是装备树文件里pinctrl_leds节点里的阿谁值,即:

下面再进一步阐发:

2、gpio子系统

这里需要重点存眷以下两个属性:

gpio-controller;#gpio-cells =;

gpio-controller;注解这个节点是一个GPIO节制器,这个节制器下面有良多引脚。

#gpio-cells =;暗示这个节制器下每个引脚要用 2 个 32 位的数(cell)来描写,此中一个数(cell)用来暗示引脚,另外一个数(cell)用来暗示有用电平或其它特征。如:

至此,基在gpio子系统和pinctrl子系统的装备树文件的代码布局以下(图片来自百问网):

对pinctrl信息,有些芯片供给了生成东西。

(1)gpio子系统的API接口

装备树用在描写装备相干的信息,而我们的驱动取得装备信息以后也要利用一些API接口来操控装备。

gpio子系统已帮我们屏障失落了寄放器相干的操作,并给我们供给了一些API接口,我们只要挪用这些API接口便可以间接地操控相干寄放器。

其有两套API接口:基在描写符的(descriptor-based)、老的(legacy)。如:

此中利用基在描写符的(descriptor-based)的接口需要包括头文件linux/gpio/consumer.h:

利用老的(legacy)接口需要包括头文件linux/gpio.h:

led驱动尝试

下面简单看一些基在这两个子系统的led驱动尝试(相干代码来自百问网)。

1、装备树文件

我们需要屏障失落百问开辟板出厂自带的装备树文件(100ask_imx6ull-14x14.dts)中描写led装备相干的代码,并添加以下内容:

(1)在装备树文件中添加以下Pinctrl信息:

(2)在装备树文件根节点下添加以下led节点信息:

2、驱动焦点代码

(1)匹配

(2)probe函数

匹配成功则履行此函数从装备树获得装备信息:

(3)open函数

此函数设置引脚标的目的:

(4)write函数

此函数设置引脚输出值:

3、利用代码
#include #include #include #include #include #include /**./ledtest/dev/100ask_led0on*./ledtest/dev/100ask_led0off*/ int main(int argc, char **argv) { int fd; char status; /*1.判定参数*/ if (argc!= 3){ printf("Usage:%s\n",argv[0]); return -1;} /*2.打开文件*/ fd=open(argv[1],O_RDWR); if (fd== -1){ printf("cannotopenfile%s\n",argv[1]); return -1;} /*3.写文件*/ if (0 == strcmp(argv[2], "on")){status= 1;write(fd, status, 1);} else {status= 0;write(fd, status, 1);}close(fd); return 0;}
4、Makefile文件

5、验证

编译装备树文件、以模块的体例编译驱动文件。并把编译生成以下几个文件上传到板子里:

100ask_imx6ull-14x14.dtb

leddrv.ko

ledtest

这里我们利用百问网开辟的100ask_imx6ull_flashing_tool东西来上传,如

也能够利用开辟板挂载NFS来上传这几个文件,关在NFS可查看往期笔记:【Linux笔记】挂载收集文件系统

100ask_imx6ull_flashing_tool东西默许把文件上传到根目次。我们需要手动把100ask_imx6ull-14x14.dtb文件拷贝到/boot目次下并重启。

测试成果如:

同时,led灯也对应着亮、灭。

往期保举:

Hello系列 | cmake简明根本常识

分享几个工作顶用到的shell剧本

分享一个轻量级跨平台构建东西!

分享一个法式员必备的常识库系统!

Hello系列 | Shell编程必备简明根本常识

Hello系列 | 静态、动态链接简明常识

在公家号聊天界面答复1024,可获得Linux资本

点击浏览原文,查看更多分享。

欲知详情,请下载word文档 下载文档

上一篇:爱游戏-华为云入选Gartner®云数据库挑战者象限 下一篇:爱游戏-内存