"); //-->
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");
运行效果
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。