通用输入/输出(GPIO)¶
目录
核心¶
-
struct gpio_irq_chip¶
GPIO 中断控制器
定义:
struct gpio_irq_chip {
struct irq_chip *chip;
struct irq_domain *domain;
#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY;
struct fwnode_handle *fwnode;
struct irq_domain *parent_domain;
int (*child_to_parent_hwirq)(struct gpio_chip *gc,unsigned int child_hwirq,unsigned int child_type,unsigned int *parent_hwirq, unsigned int *parent_type);
int (*populate_parent_alloc_arg)(struct gpio_chip *gc,union gpio_irq_fwspec *fwspec,unsigned int parent_hwirq, unsigned int parent_type);
unsigned int (*child_offset_to_irq)(struct gpio_chip *gc, unsigned int pin);
struct irq_domain_ops child_irq_domain_ops;
#endif;
irq_flow_handler_t handler;
unsigned int default_type;
struct lock_class_key *lock_key;
struct lock_class_key *request_key;
irq_flow_handler_t parent_handler;
union {
void *parent_handler_data;
void **parent_handler_data_array;
};
unsigned int num_parents;
unsigned int *parents;
unsigned int *map;
bool threaded;
bool per_parent_data;
bool initialized;
bool domain_is_allocated_externally;
int (*init_hw)(struct gpio_chip *gc);
void (*init_valid_mask)(struct gpio_chip *gc,unsigned long *valid_mask, unsigned int ngpios);
unsigned long *valid_mask;
unsigned int first;
void (*irq_enable)(struct irq_data *data);
void (*irq_disable)(struct irq_data *data);
void (*irq_unmask)(struct irq_data *data);
void (*irq_mask)(struct irq_data *data);
};
成员
chip
GPIO IRQ 芯片实现,由 GPIO 驱动程序提供。
domain
中断转换域;负责 GPIO hwirq 编号和 Linux IRQ 编号之间的映射。
fwnode
与此 gpiochip/irqchip 对应的固件节点,对于分层 irqdomain 支持是必需的。
parent_domain
如果非 NULL,将设置为此 GPIO 中断控制器的 IRQ 域的父域,以建立分层中断域。此项的存在将激活分层中断支持。
child_to_parent_hwirq
此回调将子硬件 IRQ 偏移量转换为分层中断芯片上的父硬件 IRQ 偏移量。子硬件 IRQ 对应于 GPIO 索引 0..ngpio-1(请参阅
struct gpio_chip
的 ngpio 字段),相应的父硬件 IRQ 和类型(例如 IRQ_TYPE_*)应由驱动程序返回。驱动程序可以从偏移量或使用查找表或任何最适合此芯片的方法来计算此值。如果驱动程序中成功转换,则返回 0。如果某些硬件 IRQ 范围没有相应的父 HWIRQ,则返回 -EINVAL,但也要确保填写 valid_mask 和 need_valid_mask,以使这些 GPIO 线不可用于转换。
populate_parent_alloc_arg
此可选回调分配并填充父 IRQ 域的特定结构。如果未指定,则将使用
gpiochip_populate_parent_fwspec_twocell
。 还提供了名为gpiochip_populate_parent_fwspec_fourcell
的四单元变体。child_offset_to_irq
此可选回调用于将 GPIO 芯片上的子 GPIO 线偏移量转换为 GPIO to_irq() 回调的 IRQ 编号。如果未指定,则将提供一个默认回调,该回调将返回线偏移量。
child_irq_domain_ops
将用于此 GPIO IRQ 芯片的 IRQ 域操作。如果未提供任何操作,则将填充默认回调以设置 IRQ 层次结构。某些驱动程序需要提供自己的转换函数。
handler
要使用的 IRQ 处理程序(通常是预定义的 IRQ 核心函数),用于 GPIO IRQ,由 GPIO 驱动程序提供。
default_type
在 GPIO 驱动程序初始化期间应用的默认 IRQ 触发类型,由 GPIO 驱动程序提供。
lock_key
每个 GPIO IRQ 芯片的 IRQ 锁的 lockdep 类。
request_key
每个 GPIO IRQ 芯片的 IRQ 请求的 lockdep 类。
parent_handler
GPIO 芯片的父中断的中断处理程序,如果父中断是嵌套的而不是级联的,则可能为 NULL。
{unnamed_union}
匿名
parent_handler_data
如果 per_parent_data 为 false,则 parent_handler_data 是一个用作与每个父中断关联的数据的单个指针。
parent_handler_data_array
如果 per_parent_data 为 true,则 parent_handler_data_array 是一个 num_parents 指针数组,用于为每个父项关联不同的数据。如果 per_parent_data 为 true,则此项不能为 NULL。
num_parents
GPIO 芯片的中断父项数量。
parents
GPIO 芯片的中断父项列表。此列表归驱动程序所有,因此核心只会引用此列表,而不会修改它。
map
GPIO 芯片的每条线的中断父项列表。
threaded
如果设置了中断处理使用嵌套线程,则为 True。
per_parent_data
如果 parent_handler_data_array 描述要用作父数据的 num_parents 大小的数组,则为 True。
initialized
用于跟踪 GPIO 芯片 irq 成员初始化的标志。此标志将确保在初始化之前不使用 GPIO 芯片 irq 成员。
domain_is_allocated_externally
如果 irq_domain 是在 gpiolib 外部分配的,则为 True,在这种情况下,gpiolib 将不会自己释放 irq_domain。
init_hw
在添加 IRQ 芯片之前初始化硬件的可选例程。当特定驱动程序想要清除与 IRQ 相关的寄存器以避免不必要的事件时,这非常有用。
init_valid_mask
初始化 valid_mask 的可选例程,如果并非所有 GPIO 线都是有效中断,则可以使用此例程。有时,某些线只是无法触发中断,并且此例程(如果已定义)会传递一个“valid_mask”中的位图,其中从 0..(ngpios-1) 设置为 “1” 的 ngpios 位,表示有效。然后,回调可以直接将某些位设置为 “0”,如果它们不能用于中断。
valid_mask
如果不是
NULL
,则保存 GPIO 的位掩码,这些 GPIO 有效包含在芯片的 IRQ 域中。first
静态 IRQ 分配所必需的。如果设置,irq_domain_add_simple() 将在初始化期间分配和映射所有 IRQ。
irq_enable
存储旧的 irq_chip irq_enable 回调
irq_disable
存储旧的 irq_chip irq_disable 回调
irq_unmask
存储旧的 irq_chip irq_unmask 回调
irq_mask
存储旧的 irq_chip irq_mask 回调
-
struct gpio_chip¶
抽象一个 GPIO 控制器
定义:
struct gpio_chip {
const char *label;
struct gpio_device *gpiodev;
struct device *parent;
struct fwnode_handle *fwnode;
struct module *owner;
int (*request)(struct gpio_chip *gc, unsigned int offset);
void (*free)(struct gpio_chip *gc, unsigned int offset);
int (*get_direction)(struct gpio_chip *gc, unsigned int offset);
int (*direction_input)(struct gpio_chip *gc, unsigned int offset);
int (*direction_output)(struct gpio_chip *gc, unsigned int offset, int value);
int (*get)(struct gpio_chip *gc, unsigned int offset);
int (*get_multiple)(struct gpio_chip *gc,unsigned long *mask, unsigned long *bits);
void (*set)(struct gpio_chip *gc, unsigned int offset, int value);
void (*set_multiple)(struct gpio_chip *gc,unsigned long *mask, unsigned long *bits);
int (*set_config)(struct gpio_chip *gc,unsigned int offset, unsigned long config);
int (*to_irq)(struct gpio_chip *gc, unsigned int offset);
void (*dbg_show)(struct seq_file *s, struct gpio_chip *gc);
int (*init_valid_mask)(struct gpio_chip *gc,unsigned long *valid_mask, unsigned int ngpios);
int (*add_pin_ranges)(struct gpio_chip *gc);
int (*en_hw_timestamp)(struct gpio_chip *gc,u32 offset, unsigned long flags);
int (*dis_hw_timestamp)(struct gpio_chip *gc,u32 offset, unsigned long flags);
int base;
u16 ngpio;
u16 offset;
const char *const *names;
bool can_sleep;
#if IS_ENABLED(CONFIG_GPIO_GENERIC);
unsigned long (*read_reg)(void __iomem *reg);
void (*write_reg)(void __iomem *reg, unsigned long data);
bool be_bits;
void __iomem *reg_dat;
void __iomem *reg_set;
void __iomem *reg_clr;
void __iomem *reg_dir_out;
void __iomem *reg_dir_in;
bool bgpio_dir_unreadable;
int bgpio_bits;
raw_spinlock_t bgpio_lock;
unsigned long bgpio_data;
unsigned long bgpio_dir;
#endif ;
#ifdef CONFIG_GPIOLIB_IRQCHIP;
struct gpio_irq_chip irq;
#endif ;
unsigned long *valid_mask;
#if defined(CONFIG_OF_GPIO);
unsigned int of_gpio_n_cells;
int (*of_xlate)(struct gpio_chip *gc, const struct of_phandle_args *gpiospec, u32 *flags);
#endif ;
};
成员
label
GPIO 设备的功能名称,例如部件号或实现它的 SoC IP 块的名称。
gpiodev
内部状态保持器,不透明结构
parent
提供 GPIO 的可选父设备
fwnode
可选的 fwnode,提供此控制器的属性
所有者
有助于防止移除导出活动 GPIO 的模块
请求
用于芯片特定激活的可选钩子,例如启用模块电源和时钟;可能会休眠
释放
用于芯片特定停用的可选钩子,例如禁用模块电源和时钟;可能会休眠
get_direction
返回信号“offset”的方向,0=输出,1=输入,(与 GPIO_LINE_DIRECTION_OUT / GPIO_LINE_DIRECTION_IN 相同),或负错误。建议始终实现此函数,即使在仅输入或仅输出的 gpio 芯片上也是如此。
direction_input
将信号“offset”配置为输入,成功返回 0,或返回负错误号。 这在仅输入或仅输出的 gpio 芯片上可以省略。
direction_output
将信号“offset”配置为输出,成功返回 0,或返回负错误号。 这在仅输入或仅输出的 gpio 芯片上可以省略。
get
返回信号“offset”的值,0=低电平,1=高电平,或负错误
get_multiple
读取由“mask”定义的多个信号的值,并将它们存储在“bits”中,成功返回 0,或返回负错误
set
为信号“offset”分配输出值
set_multiple
为由“mask”定义的多个信号分配输出值
set_config
适用于各种设置的可选钩子。使用与通用 pinconf 相同的打包配置格式。
to_irq
支持非静态
gpiod_to_irq()
映射的可选钩子;实现可能不会休眠dbg_show
用于在 debugfs 中显示内容的可选例程;省略此项时将使用默认代码,但自定义代码可以显示额外的状态(例如上拉/下拉配置)。
init_valid_mask
用于初始化 valid_mask 的可选例程,如果并非所有 GPIO 都有效,则使用该例程。
add_pin_ranges
用于初始化引脚范围的可选例程,当需要提供 GPIO 功能的引脚的特殊映射时使用。它在添加 GPIO 芯片之后和添加 IRQ 芯片之前调用。
en_hw_timestamp
依赖于 GPIO 芯片,用于启用硬件时间戳的可选例程。
dis_hw_timestamp
依赖于 GPIO 芯片,用于禁用硬件时间戳的可选例程。
base
标识此芯片处理的第一个 GPIO 号;或者,如果在注册期间为负数,则请求动态 ID 分配。弃用:提供任何非负数并锁定 GPIO 芯片的基本偏移量已被弃用。请传递 -1 作为基本值,以便 gpiolib 在所有可能的情况下选择芯片基本值。我们希望从长远来看摆脱静态 GPIO 编号空间。
ngpio
此控制器处理的 GPIO 数量;处理的最后一个 GPIO 是 (base + ngpio - 1)。
offset
当多个 gpio 芯片属于同一设备时,这可以用作设备内的偏移量,以便可以正确分配友好的名称。
names
如果设置,则必须是字符串数组,用作此芯片中 GPIO 的替代名称。如果 GPIO 没有别名,则数组中的任何条目都可以为 NULL,但是数组的长度必须为 ngpio 个条目。
can_sleep
如果 get()/set() 方法休眠,则必须设置标志,因为它们在通过 I2C 或 SPI 访问 GPIO 扩展器芯片时必须这样做。这意味着如果芯片支持 IRQ,则这些 IRQ 需要进行线程化,因为当例如读取 IRQ 状态寄存器时,芯片访问可能会休眠。
read_reg
通用 GPIO 的读取器函数
write_reg
通用 GPIO 的写入器函数
be_bits
如果通用 GPIO 具有大端位顺序(位 31 表示第 0 行,位 30 表示第 1 行 ... 位 0 表示第 31 行),则通用 GPIO 内核将其设置为 true。它仅用于内部管理。
reg_dat
通用 GPIO 的数据(输入)寄存器
reg_set
通用 GPIO 的输出设置寄存器(输出=高电平)
reg_clr
通用 GPIO 的输出清除寄存器(输出=低电平)
reg_dir_out
通用 GPIO 的方向输出设置寄存器
reg_dir_in
通用 GPIO 的方向输入设置寄存器
bgpio_dir_unreadable
指示无法读取方向寄存器,我们需要依赖内部状态跟踪。
bgpio_bits
用于通用 GPIO 的寄存器位数,即 <寄存器宽度> * 8
bgpio_lock
用于锁定 chip->bgpio_data。此外,还需要将阴影和实际数据寄存器写入操作放在一起。
bgpio_data
通用 GPIO 的阴影数据寄存器,用于安全地清除/设置位。
bgpio_dir
通用 GPIO 的阴影方向寄存器,用于安全地清除/设置方向。此字中的“1”表示该行设置为输出。
irq
将中断芯片功能与 GPIO 芯片集成在一起。可用于处理大多数实际情况下的 IRQ。
valid_mask
如果不是
NULL
,则保存芯片中可用的 GPIO 的位掩码。of_gpio_n_cells
用于形成 GPIO 说明符的单元格数。
of_xlate
回调以将设备树 GPIO 说明符转换为芯片相关的 GPIO 编号和标志。
描述
gpio_chip 可以帮助平台抽象各种 GPIO 来源,以便可以通过通用编程接口访问它们。示例来源包括 SOC 控制器、FPGA、多功能芯片、专用 GPIO 扩展器等等。
每个芯片控制多个信号,这些信号在方法调用中通过范围 0..(ngpio - 1) 中的“offset”值标识。当通过诸如 gpio_get_value(gpio) 之类的调用引用这些信号时,通过从 gpio 编号中减去 base 来计算偏移量。
-
for_each_hwgpio¶
for_each_hwgpio (_chip, _i, _label)
遍历给定芯片的所有 GPIO。
参数
_chip
要遍历的芯片。
_i
循环计数器。
_label
如果请求了 GPIO,则用于存储标签地址的位置。对于未使用的 GPIO,设置为 NULL。
-
for_each_requested_gpio_in_range¶
for_each_requested_gpio_in_range (_chip, _i, _base, _size, _label)
遍历给定范围内的请求的 GPIO
参数
_chip
要查询的芯片
_i
循环变量
_base
范围内的第一个 GPIO
_size
从 base 开始检查的 GPIO 数量
_label
当前 GPIO 的标签
-
gpiochip_add_data¶
gpiochip_add_data (gc, data)
注册 gpio_chip
参数
gc
要注册的芯片,其中 gc->base 已初始化
data
与此芯片关联的驱动程序私有数据
上下文
可能在 irq 工作之前
描述
当在启动期间很早调用 gpiochip_add_data()
时,以便可以自由使用 GPIO,gc->父设备必须在 GPIO 框架的 arch_initcall() 之前注册。 否则,GPIO 的 sysfs 初始化将粗暴地失败。
gpiochip_add_data()
只能在 gpiolib 初始化之后调用,即在 core_initcall() 之后。
如果 gc->base 为负数,则请求动态分配有效 GPIO 范围。
返回
如果无法注册芯片,则返回负的 errno,例如因为 gc->base 无效或已与另一个芯片关联。否则,它将返回零作为成功代码。
-
struct gpio_pin_range¶
由 gpio 芯片控制的引脚范围
定义:
struct gpio_pin_range {
struct list_head node;
struct pinctrl_dev *pctldev;
struct pinctrl_gpio_range range;
};
成员
node
用于维护引脚范围集的列表,内部使用
pctldev
处理相应引脚的 pinctrl 设备
range
gpio 控制器控制的引脚的实际范围
-
struct gpio_desc *gpio_to_desc(unsigned gpio)¶
将 GPIO 编号转换为其描述符
参数
unsigned gpio
全局 GPIO 编号
返回
与给定 GPIO 关联的 GPIO 描述符,如果系统中不存在具有给定编号的 GPIO,则为 NULL
。
-
struct gpio_desc *gpio_device_get_desc(struct gpio_device *gdev, unsigned int hwnum)¶
获取此 GPIO 设备的给定硬件编号对应的 GPIO 描述符
参数
struct gpio_device *gdev
从中获取描述符的 GPIO 设备
unsigned int hwnum
此芯片的 GPIO 的硬件编号
返回
指向 GPIO 描述符的指针,如果指定硬件编号的给定芯片中不存在 GPIO,则为 EINVAL
,如果底层芯片已经消失,则为 ENODEV
。
描述
struct gpio_device 的引用计数 NOT 像在请求 GPIO 用于独占使用时那样增加。调用者有责任确保 GPIO 设备及其此函数返回的描述符保持活动状态。
-
int desc_to_gpio(const struct gpio_desc *desc)¶
将 GPIO 描述符转换为整数命名空间
参数
const struct gpio_desc *desc
GPIO 描述符
描述
将来应该消失,但是由于我们仍然将 GPIO 编号用于错误消息和 sysfs 节点,因此是必需的。
返回
由其描述符指定的 GPIO 的全局 GPIO 编号。
参数
const struct gpio_desc *desc
用于返回芯片的描述符
描述
已弃用 此函数不安全,不应使用。在不获取 SRCU 读取锁的情况下使用芯片地址可能会导致解引用悬空指针。
返回
支持此设备的 GPIO 芯片的地址。
-
struct gpio_device *gpiod_to_gpio_device(struct gpio_desc *desc)¶
返回此描述符所属的 GPIO 设备。
参数
struct gpio_desc *desc
要为其返回 GPIO 设备的描述符。
描述
此操作不会增加 GPIO 设备的引用计数,因为期望描述符已被请求,并且用户已经持有对该设备的引用。
返回
拥有此描述符的 GPIO 设备的地址。
-
int gpio_device_get_base(struct gpio_device *gdev)¶
获取此设备分配的基 GPIO 编号
参数
struct gpio_device *gdev
GPIO 设备
返回
此设备在全局 GPIO 编号空间中的第一个 GPIO 编号。
-
const char *gpio_device_get_label(struct gpio_device *gdev)¶
获取此 GPIO 设备的标签
参数
struct gpio_device *gdev
GPIO 设备
返回
指向包含 GPIO 设备标签的字符串的指针。字符串的生命周期与底层 GPIO 设备的生命周期相关。
参数
struct gpio_device *gdev
GPIO 设备
返回
支持此设备的 GPIO 芯片的地址。
描述
已弃用 在我们可以摆脱所有非驱动程序用户 struct gpio_chip
之前,我们必须提供一种从 struct gpio_device 中检索其指针的方法。这是不安全的,因为 GPIO API 被认为是热插拔的,并且芯片可能随时消失(与引用计数的 struct gpio_device 不同)。
使用风险自负。
-
int gpiod_get_direction(struct gpio_desc *desc)¶
返回 GPIO 的当前方向
参数
struct gpio_desc *desc
要获取方向的 GPIO
返回
0 表示输出,1 表示输入,或者在发生错误时返回错误代码。
描述
如果 gpiod_cansleep()
为 true,则此函数可能会睡眠。
参数
struct gpio_chip *gc
GPIO 芯片
返回
芯片的每个子驱动程序数据。
参数
struct gpio_chip *gc
要取消注册的芯片
描述
无法删除仍有 GPIO 请求的 gpio_chip。
-
struct gpio_device *gpio_device_find(const void *data, int (*match)(struct gpio_chip *gc, const void *data))¶
查找特定的 GPIO 设备
参数
const void *data
要传递给匹配函数的数据
int (*match)(struct gpio_chip *gc, const void *data)
用于检查 gpio_chip 的回调函数
返回
指向 struct gpio_device 的新引用。
描述
类似于 bus_find_device()
。它返回一个由用户提供的 match 回调确定的 gpio_device 引用。如果设备不匹配,回调应返回 0,如果匹配则返回非零值。如果回调返回非零值,此函数将返回给调用者,并且不会迭代任何更多的 gpio_devices。
回调函数将 GPIO 芯片结构作为参数。在执行回调函数期间,芯片受到保护,不会被释放。TODO:实际上尚未实现。
如果函数返回非 NULL 值,则调用者必须使用 gpio_device_put()
释放返回的引用。
-
struct gpio_device *gpio_device_find_by_label(const char *label)¶
gpio_device_find()
的包装器,通过其后备芯片的标签查找 GPIO 设备
-
struct gpio_device *gpio_device_find_by_fwnode(const struct fwnode_handle *fwnode)¶
gpio_device_find()
的包装器,通过其 fwnode 查找 GPIO 设备
-
struct gpio_device *gpio_device_get(struct gpio_device *gdev)¶
增加此 GPIO 设备的引用计数
参数
struct gpio_device *gdev
要增加引用计数的 GPIO 设备
返回
指向 gdev 的指针。
-
void gpio_device_put(struct gpio_device *gdev)¶
减少此 GPIO 设备的引用计数,并可能释放与其关联的所有资源。
参数
struct gpio_device *gdev
要减少引用计数的 GPIO 设备
-
struct device *gpio_device_to_device(struct gpio_device *gdev)¶
检索底层
struct device
的地址。
参数
struct gpio_device *gdev
要返回地址的 GPIO 设备。
描述
这不会增加 GPIO 设备或底层 struct device
的引用计数。
返回
支持此 GPIO 设备的 struct device
的地址。
-
int gpiochip_irqchip_add_domain(struct gpio_chip *gc, struct irq_domain *domain)¶
向 gpiochip 添加一个 irqdomain
参数
struct gpio_chip *gc
要向其添加 irqchip 的 gpiochip
struct irq_domain *domain
要添加到 gpiochip 的 irqdomain
描述
此函数向 gpiochip 添加一个 IRQ 域。
返回
成功时返回 0,失败时返回负的 errno。
参数
struct gpio_chip *gc
拥有 GPIO 的 gpiochip
unsigned int offset
要请求 GPIO 功能的 GPIO 的偏移量
返回
成功时返回 0,失败时返回负的 errno。
参数
struct gpio_chip *gc
要为其请求 gpio 功能的 gpiochip
unsigned int offset
要从 GPIO 功能中释放的 GPIO 的偏移量
-
int gpiochip_generic_config(struct gpio_chip *gc, unsigned int offset, unsigned long config)¶
应用引脚的配置
参数
struct gpio_chip *gc
拥有 GPIO 的 gpiochip
unsigned int offset
要应用配置的 GPIO 的偏移量
unsigned long config
要应用的配置
返回
成功时返回 0,失败时返回负的 errno。
-
int gpiochip_add_pingroup_range(struct gpio_chip *gc, struct pinctrl_dev *pctldev, unsigned int gpio_offset, const char *pin_group)¶
为 GPIO <-> 引脚映射添加一个范围
参数
struct gpio_chip *gc
要添加范围的 gpiochip
struct pinctrl_dev *pctldev
要映射到的引脚控制器
unsigned int gpio_offset
当前 gpio_chip 编号空间中的起始偏移量
const char *pin_group
引脚控制器内的引脚组名称
描述
直接从设备树支持的 pinctrl 驱动程序调用此函数已弃用。请参阅 Documentation/devicetree/bindings/gpio/gpio.txt 的第 2.1 节,了解如何通过 “gpio-ranges” 属性绑定 pinctrl 和 gpio 驱动程序。
返回
成功时返回 0,失败时返回负的 errno。
-
int gpiochip_add_pin_range(struct gpio_chip *gc, const char *pinctl_name, unsigned int gpio_offset, unsigned int pin_offset, unsigned int npins)¶
为 GPIO <-> 引脚映射添加一个范围
参数
struct gpio_chip *gc
要添加范围的 gpiochip
const char *pinctl_name
要映射到的引脚控制器的
dev_name()
unsigned int gpio_offset
当前 gpio_chip 编号空间中的起始偏移量
unsigned int pin_offset
引脚控制器编号空间中的起始偏移量
unsigned int npins
要在此范围中累积的每个引脚空间(GPIO 和引脚控制器)的偏移量中的引脚数
描述
直接从设备树支持的 pinctrl 驱动程序调用此函数已弃用。请参阅 Documentation/devicetree/bindings/gpio/gpio.txt 的第 2.1 节,了解如何通过 “gpio-ranges” 属性绑定 pinctrl 和 gpio 驱动程序。
返回
成功时返回 0,失败时返回负的 errno。
参数
struct gpio_chip *gc
要删除所有映射的芯片
参数
struct gpio_chip *gc
控制此行的 GPIO 芯片。
unsigned int offset
该行的硬件偏移量。
返回
如果已请求该行,则指向使用者标签副本的指针;如果未请求,则为 NULL。如果返回了有效的指针,则必须使用 kfree()
释放它。如果发生内存分配错误,则该函数返回 ENOMEM
。
描述
必须不能从原子上下文中调用。
-
struct gpio_desc *gpiochip_request_own_desc(struct gpio_chip *gc, unsigned int hwnum, const char *label, enum gpio_lookup_flags lflags, enum gpiod_flags dflags)¶
允许 GPIO 芯片请求其自身的描述符
参数
struct gpio_chip *gc
GPIO 芯片
unsigned int hwnum
要请求描述符的 GPIO 的硬件编号
const char *label
GPIO 的标签
enum gpio_lookup_flags lflags
此 GPIO 的查找标志,如果使用默认值则为 0。这可用于指定诸如具有机器标志(例如 GPIO_OUT_LOW)的线路反转语义
enum gpiod_flags dflags
此 GPIO 的描述符请求标志,如果使用默认值则为 0。这可用于指定诸如开漏之类的消费者语义
描述
该函数允许 GPIO 芯片驱动程序通过 gpiolib API 请求和使用自己的 GPIO 描述符。 与 gpiod_request() 的区别在于,此函数不会增加 GPIO 芯片模块的引用计数。 这允许根据需要卸载 GPIO 芯片模块(我们假设 GPIO 芯片驱动程序处理释放它已请求的 GPIO)。
返回
指向 GPIO 描述符的指针,如果失败,则返回 ERR_PTR()
编码的负错误代码。
-
void gpiochip_free_own_desc(struct gpio_desc *desc)¶
释放芯片驱动程序请求的 GPIO
-
int gpiod_direction_input(struct gpio_desc *desc)¶
将 GPIO 方向设置为输入
参数
struct gpio_desc *desc
要设置为输入的 GPIO
描述
将传递的 GPIO 的方向设置为输入,例如,可以安全地在其上调用 gpiod_get_value()
。
返回
成功时返回 0,失败时返回负的 errno。
-
int gpiod_direction_output_raw(struct gpio_desc *desc, int value)¶
将 GPIO 方向设置为输出
参数
struct gpio_desc *desc
要设置为输出的 GPIO
int value
GPIO 的初始输出值
描述
将传递的 GPIO 的方向设置为输出,例如,可以安全地在其上调用 gpiod_set_value()
。 输出的初始值必须指定为物理线路上的原始值,而无需考虑 ACTIVE_LOW 状态。
返回
成功时返回 0,失败时返回负的 errno。
-
int gpiod_direction_output(struct gpio_desc *desc, int value)¶
将 GPIO 方向设置为输出
参数
struct gpio_desc *desc
要设置为输出的 GPIO
int value
GPIO 的初始输出值
描述
将传递的 GPIO 的方向设置为输出,例如,可以安全地在其上调用 gpiod_set_value()
。 输出的初始值必须指定为 GPIO 的逻辑值,即考虑其 ACTIVE_LOW 状态。
返回
成功时返回 0,失败时返回负的 errno。
-
int gpiod_enable_hw_timestamp_ns(struct gpio_desc *desc, unsigned long flags)¶
启用纳秒级的硬件时间戳。
参数
struct gpio_desc *desc
要启用的 GPIO。
unsigned long flags
与 GPIO 边沿相关的标志。
返回
成功时返回 0,失败时返回负的 errno。
-
int gpiod_disable_hw_timestamp_ns(struct gpio_desc *desc, unsigned long flags)¶
禁用硬件时间戳。
参数
struct gpio_desc *desc
要禁用的 GPIO。
unsigned long flags
与 GPIO 边沿相关的标志,与启用调用期间使用的值相同。
返回
成功时返回 0,失败时返回负的 errno。
-
int gpiod_set_config(struct gpio_desc *desc, unsigned long config)¶
为 GPIO 设置 config
参数
struct gpio_desc *desc
要设置配置的 GPIO 的描述符
unsigned long config
与通用引脚配置相同的打包配置格式
返回
成功时为 0,如果控制器不支持设置配置,则返回 -ENOTSUPP
。
-
int gpiod_set_debounce(struct gpio_desc *desc, unsigned int debounce)¶
为 GPIO 设置 debounce 时间
参数
struct gpio_desc *desc
要设置防抖时间的 GPIO 的描述符
unsigned int debounce
以微秒为单位的防抖时间
返回
成功时为 0,如果控制器不支持设置防抖时间,则返回 -ENOTSUPP
。
-
int gpiod_is_active_low(const struct gpio_desc *desc)¶
测试 GPIO 是否为低电平有效
参数
const struct gpio_desc *desc
要测试的 gpio 描述符
返回
如果 GPIO 为低电平有效,则为 1,否则为 0。
-
void gpiod_toggle_active_low(struct gpio_desc *desc)¶
切换 GPIO 是否为低电平有效
参数
struct gpio_desc *desc
要更改的 gpio 描述符
-
int gpiod_get_raw_value(const struct gpio_desc *desc)¶
返回 gpio 的原始值
参数
const struct gpio_desc *desc
要返回其值的 gpio
返回
GPIO 的原始值,即物理线路的值,不考虑其 ACTIVE_LOW 状态,或者如果失败,则返回负的 errno。
描述
此函数可以从我们无法休眠的上下文中调用,如果 GPIO 芯片函数可能休眠,则会报错。
-
int gpiod_get_value(const struct gpio_desc *desc)¶
返回 gpio 的值
参数
const struct gpio_desc *desc
要返回其值的 gpio
返回
GPIO 的逻辑值,即考虑 ACTIVE_LOW 状态,如果失败,则返回负的 errno。
描述
此函数可以从我们无法休眠的上下文中调用,如果 GPIO 芯片函数可能休眠,则会报错。
-
int gpiod_get_raw_array_value(unsigned int array_size, struct gpio_desc **desc_array, struct gpio_array *array_info, unsigned long *value_bitmap)¶
从 GPIO 数组中读取原始值
参数
unsigned int array_size
描述符数组/值位图中的元素数量
struct gpio_desc **desc_array
将要读取值的 GPIO 描述符数组
struct gpio_array *array_info
关于快速位图处理路径适用性的信息
unsigned long *value_bitmap
用于存储读取的值的位图
描述
读取 GPIO 的原始值,即物理线路的值,不考虑其 ACTIVE_LOW 状态。
此函数可以在我们无法休眠的上下文中调用,如果 GPIO 芯片函数可能休眠,它会报错。
返回
成功时返回 0,失败时返回负的 errno。
-
int gpiod_get_array_value(unsigned int array_size, struct gpio_desc **desc_array, struct gpio_array *array_info, unsigned long *value_bitmap)¶
从 GPIO 数组中读取值
参数
unsigned int array_size
描述符数组/值位图中的元素数量
struct gpio_desc **desc_array
将要读取值的 GPIO 描述符数组
struct gpio_array *array_info
关于快速位图处理路径适用性的信息
unsigned long *value_bitmap
用于存储读取的值的位图
描述
读取 GPIO 的逻辑值,即考虑它们的 ACTIVE_LOW 状态。
此函数可以在我们无法休眠的上下文中调用,如果 GPIO 芯片函数可能休眠,它会报错。
返回
成功时返回 0,失败时返回负的 errno。
-
void gpiod_set_raw_value(struct gpio_desc *desc, int value)¶
分配一个 GPIO 的原始值
参数
struct gpio_desc *desc
将要分配值的 GPIO
int value
要分配的值
描述
设置 GPIO 的原始值,即其物理线路的值,不考虑其 ACTIVE_LOW 状态。
此函数可以从我们无法休眠的上下文中调用,如果 GPIO 芯片函数可能休眠,则会报错。
-
void gpiod_set_value(struct gpio_desc *desc, int value)¶
分配一个 GPIO 的值
参数
struct gpio_desc *desc
将要分配值的 GPIO
int value
要分配的值
描述
设置 GPIO 的逻辑值,即考虑其 ACTIVE_LOW、OPEN_DRAIN 和 OPEN_SOURCE 标志。
此函数可以从我们无法休眠的上下文中调用,如果 GPIO 芯片函数可能休眠,则会报错。
-
int gpiod_set_raw_array_value(unsigned int array_size, struct gpio_desc **desc_array, struct gpio_array *array_info, unsigned long *value_bitmap)¶
为 GPIO 数组分配值
参数
unsigned int array_size
描述符数组/值位图中的元素数量
struct gpio_desc **desc_array
将要分配值的 GPIO 描述符数组
struct gpio_array *array_info
关于快速位图处理路径适用性的信息
unsigned long *value_bitmap
要分配的值的位图
描述
设置 GPIO 的原始值,即物理线路的值,不考虑其 ACTIVE_LOW 状态。
此函数可以从我们无法休眠的上下文中调用,如果 GPIO 芯片函数可能休眠,则会报错。
返回
成功时返回 0,失败时返回负的 errno。
-
int gpiod_set_array_value(unsigned int array_size, struct gpio_desc **desc_array, struct gpio_array *array_info, unsigned long *value_bitmap)¶
为 GPIO 数组分配值
参数
unsigned int array_size
描述符数组/值位图中的元素数量
struct gpio_desc **desc_array
将要分配值的 GPIO 描述符数组
struct gpio_array *array_info
关于快速位图处理路径适用性的信息
unsigned long *value_bitmap
要分配的值的位图
描述
设置 GPIO 的逻辑值,即考虑它们的 ACTIVE_LOW 状态。
此函数可以从我们无法休眠的上下文中调用,如果 GPIO 芯片函数可能休眠,则会报错。
返回
成功时返回 0,失败时返回负的 errno。
-
int gpiod_cansleep(const struct gpio_desc *desc)¶
报告 GPIO 值访问是否可能休眠
参数
const struct gpio_desc *desc
要检查的 GPIO
返回
对于不可休眠的返回 0,对于可休眠的返回 1,如果发生错误,则返回错误代码。
-
int gpiod_set_consumer_name(struct gpio_desc *desc, const char *name)¶
设置描述符的使用者名称
参数
struct gpio_desc *desc
要在其上设置使用者名称的 GPIO
const char *name
新的使用者名称
返回
成功时返回 0,失败时返回负的 errno。
-
int gpiod_to_irq(const struct gpio_desc *desc)¶
返回与 GPIO 对应的 IRQ
参数
const struct gpio_desc *desc
将返回其 IRQ 的 GPIO(已请求)
返回
与传入的 GPIO 对应的 IRQ,如果发生错误,则返回错误代码。
参数
struct gpio_chip *gc
要锁定的 GPIO 所属的芯片
unsigned int offset
要锁定为 IRQ 的 GPIO 的偏移量
描述
这由希望锁定某些 GPIO 线用于 IRQ 的 GPIO 驱动程序直接使用。
返回
成功时返回 0,失败时返回负的 errno。
参数
struct gpio_chip *gc
要锁定的 GPIO 所属的芯片
unsigned int offset
要锁定为 IRQ 的 GPIO 的偏移量
描述
这由希望指示某些 GPIO 不再专门用于 IRQ 的 GPIO 驱动程序直接使用。
-
int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc)¶
返回 gpio 的原始值
参数
const struct gpio_desc *desc
要返回其值的 gpio
返回
GPIO 的原始值,即物理线路的值,不考虑其 ACTIVE_LOW 状态,或者如果失败,则返回负的 errno。
描述
此函数应从可以休眠的上下文中调用。
-
int gpiod_get_value_cansleep(const struct gpio_desc *desc)¶
返回 gpio 的值
参数
const struct gpio_desc *desc
要返回其值的 gpio
返回
GPIO 的逻辑值,即考虑 ACTIVE_LOW 状态,如果失败,则返回负的 errno。
描述
此函数应从可以休眠的上下文中调用。
-
int gpiod_get_raw_array_value_cansleep(unsigned int array_size, struct gpio_desc **desc_array, struct gpio_array *array_info, unsigned long *value_bitmap)¶
从 GPIO 数组中读取原始值
参数
unsigned int array_size
描述符数组/值位图中的元素数量
struct gpio_desc **desc_array
将要读取值的 GPIO 描述符数组
struct gpio_array *array_info
关于快速位图处理路径适用性的信息
unsigned long *value_bitmap
用于存储读取的值的位图
描述
读取 GPIO 的原始值,即物理线路的值,不考虑其 ACTIVE_LOW 状态。
此函数应从可以休眠的上下文中调用。
返回
成功时返回 0,失败时返回负的 errno。
-
int gpiod_get_array_value_cansleep(unsigned int array_size, struct gpio_desc **desc_array, struct gpio_array *array_info, unsigned long *value_bitmap)¶
从 GPIO 数组中读取值
参数
unsigned int array_size
描述符数组/值位图中的元素数量
struct gpio_desc **desc_array
将要读取值的 GPIO 描述符数组
struct gpio_array *array_info
关于快速位图处理路径适用性的信息
unsigned long *value_bitmap
用于存储读取的值的位图
描述
读取 GPIO 的逻辑值,即考虑它们的 ACTIVE_LOW 状态。
此函数应从可以休眠的上下文中调用。
返回
成功时返回 0,失败时返回负的 errno。
-
void gpiod_set_raw_value_cansleep(struct gpio_desc *desc, int value)¶
分配一个 GPIO 的原始值
参数
struct gpio_desc *desc
将要分配值的 GPIO
int value
要分配的值
描述
设置 GPIO 的原始值,即其物理线路的值,不考虑其 ACTIVE_LOW 状态。
此函数应从可以休眠的上下文中调用。
-
void gpiod_set_value_cansleep(struct gpio_desc *desc, int value)¶
分配一个 GPIO 的值
参数
struct gpio_desc *desc
将要分配值的 GPIO
int value
要分配的值
描述
设置 GPIO 的逻辑值,即考虑其 ACTIVE_LOW 状态。
此函数应从可以休眠的上下文中调用。
-
int gpiod_set_raw_array_value_cansleep(unsigned int array_size, struct gpio_desc **desc_array, struct gpio_array *array_info, unsigned long *value_bitmap)¶
为 GPIO 数组分配值
参数
unsigned int array_size
描述符数组/值位图中的元素数量
struct gpio_desc **desc_array
将要分配值的 GPIO 描述符数组
struct gpio_array *array_info
关于快速位图处理路径适用性的信息
unsigned long *value_bitmap
要分配的值的位图
描述
设置 GPIO 的原始值,即物理线路的值,不考虑其 ACTIVE_LOW 状态。
此函数应从可以休眠的上下文中调用。
返回
成功时返回 0,失败时返回负的 errno。
-
int gpiod_set_array_value_cansleep(unsigned int array_size, struct gpio_desc **desc_array, struct gpio_array *array_info, unsigned long *value_bitmap)¶
为 GPIO 数组分配值
参数
unsigned int array_size
描述符数组/值位图中的元素数量
struct gpio_desc **desc_array
将要分配值的 GPIO 描述符数组
struct gpio_array *array_info
关于快速位图处理路径适用性的信息
unsigned long *value_bitmap
要分配的值的位图
描述
设置 GPIO 的逻辑值,即考虑它们的 ACTIVE_LOW 状态。
此函数应从可以休眠的上下文中调用。
返回
成功时返回 0,失败时返回负的 errno。
-
void gpiod_add_lookup_table(struct gpiod_lookup_table *table)¶
注册 GPIO 设备使用者。
参数
struct gpiod_lookup_table *table
要注册的使用者表。
-
void gpiod_remove_lookup_table(struct gpiod_lookup_table *table)¶
取消注册 GPIO 设备使用者。
参数
struct gpiod_lookup_table *table
要取消注册的使用者表。
-
void gpiod_add_hogs(struct gpiod_hog *hogs)¶
从机器代码注册一组 GPIO hogs。
参数
struct gpiod_hog *hogs
gpio hog 条目表,末尾带有一个置零的哨兵。
-
struct gpio_desc *fwnode_gpiod_get_index(struct fwnode_handle *fwnode, const char *con_id, int index, enum gpiod_flags flags, const char *label)¶
从固件节点获取 GPIO。
参数
struct fwnode_handle *fwnode
固件节点的句柄。
const char *con_id
GPIO 使用者内的函数。
int index
要为使用者获取的 GPIO 的索引。
enum gpiod_flags flags
GPIO 初始化标志。
const char *label
要附加到请求的 GPIO 的标签。
描述
此函数可用于从不透明固件获取配置的驱动程序。
该函数使用任何底层固件接口正确找到对应的 GPIO,然后确保在将 GPIO 描述符返回给调用者之前已请求该描述符。
如果发生错误,则返回 ERR_PTR()
。
返回
成功请求后,将根据提供的 flags 配置 GPIO 引脚。
参数
struct device *dev
GPIO 使用者,对于系统全局 GPIO 可以为 NULL。
const char *con_id
GPIO 使用者内的函数。
返回
与设备/函数关联的 GPIO 数量,如果未将任何 GPIO 分配给请求的函数,则为 -ENOENT。
-
struct gpio_desc *gpiod_get(struct device *dev, const char *con_id, enum gpiod_flags flags)¶
为给定的 GPIO 函数获取 GPIO。
参数
struct device *dev
GPIO 使用者,对于系统全局 GPIO 可以为 NULL。
const char *con_id
GPIO 使用者内的函数。
enum gpiod_flags flags
可选的 GPIO 初始化标志。
返回
与设备 dev 的函数 con_id 对应的 GPIO 描述符,如果未将任何 GPIO 分配给请求的函数,则为 -ENOENT,如果在尝试获取 GPIO 时发生错误,则为另一个 IS_ERR()
代码。
-
struct gpio_desc *gpiod_get_optional(struct device *dev, const char *con_id, enum gpiod_flags flags)¶
获取给定 GPIO 功能的可选 GPIO
参数
struct device *dev
GPIO 使用者,对于系统全局 GPIO 可以为 NULL。
const char *con_id
GPIO 使用者内的函数。
enum gpiod_flags flags
可选的 GPIO 初始化标志。
描述
这等效于 gpiod_get()
,不同之处在于,当没有为请求的功能分配 GPIO 时,它将返回 NULL。 这对于需要处理可选 GPIO 的驱动程序来说很方便。
返回
与设备 dev 的函数 con_id 对应的 GPIO 描述符,如果没有为请求的函数分配 GPIO,则为 NULL;如果在尝试获取 GPIO 时发生错误,则为另一个 IS_ERR()
代码。
-
struct gpio_desc *gpiod_get_index(struct device *dev, const char *con_id, unsigned int idx, enum gpiod_flags flags)¶
从多索引 GPIO 函数获取 GPIO
参数
struct device *dev
GPIO 使用者,对于系统全局 GPIO 可以为 NULL。
const char *con_id
GPIO 使用者内的函数。
unsigned int idx
要获取的 GPIO 在使用者中的索引
enum gpiod_flags flags
可选的 GPIO 初始化标志。
描述
此 gpiod_get()
的变体允许访问为定义多个 GPIO 的函数定义的第一个 GPIO 以外的 GPIO。
返回
有效的 GPIO 描述符,如果未为请求的函数和/或索引分配 GPIO,则为 -ENOENT;如果在尝试获取 GPIO 时发生错误,则为另一个 IS_ERR()
代码。
-
struct gpio_desc *gpiod_get_index_optional(struct device *dev, const char *con_id, unsigned int index, enum gpiod_flags flags)¶
从多索引 GPIO 函数获取可选 GPIO
参数
struct device *dev
GPIO 使用者,对于系统全局 GPIO 可以为 NULL。
const char *con_id
GPIO 使用者内的函数。
unsigned int index
要获取的 GPIO 在使用者中的索引
enum gpiod_flags flags
可选的 GPIO 初始化标志。
描述
这等效于 gpiod_get_index()
,不同之处在于,当没有为请求的功能分配具有指定索引的 GPIO 时,它将返回 NULL。 这对于需要处理可选 GPIO 的驱动程序来说很方便。
返回
有效的 GPIO 描述符,如果未为请求的函数和/或索引分配 GPIO,则为 NULL;如果在尝试获取 GPIO 时发生错误,则为另一个 IS_ERR()
代码。
-
struct gpio_descs *gpiod_get_array(struct device *dev, const char *con_id, enum gpiod_flags flags)¶
从多索引 GPIO 函数获取多个 GPIO
参数
struct device *dev
GPIO 使用者,对于系统全局 GPIO 可以为 NULL。
const char *con_id
GPIO 使用者内的函数。
enum gpiod_flags flags
可选的 GPIO 初始化标志。
描述
此函数获取在给定函数下定义的所有 GPIO。
返回
与设备 dev 的函数 con_id 对应的 GPIO 描述符,如果未为请求的函数分配 GPIO,则为 -ENOENT;如果在尝试获取 GPIO 时发生错误,则为另一个 IS_ERR()
代码。
-
struct gpio_descs *gpiod_get_array_optional(struct device *dev, const char *con_id, enum gpiod_flags flags)¶
从多索引 GPIO 函数获取多个 GPIO
参数
struct device *dev
GPIO 使用者,对于系统全局 GPIO 可以为 NULL。
const char *con_id
GPIO 使用者内的函数。
enum gpiod_flags flags
可选的 GPIO 初始化标志。
描述
这等效于 gpiod_get_array()
,不同之处在于,当没有为请求的函数分配 GPIO 时,它将返回 NULL。
返回
与设备 dev 的函数 con_id 对应的 GPIO 描述符,如果没有为请求的函数分配 GPIO,则为 NULL;如果在尝试获取 GPIO 时发生错误,则为另一个 IS_ERR()
代码。
-
void gpiod_put(struct gpio_desc *desc)¶
释放 GPIO 描述符
-
void gpiod_put_array(struct gpio_descs *descs)¶
释放多个 GPIO 描述符
参数
struct gpio_descs *descs
包含描述符数组的 struct gpio_descs
ACPI 支持¶
-
bool acpi_gpio_get_io_resource(struct acpi_resource *ares, struct acpi_resource_gpio **agpio)¶
如果 ACPI 资源是 GPIO I/O 资源,则获取其详细信息,否则返回 False。
参数
struct acpi_resource *ares
指向要获取的 ACPI 资源的指针
struct acpi_resource_gpio **agpio
指向
struct acpi_resource_gpio
的指针,用于存储输出指针
返回
如果找到 GpioIo 资源,则为 true
,否则为 false
。
参数
struct gpio_chip *chip
GPIO 芯片
描述
ACPI5 平台可以使用 GPIO 信号的 ACPI 事件。这些 GPIO 中断由 ACPI 事件方法处理,这些方法需要从 GPIO 芯片的中断处理程序中调用。acpi_gpiochip_request_interrupts()
找出哪些 GPIO 引脚具有 ACPI 事件方法,并为这些引脚分配调用 ACPI 事件方法的中断处理程序。
参数
struct gpio_chip *chip
GPIO 芯片
描述
释放与给定 GPIO 芯片的 GPIO ACPI 事件方法关联的中断。
-
int acpi_dev_gpio_irq_wake_get_by(struct acpi_device *adev, const char *con_id, int index, bool *wake_capable)¶
查找 GpioInt 并将其转换为 Linux IRQ 号
参数
struct acpi_device *adev
指向从中获取 IRQ 的 ACPI 设备的指针
const char *con_id
GpioInt 资源的可选名称
int index
GpioInt 资源的索引(从
0
开始)bool *wake_capable
如果 IRQ 具有唤醒功能,则设置为 true
描述
如果设备有一个或多个 GpioInt 资源,则可以使用此函数将资源中的 GPIO 偏移量转换为 Linux IRQ 号。
该函数是幂等的,尽管每次运行它都会根据 GpioInt 资源中的标志配置 GPIO 引脚方向。
该函数采用可选的 con_id 参数。如果资源在属性中具有 con_id,则只会考虑这些资源。
如果 GpioInt 资源指定 SharedAndWake 或 ExclusiveAndWake,则认为 GPIO 具有唤醒功能。
返回
成功时为 Linux IRQ 号(> 0),失败时为负 errno。
设备树支持¶
-
int of_get_named_gpio(const struct device_node *np, const char *propname, int index)¶
获取要与 GPIO API 一起使用的 GPIO 编号
参数
const struct device_node *np
从中获取 GPIO 的设备节点
const char *propname
包含 gpio 说明符的属性的名称
int index
GPIO 的索引
描述
已弃用 此函数已弃用,不得在新代码中使用。
返回
要与 Linux 通用 GPIO API 一起使用的 GPIO 编号,或错误条件下的 errno 值之一。
-
int of_mm_gpiochip_add_data(struct device_node *np, struct of_mm_gpio_chip *mm_gc, void *data)¶
添加内存映射的 GPIO 芯片(库)
参数
struct device_node *np
GPIO 芯片的设备节点
struct of_mm_gpio_chip *mm_gc
指向已分配的 of_mm_gpio_chip 结构的指针
void *data
要存储在
struct gpio_chip
中的驱动程序数据
描述
要使用此函数,您应该分配 mm_gc 并使用以下内容填充它
在 gpio_chip 结构中: - 所有回调 - of_gpio_n_cells - of_xlate 回调(可选)
在 of_mm_gpio_chip 结构中: - save_regs 回调(可选)
如果成功,此函数将映射库的内存并为您完成所有必要的工作。然后,您可以使用 .regs 从回调中管理 GPIO。
返回
成功时返回 0,失败时返回负的 errno。
-
void of_mm_gpiochip_remove(struct of_mm_gpio_chip *mm_gc)¶
移除内存映射的 GPIO 芯片(库)
参数
struct of_mm_gpio_chip *mm_gc
指向已分配的 of_mm_gpio_chip 结构的指针
设备管理 API¶
-
struct gpio_desc *devm_gpiod_get(struct device *dev, const char *con_id, enum gpiod_flags flags)¶
资源管理的
gpiod_get()
参数
struct device *dev
GPIO 使用者
const char *con_id
GPIO 使用者内的函数。
enum gpiod_flags flags
可选的 GPIO 初始化标志。
描述
托管的 gpiod_get()
。从此函数返回的 GPIO 描述符会在驱动程序分离时自动释放。有关行为和返回值的详细信息,请参阅 gpiod_get()
。
返回
与设备 dev 的函数 con_id 对应的 GPIO 描述符,如果未将 GPIO 分配给请求的函数,则为 -ENOENT
,如果在尝试获取 GPIO 时发生错误,则为另一个 IS_ERR()
代码。
-
struct gpio_desc *devm_gpiod_get_optional(struct device *dev, const char *con_id, enum gpiod_flags flags)¶
资源管理的
gpiod_get_optional()
参数
struct device *dev
GPIO 使用者
const char *con_id
GPIO 使用者内的函数。
enum gpiod_flags flags
可选的 GPIO 初始化标志。
描述
托管的 gpiod_get_optional()
。从此函数返回的 GPIO 描述符会在驱动程序分离时自动释放。有关行为和返回值的详细信息,请参阅 gpiod_get_optional()
。
返回
与设备 dev 的函数 con_id 对应的 GPIO 描述符,如果没有为请求的函数分配 GPIO,则为 NULL;如果在尝试获取 GPIO 时发生错误,则为另一个 IS_ERR()
代码。
-
struct gpio_desc *devm_gpiod_get_index(struct device *dev, const char *con_id, unsigned int idx, enum gpiod_flags flags)¶
资源管理的
gpiod_get_index()
参数
struct device *dev
GPIO 使用者
const char *con_id
GPIO 使用者内的函数。
unsigned int idx
要获取的 GPIO 在使用者中的索引
enum gpiod_flags flags
可选的 GPIO 初始化标志。
描述
管理式 gpiod_get_index()
。从此函数返回的 GPIO 描述符会在驱动程序分离时自动释放。有关行为和返回值的详细信息,请参阅 gpiod_get_index()
。
返回
与设备 dev 的函数 con_id 对应的 GPIO 描述符,如果未将 GPIO 分配给请求的函数,则为 -ENOENT
,如果在尝试获取 GPIO 时发生错误,则为另一个 IS_ERR()
代码。
-
struct gpio_desc *devm_fwnode_gpiod_get_index(struct device *dev, struct fwnode_handle *fwnode, const char *con_id, int index, enum gpiod_flags flags, const char *label)¶
从给定的节点获取 GPIO 描述符
参数
struct device *dev
GPIO 使用者
struct fwnode_handle *fwnode
包含 GPIO 引用的固件节点
const char *con_id
GPIO 使用者内的函数。
int index
要获取的 GPIO 在使用者中的索引
enum gpiod_flags flags
GPIO 初始化标志。
const char *label
要附加到请求的 GPIO 的标签。
描述
从此函数返回的 GPIO 描述符会在驱动程序分离时自动释放。
返回
与设备 dev 的函数 con_id 对应的 GPIO 描述符,如果未将 GPIO 分配给请求的函数,则为 -ENOENT
,如果在尝试获取 GPIO 时发生错误,则为另一个 IS_ERR()
代码。
-
struct gpio_desc *devm_gpiod_get_index_optional(struct device *dev, const char *con_id, unsigned int index, enum gpiod_flags flags)¶
参数
struct device *dev
GPIO 使用者
const char *con_id
GPIO 使用者内的函数。
unsigned int index
要获取的 GPIO 在使用者中的索引
enum gpiod_flags flags
可选的 GPIO 初始化标志。
描述
管理式 gpiod_get_index_optional()
。从此函数返回的 GPIO 描述符会在驱动程序分离时自动释放。有关行为和返回值的详细信息,请参阅 gpiod_get_index_optional()
。
返回
与设备 dev 的函数 con_id 对应的 GPIO 描述符,如果没有为请求的函数分配 GPIO,则为 NULL
;如果在尝试获取 GPIO 时发生错误,则为另一个 IS_ERR()
代码。
-
struct gpio_descs *devm_gpiod_get_array(struct device *dev, const char *con_id, enum gpiod_flags flags)¶
资源管理的
gpiod_get_array()
参数
struct device *dev
GPIO 使用者
const char *con_id
GPIO 使用者内的函数。
enum gpiod_flags flags
可选的 GPIO 初始化标志。
描述
管理式 gpiod_get_array()
。从此函数返回的 GPIO 描述符会在驱动程序分离时自动释放。有关行为和返回值的详细信息,请参阅 gpiod_get_array()
。
返回
与设备 dev 的函数 con_id 对应的 GPIO 描述符,如果没有为请求的函数分配 GPIO,则为 -ENOENT
;如果在尝试获取 GPIO 时发生错误,则为另一个 IS_ERR()
代码。
-
struct gpio_descs *devm_gpiod_get_array_optional(struct device *dev, const char *con_id, enum gpiod_flags flags)¶
参数
struct device *dev
GPIO 使用者
const char *con_id
GPIO 使用者内的函数。
enum gpiod_flags flags
可选的 GPIO 初始化标志。
描述
管理式 gpiod_get_array_optional()
。从此函数返回的 GPIO 描述符会在驱动程序分离时自动释放。有关行为和返回值的详细信息,请参阅 gpiod_get_array_optional()
。
返回
与设备 dev 的函数 con_id 对应的 GPIO 描述符,如果没有为请求的函数分配 GPIO,则为 NULL
;如果在尝试获取 GPIO 时发生错误,则为另一个 IS_ERR()
代码。
-
void devm_gpiod_put(struct device *dev, struct gpio_desc *desc)¶
资源管理的
gpiod_put()
参数
struct device *dev
GPIO 使用者
struct gpio_desc *desc
要释放的 GPIO 描述符
描述
释放使用 devm_gpiod_get()
或 devm_gpiod_get_index()
获取的 GPIO 描述符。通常不会调用此函数,因为 GPIO 将由资源管理代码释放。
参数
struct device *dev
GPIO 使用者
struct gpio_desc *desc
要从中删除资源管理的 GPIO 描述符
描述
从 GPIO 描述符中删除资源管理。当您想要将描述符的生命周期管理移交给另一个机制时,需要这样做。
-
void devm_gpiod_put_array(struct device *dev, struct gpio_descs *descs)¶
资源管理的
gpiod_put_array()
参数
struct device *dev
GPIO 使用者
struct gpio_descs *descs
要释放的 GPIO 描述符数组
描述
释放使用 devm_gpiod_get_array()
获取的 GPIO 描述符数组。通常不会调用此函数,因为 GPIO 将由资源管理代码释放。
-
int devm_gpiochip_add_data_with_key(struct device *dev, struct gpio_chip *gc, void *data, struct lock_class_key *lock_key, struct lock_class_key *request_key)¶
资源管理型 gpiochip_add_data_with_key()
参数
struct device *dev
gpio_chip 所属的设备指针。
struct gpio_chip *gc
要注册的 GPIO 芯片。
void *data
与此芯片关联的驱动程序私有数据
struct lock_class_key *lock_key
用于 IRQ 锁的 lockdep 类。
struct lock_class_key *request_key
用于 IRQ 请求的 lockdep 类。
上下文
可能在 irq 工作之前
描述
当设备解除绑定时,GPIO 芯片将自动释放。
返回
如果无法注册芯片,则返回负的 errno,例如因为 gc->base 无效或已与另一个芯片关联。否则,它将返回零作为成功代码。
sysfs 辅助函数¶
-
int gpiod_export(struct gpio_desc *desc, bool direction_may_change)¶
通过 sysfs 导出 GPIO
参数
struct gpio_desc *desc
要使其可用的 GPIO,已请求。
bool direction_may_change
如果用户空间可以更改 GPIO 方向,则为 true。
上下文
arch_initcall 或更高版本。
描述
当驱动程序希望在请求 GPIO 后使其对用户空间可访问时(可能是在调试期间,或作为其公共接口的一部分),他们可以使用此例程。 如果 GPIO 可以更改方向(有些不能)并且调用者允许,用户空间将看到可用于更改 gpio 方向的“direction” sysfs 属性。“value”属性将始终提供。
返回
成功时返回 0,失败时返回负的 errno。
-
int gpiod_export_link(struct device *dev, const char *name, struct gpio_desc *desc)¶
创建指向导出的 GPIO 节点的 sysfs 链接。
参数
struct device *dev
在其下创建符号链接的设备。
const char *name
符号链接的名称。
struct gpio_desc *desc
要创建符号链接的 GPIO,已导出。
描述
从 /sys/.../dev/name 设置一个符号链接到 /sys/class/gpio/gpioN 节点。调用者负责取消链接。
返回
成功时返回 0,失败时返回负的 errno。
-
void gpiod_unexport(struct gpio_desc *desc)¶
gpiod_export()
的相反效果。
参数
struct gpio_desc *desc
要使其不可用的 GPIO。
描述
这是 gpiod_free() 的隐式操作。