ARM嵌入式体系常常会遇到多串口运用需求,而ARM芯片体系原生的UART数目有限,因而就需求经过其他高速总线来扩展更多的接口。本文就以Toradex 根据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(用于RS485)位数据,1或许2位中止位。其间 UART1 为全功用串口,其余部分串口也可支撑 RTS和CTS 信号。
在 Linux 体系中一般会保存一个串口用于运用调试开发以及体系升级。尽管 SSH 等功用也能够用于长途网络拜访以及体系调试,可是关于嵌入式产品,体系发动时,特别是 Uboot 发动的信息,能够有助于功用调试以及问题定位。而这部分信息只能从串口输出。Toradex 模块在更新 Linux BSP 的时分也相同需求在 Uboot 进行。
Apalis i.MX6Q/D 模块剩下的4个串口,除了能够运用 TTL 电平直接操控相应的外设,也能够扩展为 RS232/RS485/RS422 常用的工业操控端口。关于更多串口的需求,现在有多种计划完成串口扩展,例如经过 USB、SPI、Memory Bus、I2C以及 PCIe 等总线。 Memory Bus 和 PCIe 相关于其他总线具有更高的实时性,在同一个接口上也能够扩展出更多的串口。关于串口数量以及数据实时性较高的运用能够优先选择这两种扩展计划。与此同时, Memory Bus 和 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 平台上。驱动源码下载地址 http://www.exar.com/common/content/document.ashx?id=20121
2). 装备编译环境
在编译之前,还需求下载 Apalis i.MX6 的 Linux 内核以及穿插编译东西。
a). Apalis i.MX6 的 Linux 内核下载
$ git clone -b toradex_imx_3.14.28_1.0.0_ga-next git://git.toradex.com/linux-toradex.git
b). 穿插编译东西下载
$ wget http://releases.linaro.org/14.11/components/toolchain/binaries/arm-linux-gnueabihf/gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf.tar.xz
$ tar xvf gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf.tar.xz
$ ln -s gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf gcc-linaro
$ export ARCH=arm
$ export PATH=~/gcc-linaro/bin/:$PATH
$ export CROSS_COMPILE=arm-linux-gnueabihf-
留意:上面的途径需求对应穿插编译东西实践解压的目录。
c). 编译 Linux 内核,为 XR17V358 供给必要的装备文件。
$ make apalis_imx6_defconfig
$ make -j4 uImage LOADADDR=10008000
d). 编译 XR17V358 驱动
// 修改 Makefile 文件,将 KERNEL_SRC 指向 Linux 内核地点目录
KERNEL_SRC = /home/ban/Toradex/oe-core-tegra/LinuxKernel/v2.5/mx6/toradex_imx_3.14.28_1.0.0_ga-next/linux-toradex
// 坚持后运转 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]=399121b7862105b185e24b45
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 中能够和其他串口相同正常运用。