Lines Matching refs:GPIO

27 GPIO 接口
29 本文档提供了一个在Linux下访问GPIO的公约概述。
35 什么是GPIO?
37 "通用输入/输出口"(GPIO)是一个灵活的由软件控制的数字信号。他们可
39 比较熟悉。每个GPIO 都代表一个连接到特定引脚或球栅阵列(BGA)封装中
40 “球珠”的一个位。电路板原理图显示了 GPIO 与外部硬件的连接关系。
43 片上系统 (SOC) 处理器对 GPIO 有很大的依赖。在某些情况下,每个
44 非专用引脚都可配置为 GPIO,且大多数芯片都最少有一些 GPIO
45 可编程逻辑器件(类似 FPGA) 可以方便地提供 GPIO。像电源管理和
47 匮乏的 SOC。同时还有通过 I2C 或 SPI 串行总线连接的“GPIO扩展器”
48 芯片。大多数 PC 的南桥有一些拥有 GPIO 能力的引脚 (只有BIOS
51 GPIO 的实际功能因系统而异。通常用法有:
58 “线与”的情况(以支持双向信号)是非常有用的。GPIO 控制器可能有输入
64 - 通常一个 GPIO 根据不同产品电路板的需求,可以配置为输入或输出,也有仅
67 - 大部分 GPIO 可以在持有自旋锁时访问,但是通常由串行总线扩展的 GPIO
70 对于给定的电路板,每个 GPIO 都用于某个特定的目的,如监控 MMC/SD 卡的
75 GPIO 公约
78 因为此时可移植性并不重要。GPIO 常用于板级特定的电路逻辑,甚至可能
83 访问芯片寄存器的内联函数来实现它,其他平台可能通过委托一系列不同的GPIO
85 后面会介绍,但作为 GPIO 接口的客户端驱动程序必须与它的实现无关。)
89 选项。那些调用标准 GPIO 函数的驱动应该在 Kconfig 入口中声明依赖GENERIC_GPIO。
94GPIO 函数是可用,无论是“真实代码”还是经优化过的语句。如果你遵守
100 标识 GPIO
102 GPIO 是通过无符号整型来标识的,范围是 0 到 MAX_INT。保留“负”数
106 平台会定义这些整数的用法,且通常使用 #define 来定义 GPIO,这样
108 启动代码传递过来的 GPIO 编号,使用 platform_data 保存板级特定
111 例如一个平台使用编号 32-159 来标识 GPIO,而在另一个平台使用编号0-63
112 标识一组 GPIO 控制器,64-79标识另一类 GPIO 控制器,且在一个含有
114 使用编号2000-2063来标识一个 I2C 接口的 GPIO 扩展器中的 GPIO
116 如果你要初始化一个带有无效 GPIO 编号的结构体,可以使用一些负编码
118 是否关联一个 GPIO,你可使用以下断言:
122 如果编号不存在,则请求和释放 GPIO 的函数将拒绝执行相关操作(见下文)。
125 一个平台是否支持多个 GPIO 控制器为平台特定的实现问题,就像是否可以
126GPIO 编号空间中有“空洞”和是否可以在运行时添加新的控制器一样。
127 这些问题会影响其他事情,包括相邻的 GPIO 编号是否存在等。
129 使用 GPIO
131 对于一个 GPIO,系统应该做的第一件事情就是通过 gpio_request()
134 接下来是设置I/O方向,这通常是在板级启动代码中为所使用的 GPIO 设置
143 你应该在进程上下文中调用这些函数。然而,对于自旋锁安全的 GPIO,在板子
146 对于作为输出的 GPIO,为其提供初始输出值,对于避免在系统启动期间出现
149 为了与传统的 GPIO 接口兼容, 在设置一个 GPIO 方向时,如果它还未被申请,
150 则隐含了申请那个 GPIO 的操作(见下文)。这种兼容性正在从可选的 gpiolib
153 如果这个 GPIO 编码不存在,或者特定的 GPIO 不能用于那种模式,则方向
156 将这个复用的引脚设置为 GPIO,并正确地配置上拉/下拉电阻。)
159 访问自旋锁安全的 GPIO
161 大多数 GPIO 控制器可以通过内存读/写指令来访问。这些指令不会休眠,可以
164 对于那些用 gpio_cansleep()测试总是返回失败的 GPIO(见下文),使用
167 /* GPIO 输入:返回零或非零 */
170 /* GPIO 输出 */
173 GPIO值是布尔值,零表示低电平,非零表示高电平。当读取一个输出引脚的值时,
178 其是否为“无效GPIO”。此外,还需要注意的是并不是所有平台都可以从输出引脚
180 安全访问的 GPIO (译者注:因为访问可能导致休眠)使用这些函数是不合适的
183GPIO 编号(还有输出、值)为常数的情况下,鼓励通过平台特定的实现来优化
184 这两个函数来访问 GPIO 值。这种情况(读写一个硬件寄存器)下只需要几条指令
186 函数可以使得模拟接口(译者注:例如 GPIO 模拟 I2C、1-wire 或 SPI)的
190 访问可能休眠的 GPIO
192 某些 GPIO 控制器必须通过基于总线(如 I2C 或 SPI)的消息访问。读或写这些
193 GPIO 值的命令需要等待其信息排到队首才发送命令,再获得其反馈。期间需要
196 支持此类 GPIO 的平台通过以下函数返回非零值来区分出这种 GPIO。(此函数需要
197 一个之前通过 gpio_request 分配到的有效 GPIO 编号):
201 为了访问这种 GPIO,内核定义了一套不同的函数:
203 /* GPIO 输入:返回零或非零 ,可能会休眠 */
206 /* GPIO 输出,可能会休眠 */
210 访问这样的 GPIO 需要一个允许休眠的上下文,例如线程 IRQ 处理例程,并用以上的
213 除了这些访问函数可能休眠,且它们操作的 GPIO 不能在硬件 IRQ 处理例程中访问的
216 ** 除此之外 ** 调用设置和配置此类 GPIO 的函数也必须在允许休眠的上下文中,
217 因为它们可能也需要访问 GPIO 控制器芯片: (这些设置函数通常在板级启动代码或者
233 声明和释放 GPIO
237 /* 申请 GPIO, 返回 0 或负的错误代码.
242 /* 释放之前声明的 GPIO */
245 将无效的 GPIO 编码传递给 gpio_request()会导致失败,申请一个已使用这个
246 函数声明过的 GPIO 也会失败。gpio_request()的返回值必须检查。你应该在
247 进程上下文中调用这些函数。然而,对于自旋锁安全的 GPIO,在板子启动的早期、
250 这个函数完成两个基本的目标。一是标识那些实际上已作为 GPIO 使用的信号线,
251 这样便于更好地诊断;系统可能需要服务几百个可用的 GPIO,但是对于任何一个
254 某个已激活信号的驱动是安全的。也就是说,申请 GPIO 的作用类似一种锁机制。
256 某些平台可能也使用 GPIO 作为电源管理激活信号(例如通过关闭未使用芯片区和
259 对于 GPIO 使用 pinctrl 子系统已知的引脚,子系统应该被告知其使用情况;
265 任何须将 GPIO 信号导向适当引脚的引脚复用硬件的编程应该发生在 GPIO
267 任何输出 GPIO 值的设置之后。这样可使从引脚特殊功能到 GPIO 的转换
268 不会在引脚产生毛刺波形。有时当用一个 GPIO 实现其信号驱动一个非 GPIO
271 某些平台允许部分或所有 GPIO 信号使用不同的引脚。类似的,GPIO 或引脚的
272 其他方面也需要配置,如上拉/下拉。平台软件应该在对这些 GPIO 调用
274 使得 GPIO 的用户无须关注这些细节。
276 还有一个值得注意的是在释放 GPIO 前,你必须停止使用它。
279 注意:申请一个 GPIO 并没有以任何方式配置它,只不过标识那个 GPIO 处于使用
280 状态。必须有另外的代码来处理引脚配置(如控制 GPIO 使用的引脚、上拉/下拉)。
281 考虑到大多数情况下声明 GPIO 之后就会立即配置它们,所以定义了以下三个辅助函数:
283 /* 申请一个 GPIO 信号, 同时通过特定的'flags'初始化配置,
289 /* 在单个函数中申请多个 GPIO
293 /* 在单个函数中释放多个 GPIO
328 更进一步,为了更简单地声明/释放多个 GPIO,'struct gpio'被引进来封装所有
358 GPIO 映射到 IRQ
360 GPIO 编号是无符号整数;IRQ 编号也是。这些构成了两个逻辑上不同的命名空间
361 (GPIO 0 不一定使用 IRQ 0)。你可以通过以下函数在它们之间实现映射:
363 /* 映射 GPIO 编号到 IRQ 编号 */
366 /* 映射 IRQ 编号到 GPIO 编号 (尽量避免使用) */
370 (例如,某些 GPIO 无法做为 IRQ 使用。)以下的编号错误是未经检测的:使用一个
371 未通过 gpio_direction_input()配置为输入的 GPIO 编号,或者使用一个
396 某些 GPIO 控制器直接支持开漏输出,还有许多不支持。当你需要开漏信号,但
397 硬件又不直接支持的时候,一个常用的方法是用任何即可作输入也可作输出的 GPIO
417 几个引脚中的任何一个作为给定的 GPIO。(是的,这些例子都来自于当前运行
425 可配置引脚和 GPIO 之间(没)有一一对应的关系。
428 选项。硬件可能支持批量读或写 GPIO,但是那一般是配置相关的:对于处于同一
429 块区(bank)的GPIO。(GPIO 通常以 16 或 32 个组成一个区块,一个给定的
430 片上系统一般有几个这样的区块。)某些系统可以通过输出 GPIO 触发 IRQ,
431 或者从并非以 GPIO 管理的引脚取值。这些机制的相关代码没有必要具有可移植性。
433 当前,动态定义 GPIO 并不是标准的,例如作为配置一个带有某些 GPIO 扩展器的
436 GPIO 实现者的框架 (可选)
439 不同种类的 GPIO 控制器。这个框架称为"gpiolib"。
442 文件。通过这个框架,它可以列出所有注册的控制器,以及当前正在使用中的 GPIO
448 在框架中每个 GPIO 控制器都包装为一个 "struct gpio_chip",他包含了
451 - 设置 GPIO 方向的方法
452 - 用于访问 GPIO 值的方法
457 也包含了来自 device.platform_data 的每个实例的数据:它第一个 GPIO
458 编号和它可用的 GPIO 的数量。
461 配置每个 gpio_chip,并发起gpiochip_add()。卸载一个 GPIO 控制器很少见,
464 大部分 gpio_chip 是一个实例特定结构体的一部分,而并不将 GPIO 接口单独
465 暴露出来,比如编址、电源管理等。类似编解码器这样的芯片会有复杂的非 GPIO
468 任何一个 debugfs 信息导出方法通常应该忽略还未申请作为 GPIO 的信号线。
469 他们可以使用 gpiochip_is_requested()测试,当这个 GPIO 已经申请过了
480 它也应提供一个 ARCH_NR_GPIOS 的定义值,这样可以更好地反映该平台 GPIO
481 的实际数量,节省静态表的空间。(这个定义值应该包含片上系统内建 GPIO
482 GPIO 扩展器中的数据。)
489 如果这些选项都没被选择,该平台就不通过 GPIO-lib 支持 GPIO,且代码不可以
499 基于特定片上系统的 GPIO。例如,若引用的 GPIO (寄存器位偏移)是常量“12”,
501 那些函数必须使用框架提供的代码,那就至少要几十条指令才可以实现。对于用 GPIO
504 对于片上系统,平台特定代码为片上 GPIO 每个区(bank)定义并注册 gpio_chip
505 实例。那些 GPIO 应该根据芯片厂商的文档进行编码/标签,并直接和电路板原理图
506 对应。他们应该开始于零并终止于平台特定的限制。这些 GPIO(代码)通常从
507 arch_initcall()或者更早的地方集成进平台初始化代码,使这些 GPIO 总是可用,
512 对于外部 GPIO 控制器(例如 I2C 或 SPI 扩展器、专用芯片、多功能器件、FPGA
514 gpiochip_add()所使用的 GPIO 编号。他们的起始编号通常跟在平台特定的 GPIO
517 例如板级启动代码应该创建结构体指明芯片公开的 GPIO 范围,并使用 platform_data
518 将其传递给每个 GPIO 扩展器芯片。然后芯片驱动中的 probe()例程可以将这个
521 初始化顺序很重要。例如,如果一个设备依赖基于 I2C 的(扩展)GPIO,那么它的
522 probe()例程就应该在那个 GPIO 有效以后才可以被调用。这意味着设备应该在
523 GPIO 可以工作之后才可被注册。解决这类依赖的的一种方法是让这种 gpio_chip
525 资源可用之后,这些板级特定的回调函数将会注册设备,并可以在这些 GPIO 控制器
531 使用“gpiolib”实现框架的平台可以选择配置一个 GPIO 的 sysfs 用户接口。
532 这不同于 debugfs 接口,因为它提供的是对 GPIO方向和值的控制,而不只显示
533 一个GPIO 的状态摘要。此外,它可以出现在没有调试支持的产品级系统中。
537 临时解除这个保护:首先导入一个 GPIO,改变其输出状态,然后在重新使能写保护
538 前升级代码。通常情况下,GPIO #23 是不会被触及的,并且内核也不需要知道他。
540 根据适当的硬件文档,某些系统的用户空间 GPIO 可以用于确定系统配置数据,
541 这些数据是标准内核不知道的。在某些任务中,简单的用户空间 GPIO 驱动可能是
544 注意:标准内核驱动中已经存在通用的“LED 和按键”GPIO 任务,分别是:
545 "leds-gpio" 和 "gpio_keys"。请使用这些来替代直接访问 GPIO,因为集成在
553 - 用于在用户空间控制 GPIO 的控制接口;
557 - GPIO 控制器 ("gpio_chip" 实例)。
566 一个 GPIO 的控制到用户空间。
568 例如: 如果内核代码没有申请 GPIO #19,"echo 19 > export"
569 将会为 GPIO #19 创建一个 "gpio19" 节点。
576 GPIO 信号的路径类似 /sys/class/gpio/gpio42/ (对于 GPIO #42 来说),
583 "low" 或 "high" 的电平值应该写入 GPIO 的配置,作为初始输出值。
585 注意:如果内核不支持改变 GPIO 的方向,或者在导出时内核代码没有
586 明确允许用户空间可以重新配置 GPIO 方向,那么这个属性将不存在。
588 "value" ... 读取得到 0 (低电平) 或 1 (高电平)。如果 GPIO 配置为
609 GPIO 控制器的路径类似 /sys/class/gpio/gpiochip42/ (对于从#42 GPIO
614 "base" ... 与以上的 N 相同,代表此芯片管理的第一个 GPIO 的编号
618 "ngpio" ... 此控制器所管理的 GPIO 数量(而 GPIO 编号从 N 到
621 大多数情况下,电路板的文档应当标明每个 GPIO 的使用目的。但是那些编号并不总是
622 固定的,例如在扩展卡上的 GPIO会根据所使用的主板或所在堆叠架构中其他的板子而
624 确定给定信号所用的 GPIO 编号。
629 内核代码可以明确地管理那些已通过 gpio_request()申请的 GPIO 的导出:
631 /* 导出 GPIO 到用户空间 */
637 /* 创建一个 sysfs 连接到已导出的 GPIO 节点 */
641 在一个内核驱动申请一个 GPIO 之后,它可以通过 gpio_export()使其在 sysfs
648GPIO 被导出之后,gpio_export_link()允许在 sysfs 文件系统的任何地方
649 创建一个到这个 GPIO sysfs 节点的符号链接。这样驱动就可以通过一个描述性的
650 名字,在 sysfs 中他们所拥有的设备下提供一个(到这个 GPIO sysfs 节点的)接口。