【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第五十四章 Pinctrl 子系统和 GPIO 子系统

news2024/11/29 8:59:16

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7+单核cortex-M4异构处理器,既可用Linux、又可以用于STM32单片机开发。开发板采用核心板+底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐用,可满足高速信号环境下使用。共240PIN,CPU功能全部引出:底板扩展接口丰富底板板载4G接口(选配)、千兆以太网、WIFI蓝牙模块HDMI、CAN、RS485、LVDS接口、温湿度传感器(选配)光环境传感器、六轴传感器、2路USB OTG、3路串口,CAMERA接口、ADC电位器、SPDIF、SDIO接口等


第五十四章 Pinctrl 子系统和 GPIO 子系统

本章导读

在学习了设备树之后,如果还按照裸板开发的方式配置寄存器来控制IO的方式太过于原始,Linux内核提供了pinctrl子系统和gpio子系统用于GPIO驱动,当然pinctrl子系统负责的就不仅仅是GPIO的驱动了而是所有pin脚的配置。pinctrl子系统是随着设备树的加入而加入的,依赖于设备树。GPIO子系统在之前的内核中也是存在的,但是pinctrl子系统的加入GPIO子系统也是有很大的改变,之前的GPIO子系统需要芯片厂商提供的mach文件,而加入设备树后,GPIO子系统使用设备树来实现。

54.1章节讲解了pinctrl子系统。

54.2章节讲解了GPIO子系统。

本章内容对应视频讲解链接(在线观看):

