Lines Matching refs:GPIO
15 传统GPIO接口
18 本文档概述了Linux下的GPIO访问公约。
24 什么是GPIO?
26 "通用输入/输出口"(GPIO)是一个灵活的由软件控制的数字信号。他们可
28 比较熟悉。每个GPIO 都代表一个连接到特定引脚或球栅阵列(BGA)封装中
29 “球珠”的一个位。电路板原理图显示了 GPIO 与外部硬件的连接关系。
32 片上系统 (SOC) 处理器对 GPIO 有很大的依赖。在某些情况下,每个
33 非专用引脚都可配置为 GPIO,且大多数芯片都最少有一些 GPIO。
34 可编程逻辑器件(类似 FPGA) 可以方便地提供 GPIO。像电源管理和
36 匮乏的 SOC。同时还有通过 I2C 或 SPI 串行总线连接的“GPIO扩展器”
37 芯片。大多数 PC 的南桥有一些拥有 GPIO 能力的引脚 (只有BIOS
40 GPIO 的实际功能因系统而异。通常用法有:
47 “线与”的情况(以支持双向信号)是非常有用的。GPIO 控制器可能有输入
53 - 通常一个 GPIO 根据不同产品电路板的需求,可以配置为输入或输出,也有仅
56 - 大部分 GPIO 可以在持有自旋锁时访问,但是通常由串行总线扩展的 GPIO
59 对于给定的电路板,每个 GPIO 都用于某个特定的目的,如监控 MMC/SD 卡的
64 GPIO 公约
67 因为此时可移植性并不重要。GPIO 常用于板级特定的电路逻辑,甚至可能
72 访问芯片寄存器的内联函数来实现它,其他平台可能通过委托一系列不同的GPIO
74 后面会介绍,但作为 GPIO 接口的客户端驱动程序必须与它的实现无关。)
78 选项。那些调用标准 GPIO 函数的驱动应该在 Kconfig 入口中声明依赖GENERIC_GPIO。
83 则 GPIO 函数是可用,无论是“真实代码”还是经优化过的语句。如果你遵守
89 标识 GPIO
92 GPIO 是通过无符号整型来标识的,范围是 0 到 MAX_INT。保留“负”数
96 平台会定义这些整数的用法,且通常使用 #define 来定义 GPIO,这样
98 启动代码传递过来的 GPIO 编号,使用 platform_data 保存板级特定
101 例如一个平台使用编号 32-159 来标识 GPIO,而在另一个平台使用编号0-63
102 标识一组 GPIO 控制器,64-79标识另一类 GPIO 控制器,且在一个含有
104 使用编号2000-2063来标识一个 I2C 接口的 GPIO 扩展器中的 GPIO。
106 如果你要初始化一个带有无效 GPIO 编号的结构体,可以使用一些负编码
108 是否关联一个 GPIO,你可使用以下断言::
112 如果编号不存在,则请求和释放 GPIO 的函数将拒绝执行相关操作(见下文)。
115 一个平台是否支持多个 GPIO 控制器为平台特定的实现问题,就像是否可以
116 在 GPIO 编号空间中有“空洞”和是否可以在运行时添加新的控制器一样。
117 这些问题会影响其他事情,包括相邻的 GPIO 编号是否存在等。
119 使用 GPIO
122 对于一个 GPIO,系统应该做的第一件事情就是通过 gpio_request()
125 接下来是设置I/O方向,这通常是在板级启动代码中为所使用的 GPIO 设置
134 你应该在进程上下文中调用这些函数。然而,对于自旋锁安全的 GPIO,在板子
137 对于作为输出的 GPIO,为其提供初始输出值,对于避免在系统启动期间出现
140 为了与传统的 GPIO 接口兼容, 在设置一个 GPIO 方向时,如果它还未被申请,
141 则隐含了申请那个 GPIO 的操作(见下文)。这种兼容性正在从可选的 gpiolib
144 如果这个 GPIO 编码不存在,或者特定的 GPIO 不能用于那种模式,则方向
147 将这个复用的引脚设置为 GPIO,并正确地配置上拉/下拉电阻。)
150 访问自旋锁安全的 GPIO
153 大多数 GPIO 控制器可以通过内存读/写指令来访问。这些指令不会休眠,可以
156 对于那些用 gpio_cansleep()测试总是返回失败的 GPIO(见下文),使用
159 /* GPIO 输入:返回零或非零 */
162 /* GPIO 输出 */
165 GPIO值是布尔值,零表示低电平,非零表示高电平。当读取一个输出引脚的值时,
170 其是否为“无效GPIO”。此外,还需要注意的是并不是所有平台都可以从输出引脚
172 安全访问的 GPIO (译者注:因为访问可能导致休眠)使用这些函数是不合适的
175 在 GPIO 编号(还有输出、值)为常数的情况下,鼓励通过平台特定的实现来优化
176 这两个函数来访问 GPIO 值。这种情况(读写一个硬件寄存器)下只需要几条指令
178 函数可以使得模拟接口(译者注:例如 GPIO 模拟 I2C、1-wire 或 SPI)的
182 访问可能休眠的 GPIO
185 某些 GPIO 控制器必须通过基于总线(如 I2C 或 SPI)的消息访问。读或写这些
186 GPIO 值的命令需要等待其信息排到队首才发送命令,再获得其反馈。期间需要
189 支持此类 GPIO 的平台通过以下函数返回非零值来区分出这种 GPIO。(此函数需要
190 一个之前通过 gpio_request 分配到的有效 GPIO 编号)::
194 为了访问这种 GPIO,内核定义了一套不同的函数::
196 /* GPIO 输入:返回零或非零 ,可能会休眠 */
199 /* GPIO 输出,可能会休眠 */
203 访问这样的 GPIO 需要一个允许休眠的上下文,例如线程 IRQ 处理例程,并用以上的
206 除了这些访问函数可能休眠,且它们操作的 GPIO 不能在硬件 IRQ 处理例程中访问的
209 ** 除此之外 ** 调用设置和配置此类 GPIO 的函数也必须在允许休眠的上下文中,
210 因为它们可能也需要访问 GPIO 控制器芯片 (这些设置函数通常在板级启动代码或者
226 声明和释放 GPIO
231 /* 申请 GPIO, 返回 0 或负的错误代码.
236 /* 释放之前声明的 GPIO */
239 将无效的 GPIO 编码传递给 gpio_request()会导致失败,申请一个已使用这个
240 函数声明过的 GPIO 也会失败。gpio_request()的返回值必须检查。你应该在
241 进程上下文中调用这些函数。然而,对于自旋锁安全的 GPIO,在板子启动的早期、
244 这个函数完成两个基本的目标。一是标识那些实际上已作为 GPIO 使用的信号线,
245 这样便于更好地诊断;系统可能需要服务几百个可用的 GPIO,但是对于任何一个
248 某个已激活信号的驱动是安全的。也就是说,申请 GPIO 的作用类似一种锁机制。
250 某些平台可能也使用 GPIO 作为电源管理激活信号(例如通过关闭未使用芯片区和
253 对于 GPIO 使用引脚控制子系统已知的引脚,子系统应该被告知其使用情况;
259 任何须将 GPIO 信号导向适当引脚的引脚复用硬件的编程应该发生在 GPIO
261 任何输出 GPIO 值的设置之后。这样可使从引脚特殊功能到 GPIO 的转换
262 不会在引脚产生毛刺波形。有时当用一个 GPIO 实现其信号驱动一个非 GPIO
265 某些平台允许部分或所有 GPIO 信号使用不同的引脚。类似的,GPIO 或引脚的
266 其他方面也需要配置,如上拉/下拉。平台软件应该在对这些 GPIO 调用
268 使得 GPIO 的用户无须关注这些细节。
270 还有一个值得注意的是在释放 GPIO 前,你必须停止使用它。
273 注意:申请一个 GPIO 并没有以任何方式配置它,只不过标识那个 GPIO 处于使用
274 状态。必须有另外的代码来处理引脚配置(如控制 GPIO 使用的引脚、上拉/下拉)。
275 考虑到大多数情况下声明 GPIO 之后就会立即配置它们,所以定义了以下三个辅助函数::
277 /* 申请一个 GPIO 信号, 同时通过特定的'flags'初始化配置,
283 /* 在单个函数中申请多个 GPIO
287 /* 在单个函数中释放多个 GPIO
322 更进一步,为了更简单地声明/释放多个 GPIO,'struct gpio'被引进来封装所有
352 GPIO 映射到 IRQ
355 GPIO 编号是无符号整数;IRQ 编号也是。这些构成了两个逻辑上不同的命名空间
356 (GPIO 0 不一定使用 IRQ 0)。你可以通过以下函数在它们之间实现映射::
358 /* 映射 GPIO 编号到 IRQ 编号 */
362 (例如,某些 GPIO 无法做为 IRQ 使用。)以下的编号错误是未经检测的:使用一个
363 未通过 gpio_direction_input()配置为输入的 GPIO 编号,或者使用一个
385 某些 GPIO 控制器直接支持开漏输出,还有许多不支持。当你需要开漏信号,但
386 硬件又不直接支持的时候,一个常用的方法是用任何即可作输入也可作输出的 GPIO
400 GPIO控制器和引脚控制子系统
403 SOC上的GPIO控制器可能与引脚控制子系统紧密结合,即引脚可以与可选的gpio功
404 能一起被其他功能使用。我们已经涵盖了这样的情况,例如一个GPIO控制器需要保
412 但是,引脚控制子系统是如何将GPIO号码(这是一个全局事项)与某个引脚控制器
441 几个引脚中的任何一个作为给定的 GPIO。(是的,这些例子都来自于当前运行
449 可配置引脚和 GPIO 之间(没)有一一对应的关系。
452 选项。硬件可能支持批量读或写 GPIO,但是那一般是配置相关的:对于处于同一
453 块区(bank)的GPIO。(GPIO 通常以 16 或 32 个组成一个区块,一个给定的
454 片上系统一般有几个这样的区块。)某些系统可以通过输出 GPIO 触发 IRQ,
455 或者从并非以 GPIO 管理的引脚取值。这些机制的相关代码没有必要具有可移植性。
457 当前,动态定义 GPIO 并不是标准的,例如作为配置一个带有某些 GPIO 扩展器的
460 GPIO 实现者的框架(可选)
464 不同种类的 GPIO 控制器。这个框架称为"gpiolib"。
467 文件。通过这个框架,它可以列出所有注册的控制器,以及当前正在使用中的 GPIO
474 在框架中每个 GPIO 控制器都包装为一个 "struct gpio_chip",他包含了
477 - 设置 GPIO 方向的方法
478 - 用于访问 GPIO 值的方法
483 也包含了来自 device.platform_data 的每个实例的数据:它第一个 GPIO 的
484 编号和它可用的 GPIO 的数量。
487 配置每个 gpio_chip,并发起gpiochip_add()。卸载一个 GPIO 控制器很少见,
490 大部分 gpio_chip 是一个实例特定结构体的一部分,而并不将 GPIO 接口单独
491 暴露出来,比如编址、电源管理等。类似编解码器这样的芯片会有复杂的非 GPIO
494 任何一个 debugfs 信息导出方法通常应该忽略还未申请作为 GPIO 的信号线。
495 他们可以使用 gpiochip_is_requested()测试,当这个 GPIO 已经申请过了
507 它也应提供一个 ARCH_NR_GPIOS 的定义值,这样可以更好地反映该平台 GPIO
508 的实际数量,节省静态表的空间。(这个定义值应该包含片上系统内建 GPIO 和
509 GPIO 扩展器中的数据。)
516 如果这些选项都没被选择,该平台就不通过 GPIO-lib 支持 GPIO,且代码不可以
526 基于特定片上系统的 GPIO。例如,若引用的 GPIO (寄存器位偏移)是常量“12”,
528 那些函数必须使用框架提供的代码,那就至少要几十条指令才可以实现。对于用 GPIO
531 对于片上系统,平台特定代码为片上 GPIO 每个区(bank)定义并注册 gpio_chip
532 实例。那些 GPIO 应该根据芯片厂商的文档进行编码/标签,并直接和电路板原理图
533 对应。他们应该开始于零并终止于平台特定的限制。这些 GPIO(代码)通常从
534 arch_initcall()或者更早的地方集成进平台初始化代码,使这些 GPIO 总是可用,
540 对于外部 GPIO 控制器(例如 I2C 或 SPI 扩展器、专用芯片、多功能器件、FPGA
542 gpiochip_add()所使用的 GPIO 编号。他们的起始编号通常跟在平台特定的 GPIO
545 例如板级启动代码应该创建结构体指明芯片公开的 GPIO 范围,并使用 platform_data
546 将其传递给每个 GPIO 扩展器芯片。然后芯片驱动中的 probe()例程可以将这个
549 初始化顺序很重要。例如,如果一个设备依赖基于 I2C 的(扩展)GPIO,那么它的
550 probe()例程就应该在那个 GPIO 有效以后才可以被调用。这意味着设备应该在
551 GPIO 可以工作之后才可被注册。解决这类依赖的的一种方法是让这种 gpio_chip
553 资源可用之后,这些板级特定的回调函数将会注册设备,并可以在这些 GPIO 控制器
560 使用“gpiolib”实现框架的平台可以选择配置一个 GPIO 的 sysfs 用户接口。
561 这不同于 debugfs 接口,因为它提供的是对 GPIO方向和值的控制,而不只显示
562 一个GPIO 的状态摘要。此外,它可以出现在没有调试支持的产品级系统中。
566 临时解除这个保护:首先导入一个 GPIO,改变其输出状态,然后在重新使能写保护
567 前升级代码。通常情况下,GPIO #23 是不会被触及的,并且内核也不需要知道他。
569 根据适当的硬件文档,某些系统的用户空间 GPIO 可以用于确定系统配置数据,
570 这些数据是标准内核不知道的。在某些任务中,简单的用户空间 GPIO 驱动可能是
573 注意:标准内核驱动中已经存在通用的“LED 和按键”GPIO 任务,分别是:
574 "leds-gpio" 和 "gpio_keys"。请使用这些来替代直接访问 GPIO,因为集成在
583 - 用于在用户空间控制 GPIO 的控制接口;
587 - GPIO 控制器 ("gpio_chip" 实例)。
596 一个 GPIO 的控制到用户空间。
598 例如: 如果内核代码没有申请 GPIO #19,"echo 19 > export"
599 将会为 GPIO #19 创建一个 "gpio19" 节点。
606 GPIO 信号的路径类似 /sys/class/gpio/gpio42/ (对于 GPIO #42 来说),
613 "low" 或 "high" 的电平值应该写入 GPIO 的配置,作为初始输出值。
615 注意:如果内核不支持改变 GPIO 的方向,或者在导出时内核代码没有
616 明确允许用户空间可以重新配置 GPIO 方向,那么这个属性将不存在。
618 "value" ... 读取得到 0 (低电平) 或 1 (高电平)。如果 GPIO 配置为
639 GPIO 控制器的路径类似 /sys/class/gpio/gpiochip42/ (对于从#42 GPIO
644 "base" ... 与以上的 N 相同,代表此芯片管理的第一个 GPIO 的编号
648 "ngpio" ... 此控制器所管理的 GPIO 数量(而 GPIO 编号从 N 到
651 大多数情况下,电路板的文档应当标明每个 GPIO 的使用目的。但是那些编号并不总是
652 固定的,例如在扩展卡上的 GPIO会根据所使用的主板或所在堆叠架构中其他的板子而
654 确定给定信号所用的 GPIO 编号。
660 内核代码可以明确地管理那些已通过 gpio_request()申请的 GPIO 的导出::
662 /* 导出 GPIO 到用户空间 */
668 在一个内核驱动申请一个 GPIO 之后,它可以通过 gpio_export()使其在 sysfs
679 本节中列出的函数已被废弃。在新的代码中应该使用基于GPIO描述符的API。