1、背景
为了验证展锐原厂的USB CDC EMC(Ethernet Control Model)驱动的上网功能,需要搭建Linux系统。现将整个流程整理如下。
2、环境搭建
安装虚拟机
VMware-workstation-full-16.2.3-19376536.exe
安装Ubuntu系统
ubuntu-16.04.5-desktop-amd64.iso
3、执行终端命令行
3.1 Linux 下使用
Linux 下 Kernel 自带USB 串口、 ECM 和MTP驱动,比较新的版本可能还自带 RNDIS 驱动。但是Linux使用 USB 网卡建议直接用 ECM。
Linux 下 ECM 驱动是通过 CLASS ID 来识别的,所以在Linux下不需要额外装驱动也不需要其他操作就可以被识别。
USB 串口没有标准 CLASS,在Linux要根据PID/VID 去识别。
1) 在命令行下配置
a) 挂载 option 驱动
/sbin/modprobe option
b) 把 8850 可能用到的模式加入 option 驱动的识别列表
# 4D30 可以不加,这个模式通常只在 Windows 下使用
echo 1782 4d11 ff > /sys/bus/usb-serial/drivers/option1/new_id
echo 1782 4d13 ff > /sys/bus/usb-serial/drivers/option1/new_id
echo 1782 4d17 ff > /sys/bus/usb-serial/drivers/option1/new_id
2) 修改 Kernel 代码(最新8850基线版本不需要了,可忽略)
需要修改的文件为 drivers/usb/serial/option.c,在 option_ids 里增加:
// Rndis and four serials
{ USB_DEVICE_AND_INTERFACE_INFO(0x1782, 0x4d11, 0xff, 0, 0) },
// ECM and four serials
{ USB_DEVICE_AND_INTERFACE_INFO(0x1782, 0x4d13, 0xff, 0, 0) },
// Four Serials
{ USB_DEVICE_AND_INTERFACE_INFO(0x1782, 0x4d17, 0xff, 0, 0) }
3.2 shell命令行log
hz47**@hz47**-virtual-machine:~$ sudo -i
[sudo] hz47** 的密码:
root@hz47**-virtual-machine:~# /sbin/modprobe option
root@hz47**-virtual-machine:~# echo 1782 4d11 ff>/sys/bus/usb-serial/drivers/option1/new_id
root@hz47**-virtual-machine:~# echo 1782 4d13 ff>/sys/bus/usb-serial/drivers/option1/new_id
root@hz47**-virtual-machine:~# echo 1782 4d17 ff>/sys/bus/usb-serial/drivers/option1/new_id
root@hz47**-virtual-machine:~# ls /dev/tty*
/dev/tty /dev/tty23 /dev/tty39 /dev/tty54 /dev/ttyS10 /dev/ttyS26
/dev/tty0 /dev/tty24 /dev/tty4 /dev/tty55 /dev/ttyS11 /dev/ttyS27
/dev/tty1 /dev/tty25 /dev/tty40 /dev/tty56 /dev/ttyS12 /dev/ttyS28
/dev/tty10 /dev/tty26 /dev/tty41 /dev/tty57 /dev/ttyS13 /dev/ttyS29
/dev/tty11 /dev/tty27 /dev/tty42 /dev/tty58 /dev/ttyS14 /dev/ttyS3
/dev/tty12 /dev/tty28 /dev/tty43 /dev/tty59 /dev/ttyS15 /dev/ttyS30
/dev/tty13 /dev/tty29 /dev/tty44 /dev/tty6 /dev/ttyS16 /dev/ttyS31
/dev/tty14 /dev/tty3 /dev/tty45 /dev/tty60 /dev/ttyS17 /dev/ttyS4
/dev/tty15 /dev/tty30 /dev/tty46 /dev/tty61 /dev/ttyS18 /dev/ttyS5
/dev/tty16 /dev/tty31 /dev/tty47 /dev/tty62 /dev/ttyS19 /dev/ttyS6
/dev/tty17 /dev/tty32 /dev/tty48 /dev/tty63 /dev/ttyS2 /dev/ttyS7
/dev/tty18 /dev/tty33 /dev/tty49 /dev/tty7 /dev/ttyS20 /dev/ttyS8
/dev/tty19 /dev/tty34 /dev/tty5 /dev/tty8 /dev/ttyS21 /dev/ttyS9
/dev/tty2 /dev/tty35 /dev/tty50 /dev/tty9 /dev/ttyS22 /dev/ttyUSB0
/dev/tty20 /dev/tty36 /dev/tty51 /dev/ttyprintk /dev/ttyS23 /dev/ttyUSB1
/dev/tty21 /dev/tty37 /dev/tty52 /dev/ttyS0 /dev/ttyS24 /dev/ttyUSB2
/dev/tty22 /dev/tty38 /dev/tty53 /dev/ttyS1 /dev/ttyS25 /dev/ttyUSB3
3.3、效果
模组激活PDP后,连接虚拟机设备,查看有线网络参数
使用USB CDC ECM驱动,打开火狐浏览器上网
4 注意事项
4.1 Linux 下的串口设备通常不是按照 Interface ID 顺序排列的
插入usb 就可以看到 ttyUSB{*} device。因为Linux下 tty 设备不显示设备名称,所以需要使用 udevinfo 来确认具体设备对应端口。注意 ttyUSB0 通常不是 Port0。
udevadm info –n /dev/ttyUSB{0-5}
看其中的 ID_USB_INTERFACE_NUM=${id}:对于 pid 4d17,id 是 0-3;对于pid 4d13,id 是 2-5。从小到大依次对应 Windows 下的 *Port0 - *Port3。
如果想给固定端口指定名称的话可以通过增加 udev rules 来解决。
增加文件 /etc/udev/rules.d/98-unisoc-usb-udev.rules ,加入下述内容
# 给串口起别名,这样第一个串口就会被改名为 /dev/unisoc.at,想要增加其他端口类似方式
SUBSYSTEM=="tty", ATTRS{idVendor}=="1782", ATTRS{idProduct}=="4d17", ENV{ID_USB_INTERFACE_NUM}=="00", SYMLINK+="unisoc.at"
SUBSYSTEM=="tty", ATTRS{idVendor}=="1782", ATTRS{idProduct}=="4d13", ENV{ID_USB_INTERFACE_NUM}=="02", SYMLINK+="unisoc.at"
4.2 Linux 下的 modem manager 可能会自作主张操作 ttyUSB 设备
此问题通常只出现在 Linux 桌面 PC 上,同样可以在 udev rules 增加信息来解决。
在上面的文件 /etc/udev/rules.d/98-unisoc-usb-udev.rules 中增加几行
# 禁止 Modem Manager 访问串口
ATTRS{idVendor}=="1782", ATTRS{idProduct}=="4d11", ENV{ID_MM_DEVICE_IGNORE}="1"
ATTRS{idVendor}=="1782", ATTRS{idProduct}=="4d13", ENV{ID_MM_DEVICE_IGNORE}="1"
ATTRS{idVendor}=="1782", ATTRS{idProduct}=="4d17", ENV{ID_MM_DEVICE_IGNORE}="1"
4.3 ECM 和 RNDIS 虽然是即插即用,但是前提需要激活网络
可以设置开机自动激活,也可以使用 AT 命令激活
# AT 命令激活
AT+CFUN=1
AT+CGDCONT=5,"IP"
AT+CGACT=1,5
4.4 MTP模式虽然是即插即用,但是需要提前准备好存储文件夹
#建立FLASH分区mtp根目录
AT+FSMKDIR="/mtp"
#查看是否成功创建mtp根目录
AT+FSLSTFILE="/"
4.5 其他
RNDIS 在多数Linux PC 上也可以正常使用,但是支持的并不如 Windows,建议Linux 下网卡仍选用 ECM。
5、后续工作
通过本文档得出模组ECM驱动是OK的,后续需要把模组直接接在具有Linux系统的板卡下上网,比如正点原子提供的阿尔法开发板,这需要具备相关Linux开发能力,涉及固件编译和下载、驱动开发调试、系统移植和优化等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)