pinctl和gpio子系统 ( https://www.bilibili.com/video/BV1Vy4y1B7ta?p=29

 

54.1 Pinctrl子系统 

大多数SOC的PIN都是支持复用的,此外我们还需要配置 pin 的电气特性,比如上/下拉、速度、驱动能力等等。传统的配置 pin 的方式就是直接操作相应的寄存器,但是这种配置方式比较繁琐、而且容易出问题(比如 pin 功能冲突)。pinctrl 子系统就是为了解决这个问题而引入的,pinctrl 子系统主要工作内容如下

  • 获取设备树中pin信息,管理系统中所有的可以控制的pin,在系统初始化的时候,枚举所有可以控制的pin,并标识这些pin。
  • 根据获得到的pin信息来设置pin的复用功能,对于SOC而言,其引脚除了配置成普通的GPIO之外,若干个引脚还可以组成一个pin group,形成特定的功能。
  • 根据获得到的pin信息来设置pin的电气特性,比如上下拉、速度、驱动能力。

对于我们使用者来说,只需要在设备树里面设置好某个pin的相关属性即可,其他的初始化工作均由pinctrl子系统来完成,pinctrl 子系统源码目录drivers/pinctrl。

不同soc厂家的pin controller的节点是不一样的,但是这些节点里都是把某些引脚复用成某些功能。如

NXP的pinctrl子系统如下所示:

 三星pinctrl子系统如下所示:

 瑞星微pinctrl子系统如下所示:

ST的pinctrl子系统如下所示: 

不同soc厂家的pin controller的节点里面的属性都可以通过内核源码/Documentation/devicetree/bindings下的txt文档查看。

下面我们来看一下 pinctrl 子系统在 stm32mp157的设备树中是如何实现并使用的。

首先来到linux内核目录下,如图所示:

 

然后我们使用以下命令进入stm32mp151.dtsi文件中,找到 pinctrl: pin-controller@50002000节点,如下图所示:

vim arch/arm/boot/dts/stm32mp151.dtsi

部分截图如下图所示:

 pinctrl: pin-controller@50002000 {
                        #address-cells = <1>;
                        #size-cells = <1>;
                        compatible = "st,stm32mp157-pinctrl";
                        ranges = <0 0x50002000 0xa400>;
                        interrupt-parent = <&exti>;
                        st,syscfg = <&exti 0x60 0xff>;
                        hwlocks = <&hsem 0 1>;
                        pins-are-numbered;

#address-cells 属性值为 1 和#size-cells 属性值为 1第 1818 行,

ranges 属性表示 STM32MP1 的 GPIO 相关寄存器起始地址,0x50002000 表示起始地址,0xa400 表示寄存器地址范围。

interrupt-parent 属性值为“&exti”,父中断为 exti。

然后在该内容的下方可以找到如下内容:

  gpioa: gpio@50002000 {
                                gpio-controller;
                                #gpio-cells = <2>;
                                interrupt-controller;
                                #interrupt-cells = <2>;
                                reg = <0x0 0x400>;
                                clocks = <&rcc GPIOA>;
                                st,bank-name = "GPIOA";
                                status = "disabled";
                        };
                        ..........................................................

这些是关于gpio相关的,我们在稍后的GPIO子系统相关小节中会进行说明。绑定文档 Documentation/devicetree/bindings/pinctrl/st,stm32-pinctrl.yaml 描述了如何在设备树中设置 STM32 的 PIN 信息,截取出的一段例程如下

pinctrl@60020000 {
        usart1_pins_a: usart1-0 {
                pins1 {
                        pinmux = <STM32_PINMUX('A', 9, AF7)>;
                        bias-disable;
                        drive-push-pull;
                        slew-rate = <0>;
                };
                pins2 {
                        pinmux = <STM32_PINMUX('A', 10, AF7)>;
                        bias-disable;
                };
        };
    };

以上内容对usart1-0节点进行定义, usart1_pins_a是usart1-0的别名,然后对两个引脚使用 pinmux属性进行分别的功能复用。其中pinmux属性的宏定义在include/dt-bindings/pinctrl/stm32-pinfunc.h 文件中,具体内容如下

/* define Pins number*/
#define PIN_NO(port, line)      (((port) - 'A') * 0x10 + (line))
#define STM32_PINMUX(port, line, mode) (((PIN_NO(port, line)) << 8) | (mode))

port:表示用那一组 GPIO。

line:表示这组 GPIO 的第几个引脚。

mode:表示当前引脚要做那种复用功能

pinmux = <STM32_PINMUX('A', 9, AF7)>;

在这里以pins1的 pinmux属性为例子,进行讲解。首先前面的A代表GPIOA组别,而9代表该组别的第9个io口,之后的AF7为对应的复用功能,我们打开iTOP-STM32MP157开发板\iTOP-STM32MP157开发板光盘资料\20220223\01_开发板硬件资料\官方数据手册\STM32MP157A&D 数据手册.pdf ,然后我们来到4 Pinouts, pin description and alternate functions小节,即引脚输出、引脚描述和功能复用,找到PA9相关的功能描述如下图所示:

在找到PA9功能之后,然后找到对应的AF7,可以发现对应的复用功能为USART1_TX。

而如何对我们的pinctrl子系统进行调用呢,我们将我们在st,stm32-pinctrl.yaml例子中没列举的内容进行展示,内容如下

    usart1 {
                pinctrl-0 = <&usart1_pins_a>;
                pinctrl-names = "default";
    };

我们只需要将对应的节点内容,添加到&pinctrl 节点下,即可,这里我们在内核移植章节中进行了演示。

接下来我们进行gpio子系统的讲解。

54.2 GPIO子系统

当我们使用pinctrl子系统将引脚的复用关系设置为GPIO以后,我们就可以使用GPIO子系统来操作我们的GPIO了,Linux 内核提供了 pinctrl 子系统和 gpio 子系统用于 GPIO 驱动。当然 pinctrl 子系统负责的就不仅仅是 GPIO 的驱动了而是所有 pin 脚的配置。pinctrl 子系统是随着设备树的加入而加入的,依赖于设备树。GPIO 子系统在之前的内核中也是存在的,但是 pinctrl 子系统的加入 GPIO 子系统也是有很大的改变。为什么他会发生非常大的变化呢?之前我们控制一个GPIO可以直接来操作我们的寄存器,还有一种方法是使用SOC厂家实现的配置函数,例如三星的配置函数为s3c_gpio_cfgpin等,这样带来的问题就是各家有各家的接口函数与实现方式,不但内核的代码复用率低而且开发者很难记住这么多的函数,如果要使用多种平台的话背函数都是很麻烦的,所以在引入设备树后对GPIO子系统进行了大的改造,使用设备树来实现并提供统一的接口。通过 GPIO 子系统功能要实现:

  • 引脚功能的配置(设置为 GPIO,特殊功能,GPIO 的方向,设置为中断等)
  • 实现软硬件的分离(分离出硬件差异,有厂商提供的底层支持;软件分层。驱动只需要调用接口 API 即可操作 GPIO)
  • iommu 内存管理(直接调用宏即可操作 GPIO)

经过 GPIO 子系统,我们可以通过如下的方式来配置 GPIO

下面具体讲解一下这几个函数的用法:

1 gpio_request 函数

函数

int gpio_request(unsigned gpio, const char *label)

gpio

要申请的 gpio 标号,使用 of_get_named_gpio 函数从设备树获取指定 GPIO 属性信息,此函数会返回这个 GPIO 的标号。

label

给 gpio 设置个名字

返回值

0,申请成功;其他值,申请失败

功能

gpio_request 函数用于申请一个 GPIO 管脚

2 gpio_free函数 

函数

void gpio_free(unsigned gpio)

gpio

要释放的 gpio 标号

返回值

功能

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

3 gpio_direction_input 函数

函数

int gpio_direction_input(unsigned gpio)

gpio

要设置为输入的 GPIO 标号

返回值

设置成功返回0;设置失败返回负值

功能

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

4 gpio_direction_output 函数 

函数

int gpio_direction_output(unsigned gpio, int value)

gpio

要设置为输出的 GPIO 标号

value

GPIO 默认输出值

返回值

设置成功返回0;设置失败返回负值

功能

此函数用于设置某个 GPIO 为输出,并且设置默认输出值

5 gpio_get_value函数 

函数

int __gpio_get_value(unsigned gpio)

gpio

要获取的 GPIO 标号

返回值

成功返回GPIO值,失败返回负值

功能

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

 6 gpio_set_value函数

函数

void __gpio_set_value(unsigned gpio, int value)

gpio

要设置的 GPIO 标号

value

要设置的值

返回值

功能

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

 7 of_get_named_gpio 函数

函数

int of_get_named_gpio(struct device_node *np,const char *propname,int index)

np

设备节点

propname

包含要获取 GPIO 信息的属性名

index

因为一个属性里面可能包含多个 GPIO,此参数指定要获取哪个 GPIO的编号,如果只有一个 GPIO 信息的话此参数为 0

返回值

成功返回到的 GPIO 编号,失败返回一个负数

功能

此函数获取 GPIO 编号,因为 Linux 内核中关于 GPIO 的 API 函数都要使用 GPIO 编号,此函数会将设备树中类似<&gpio1 3 GPIO_ACTIVE_LOW>的属性信息转换为对应的 GPIO 编号

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2218689.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp,获取头部高度

头部自定义时候&#xff0c;设置获取安全区域&#xff0c;可以用 uni.getSystemInfoSync();接口。 <view class"statusBar" :style"{height:statusBarHeightpx}"> let SYSuni.getSystemInfoSync(); let statusBarHeightref(SYS.statusBarHeight) …

最后一周征稿!第四届计算机、物联网与控制工程国际学术会议(CITCE 2024)

第四届计算机、物联网与控制工程国际学术会议&#xff08;CITCE 2024&#xff09;将于2024年11月1-3日在中国-武汉召开。CITCE 2024将围绕计算机、物联网与控制工程的最新研究领域&#xff0c;为来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者、工程师等提供一…

Shell编程-break

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们前面学习了那么多命令&#xff0c;以及涉及到部分逻辑判断的问题。从简单来说&#xff0c;他就是Shell编程&#xff0c;…

Linux与Windows文件共享:Samba的详细配置(Ubuntu)

序 什么是samba&#xff1f;Samba是一种在Linux和UNIX系统上实现SMB协议的免费软件&#xff0c;用于局域网内不同计算机之间的文件和打印机共享服务。今天我们将通过配置samba来进行Windows与linux系统之间的文件共享。 配置 此次配置&#xff0c;我们所使用的Linux发行版版本信…

萤石云服务支持云端视频AI自动剪辑生成

萤石视频云存储及媒体处理服务是围绕IoT设备云端存储场景下的音视频采集、媒体管理、视频剪辑和分发能力的一站式、专业云服务&#xff0c;并可面向广大开发者提供复杂设备存储场景下的完整技术方案。目前该服务新增了视频剪辑功能&#xff0c;支持将视频片段在云端进行裁剪并拼…

WordPress+Nginx 安装教程

WordPress 是一个开源的网站建设工具&#xff0c;可以用它来“快速”搭建个人博客&#xff0c;官网等等。它本身是用 php 开发的&#xff0c;本身部署不复杂&#xff0c;主要是需要一些配套的东西才能跑起来&#xff0c;网上的一些教程也是写的不清不楚&#xff0c;本文针对非 …

LeetCode :LCR 173. 点名

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;leetcode刷题 ​ ​ LeetCode :LCR 173. 点名 这个题就是缺失的数字&#xff0c;我们可以通过三种方式来解决这个问题。 1.可以通过位异或的方式来找到这个数&#xff08;相同的数异或为…

枸杞常见病虫害识别数据集(猫脸码客 第220期)

枸杞常见病虫害识别数据集 枸杞&#xff0c;作为一种在中医药学和食品保健领域都备受瞩目的植物&#xff0c;其生长过程中常常会受到各种病虫害的侵扰。这些病虫害不仅影响枸杞的产量&#xff0c;还对其品质产生不良影响。因此&#xff0c;对枸杞病虫害的研究和防治显得尤为重…

SpringBoot使用RestTemplate实现发送HTTP请求

Java 实现发送 HTTP 请求&#xff0c;系列文章&#xff1a; 《Java使用原生HttpURLConnection实现发送HTTP请求》 《Java使用HttpClient5实现发送HTTP请求》 《SpringBoot使用RestTemplate实现发送HTTP请求》 1、RestTemplate 的介绍 RestTemplate 是 Spring 框架提供的一个用…

【前端】如何制作一个自己的网页(9)

前面&#xff0c;我们使用的CSS选择器&#xff0c;是通过元素的标签来指定网页的样式。而CSS中提供了多种不同类型的选择器&#xff0c;我们需要根据不同的情况&#xff0c;选择不同的CSS选择器。 CSS中&#xff0c;常见的基础选择器有三种。分别为&#xff1a;标签选择器、类选…

案例分享—国外优秀UI卡片设计作品赏析

国外UI设计注重用户体验&#xff0c;倾向于采用简洁的布局、清晰的排版和直观的交互方式&#xff0c;减少用户的认知负担。卡片式设计能够完美利用屏幕空间&#xff0c;使内容一目了然&#xff0c;易于用户快速浏览和阅读&#xff0c;从而提升了整体的用户体验。 更加注重扁平化…

一款.NET开源的i茅台自动预约小助手

前言 今天大姚给大家分享一款.NET开源、基于WPF实现的i茅台APP接口自动化每日自动预约&#xff08;抢茅台&#xff09;小助手&#xff1a;HyggeImaotai。 项目介绍 该项目通过接口自动化模拟i茅台APP实现每日自动预约茅台酒的功能&#xff0c;软件会在指定时间开始对管理的用…

数据结构与算法 - 树 #数的概念 #二叉树 #堆 - 堆的实现/堆排序/TOP-K问题

文章目录 前言 一、树 (一)、概念 1、树的定义 (二)、树的定义 1、树为什么是递归定义的&#xff1f; 2、如何定义树(如何表达一棵树) 解决方案一&#xff1a;假设我们得知该树的度 解决方案二&#xff1a;顺序表 解决方案三&#xff1a;左孩子右兄弟表示法 二、二叉…

众数信科荣登“2024 CHINA AIGC 100”榜单

2024年10月17日&#xff0c;由非凡产研推出的「2024 CHINA AIGC 100」榜单隆重发布&#xff0c;众数信科凭借领先的企业AI智能体解决方案能力荣登榜单。 非凡产研AIGC 100 评选旨在挖掘国内具有高潜力的AI应用&#xff0c;为AI产业的高质量发展注入新动力。榜单覆盖了教育、医疗…

无人机之融合集群技术篇

无人机的融合集群技术是一个涉及多个领域的复杂技术体系&#xff0c;它结合了无人机技术、自组网技术、集群控制技术以及反制设备等多个方面&#xff0c;旨在实现多架无人机之间的协同、编队、信息共享、任务分配和高效作业。 一、无人机自组网技术 无人机自组网技术是一种利用…

vulnhub靶场之digitalworld.local DEVELOPMENT

一.环境搭建 1.靶场描述 This machine reminds us of a DEVELOPMENT environment: misconfigurations rule the roost. This is designed for OSCP practice, and the original version of the machine was used for a CTF. It is now revived, and made slightly more nefari…

Linux 之 fdisk 【磁盘分区管理】

删除分区 1.查看磁盘信息 lsblk 2.删除分区sdb硬盘下的所有分区 # 1 进入d的磁盘分区 fdisk /dev/sdb # 2 输入p查看磁盘的分区信息 # 3 输入d进入删除磁盘分区命令 # 4 选择要删除的分区号 重复3&#xff0c;4 全部删除 # 5 w 保存退出并生效操作信息 &#xff08;输入q…

面试应该问什么?

在求职者面试的过程中&#xff0c;向面试官提问是一个展现自己积极态度、对职位和公司兴趣以及进一步了解工作环境和职业发展机会的重要环节。以下是一些求职者可以在面试中向面试官提问的问题&#xff0c;这些问题旨在帮助你更全面地了解未来的工作环境、团队文化、以及个人职…

联系拯救者Y9000P2022笔记本电脑进入BIOS快捷键

联系拯救者Y9000P2022笔记本电脑进入BIOS快捷键 文章目录 联系拯救者Y9000P2022笔记本电脑进入BIOS快捷键1. 进入BIOS快捷键2. 快速进入BIOS设置界面3. 快速进入启动项选择界面 1. 进入BIOS快捷键 进入BIOS设置界面的快捷键为F2快速进入启动项选择界面的快捷键为F12 2. 快速进…

82.【C语言】数据结构之顺序表的初始化和销毁

目录 1.线性表 2.分类 1.静态顺序表&#xff1a;使用定长数组存储元素 代码示例(写入Seqlist.h中) 2.动态顺序表:使用与动态内存管理有关的函数 代码示例(写入Seqlist.h中) 补:数据管理的四个需求:增改删查 3.操作顺序表 1.初始化顺序表 1.不开辟空间 2.开辟空间 1…