OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5471|回复: 5

关于设备使用多组中断的驱动程序问题

[复制链接]

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2019-10-23
在线时间
42 小时
发表于 2021-3-12 14:52:56 | 显示全部楼层 |阅读模式
3金钱
Hi, all
     最近拿到了一个设备树,需要根据设备树编写对应的中断驱动,下面这个设备共使用到了三组中断
  1.                 adc_top_0: adc_top@43c00000 {
  2.                         /* This is a place holder node for a custom IP, user may need to update the entries */
  3.                         clock-names = "AXI_ACLK";
  4.                         clocks = <&clkc 15>;
  5.                         compatible = "imx,adc-top-1.0";
  6.                         interrupt-names = "key1_out", "key2_out", "ddr_wr_interrupt";
  7.                         interrupt-parent = <&intc>;
  8.                         interrupts = <0 30 4 0 31 4 0 29 4>;
  9.                         reg = <0x43c00000 0x1000>;
  10.                 };
复制代码

我这边要是使用一组中断的花,比如 interrupts = <0 30 4>,驱动已经有了,使用platform_get_irq()+ request_irq()


那这样多组中断的话,改怎么样改写驱动程序呢,可以让这几个使用不同的中断函数吗?


最佳答案

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2019-10-23
在线时间
42 小时
 楼主| 发表于 2021-3-12 14:52:57 | 显示全部楼层
回复

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2019-10-23
在线时间
42 小时
 楼主| 发表于 2021-3-12 14:57:18 | 显示全部楼层
我使用的驱动程序 init
  1. major = register_chrdev(0, devname, &irq_fops);

  2.         cls = class_create(THIS_MODULE, devname);
  3.         mijor = 1;
  4.         tmp_dev = device_create(cls, &pdev->dev, MKDEV(major, mijor), NULL, devname);
  5.         if (IS_ERR(tmp_dev)) {
  6.                 class_destroy(cls);
  7.                 unregister_chrdev(major, devname);
  8.                 return 0;
  9.         }
  10.        
  11.         irq = platform_get_irq(pdev,0);
  12.         if (irq <= 0)
  13.                 return -ENXIO;

  14.         dev = &pdev->dev;

  15.         // err = request_threaded_irq(irq, NULL,
  16.         //                         irq_interrupt,
  17.         //                         IRQF_TRIGGER_RISING | IRQF_ONESHOT,
  18.         //                         devname, NULL);       

  19.         err = request_irq(irq,
  20.                         irq_interrupt,
  21.                         IRQF_TRIGGER_RISING,
  22.                         devname, NULL);       
复制代码
回复

使用道具 举报

11

主题

314

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1039
金钱
1039
注册时间
2020-7-21
在线时间
258 小时
发表于 2021-3-12 16:50:01 | 显示全部楼层
帮顶         

回复

使用道具 举报

1

主题

385

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1023
金钱
1023
注册时间
2019-9-21
在线时间
269 小时
发表于 2021-3-12 18:22:39 | 显示全部楼层
帮顶!
回复

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2019-10-23
在线时间
42 小时
 楼主| 发表于 2021-3-15 09:18:07 | 显示全部楼层
解决方法:request_irq 接着申请多个中断即可
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 21:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表