参考文档:Documentation/devicetree/bindings/interrupt-controller/interrupts.txt
在设备树中有两个定义
// Example 1:
interrupt-parent = <&intc1>; //指定使用哪个controller的中断控制器
interrupts = <5 0>, <6 0>; //指定使用的中断号
// Example 2:
interrupts-extended = <&intc1 5 1>, <&intc2 1 0>; //用一个属性描述两个变量
别的节点要使用这个中断控制器时,只需要一个 cell 来表明使用“哪一个中断”。
// Example:
vic: intc@10140000 {
compatible = "arm,versatile-vic";
interrupt-controller; //表明是一个中断控制器
#interrupt-cells = <1>; //指定cell的个数
reg = <0x10140000 0x1000>;
};
sic: intc@10003000 {
compatible = "arm,versatile-sic";
interrupt-controller; //表明是一个中断控制器
#interrupt-cells = <1>;
reg = <0x10003000 0x1000>;
interrupt-parent = <&vic>; //这里引用vic,说明vic是它的父中断节点
interrupts = <31>; /* Cascaded to vic */ //使用vic的31号中断,因为interupt-cells设置了1,这里只填写1个值
};
需要一个cell表明使用“哪一个中断”,一个cell来描述中断:
// cell = <2>是第二个的数值,触发方式填写内容
// 1 = low-to-high edge triggered
// 2 = high-to-low edge triggered
// 4 = active high level-sensitive
// 8 = active low level-sensitive
// Example:
i2c@7000c000 {
gpioext: gpio-adnp@41 {
compatible = "ad,gpio-adnp";
reg = <0x41>;
interrupt-parent = <&gpio>;
interrupts = <160 1>; //指定中断号、触发条件
gpio-controller;
#gpio-cells = <1>;
interrupt-controller;
#interrupt-cells = <2>;
nr-gpios = <64>;
};
sx8634@2b {
compatible = "smtc,sx8634";
reg = <0x2b>;
interrupt-parent = <&gpioext>; //使用中断gpio-adnp@41
interrupts = <3 0x8>; //3中断号,低电平触发
#address-cells = <1>;
#size-cells = <0>;
threshold = <0x40>;
sensitivity = <7>;
};
};
在设备树中使用中断时,需要指定所需要的中断控制器节点,需要指定使用中断对应的物理接口,button的话就是一个gpio口。
interrupt-parent=<&xxxx>; //指定使用哪个接口
interrupts=< xxx xxx >; //指定使用哪个中断号,#interrupt-cells如果是2的话,还要指定中断的出发方式。
/* platform_get_resource - get a resource for a device.
* @dev: platform device,@type: resource type,@num: resource index */
struct resource *platform_get_resource(struct platform_device *dev, unsigned int type, unsigned int num);
//用device_node*设备树节点,index序号,获取中断号
extern int of_irq_get(struct device_node *dev, int index);
如果既不能转换为paltform_device,也不是i2c或spi,在驱动程序中需要自行调用of_irq_get去解析设备树,得到中断号。
参考文档:Documentation/devicetree/bindings/input/gpio-keys.txt
参考源码:drivers/input/keyboard/gpio_keys.c
对 于 GPIO 按 键 , 我 们 并 不 需 要 去 写 驱 动 程 序 , 使 用 内 核 自 带 的 驱 动 程 序drivers/input/keyboard/gpio_keys.c 就可以,然后你需要做的只是修改设备树指定引脚及键值。
//Example nodes:
gpio_keys {
compatible = "gpio-keys"; // 如果用内核gpio,必须是gpio-keys的子节点
#address-cells = <1>;
#size-cells = <0>;
autorepeat;
button@21 {
label = "GPIO Key UP"; //按键的描述名称
linux,code = <103>; //输入事件的代码
gpios = <&gpio1 0 1>; //指定的设备树GPIO,gpios和interrupts可以省略其中一个。
};
button@22 {
label = "GPIO Key DOWN"; //按键的描述名称
linux,code = <108>; //输入事件的代码
interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>; //对应的书中中断线
};
//...
};
示例:
gpio-keys {
button@1 {
gpios = <&gpio7 9 GPIO_ACTIVE_LOW>;
linux,code = <KEY_A>;
label = "GPIO KEY_A";
linux,input-type = <1>;
gpio-key,wakeup = <1>;
debounce-interval = <100>;
pinctrl-names = "default";
pinctrl-0 = <&keyabtn>;
};
};