设备树根节点下添加
- myledIrqPlatform{
- compatible="hqyj,myledIrqPlatform";
- reg=<0x22334455 59>;
- interrupt-parent=<&gpiof>;
- interrupts=<9 0>;
- led1-gpio=<&gpioe 10 0>;//10表示使用的gpioe第几个管脚 0,表示gpio默认属性
- };
驱动程序代码
- #include <linux/init.h>
- #include <linux/module.h>
- #include <linux/platform_device.h>
- #include <linux/mod_devicetable.h>
- #include <linux/of_gpio.h>
- #include <linux/interrupt.h>
-
- struct resource *res;
- unsigned int irqno;//中断号
- struct gpio_desc *gpiono;
- unsigned int number = 0;
-
- // 定义中断处理函数
- irqreturn_t key_handler(int irq, void *dev)
- {
- printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);
- int which = (int)dev;
- printk("which=%d number=%d\n",which,number);
- //灯状态取反
- gpiod_set_value(gpiono,!gpiod_get_value(gpiono));
- //变量 在 0 或 1之间切换
- number = (number == 0) ? 1 : 0;
- return IRQ_HANDLED;
- }
-
- // 封装probe函数
- int pdrv_probe(struct platform_device *pdev){
- //设备树匹配成功后,设备树节点指针可以通过pdev->dev.of_node获取
- //基于设备树节点信息获取gpio_desc对象指针
- //申请GPIO LED1灯
- gpiono = gpiod_get_from_of_node(pdev->dev.of_node,"led1-gpio",0,GPIOD_OUT_HIGH,NULL);
- if(IS_ERR(gpiono)){
- printk("解析GPIO管脚信息失败\n");
- return -ENXIO;
- }
- printk("解析GPIO管脚信息成功\n");
-
- //获取软中断号
- irqno = platform_get_irq(pdev,0);
- if(irqno < 0){
- printk("获取中断LED类型资源失败\n");
- return -ENXIO;
- }
- printk("irq资源/软中断号%d\n",irqno);
- printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);
-
- // 注册中断 按键KEY1 PE10
- int ret = request_irq(irqno, key_handler, IRQF_TRIGGER_FALLING|IRQF_SHARED, "key_int", (void *)1);
- if (ret < 0)
- {
- printk("注册按键1中断失败\n");
- return ret;
- }
- printk("注册按键1中断成功\n");
-
- return 0;
- }
-
- int pdrv_remove(struct platform_device *pdev){
- // 注销中断 按键KEY1 PE10
- free_irq(irqno, 0);
- //灭灯
- gpiod_set_value(gpiono,0);
- //释放GPIO信息 LED
- gpiod_put(gpiono);
- printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);
- return 0;
- }
-
- //构建设备树匹配表
- struct of_device_id oftable[] = {
- {.compatible = "hqyj,myledIrqPlatform"},
- {},//防止数组越界
- };
-
- // 定义驱动信息对象并初始化
- struct platform_driver pdrv = {
- .probe = pdrv_probe,
- .remove = pdrv_remove,
- .driver = {
- .name = "bbbbb",
- .of_match_table = oftable,//用于设备树匹配
- },
- };
-
- //一键注册宏
- module_platform_driver(pdrv);
- MODULE_LICENSE("GPL");