在ARM嵌入式系统中,通常存在多串行APP应用的需求,但由于ARM芯片系统的本机UART数量有限,因此需要通过其他高速总线扩展更多的接口。 本文使用带有tora dex nxp I.mx6d/6q处理器的Apalis i.MX6D/Q ARM计算机模块,在Linux系统下以EXAR方式扩展8路串行端口。
Apalis i.MX6D/Q模块本身最多可以支持5个UART串行输出。 支持高速TIA/EIA-232F (最多5Mbit/s )。 支持7、8或9 (用于9(RS485 )位数据、1或2位停止位。 其中UART1是全功能串行端口,其余部分串行端口也能够支持RTS和CTS信号。
在Linux系统上,通常保留串行端口用于APP应用程序的调试开发和系统升级。 虽然SSH等功能也可用于远程网络访问和系统调试,但对于嵌入式产品,系统启动时(特别是Uboot启动信息)有助于识别功能调试和问题。 此信息只能通过串行端口输出。 Toradex模块在更新Linux BSP时也同样需要在Uboot上进行。
Apalis i.MX6Q/D模块的剩馀四个串行端口除可以使用TTL级别来直接控制对应的外围设备,还可以扩展到RS232/RS485/RS422常用的工业控制端口。 针对更多串行端口需求,目前有多种方法可以通过USB、SPI、内存总线、I2C和PCIe等总线实现串行端口扩展。 Memory Bus和PCIe比其他总线更实时,并且可以在同一接口上扩展更多串行端口。 对于串行端口数和数据实时性较高的APP应用,可以优先选择这两种扩展方案。 同时,内存总线和PCIe是高速信号总线,在PCB布线方面需要特殊考虑。 Toradex还为此提供免费的PCB设计指导。 本节介绍如何使用基于exar pcie总线的XR17V358方案来扩展8路串行端口。
1 ).XR17V358方案介绍和驱动程序下载
XR17V358扩展的8个串行端口都支持RTS/CTS或DTR/DSR流控制功能,每个串行端口具有256字节的FIFO、独立时钟输出、支持半双工RS485,最高传输速率为25 Mbps。 XR17V358使用PCIe 2.0 Gen 1与Apalis i.MX6Q/D连接,确保高速实时数据传输。 EXAR目前为XR17V358提供Windows和Linux驱动程序。 这里采用最新的Linux驱动程序,移植到Apalis i.MX6平台。 驱动器源代码下载地址https://www.exar.com/common/content/document.ashx? id=20121
2 )配置编译环境
在编译之前,还必须下载Apalis i.MX6的Linux内核和交叉编译工具。
a ).Apalis i.MX6上的Linux内核下载
$ git clone-btoradex _ imx _3. 14.28 _1.0.0_ ga-next git ://git.tora dex.com/Linux-tora dex.git
b ) .下载交叉编译工具
$ wget https://releases.Lina ro.org/14.11/components/toolchain /敏感电话Aries/arm-Linux-gnueabihf/gcc-Lina ro-4.9
$ tarxvfgcc-Lina ro-4.9-2014.11-x86 _ 64 _ arm-Linux-gnueabihf.tar.xz
$ ln-sgcc-Lina ro-4.9-2014.11-x86 _ 64 _ arm-Linux-gnueabihfgcc-Lina ro
$ export ARCH=arm
$导出路径=~/gcc-Lina ro /敏感电话/:$PATH
$ export cross _ compile=arm-Linux-gnueabihf -
注意:上述路径必须与交叉编译工具实际解压缩的目录相对应。
c ) .编译Linux内核并提供XR17V358所需的配置文件。
$ make apalis_imx6_defconfig
$ make-j4uimageloadaddr=10008000
d ) .编译XR17V358驱动程序
编辑//makefile,将KERNEL_SRC指向Linux内核所在的目录
kernel _ src=/home/ban/tora dex/OE-core-tegra/Linux kernel/v 2.5/mx6/tora dex _ imx _3. 14.28 _ 1.0
//保持后运行make命令进行编译,确保上述ARCH、PATH和CROSS_COMPILE参数仍然有效。
$ make
//
编译成功后会生成针对 ARM 处理器的内核模块文件 xr17v35x.ko$ file xr17v35x.ko
xr17v35x.ko: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), BuildID[sha1]=399121b7862105b185e24b45ba3522f14158295e, not stripped
e). 安装驱动
将 xr17v35x.ko 复制到 Apalis i.MX6 模块上,并安装
root@apalis-imx6:~# insmod xr17v35x.ko
[ 151.156648] Exar PCIe (XR17V35x) serial driver Revision: 2.0
root@apalis-imx6:~# lspci
00:00.0 PCI bridge: Device 16c3:abcd (rev 01)
01:00.0 PCI bridge: PLX Technology, Inc. PEX 8605 PCI Express 4-port Gen2 Switch (rev aa)
02:01.0 PCI bridge: PLX Technology, Inc. PEX 8605 PCI Express 4-port Gen2 Switch (rev aa)
02:02.0 PCI bridge: PLX Technology, Inc. PEX 8605 PCI Express 4-port Gen2 Switch (rev aa)
02:03.0 PCI bridge: PLX Technology, Inc. PEX 8605 PCI Express 4-port Gen2 Switch (rev aa)
03:00.0 Serial controller: Exar Corp. Device 0358 (rev 03)
在 /dev 目录下出现对应的串口设备文件 ttyXR0 至 ttyXR7。
root@apalis-imx6:/dev# ls
autofs network_latency tty18 tty60
block network_throughput tty19 tty61
bus null tty2 tty62
char port tty20 tty63
console ppp tty21 tty7
cpu_dma_latency ptmx tty22 tty8
cuse ptp0 tty23 tty9
disk pts tty24 ttyXR0
dri ram0 tty25 ttyXR1
fb ram1 tty26 ttyXR2
fb0 ram10 tty27 ttyXR3
fb1 ram11 tty28 ttyXR4
fb2 ram12 tty29 ttyXR5
fb3 ram13 tty3 ttyXR6
fd ram14 tty30 ttyXR7
f). 设置波特率
root@apalis-imx6:~# stty -F /dev/ttyXR0 115200
驱动加载完毕后,在 Linux 中可以和其他串口一样正常使用。