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

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 编号

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于百度智能体开发爱情三十六计

基于百度智能体开发爱情三十六计 文章目录 基于百度智能体开发爱情三十六计1. 爱情三十六计智能体2. 三十六计开发创意3. 智能体开发实践3.1 基础配置3.2 进阶配置3.3 调优心得3.4可能会遇到的问题 4. 为什么选择文心智能体平台 1. 爱情三十六计智能体 爱情三十六计 是一款基于…

Kaggle竞赛——森林覆盖类型分类

目录 1. 竞赛简要2. 数据分析2.1 特征类型统计2.2 四个荒野区域数据分析2.3 连续特征分析2.4 离散特征分析2.5 特征相关性热图2.6 特征间的散点关系图 3. 特征工程3.1 特征组合3.2 连续特征标准化 4. 模型搭建4.1 模型定义4.2 绘制混淆矩阵和ROC曲线4.3 模型对比与选择 5. 测试…

从0-1实战演练后台管理系统 (3)还在寻找优秀的后台管理系统?Pure Admin 源码及目录结构带你一探究竟!

一、获取源码: 从-gitee-上拉取从 Gitee 上拉取 1、完整版前端代码 git clone https://gitee.com/yiming_chang/vue-pure-admin.git2、国际化精简版前端代码 git clone -b i18n https://gitee.com/yiming_chang/pure-admin-thin.git3、非国际化精简版前端代码 git clone ht…

【Vue】Vue扫盲(七)如何使用Vue脚手架进行模块化开发及遇到的问题(cmd中无法识别vue命令、vue init webpack 命令执行失败)

上篇文章&#xff1a; Vue】Vue扫盲&#xff08;六&#xff09;关于 Vue 项目运行以及文件关系和关联的详细介绍 文章目录 一、安装 相关工具二、处理相关问题问题一&#xff1a;vue -v 提示 vue不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。问题二&#xf…

wifi、热点密码破解 - python

乐子脚本&#xff0c;有点小慢&#xff0c;试过多线程&#xff0c;系统 wifi 连接太慢了&#xff0c;需要时间确认&#xff0c;多线程的话系统根本反应不过来。 也就可以试试破解别人的热点&#xff0c;一般都是 123456 这样的傻鸟口令 # coding:utf-8 import pywifi from pyw…

el-table修改指定列字体颜色 ,覆盖划过行的高亮显示文字颜色

修改指定列字体颜色 ,覆盖划过行的高亮显示文字颜色 代码如下&#xff1a; <div class"c1"><el-table:data"tableData"striperow-class-name"custom-table-row"style"width:100%"cell-mouse-enter"lightFn"cell-…

Android开发 Camera2(最全代码Camera2开发)

介绍 google已经在Android5.1之后取消了对Camera1的更新,转而提供了功能更加强大的Camera2.虽然新版本依然可以使用Camera1但是,不管是各种机型适配还是拍照参数自定义都是很鸡肋的.跟上最新的技术了解Camera2是必要的.关于Camera2的兼容一般是支持API22之后包括API22的Androi…

Flink时间语义和时间窗口

前言 在实际的流计算业务场景中&#xff0c;我们会发现&#xff0c;数据和数据的计算往往都和时间具有相关性。 举几个例子&#xff1a; 直播间右上角通常会显示观看直播的人数&#xff0c;并且这个数字每隔一段时间就会更新一次&#xff0c;比如10秒。电商平台的商品列表&a…

【大数据技术基础 | 实验一】配置SSH免密登录

文章目录 一、实验目的二、实验要求三、实验原理&#xff08;一&#xff09;大数据实验一体机&#xff08;二&#xff09;SSH免密认证 四、实验环境五、实验内容和步骤&#xff08;一&#xff09;搭建集群服务器&#xff08;二&#xff09;添加域名映射&#xff08;三&#xff…

基于SpringBoot+Vue+MySQL的智慧博物馆管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着信息技术的飞速发展&#xff0c;智慧化已成为博物馆发展的新趋势。然而&#xff0c;当前许多博物馆仍面临着预约困难、参观体验不佳等问题&#xff0c;严重影响了博物馆的服务质量和公众形象。传统的预约和票务管理方式已难…

mac安装brew时踩坑解决方案

安装包 mac上如果按照git等工具可能会使用brew&#xff0c;例如使用&#xff1a;$ brew install git命令&#xff0c;如果电脑没有按照brew&#xff0c;则会提示&#xff1a;zsh: command not found: brew 解决方案 需要我们打开brew的官网https://brew.sh/&#xff0c;复制…

C语言 | Leetcode C语言题解之第476题数字的补数

题目&#xff1a; 题解&#xff1a; class Solution { public:int findComplement(int num) {int pos;for (int i 30; i > 0; i--) {if (num & (1 << i)) {pos i;break;}}return (((1LL << (pos 1)) - 1) ^ (num));} };

mysql的重置

今天用Navicat16去连接mysql突然就连不上了。一直报错 连接本地mysql时出现2003-Can‘t connect to MySql server on ‘localhost‘(10061)错误。 以为是Navicat过期了。正好Navicat推出了Lite 17免费版本&#xff0c;心想正好可以尝尝鲜&#xff0c;而且还支持连接Redis&#…

Windows git 配置

需要在git-bash的目录下,配置.ssh 的配置文件 要 .ssh 目录下的配置无法使用

企业或设计师如何使用ComfyUI轻松构建项目AI工作流

ComfyUI是一个为Stable Diffusion专门设计的基于节点的图形用户界面&#xff08;GUI&#xff09;。它使用户能够通过链接不同的块&#xff08;称为节点&#xff09;来构建复杂的图像生成工作流程。这些节点可以包括各种任务&#xff0c;如加载检查点模型、输入提示、指定采样器…

CCS字体、字号更改+CCS下载官方链接

Step1、 按照图示箭头操作 step2 Step3 点击确定&#xff0c;点击Apply(应用)&#xff0c;点击Apply and close(应用和关闭) 4、历代版本下载链接 CCS下载&#xff1a;官方链接https://www.ti.com/tool/CCSTUDIO The last but not least 如果成功的解决了你的问题&#x…

基于SpringBoot+Vue+uniapp的在线招聘平台的详细设计和实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

基于SSM服装定制系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;服装类型管理&#xff0c;服装信息管理&#xff0c;服装定制管理&#xff0c;留言反馈&#xff0c;系统管理 前台账号功能包括&#xff1a;系统首页&#xff0c;个人中心&#xf…

Vue3工程基本创建模板

创建vue工程 执行这两个绿色的命令 输入 code . 打开vscode 安装依赖 Element - plus npm install element-plus --save 在vscode的 main.js 换这个代码 // main.ts import { createApp } from vue import ElementPlus from element-plus import element-plus/dist/inde…

Datawhale 组队学习 文生图 Prompt攻防 task03随笔

这期我们从不同角度切入探讨赛题的进阶思路 思路1&#xff1a;对比不同大模型 首先我们可以选择尝试不同的大模型&#xff0c;使用更复杂的大模型可以提高文本改写的质量和效果。随着模型大小的增加&#xff0c;其表示能力也随之增强&#xff0c;能够捕捉更细微的语言特征和语…