文章目录
一、硬件原理图

二、添加设备树节点
1、iomuxc子节点
pinctrl_button: button{
fsl,pins = <
MX6UL_PAD_SNVS_TAMPER1__GPIO5_IO01 0x000110A1
>;
};
2、自定义按键节点
button_interrupt {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_button>;
button_gpio = <&gpio5 1 GPIO_ACTIVE_LOW>;
interrupt-parent = <&gpio5>;
interrupts = <1 IRQ_TYPE_EDGE_RISING>;
};
3、irq_of_parse_and_map()函数
从 interupts 属性中提取到对应的设备号,如:
interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>;
drivers/of/irq.c
unsigned int irq_of_parse_and_map(struct device_node *dev, int index)
-
参数:
dev:设备树节点
index:索引号,interrupts属性可能包含多条中断信息,从0开始计数 -
返回值:
-
中断号
4、gpio_to_irq() 函数
获取gpio对应的中断号,和上面一样,都是获取中断号的方法。
int gpio_to_irq(unsigned int gpio)
gpio: 要获取的 GPIO 编号。
返回值: GPIO 对应的中断号。
三、源文件
1、按二添加设备树节点
2、驱动源文件
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/uaccess.h>
#include <linux/delay.h>
#include <linux/ide.h>
#include <linux/errno.h>
#include <linux/gpio.h>
#include <asm/mach/map.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_gpio.h>
#include <asm/io.h>
#include <linux/device.h>
#include <linux/irq.h>
#include <linux/of_irq.h>
/*------------------字符设备内容----------------------*/
#define DEV_NAME "button"

本文详细介绍了Linux驱动开发中如何配置设备树以添加自定义按键节点,解析中断并映射到GPIO,以及驱动源文件的编写。通过`iomuxc`子节点设置GPIO引脚,`irq_of_parse_and_map()`函数获取中断号,并在驱动中实现中断处理函数`button_irq_hander`。最后,提供了一个简单的测试app来读取按键状态。
最低0.47元/天 解锁文章
4922

被折叠的 条评论
为什么被折叠?



