request_irq成功但从未检测到中断

时间:2012-11-30 17:57:24

标签: linux serial-port embedded-linux atmel irq

我在ARM处理器上运行嵌入式linux 3.2.6。我正在使用atmel的串行驱动程序的修改版本来控制我设备上的4个USART端口。当我使用用内核编译的驱动程序时,一切正常。但我想将驱动程序作为内核模块运行。我做了所有必要的更改并禁用内部驱动程序,一切似乎都很好。 4个tty设备已成功注册,我可以看到我的所有探测和初始化功能都能正常工作。

所以这就是问题所在: 当我尝试写入任何设备时,我的“start transmit”函数被调用,但随后等待来自usart的中断,这种中断从未发生过。因此写入只是挂起,并且使用逻辑分析器,我可以看到RTS被断言但在tx线上没有出现字节。我知道我对request_irq的调用成功,但我从未在/ proc / interrupts中看到任何irq条目。在驱动程序中,我也尝试使用request_irq为gpio行注册一个单独的中断处理程序,这很好。

我知道这是一个可能难以诊断的问题,但我正在寻找可能引导我找到解决方案的正确方向的任何可能的建议。如果您需要任何澄清,请告诉我。谢谢

2 个答案:

答案 0 :(得分:1)

症状读起来像外围时钟尚未启用(或关闭):设备可以初始化,无错误,可以设置I / O操作,但设备什么都不做;它死了。由于没有I / O 启动,您永远不会得到指示完成的中断

要检查的另一件事是arch/arm/mach-xxx/zzz_devices.c文件中HW配置结构的条件编译指令 确保串行端口结构具有以下内容:

#if defined(CONFIG_SERIAL_ATMEL) || defined(CONFIG_SERIAL_ATMEL_MODULE)

而不仅仅是

#if defined(CONFIG_SERIAL_ATMEL) 

附录

  

我可能错了,但时钟不应该对CTS引脚产生任何影响导致中断,对吗?

不对。
这些数字电路是同步状态机:没有时钟,输入的状态变化无法处理 此外,SoC和现代u控制器将外设时钟用作这些集成外设的开/关开关。在硅芯片上通常存在比实际使用的功能更多的功能,即外围设备,主要是由于到板的引脚数量不足。因此,禁用未使用设备的时钟以降低功耗。

你太专注于中断了 您没有可解决的中断问题;那些是次要的失败 尝试传输时缺乏输出更为重要和显着 根本原因可能是USART设备的有缺陷的配置,因为发送比特是配置的&的自动操作。操作USART。
如果not-working与working之间的差异是可加载模块静态链接,那么根本原因将是基本(并且微不足道),就像我的两个建议一样。

此外,您对#if defined()缺乏确认,例如你没有回复“哦是的,我们已经知道了”,引发了一个巨大的红旗,上面写着“先修复我!”

附录2

我发现无法使用make menuconfig(这是答案的一半的前提)发现Atmel串行驱动程序无法配置/构建为可加载模块,因此我很想删除此答案。 (当然Kconfig文件可以被黑客攻击以使配置变量三态而不是 boolean 来克服模块限制。)我已经对OP发表了评论。但我还想保留对Stratton先生的评论,指出.config文件中的符号是如何使用的。

答案 1 :(得分:1)

所以我终于解决了我的问题。感谢您的回复,他们都没有直接解决我的问题,但他们确实提示我的代码进一步检查。经过一些反复试验后,我终于开始工作了。我最初将每个usart的platform_device结构从/mach-at91/xxx_devices.c移动到我的可加载模块。由于某种原因,结构没有得到正确的数据映射到硬件,我想因为它没有正确链接内核中的符号(虽然从来没有得到错误消息),所以一些注册函数不是'甚至被叫。我最终将结构和platform_device_register调用移回设备文件。我还决定使用原始的atmel_serial.c驱动程序保留内置控制台的驱动程序。我必须在设备文件和内置atmel_serial.c文件中更改控制台的platform_device名称,以使其不与我的usart端口驱动程序冲突。我发现更改usart的platform_device和platform_driver名称除了“atmel_usart”之外的所有内容都会导致usart传输失败。我真的不明白为什么,但我只是把它留作atmel_usart所以它有效。

再次感谢所有回答我问题的人。