最近公司在做降本相关工作,考虑移远 EC20 4G模组成本较高,希望通过更低成本替换硬件,最后找到EC200M芯片,虽然EC200M速率(最大下行10M/s 最大上行5M/s)上低于EC20(最大下行150M/s 最大上行50M/s),基本上可以满足大部分用户场景(中低速)。
公司使用ubuntu armv7架构 内核版本为4.14.111版本,本身系统做了裁剪,不支持EC200M驱动。如果用户在ubuntu上增加移远EC200M驱动,可按照如下步骤操作:
1.如果从移远公司获取到相关驱动包📎Quectel_UMTS_LTE_5G_Linux_USB_Driver_用户指导_V1.1(1).pdf 说明文档
Quectel_Linux_USB_Serial_Option_Driver_20231211压缩包
压缩包含有
文件夹。
这些文件夹主要是对应内核版本驱动的源码。
2.先下载ubuntu系统对应驱动源码,可以通过uname -a /uname -r来查询内核版本,确定对应驱动源码(公司ubuntu系统内核版本为4.14.111,下面都是以此版本为参考点)。
3.接着将驱动源码赋值到宿主机ubuntu系统(因为目标机的性能不一定有编译环境)(本文宿主机系统为ubuntu adm64),然后解压缩。
4.安装交叉编译工具
下载gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar
解压缩 tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar
设置安装目录。
设置交叉编译环境
在/etc/profile 最后一行追加
export PATH=$PATH:"安装目录/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin"
显示如上信息表示安装交叉环境成功。
- 如何内核版本一致,则跳过该步骤,如果-宿主机内核版本和目标机不一样,需要在宿主机上编译内核源码,然后供驱动代码引用。我们的宿主机环境为5.8.0 目标机为4.14.111 版本。所以下载4.14.114内核源码git clone http://github.com/friendlyarm/linux.git -b sunxi-4.14.y --depth 1
- 制作自己config文件,到/home/yangxd/linux/arch/arm/configs/找到自己配置相似或者之前系统配置,我们以 sunxi_defconfig 为例。
开启如下配置:
CONFIG_USB_SERIAL = m
CONFIG_USB_SERIAL_WWAN = m
CONFIG_USB_SERIAL_OPTION =m
- 开始编译内核并按照以下步骤
编译内核请执行该命令
make -j4 zImage dtbs ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 编译内核
编译模块请执行该命令
make -j4 modules ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 编译模块
将模块安装output请执行下面命令
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=output modules_install
将模块安装到内核里请执行下面命令
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules_install
8.进入对应驱动源码的目录下(/home/yangxd/v4.14.111/)。
1.因为驱动源码使用uname -r 获取内核,宿主机和目标机不一致,所以我们修改内核版本为制定版本。
2.修改交叉编译的环境,ARCH=arm CROSS_COMPILE=arm-linux-gnueablihf-
修改红色部分。
9.开始编译驱动
执行make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
生成三个*.ko文件
可以使用readelf -h *.ko 和modinfo *.ko 分别查询当前ko的架构和内核版本是否和目标机一致。
10.复制驱动option.ko,usb_wwan.ko,qcserial.ko到目标机(ubuntun armv7 架构) 复制到/lib/modules/kneral/drivers/usb/serial/
11.然后执行depmod驱动安装,可以使用dmesg查看是否安装成功,如果出现以下信息表示安装成功
- 如果11步骤出现
说明option.ko文件已经内置到build-in中,会加载冲突失败 。如果内核模块加载EC200M驱动,需要重新处理串口option这块。
13.使用移远编写好的串口处理代码 📎usb_serial.zip来解决option.ko加载冲突的问题
14.重新交叉编译补丁源码,类似之前驱动源码编译,修改内核这块
15.生成gsmdriver.ko并把该ko文件发送到目标机中,
将quectel-CM 源码里的那个 default.script 放到 /etc/udhcpc/目录里,
chmod 777 /etc/udhcpc/default.script
16.然后执行depmod命令,就会出现11步骤结果,则表示成功,如果不成功,则重新定位问题,主要错误就是内核版本不一致等等原因
17.解决完之后,就可以执行Quectel_QConnectManager_Linux_V1.6.5.zip编译出quectel-CM进行拨号
18.最终 成功可以使用以下验证。
usb0带有ip地址
route -n 含有 usb路由信息
ping www.baidu.com成功