【发布时间】:2012-11-18 23:44:44
【问题描述】:
我在 ARM 处理器上运行嵌入式 linux 3.2.6。我正在使用修改版的 atmel 串行驱动程序来控制我设备上的 4 个 USART 端口。当我使用用内核编译的驱动程序时,一切正常。但我想将驱动程序作为内核模块运行。我进行了所有必要的更改并禁用了内部驱动程序,一切似乎都很好。 4 个 tty 设备注册成功,我可以看到我的所有探测和初始化功能都正常工作。
所以问题来了: 当我尝试写入任何设备时,我的“开始传输”函数被调用,但随后等待来自 usart 的中断,该中断从未发生。所以写入只是挂起,使用逻辑分析器我可以看到 RTS 被断言但 tx 线上没有字节显示。我知道我对 request_irq 的调用成功,但我从未在 /proc/interrupts 中看到任何 irq 条目。在驱动程序中,我也尝试过使用 request_irq 为 gpio 线注册一个单独的中断处理程序,效果很好。
我知道这是一个可能难以诊断的问题,但我正在寻找任何可能的建议,以帮助我找到解决方案的正确方向。如果您需要任何澄清,请告诉我。谢谢
【问题讨论】:
-
另一个想法,当使用 /proc/interupts 中内置的驱动程序时,显示 irq 注册为“AIC”irqs。会不会有什么东西导致高级中断控制器和可加载模块之间断开连接?
-
“我进行了所有必要的更改并禁用了内部驱动程序” 是什么意思?为什么必须“禁用”“内部”驱动程序?这是否意味着内存中可能有两个版本的驱动程序?这是否与无法通过
make menuconfig将 Atmel 串行驱动程序配置为可加载模块这一事实有关?
标签: linux serial-port embedded-linux atmel irq