inux中 GPIO 相关操作函数 (GPIOd)

inux中 GPIO 相关操作函数 (GPIOd)

gpiod_get

struct gpio_desc *gpiod_get(struct device *dev, const char *con_id, enum gpiod_flags flags);

举例

设备树
sr04 {
    compatible = "mycompany,sr04";
    trig-gpios = <&gpio1 3 GPIO_ACTIVE_HIGH>;
    echo-gpios = <&gpio1 4 GPIO_ACTIVE_HIGH>;
};

在设备树中,*-gpios 中的 * 代表的是你定义的 GPIO 名字(label)。这个名字可以是任何你指定的有意义的字符串,用于标识特定的 GPIO。
上面的例子中 trig,echo就是名字

static struct gpio_desc *sr04_trig;
static struct gpio_desc *sr04_echo ;

sr04_trig = gpiod_get(&pdev->dev, "trig", GPIOD_OUT_LOW);
sr04_echo = gpiod_get(&pdev->dev, "echo", GPIOD_IN);

第三个参数有以下区别

GPIOD_OUT_LOW:如果 GPIO 是输出模式,这个标志表示在获取 GPIO 时将其设置为低电平(0)。

GPIOD_OUT_HIGH:如果 GPIO 是输出模式,这个标志表示在获取 GPIO 时将其设置为高电平(1)。

GPIOD_IN:如果 GPIO 是输入模式,这个标志表示在获取 GPIO 时将其配置为输入。

GPIOD_ASIS:保持 GPIO 的当前状态,不做任何配置。

gpiod_to_irq

用于将 GPIO 描述符 (struct gpio_desc) 转换为对应的 IRQ (中断请求) 号。这个函数常用于需要将 GPIO 配置为触发中断的场景。

int gpiod_to_irq(const struct gpio_desc *desc);

成功时,返回一个正数,即对应的 IRQ 号。
如果失败,返回一个负数的错误码。常见错误码包括:
-EINVAL:表示无效的参数,通常是因为传入的 desc 无效或没有对应的 IRQ。
-ENOSYS:表示该 GPIO 控制器不支持 IRQ
举例

int irq_num = gpiod_to_irq(sr04_echo)

request_irq

用于注册一个中断处理程序(ISR, Interrupt Service Routine),以便处理特定的中断请求 (IRQ)。当对应的硬件中断发生时,内核会调用注册的处理程序。

int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev);

参数解释

参数解释
irq: 中断号。
handler: 中断函数
irqreturn_t handler(int irq, void *dev_id);
dev_id: 传递给 request_irq 的 dev 参数。通常用于区分同一个 IRQ 号上多个设备的中断处理。
中断处理程序的返回值可以是:
	IRQ_NONE: 表示中断没有被处理。
	IRQ_HANDLED: 表示中断已被正确处理。
	IRQ_WAKE_THREAD: 表示中断处理需要唤醒一个内核线程进行后续处理。
flags (unsigned long):
	控制中断行为的标志位。常见的标志包括:
	IRQF_SHARED: 表示该中断可以与其他设备共享。
	IRQF_TRIGGER_RISING: 在上升沿触发中断。
	IRQF_TRIGGER_FALLING: 在下降沿触发中断。
	IRQF_TRIGGER_HIGH: 高电平触发中断。
	IRQF_TRIGGER_LOW: 低电平触发中断。
	IRQF_ONESHOT: 仅触发一次中断,并且中断处理程序被设置为一次性执行。
name (const char *):
	中断处理程序的名字,通常用于调试或 /proc/interrupts 文件中显示。
dev (void *):
	一个指向设备的指针,通常用作区分共享中断的多个设备。可以是设备结构体或设备数据的指针。在共享中断时,内核会使用这个指针来区分不同设备的中断处理程序。
	handler

返回值

成功时: 返回 0。
失败时: 返回负数的错误码,常见错误码包括:
-EBUSY: 该 IRQ 已经被其他设备独占。
-EINVAL: 参数无效。

free_irq

释放先前通过 request_irq 申请的中断资源。这个函数确保在模块或驱动程序卸载时,正确地释放中断资源,避免资源泄露或其他问题。

void free_irq(unsigned int irq, void *dev_id);

参数解释
irq (unsigned int):
要释放的中断号。这个值应该与在 request_irq 时传入的 irq 参数相同。
dev_id (void *):
这是与中断号关联的设备标识符指针。这个值应该与 request_irq 中传入的 dev_id 参数相同。这个参数用于区分共享中断的多个设备。
如果中断是独占的(即未使用 IRQF_SHARED 标志),这个参数可以为 NULL。

gpiod_direction_output

函数用于将一个 GPIO(通用输入/输出)引脚配置为输出模式,并设置其初始输出值。

int gpiod_direction_output(struct gpio_desc *desc, int value);

value : GPIOD_OUT_LOW | GPIOD_OUT_HIGH ; 低电平和高电平
也可以使用0和1来表示

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值