gpt4 book ai didi

linux - request_irq 成功但从未检测到中断

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:25:22 25 4
gpt4 key购买 nike

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

问题来了:当我尝试写入任何设备时,我的“开始传输”功能被调用,但随后等待来自 usart 的中断从未发生。所以写入只是挂起,并且使用逻辑分析器我可以看到 RTS 被断言但没有字节显示在 tx 线上。我知道我对 request_irq 的调用成功了,但我从未在/proc/interrupts 中看到任何 irq 条目。在驱动程序中,我也尝试过使用 request_irq 为 gpio 线路注册一个单独的中断处理程序,这工作正常。

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

最佳答案

症状看起来像一个尚未启用(或关闭)的外设时钟:设备可以初始化而没有错误,并且可以设置 I/O 操作,但是设备什么都不做;它装死了。由于从来没有 I/O 开始,因此您永远不会得到指示完成的中断!

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

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

不仅仅是

#if defined(CONFIG_SERIAL_ATMEL) 

附录

I could be wrong but the clock shouldn't have any effect on the CTS pin causing an interrupt, right?

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

你太专注于中断了。
您没有可解决的中断问题;那些是次要故障。
尝试传输时缺少输出更为重要和具有启发性。
根本原因可能是 USART 设备的配置有缺陷,因为传输位是配置和运行的 USART 的自动操作。
如果不工作与工作之间的区别是可加载模块静态链接,那么根本原因将是一些基本的(而且微不足道的)事情,就像我的两个建议一样。

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

附录 2

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

关于linux - request_irq 成功但从未检测到中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13650564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com