设备树如下,触摸挂在i2c1下面,中断用pinctrl子系统
驱动如下:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/i2c.h>
#include <linux/gpio.h>
#include <linux/gpio/consumer.h>
#include <linux/interrupt.h>
#include <linux/delay.h>
// 定义 ft5x06 设备的 GPIO 描述符
struct gpio_desc *reset_gpio, *irq_gpio;
// ft5x06 中断处理函数
irqreturn_t ft5x06_handler(int irq, void *args)
{
printk("This is ft5x06 handler\n");
// 返回中断已处理标志
return IRQ_RETVAL(IRQ_HANDLED);
}
// ft5x06 设备的探测函数
int ft5x06_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
int ret;
printk("This is ft5x06 probe\n");
// 获取 reset GPIO 描述符
reset_gpio = devm_gpiod_get_optional(&client->dev, "reset", 0);
if (!reset_gpio) {
printk("gpiod_get_optional reset gpio is error\n");
return -1;
}
// 获取 irq GPIO 描述符
irq_gpio = devm_gpiod_get_optional(&client->dev, "interrupts", 0);
if (!irq_gpio) {
printk("gpiod_get_optional irq gpio is error\n");
return -1;
}
// 请求中断,设置为下降沿触发,单次触发
ret = devm_request_irq(&client->dev, client->irq, ft5x06_handler,
IRQ_TYPE_EDGE_FALLING | IRQF_ONESHOT | IRQF_SHARED, client->name,
client);
printk("request irq name:%s\n", client->name);
if (ret < 0) {
printk("request irq is error\n");
return -2;
}
return 0;
}
// ft5x06 设备的移除函数
int ft5x06_remove(struct i2c_client *client)
{
// free_irq(client->irq, client);
// gpiod_put(reset_gpio);
// gpiod_put(irq_gpio);
return 0;
}
// 定义 i2c_device_id 结构体数组,用于标识 ft5x06 设备
static const struct i2c_device_id ft5x06_id[] = { { "my-ft5x06", 0 }, {} };
// 定义 i2c_driver 结构体,描述 ft5x06 设备驱动
static struct i2c_driver ft5x06_driver = {
.driver = {
.name = "my-ft5x06",
.owner = THIS_MODULE,
},
.probe = ft5x06_probe,
.remove = ft5x06_remove,
.id_table = ft5x06_id,
};
// 驱动初始化函数
static int __init ft5x06_driver_init(void)
{
int ret;
// 注册 I2C 设备驱动
ret = i2c_add_driver(&ft5x06_driver);
if (ret < 0) {
printk("i2c_add_driver is error\n");
return ret;
}
return 0;
}
// 驱动退出函数
static void __exit ft5x06_driver_exit(void)
{
// 注销 I2C 设备驱动
i2c_del_driver(&ft5x06_driver);
}
module_init(ft5x06_driver_init);
module_exit(ft5x06_driver_exit);
MODULE_LICENSE("GPL");
在第二次insmod的时候就报错
第一次insmod,触摸屏幕正常产生了中断,中断号也有
第二次insmod报错
请教下大佬,这是什么原因导致的啊
更多回帖