PCIe转串口芯片CH382/CH384以及PCI转串口芯片CH351/CH352/CH353/CH355/CH356/CH357/CH358/CH359以及使用如上芯片外加CH432/CH438的组合串口转接方案均支持Windows和Linux操作系统,在系统下会生成多个独立的串口,各虚拟串口分别对应一个硬件串口。各串口独立工作,互不影响。本文主要介绍Linux操作系统如何为设备加载厂商串口驱动。


厂商驱动下载链接: CH38XDRV.ZIP - 南京沁恒微电子股份有限公司

厂商驱动Github链接:https://github.com/WCHSoftGroup/ch35_38x_linux

步骤一:解绑系统内置串口驱动1、使能root权限

因如下各操作均需要root权限,可以在终端下通过"sudo su"或“sudo -i”命令开启该权限。当然也可以在后续操作时每条命令前单独加上sudo关键字。

2、确定串口卡状态

Linux内核中,系统启动时会自动加载内置的8250_pci驱动。该驱动包含各厂家PCI/PCIe产品,可以通过lspci命令确认当前硬件的工作状态以及驱动匹配情况。CH35x和CH38x芯片使用的VID有2种:0x1C00和0x4348,命令为:

lspci -vd 1c00:*

lspci -vd 4348:*

运行如上命令后,若设备存在,则会显示如下设备信息:

07:00.0 Serial controller: Device 1c00:3470 (rev 10) (prog-if 05 [16850])
Subsystem: Device 1c00:3470
Flags: fast devsel, IRQ 41
I/O ports at 1000 [size=256]
Memory at 58700000 (32-bit, prefetchable) [size=32K]
I/O ports at 1100 [size=4]
Expansion ROM at 58700000 [size=32K]
Capabilities: [60] Power Management version 3
Capabilities: [68] MSI: Enable- Count=1/32 Maskable+ 64bit+
Capabilities: [80] Express Legacy Endpoint, MSI 00
Capabilities: [100] Advanced Error Reporting
Kernel driver in use: serial
Kernel modules: 8250_pci

如上所示,在“Kernel modules”信息中会显示当前已经为该设备加载的驱动。注:系统内置的可以满足设备基础串口通信的需求,该驱动为串口卡创建的设备名称为:/dev/ttySn,也可以通过dmesg | grep ttyS 通过对比ttyS的IO地址和lspci的地址来确定具体的ttyS通道。

如果需要使用扩展功能,如:支持串口高波特率通讯,开启半双工功能支持RS485串口通讯等,则务必使用厂商单独提供的串口驱动。

3、解绑本地8250_pci串口驱动

执行如下命令:

ls /sys/bus/pci/drivers/serial

如上命令返回内容如下所示:

0000:07:00.0 bind new_id remove_id uevent unbind

使用如下命令完成驱动和设备的解绑:

echo -n “0000:07:00.0” > /sys/bus/pci/drivers/serial/unbind

步骤二:加载厂商串口驱动

1、从开头的链接地址下载驱动到本地,也可以通过git clone。

2、参考驱动文件夹中的README.md文档完成驱动的编译和移植工作。

3、设备存在且工作正常的情况下,驱动会为设备生成名称为“/dev/ttyWCH”开头的串口节点。

若驱动加载时出错,可能原因有:

1、系统当前未发现任何CH35x和CH38x串口卡。

2、系统默认为CH35x和CH38x串口卡分配的IO地址不可用,导致驱动无法成功访问硬件,甚至造成系统Crash。原因:CH35x和CH38x串口卡的相关串口寄存器均位于IO空间内,部分非X86和X64的架构不支持独立编址或者支持分配地址但地址无法通过原生IO地址操作直接访问,此时可联系相应CPU或系统厂商咨询解决方法。

3、若使用CH35x和CH38x与CH43x的组合芯片方案,当主芯片和CH43x的硬件通讯异常,驱动加载也会报错,此时可以更换其他系统平台进行验证以排除原因2的问题。若其他系统上如Windows可以正常工作,则硬件正常,仅检查原因2即可。