Embedded linux 嵌入式Linux设备在启动期间阻塞RS485总线

Embedded linux 嵌入式Linux设备在启动期间阻塞RS485总线,embedded-linux,bootloader,usart,rs485,arm9,Embedded Linux,Bootloader,Usart,Rs485,Arm9,我使用的工业Linux计算机在通过RS485总线与多个连接设备进行通信时遇到问题。我遇到的是RS485 USART驱动程序使用的IO引脚在启动时设置为不同的级别,而不是进入RS485空闲/三态。因此,当设备启动时,总线上的其他设备会被阻塞30秒以上,从而引发各种外部问题。事件的过程可以在所附的图片中看到,我在启动期间用示波器测量了输出电压 我的猜测是,直到电压水平达到三态水平(例如,本设备约2.2V),实际驱动器才会启动。在那之后,一切都按预期进行 我试图找到任何配置文件来设置引导时引脚的默认I

我使用的工业Linux计算机在通过RS485总线与多个连接设备进行通信时遇到问题。我遇到的是RS485 USART驱动程序使用的IO引脚在启动时设置为不同的级别,而不是进入RS485空闲/三态。因此,当设备启动时,总线上的其他设备会被阻塞30秒以上,从而引发各种外部问题。事件的过程可以在所附的图片中看到,我在启动期间用示波器测量了输出电压

我的猜测是,直到电压水平达到三态水平(例如,本设备约2.2V),实际驱动器才会启动。在那之后,一切都按预期进行

我试图找到任何配置文件来设置引导时引脚的默认IO级别(认为这可能是由引导加载程序设置的),但都没有用

此外,我还尝试应用启动脚本“足够早地”运行,以将数据设置为高,但据我所知,该设备没有提供任何接口来像常规GPIO那样控制这些引脚

任何帮助、提示或见解都将不胜感激

编辑:我不是一个经验丰富的Linux开发人员,所以如果我遗漏了任何重要的细节,请强调

某些规格:

  • ARM920T版本0(v41)CPU
  • Linux 2.6的专有发行版
  • 使用Busybox
  • Atmel USART驱动程序
从启动日志中提取:

Linux版本2.6.28.10(root@)(gcc版本4.1.2)#94 PREEMPT周二10月29日10:22:19 CET 2013
CPU:ARM920T[41129200]版本0(ARMv4T),cr=c0003177
/…
…/
端口/dev/ttyS3的RS485模式已启用
/…
... (我猜大约30秒过去了)
…/
atmel_usart.3:MMIO 0xfffcc000(irq=9)处的ttyS3是一个atmel_序列
atmel_串行。3:将RS485 RTS引脚放下
/…

…/

完整启动日志:

类似问题:

这里可能讨论了类似的问题:
但我不确定如何继续执行建议的解决方案


这不过是胡乱猜测,但可能值得在启动期间尽早添加一个启动脚本,在设备上回显一个空字符(例如/dev/ttyS1或其他)。这可能足以让驱动程序初始化硬件


您还可以尝试在Linux源代码中找到驱动程序,以查看它是如何启动的。

您可能有权访问源代码,这样您就可以调查是谁以及何时弄乱了那个GPIO。只需grep内核源代码中的atmel gpio控制器端口地址,就可以知道会发生什么。如果幸运的话,可能会有一个内核命令行选项,您可以从引导加载程序中传递该选项,以预先将该行设置为所需

如果你能找到下面提到的必要的东西,这个答案可能有用 你的董事会成员

有一次,我在PWM上也遇到了同样的问题。在那里,我发现我的引导加载程序负责同样的工作,我改变了引导加载程序的配置,它开始正常工作

检查主板供应商或第三方提供的BSP(如果您有源代码),如果您的引导加载程序是U-boot,您可以在
U-boot-(源代码)/include/configs/(您的主板).h中找到RS484的配置。根据您的电路板数据表,您可以检查在同一引脚上多路复用的其他内容,如果启动时间不需要,则禁用这些内容,并启用RS485


启用/禁用
可以根据您的配置更改值
0、1或2
,也可以只需在行外注释
/
即可禁用任何内容。

您使用的是哪种驱动程序?是否有运行总线的外部控制器/收发器?有关硬件的更多信息会有所帮助。嗨!我在OP中添加了一些规范。我在文件系统中找到了Atmel驱动程序,但我不确定硬件驱动程序(收发器)。我可以打开外壳四处看看,但我宁愿不要,因为它是密封的。我真希望我有一个原理图,但它不是由制造商提供的。你可以从SoC串行调试端口获得更多信息(例如引导日志),因此连接到串行控制台对于进一步的进程是至关重要的。串行端口通常在内核引导的早期初始化,因此,您需要将RS485状态与系统引导活动关联起来。您可能需要识别所使用的RS-485收发器芯片,以便了解其控制输入的正确逻辑(例如驱动器去低和再高)。Atmel没有太多使用ARM920T的SOC;您可能有一个AT91RM9200。您能提供更多的引导日志吗?我不确定内核初始化期间或任何用户空间程序是否采取了此操作。您对“此处经过~30秒”的猜测是不合理的。内核没有理由花那么长时间来完成初始化阶段。30秒延迟的起点是什么?与此起点对应的控制台输出在哪里?(例如,在内核启动之前?)您需要将“作用域”和计算机监视器放在一起以关联事件。感谢您的建议。然而,我想不出一个足够早的方法(从rcs启动脚本中尝试)这些东西在内核启动后也会起作用,这意味着10-20seconds@SamratDas看来你是对的。看到我插入到Q中的bot日志显示,一切都发生在引导过程中。不幸的是,我似乎没有U-boot(但我不知道我真正有什么)。没有这样的目录,而且我已经对*.h文件进行了grep,但没有任何效果。谢谢你的建议和坚持帮助我!