嵌入式学习-----liunx中断相关编程

设备树里使用中断

① interrupt-parent=<&XXXX>
你要用哪一个中断控制器里的中断?
② interrupts
你要用哪一个中断?
Interrupts 里要用几个 cell,由 interrupt-parent 对应的中断控制器决定。在中断控制器里有
“#interrupt-cells”属性,它指明了要用几个 cell 来描述中断。例如一个 cell 来表明使用“哪一个中断”
另一个 cell 来描述中断,一般是表明触发类型。

2 个 cell 的 bits[3:0] 用来表示中断触发类型(trigger type and level flags)1 = low-to-high edge triggered,上升沿触发
2 = high-to-low edge triggered,下降沿触发
4 = active high level-sensitive,高电平触发
8 = active low level-sensitive,低电平触发

在这里插入图片描述
在代码中获得中断
设备树中的节点有些能被转换为内核里的 platform_device,有些不能,回顾如下:
A. 根节点下含有 compatile 属性的子节点,会转换为 platform_device
B. 含有特定 compatile 属性的节点的子节点,会转换为 platform_device
如 果 一 个 节 点 的 compatile 属性 , 它 的 值 是这 4 者之一: “simple-bus”,“simplemfd”,“isa”,“arm,amba-bus”,
那么它的子结点(需含 compatile 属性)也可以转换为 platform_device。
C. 总线 I2C、SPI 节点下的子节点:不转换为 platform_device
某个总线下到子节点,应该交给对应的总线驱动程序来处理, 它们不应该被转换为 platform_device。

对于 platform_device
一个节点能被转换为 platform_device , 如 果它 的 设 备 树 里 指 定 了中 断 属 性 , 那 么 可 以 从
platform_device 中获得“中断资源”,函数如下,可以使用下列函数获得 IORESOURCE_IRQ 资源,即中断号:

/**
* platform_get_resource - get a resource for a device
* @dev: platform device
* @type: resource type // 取哪类资源?IORESOURCE_MEM、IORESOURCE_REG
*  // IORESOURCE_IRQ 等
* @num: resource index // 这类资源中的哪一个?
*/
struct resource *platform_get_resource(struct platform_device *dev,
unsigned int type, unsigned int num);

对于 I2C 设备、SPI 设备
对于 I2C 设备节点,I2C 总线驱动在处理设备树里的 I2C 子节点时,也会处理其中的中断信息。一个
I2C 设备会被转换为一个 i2c_client 结构体,中断号会保存在 i2c_client 的 irq 成员里,代码如下
(drivers/i2c/i2c-core.c):
在这里插入图片描述
对于 SPI 设备节点,SPI 总线驱动在处理设备树里的 SPI 子节点时,也会处理其中的中断信息。一个
SPI 设备会被转换为一个 spi_device 结构体,中断号会保存在 spi_device 的 irq 成员里,代码如下
(drivers/spi/spi.c):
在这里插入图片描述
调用 of_irq_get 获得中断号
如果你的设备节点既不能转换为 platform_device,它也不是 I2C 设备,不是 SPI 设备,那么在驱动程
序中可以自行调用 of_irq_get 函数去解析设备树,得到中断号。

对于 GPIO
可以使用 gpio_to_irq 或 gpiod_to_irq 获得中断号。

可以使用下面的函数获得引脚和 flag
button->gpio = of_get_gpio_flags(pp, 0, &flags);
bdata->gpiod = gpio_to_desc(button->gpio);

再去使用 gpiod_to_irq 获得中断号:
irq = gpiod_to_irq(bdata->gpiod);

编写使用中断的按键驱动程序
对于 GPIO 按键,我们并不需要去写驱动程序,使用内核自带的驱动程序
drivers/input/keyboard/gpio_keys.c 就可以,然后你需要做的只是修改设备树指定引脚及键值。不过这还是从头写一下按键驱动。

按键驱动程序编写
gpio_key_drv.c

主要流程:
1.首先定义platform_driver结构体,然后gpio_key_init

#include <linux/module.h>

#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/miscdevice.h>
#include <linu
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值