Lines Matching +full:gpio +full:-
1 Chinese translated version of Documentation/admin-guide/gpio
12 ---------------------------------------------------------------------
13 Documentation/admin-guide/gpio 的中文翻译
26 ---------------------------------------------------------------------
27 GPIO 接口
37 "通用输入/输出口"(GPIO)是一个灵活的由软件控制的数字信号。他们可
40 “球珠”的一个位。电路板原理图显示了 GPIO 与外部硬件的连接关系。
43 片上系统 (SOC) 处理器对 GPIO 有很大的依赖。在某些情况下,每个
44 非专用引脚都可配置为 GPIO,且大多数芯片都最少有一些 GPIO。
45 可编程逻辑器件(类似 FPGA) 可以方便地提供 GPIO。像电源管理和
48 芯片。大多数 PC 的南桥有一些拥有 GPIO 能力的引脚 (只有BIOS
51 GPIO 的实际功能因系统而异。通常用法有:
53 - 输出值可写 (高电平=1,低电平=0)。一些芯片也有如何驱动这些值的选项,
57 - 输入值可读(1、0)。一些芯片支持引脚在配置为“输出”时回读,这对于类似
58 “线与”的情况(以支持双向信号)是非常有用的。GPIO 控制器可能有输入
61 - 输入通常可作为 IRQ 信号,一般是沿触发,但有时是电平触发。这样的 IRQ
64 - 通常一个 GPIO 根据不同产品电路板的需求,可以配置为输入或输出,也有仅
67 - 大部分 GPIO 可以在持有自旋锁时访问,但是通常由串行总线扩展的 GPIO
70 对于给定的电路板,每个 GPIO 都用于某个特定的目的,如监控 MMC/SD 卡的
75 GPIO 公约
78 因为此时可移植性并不重要。GPIO 常用于板级特定的电路逻辑,甚至可能
85 后面会介绍,但作为 GPIO 接口的客户端驱动程序必须与它的实现无关。)
89 选项。那些调用标准 GPIO 函数的驱动应该在 Kconfig 入口中声明依赖GENERIC_GPIO。
92 #include <linux/gpio.h>
94 则 GPIO 函数是可用,无论是“真实代码”还是经优化过的语句。如果你遵守
100 标识 GPIO
101 ---------
102 GPIO 是通过无符号整型来标识的,范围是 0 到 MAX_INT。保留“负”数
106 平台会定义这些整数的用法,且通常使用 #define 来定义 GPIO,这样
108 启动代码传递过来的 GPIO 编号,使用 platform_data 保存板级特定
111 例如一个平台使用编号 32-159 来标识 GPIO,而在另一个平台使用编号0-63
112 标识一组 GPIO 控制器,64-79标识另一类 GPIO 控制器,且在一个含有
113 FPGA 的特定板子上使用 80-95。编号不一定要连续,那些平台中,也可以
114 使用编号2000-2063来标识一个 I2C 接口的 GPIO 扩展器中的 GPIO。
116 如果你要初始化一个带有无效 GPIO 编号的结构体,可以使用一些负编码
117 (如"-EINVAL"),那将使其永远不会是有效。来测试这样一个结构体中的编号
118 是否关联一个 GPIO,你可使用以下断言:
122 如果编号不存在,则请求和释放 GPIO 的函数将拒绝执行相关操作(见下文)。
125 一个平台是否支持多个 GPIO 控制器为平台特定的实现问题,就像是否可以
126 在 GPIO 编号空间中有“空洞”和是否可以在运行时添加新的控制器一样。
127 这些问题会影响其他事情,包括相邻的 GPIO 编号是否存在等。
129 使用 GPIO
130 ---------
131 对于一个 GPIO,系统应该做的第一件事情就是通过 gpio_request()
134 接下来是设置I/O方向,这通常是在板级启动代码中为所使用的 GPIO 设置
138 int gpio_direction_input(unsigned gpio);
139 int gpio_direction_output(unsigned gpio, int value);
143 你应该在进程上下文中调用这些函数。然而,对于自旋锁安全的 GPIO,在板子
146 对于作为输出的 GPIO,为其提供初始输出值,对于避免在系统启动期间出现
149 为了与传统的 GPIO 接口兼容, 在设置一个 GPIO 方向时,如果它还未被申请,
150 则隐含了申请那个 GPIO 的操作(见下文)。这种兼容性正在从可选的 gpiolib
153 如果这个 GPIO 编码不存在,或者特定的 GPIO 不能用于那种模式,则方向
156 将这个复用的引脚设置为 GPIO,并正确地配置上拉/下拉电阻。)
159 访问自旋锁安全的 GPIO
160 -------------------
161 大多数 GPIO 控制器可以通过内存读/写指令来访问。这些指令不会休眠,可以
164 对于那些用 gpio_cansleep()测试总是返回失败的 GPIO(见下文),使用
167 /* GPIO 输入:返回零或非零 */
168 int gpio_get_value(unsigned gpio);
170 /* GPIO 输出 */
171 void gpio_set_value(unsigned gpio, int value);
180 安全访问的 GPIO (译者注:因为访问可能导致休眠)使用这些函数是不合适的
183 在 GPIO 编号(还有输出、值)为常数的情况下,鼓励通过平台特定的实现来优化
184 这两个函数来访问 GPIO 值。这种情况(读写一个硬件寄存器)下只需要几条指令
186 函数可以使得模拟接口(译者注:例如 GPIO 模拟 I2C、1-wire 或 SPI)的
190 访问可能休眠的 GPIO
191 -----------------
192 某些 GPIO 控制器必须通过基于总线(如 I2C 或 SPI)的消息访问。读或写这些
193 GPIO 值的命令需要等待其信息排到队首才发送命令,再获得其反馈。期间需要
196 支持此类 GPIO 的平台通过以下函数返回非零值来区分出这种 GPIO。(此函数需要
197 一个之前通过 gpio_request 分配到的有效 GPIO 编号):
199 int gpio_cansleep(unsigned gpio);
201 为了访问这种 GPIO,内核定义了一套不同的函数:
203 /* GPIO 输入:返回零或非零 ,可能会休眠 */
204 int gpio_get_value_cansleep(unsigned gpio);
206 /* GPIO 输出,可能会休眠 */
207 void gpio_set_value_cansleep(unsigned gpio, int value);
210 访问这样的 GPIO 需要一个允许休眠的上下文,例如线程 IRQ 处理例程,并用以上的
213 除了这些访问函数可能休眠,且它们操作的 GPIO 不能在硬件 IRQ 处理例程中访问的
216 ** 除此之外 ** 调用设置和配置此类 GPIO 的函数也必须在允许休眠的上下文中,
217 因为它们可能也需要访问 GPIO 控制器芯片: (这些设置函数通常在板级启动代码或者
233 声明和释放 GPIO
234 ----------------------------
237 /* 申请 GPIO, 返回 0 或负的错误代码.
240 int gpio_request(unsigned gpio, const char *label);
242 /* 释放之前声明的 GPIO */
243 void gpio_free(unsigned 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'初始化配置,
287 int gpio_request_one(unsigned gpio, unsigned long flags, const char *label);
289 /* 在单个函数中申请多个 GPIO
291 int gpio_request_array(struct gpio *array, size_t num);
293 /* 在单个函数中释放多个 GPIO
295 void gpio_free_array(struct gpio *array, size_t num);
299 * GPIOF_DIR_IN - 配置方向为输入
300 * GPIOF_DIR_OUT - 配置方向为输出
302 * GPIOF_INIT_LOW - 在作为输出时,初始值为低电平
303 * GPIOF_INIT_HIGH - 在作为输出时,初始值为高电平
304 * GPIOF_OPEN_DRAIN - gpio引脚为开漏信号
305 * GPIOF_OPEN_SOURCE - gpio引脚为源极开路信号
307 * GPIOF_EXPORT_DIR_FIXED - 将 gpio 导出到 sysfs,并保持方向
308 * GPIOF_EXPORT_DIR_CHANGEABLE - 同样是导出, 但允许改变方向
312 * GPIOF_IN - 配置为输入
313 * GPIOF_OUT_INIT_LOW - 配置为输出,并初始化为低电平
314 * GPIOF_OUT_INIT_HIGH - 配置为输出,并初始化为高电平
328 更进一步,为了更简单地声明/释放多个 GPIO,'struct gpio'被引进来封装所有
331 struct gpio {
332 unsigned gpio;
339 static struct gpio leds_gpios[] = {
358 GPIO 映射到 IRQ
359 --------------------
360 GPIO 编号是无符号整数;IRQ 编号也是。这些构成了两个逻辑上不同的命名空间
361 (GPIO 0 不一定使用 IRQ 0)。你可以通过以下函数在它们之间实现映射:
363 /* 映射 GPIO 编号到 IRQ 编号 */
364 int gpio_to_irq(unsigned gpio);
366 /* 映射 IRQ 编号到 GPIO 编号 (尽量避免使用) */
370 (例如,某些 GPIO 无法做为 IRQ 使用。)以下的编号错误是未经检测的:使用一个
371 未通过 gpio_direction_input()配置为输入的 GPIO 编号,或者使用一个
387 ----------------------------
396 某些 GPIO 控制器直接支持开漏输出,还有许多不支持。当你需要开漏信号,但
397 硬件又不直接支持的时候,一个常用的方法是用任何即可作输入也可作输出的 GPIO
400 LOW: gpio_direction_output(gpio, 0) ... 这代码驱动信号并覆盖
403 HIGH: gpio_direction_input(gpio) ... 这代码关闭输出,所以上拉电阻
406 如果你将信号线“驱动”为高电平,但是 gpio_get_value(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"。
441 作为一个辅助调试功能,如果 debugfs 可用,就会有一个 /sys/kernel/debug/gpio
442 文件。通过这个框架,它可以列出所有注册的控制器,以及当前正在使用中的 GPIO
447 -------------------
448 在框架中每个 GPIO 控制器都包装为一个 "struct gpio_chip",他包含了
451 - 设置 GPIO 方向的方法
452 - 用于访问 GPIO 值的方法
453 - 告知调用其方法是否可能休眠的标志
454 - 可选的 debugfs 信息导出方法 (显示类似上拉配置一样的额外状态)
455 - 诊断标签
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 已经申请过了
474 -------
477 <asm/gpio.h> 包含 <asm-generic/gpio.h>,同时定义三个方法:
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 总是可用,
511 -------
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 用户接口。
537 临时解除这个保护:首先导入一个 GPIO,改变其输出状态,然后在重新使能写保护
538 前升级代码。通常情况下,GPIO #23 是不会被触及的,并且内核也不需要知道他。
540 根据适当的硬件文档,某些系统的用户空间 GPIO 可以用于确定系统配置数据,
541 这些数据是标准内核不知道的。在某些任务中,简单的用户空间 GPIO 驱动可能是
544 注意:标准内核驱动中已经存在通用的“LED 和按键”GPIO 任务,分别是:
545 "leds-gpio" 和 "gpio_keys"。请使用这些来替代直接访问 GPIO,因为集成在
550 --------------
551 在/sys/class/gpio 中有 3 类入口:
553 - 用于在用户空间控制 GPIO 的控制接口;
555 - GPIOs 本身;以及
557 - GPIO 控制器 ("gpio_chip" 实例)。
563 /sys/class/gpio/
566 一个 GPIO 的控制到用户空间。
568 例如: 如果内核代码没有申请 GPIO #19,"echo 19 > export"
569 将会为 GPIO #19 创建一个 "gpio19" 节点。
576 GPIO 信号的路径类似 /sys/class/gpio/gpio42/ (对于 GPIO #42 来说),
579 /sys/class/gpio/gpioN/
583 "low" 或 "high" 的电平值应该写入 GPIO 的配置,作为初始输出值。
585 注意:如果内核不支持改变 GPIO 的方向,或者在导出时内核代码没有
586 明确允许用户空间可以重新配置 GPIO 方向,那么这个属性将不存在。
588 "value" ... 读取得到 0 (低电平) 或 1 (高电平)。如果 GPIO 配置为
609 GPIO 控制器的路径类似 /sys/class/gpio/gpiochip42/ (对于从#42 GPIO
612 /sys/class/gpio/gpiochipN/
614 "base" ... 与以上的 N 相同,代表此芯片管理的第一个 GPIO 的编号
618 "ngpio" ... 此控制器所管理的 GPIO 数量(而 GPIO 编号从 N 到
619 N + ngpio - 1)
621 大多数情况下,电路板的文档应当标明每个 GPIO 的使用目的。但是那些编号并不总是
624 确定给定信号所用的 GPIO 编号。
628 -------------
629 内核代码可以明确地管理那些已通过 gpio_request()申请的 GPIO 的导出:
631 /* 导出 GPIO 到用户空间 */
632 int gpio_export(unsigned gpio, bool direction_may_change);
637 /* 创建一个 sysfs 连接到已导出的 GPIO 节点 */
639 unsigned gpio)
641 在一个内核驱动申请一个 GPIO 之后,它可以通过 gpio_export()使其在 sysfs
648 在 GPIO 被导出之后,gpio_export_link()允许在 sysfs 文件系统的任何地方
649 创建一个到这个 GPIO sysfs 节点的符号链接。这样驱动就可以通过一个描述性的
650 名字,在 sysfs 中他们所拥有的设备下提供一个(到这个 GPIO sysfs 节点的)接口。