对于ZYNQ中AXI GPIO中断处理的问题,可以参考以下示例代码进行解决:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/interrupt.h>
#include <linux/input.h>
#define GPIO_INTR_NAME "axi_gpio_intr"
struct axi_gpio_intr_dev {
struct device *dev;
struct input_dev *input_dev;
int irq_num;
int gpio_num;
};
static irqreturn_t axi_gpio_isr(int irq, void *dev_id) {
struct axi_gpio_intr_dev *dev = (struct axi_gpio_intr_dev *)dev_id;
unsigned int gpio_val;
// 读取GPIO值
gpio_val = gpio_get_value(dev->gpio_num);
// 将GPIO值作为输入设备的事件发送
input_report_key(dev->input_dev, BTN_0, gpio_val);
input_sync(dev->input_dev);
return IRQ_HANDLED;
}
static int axi_gpio_probe(struct platform_device *pdev) {
struct device_node *np = pdev->dev.of_node;
struct axi_gpio_intr_dev *dev;
int ret;
// 读取GPIO和中断号
int gpio_num = of_get_gpio(np, 0);
int irq_num = irq_of_parse_and_map(np, 0);
// 分配结构体
dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
if (!dev) {
dev_err(&pdev->dev, "Can't allocate memory for dev\n");
return -ENOMEM;
}
dev->dev = &pdev->dev;
dev->irq_num = irq_num;
dev->gpio_num = gpio_num;
// 初始化输入设备
dev->input_dev = input_allocate_device();
if (!dev->input_dev) {
dev_err(&pdev->dev, "Can't allocate input device\n");
return -ENOMEM;
}
dev->input_dev->name = GPIO_INTR_NAME;
dev->input_dev->phys = "axi_gpio