新闻  |   论坛  |   博客  |   在线研讨会
按键中断实验
chen3bing | 2025-05-21 17:06:55    阅读:20   发布文章

imx6ull-14x14-evk.dts:

test_key{

compatible="keys";

pinctrl-names = "default";

pinctrl-0 = <&pinctrl_gpio_keys>;

gpios = <&gpio1 18 GPIO_ACTIVE_LOW>;

interrupt-parent=<&gpio1>;

interrupts=<18 IRQ_TYPE_EDGE_BOTH>;

};


driver.c

#include<linux/init.h>

#include<linux/module.h>

#include<linux/platform_device.h>

#include<linux/of.h>

#include<linux/of_address.h>

#include<linux/gpio.h>

#include<linux/of_gpio.h>

#include<linux/interrupt.h>

#include<linux/of_irq.h>


struct device_node *test_device_node;

struct property *test_node_property;

int gpio_nu;

int irq;

irq_handler_t test_key(int irq,void *args)

{

printk("test_key\n");

return IRQ_HANDLED;

}

int beep_probe(struct platform_device *pdev)

{

int ret=0;

printk("beep_probe\n");

//printk("node name is %s\n",pdev->dev.of_node->name);


test_device_node=of_find_node_by_path("/test_key");

if(test_device_node==NULL)

{

printk("of_find_node_by_path is error\n");

return -1;

}

gpio_nu=of_get_named_gpio(test_device_node,"gpios",0);

if(gpio_nu<0)

{

printk("of_get_namd_gpio is error\n");

return -1;

}

gpio_direction_input(gpio_nu);

irq=irq_of_parse_and_map(test_device_node,0);

printk("irq is %d\n",irq);

ret=request_irq(irq,test_key,IRQF_TRIGGER_RISING,"test_key",NULL);

if(ret<0)

{

printk("request_irq is error\n");

return -1;

}

//irq=gpio_to_irq(gpio_nu);

/*request_irq(irq,test_key,IRQF_TRIGGER_RISING,"test_key",NULL);

if(ret<0)

{

printk("request is error\n");

return -1;

}*/

return 0;

}


int beep_remove(struct platform_device *pedv)

{

printk("beep_remove\n");

return 0;

}


const struct platform_device_id beep_id_table=

{

.name="keys"

};

const struct of_device_id of_match_table_test[]={

{.compatible="keys"},

{}

};

struct platform_driver beep_driver=

{

.probe=beep_probe,

.remove=beep_remove,

.driver=

{

.owner=THIS_MODULE,

.name="keys",

.of_match_table=of_match_table_test

},

.id_table=&beep_id_table

};

static int beep_driver_init(void)

{

int ret=0;

ret=platform_driver_register(&beep_driver);

if(ret<0)

{

printk("platform_driver_register error\n");

return ret;

}

printk("platform_driver_register ok\n");

return 0;

}

static void beep_driver_exit(void)

{

printk("byb byb\n");

free_irq(irq,NULL);

platform_driver_unregister(&beep_driver);

}

module_init(beep_driver_init);

module_exit(beep_driver_exit);

MODULE_LICENSE("GPL");

运行效果

6.jpg


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
1
最近文章
QT网络通信之TCP通信
2025-05-29 11:25:50
工作队列
2025-05-22 15:28:50
按键中断实验
2025-05-21 17:06:55
推荐文章
最近访客