文章目录[隐藏]
IOMUX
无论是哪种芯片,都有类似图 16.1 的结构:

⚫ 要想让 pinA、B 用于 I2C,需要设置 IOMUX 让它们连接到 I2C 模块。
所以 GPIO、I2C 应该是并列的关系,它们能够使用之前,需要设置 IOMUX。
有时候并不仅仅是设置 IOMUX,还要配置引脚,比如上拉、下拉、开漏等等。
现在的芯片动辄几百个引脚,在使用到 GPIO 功能时,让你一个引脚一个引 脚去找对应的寄存器,这要疯掉。术业有专攻,这些累活就让芯片厂家做吧──
他们是 BSP 工程师。我们在他们的基础上开发,我们是驱动工程师。要把引脚的复用、配置抽出来,做成 Pinctrl 子系统,给 GPIO、I2C等模块使用。
BSP 工程师要做什么?看图 16.2:

Pinctrl子系统
pinctrl子系统的工作流程通常包括以下步骤:
- 内核启动时,pinctrl子系统会读取设备树中的引脚配置信息。
2.创建pinctrl设备 - 根据设备树中的信息,为每个需要管理的引脚创建pinctrl设备。
3.初始化引脚状态 - 设置引脚的默认状态,通常是基于设备树中指定的初始配置。
4.动态更改状态 - 当应用程序需要改变引脚的功能或电气特性时,可以通过pinctrl子系统的API进行动态配置。
GPIO子系统
在嵌入式Linux系统中,GPIO(General Purpose Input/Output)子系统是一个关键组件,用于管理SoC(System on Chip)芯片上的通用输入输出引脚。这些引脚可以被配置成输入或输出,从而与外部设备进行数字信号的交互。GPIO子系统提供了一套标准化的API和框架,使得驱动开发者可以更轻松地控制和使用GPIO资源。在实际的嵌入式Linux开发中,当pinctrl子系统将某个引脚复用为GPIO后,接下来就可以使用GPIO子系统来控制这个引脚。
以下是GPIO子系统的一些关键特性和功能:
- 标准化API
- GPIO子系统提供了一系列API函数,如gpio_request(), gpio_free(), gpio_set_value(), gpio_get_value()等,用于请求GPIO资源,设置和获取GPIO引脚的状态。
- 设备树集成
- GPIO子系统依赖于设备树来描述硬件的GPIO配置。设备树中包含有关GPIO引脚的信息,如引脚编号、方向(输入或输出)、初始状态等。
- 驱动分离与分层
- GPIO子系统遵循Linux内核的驱动分离与分层原则,允许底层硬件抽象和高层应用逻辑分离,提高代码的可重用性和可维护性。
- 资源管理
- GPIO子系统负责管理GPIO资源,避免资源冲突,确保多个驱动或应用程序不会同时使用同一个GPIO引脚。
- 高级GPIO接口(gpiod)
- 高级GPIO接口(gpiod)是GPIO子系统的一部分,它提供了更强大的功能,如中断处理、边缘检测等,并且API设计更为现代化,易于使用。
- 兼容性与移植性
- 通过使用GPIO子系统,驱动开发者可以编写与硬件无关的代码,便于在不同的SoC和平台之间移植。
在设备树中指定引脚
在几乎所有 ARM 芯片中,GPIO 都分为几组,每组中有若干个引脚。所以在
使用 GPIO 子系统之前,就要先确定:它是哪组的?组里的哪一个?
在设备树中,“GPIO 组”就是一个 GPIO Controller,这通常都由芯片厂家
设置好。我们要做的是找到它名字,比如“gpio1”,然后指定要用它里面的哪个
引脚,比如<&gpio1 0>。示例如下

在驱动代码中调用 GPIO 子系统
在设备树中指定了 GPIO 引脚,在驱动代码中如何使用?
也就是 GPIO 子系统的接口函数是什么?
GPIO 子系统有两套接口:基于描述符的(descriptor-based)、老的
(legacy)。前者的函数都有前缀“gpiod_”,它使用 gpio_desc 结构体来表示
一个引脚;后者的函数都有前缀“gpio_”,它使用一个整数来表示一个引脚。要操作一个引脚,首先要 get 引脚,然后设置方向,读值、写值。
驱动程序中要包含头文件,
#include <linux/gpio/consumer.h> // descriptor-based
或者
#include <linux/gpio.h> // legacy
Code language: HTML, XML (xml)
常用的函数:

设备树介绍
简介
设备树的源文件通常为.dts或.dtsi,这些文件被编译器如dtc转换成二进制的.dtb文件,然后在系统启动时加载到内核中。
内核中的设备驱动程序可以利用设备树来获取硬件的详细信息,从而进行初始化和管理。

设备树的历史背景
设备树的组成部分
1. DTS (Device Tree Source)
这是设备树的源文件,通常以.dts扩展名保存。DTS文件包含描述硬件配置的文本,类似于配置文件,但使用了一种特殊的语法。这些文件由人类编写并存储在内核源代码树中,通常是arch//boot/dts/目录下。
2. DTC (Device Tree Compiler)
这是一个工具,用于编译DTS文件生成二进制的设备树Blob (DTB),即.dtb文件。DTB文件是内核可以解析的紧凑格式,它在启动过程中被加载到内存中。
3. DTB (Device Tree Blob)
这是设备树的二进制表示,内核在启动时会加载这个文件,然后解析其中的信息来初始化硬件。
设备树的结构

- compatible:列出与该节点兼容的驱动程序或硬件模型。
- model:具体描述硬件设备的型号。
- reg:描述设备的地址和范围。
- interrupts:描述中断线的配置。
- status:表示设备是否启用或禁用。
- #address-cells和#size-cells:用于描述地址和大小单元的数目,帮助内核理解设备的寻址方式。
设备树的解析
当内核启动时,它会读取设备树Blob (DTB),解析其中的信息,并使用这些信息来初始化和配置硬件设备。内核会寻找与compatible属性匹配的驱动程序,然后使用设备树中提供的参数来初始化设备。
评论