ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

移远EC20 4G模块驱动实战:配置与拨号,而非写源码

移远EC20 4G模块驱动实战:配置与拨号,而非写源码 简介移远EC20 4G模块驱动程序源码面向嵌入式开发者适用于在Android与Linux平台快速集成EC20模块、实现4G通信功能。压缩包重点覆盖USB、GobiNet、CMUX三种接口驱动并深入讲解驱动基础、模块特性、平台集成、调试日志等知识能够帮助开发者掌握从硬件交互到系统级软件工程的完整链路。资源共59个文件包含25个PDF规格与说明文档、11个C源码、8个H头文件、8个ZIP工程/驱动包以及Makefile、脚本等整体大小约43.63MB文档与源码结合便于按模块查阅和编译调试。已有1520人学习下载。通过研读源码和配套说明可快速掌握EC20在Linux内核模块加载、Android HAL层对接及CMUX多逻辑通道管理中的实现要点并借助dmesg和logcat等工具解决常见驱动问题具有较强的工程参考价值。 我印象里第一次真正摸到移远EC20还是在做一个户外数据采集终端的时候。主控用的NXP i.MX6ULL系统跑Linux 4.1.15板子要跟云端服务器保持长连接实时回传GPS位置和传感器数据对网络的稳定性要求很高。当时硬件同事把EC20焊在底板上SIM卡槽、天线接口一堆东西排得密密麻麻然后跟我说“软件你来搞定”。说实话接到“移远EC20的4G模块驱动程序源码”这个需求时我最想说的第一句话是EC20这模块压根就不需要你自己去写什么“驱动程序源码”啊。这里要先给做嵌入式的新手朋友吃颗定心丸。EC20走的是标准的USB接口工作在Linux系统下时用的是内核里现成的USB Serial / CDC-ACM / RNDIS驱动框架。也就是说真正要做的不是“写驱动”而是“配驱动”加“编驱动”。你做的工作是让内核把EC20正确识别成网卡或串口设备再把这层通道管好、用好。这篇文章我想从驱动框架、内核配置、设备树、拨号流程和实际排查这几个维度把我这几年在项目里折腾EC20的经验完整梳理一遍希望对正在跟4G模块较劲的朋友有点实际帮助。1. 整体设计与驱动思路拆解1.1 为什么说EC20驱动的核心不在“源码”而在“配置”很多刚入行的人一听到“模块驱动”第一反应是翻代码、看懂USB控制传输、写一堆URB请求之类的。EC20的特别之处在于它把复杂度基本都屏蔽在了模块内部。模块通过USB连接主控后在内核视角里就是一个标准的USB复合设备——一侧是AT命令通道一侧是数据通道。AT命令通道对应内核的usbserial驱动数据通道根据你设置的工作模式可以是CDC-ECM虚拟网卡也可以是RNDIS虚拟网卡。所以驱动适配真正要做的是把内核编译出对应的USB串口驱动、RNDIS驱动或者CDC-ECM驱动再处理一下设备树里的USB控制器配置让USB Host控制器能正常枚举到设备。等你执行lsusb能看到“Qualcomm / Option”字样的设备后EC20就已经被系统“认识”了剩下的是拨号链路怎么建起来的问题。1.2 EC20的三种工作模式与选型场景EC20通过AT指令可以切换数据通道的工作模式常用的就三种。RNDIS模式是最省事的模块内部自带网卡功能USB枚举出来直接是一张虚拟网卡之后PPP、拨号、DNS这些事情全部不需要你操心。主控端只要配好IP和路由就能上网开发量最小适合追求快速上线的设备。代价是性能和效率略低但绝大多数物联网场景完全够用。CDC-ECM模式跟RNDIS很相似也是枚举成网卡区别是它走的是标准ECM协议。Linux原生支持很好macOS、Android这些系统也认但Windows对ECM的兼容性有时候会闹脾气PC端做测试时会麻烦一点。PPP模式是一个串口扛数据。EC20拨号上网后通过串口链路跑PPP协议数据走的是AT串口那一条线。这种模式代码层面比较老派而且波特率受限实际吞吐率比网卡模式差不少现在新项目基本不推荐了。实际项目里如果主控性能不差指能跑得动USB Host协议栈优先选RNDIS。如果你用的是单片机外部USB Host芯片这种方案也许PPP或一个串口的透传方案会更现实但那属于另一条技术路线了。1.3 关于“源码”这件事很多项目里其实都是现成的聊回“移远EC20的4G模块驱动程序源码”这个标题。我理解大家搜这个词想要的是“能在我的板子上把EC20跑起来的那份代码”。但这个代码不是一个单独的文件而是分散在内核、总线驱动、拨号工具和设备树里的。比如当你把内核配置成支持CONFIG_USB_SERIAL_OPTIONEC20的AT口通常就会被识别成/dev/ttyUSB0、/dev/ttyUSB1这样的设备节点。当你配置了CONFIG_USB_NET_DRIVERS和CONFIG_USB_RNDIS_HOSTRNDIS网卡就出来了。移远官方提供的驱动包我也看过主要就是针对一些老内核、非标准USB描述符做的补丁以及编译脚本和说明文档。内核版本如果够新这些补丁大多已经收入主线不需要你再打一遍。所以别被“源码”两个字吓到。你需要的是一份清晰的编译配置而不是从零开始写驱动。认清这个逻辑整个EC20的对接周期能缩短一半以上。2. 驱动配置与设备树详细拆解2.1 内核裁剪时的关键配置项我以Linux 4.15以上的内核为例给你列一份可以直接抄作业的配置清单。这些配置项决定了内核能不能正确识别EC20并创建网卡节点。首先USB串口驱动一定要开。AT命令通路全靠它这是调试EC20的基础。对应配置项是CONFIG_USB_SERIAL和CONFIG_USB_SERIAL_OPTION。开了之后模块插上USB口正常会枚举出三个串口节点分别对应AT命令、PPP数据和日志调试。其次网络相关配置要开。如果你用RNDIS需要打开CONFIG_USB_NET_DRIVERS和CONFIG_USB_RNDIS_HOST。如果你用CDC-ECM开CONFIG_USB_NET_CDC_EEM或CONFIG_USB_NET_CDC_MBIM。顺手把CONFIG_USB_NET_QMI_WWAN也开了吧Quectel不少模块支持QMI方式这个驱动是内核里的一个标准驱动跟EC20代码无关但很可能能帮你多一条路。协议层方面CONFIG_PPP相关选项建议全部打开。哪怕你主要用RNDIS总有需要PPP做备用的场景。我在调试的时候习惯做好两手准备先用串口把AT命令调通再上RNDIS。真到了现场发现RNDIS拨号不稳退到PPP至少还能把数据回传保住。2.2 设备树里必须处理的USB控制器节点在主控侧要让EC20正常工作设备树里通常不需要为EC20本身增加什么特殊属性但USB Host控制器的状态必须是“okay”而且供电和复位引脚要理清楚。例如i.MX6ULL的板子设备树里usbotg1这个节点需要确认是dr_mode host或者otg但实际作为Host用并且vbus-supply接的电源节点要真实存在且能输出5V。很多板子Debug的时候发现EC20没反应先查这个而不是去改驱动。有些硬件设计里USB_HOST_EN这个引脚控制VBUS输出GPIO默认状态不对EC20就完全不工作了。这时候驱动程序怎么调都没用硬件上电时序就不对。所以设备树最重要的是确保USB控制器、电源、时钟这几个基础节点干净可靠。2.3 驱动编译的一个实操示例我习惯用SDK交叉编译而不是直接在板子上编译内核。以Yocto或Buildroot为例进入内核目录执行make ARCHarm menuconfig然后按上面的配置项逐个确认保存退出后执行编译。make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- zImage -j8 make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- dtbs编译完成后把新的zImage和dtb文件替换到SD卡的启动分区。这一步最容易踩的坑是忘了重新编译设备树只更新了内核镜像结果GPIO配置不对USB Host无法正常工作。我在一个项目上因为这个反复排查了半天最后发现设备树居然还是旧版本那叫一个郁闷。替换完启动文件插上EC20模块或者模块已经焊在板上开机后在串口控制台执行lsusb如果能看到类似2c7c:0125这样的ID说明USB枚举成功了驱动已经识别了EC20。这个2c7c是移远的厂商ID0125是EC25/EC20系列常见的产品ID看到它就相当于系统打了招呼“你好EC20”。然后查看串口节点ls /dev/ttyUSB*正常会看到/dev/ttyUSB0、/dev/ttyUSB1、/dev/ttyUSB2三个节点。到此EC20的“驱动源码”工作已经全部做完剩下的就是AT命令和拨号。3. 拨号流程、网络配置与云平台接入实战3.1 先用AT命令确认模块和SIM卡状态驱动起来后第一件事不是急着拨号而是先用AT命令确认模块状态。我用的是minicom或者直接echo重定向的方式。先简单发一个AT模块应该返回OK。echo -e AT\r /dev/ttyUSB0如果连OK都没有先查串口节点权限、模块是否处于开机状态。EC20有个PWRKEY引脚相当于电源开机键。硬件上如果没用MCU的GPIO控制PWRKEY默认电平不对模块根本不会启动。这时候看起来就是lsusb正常但AT无响应我遇到过不止一次。AT返回OK后再检查SIM卡ATCPIN?预期返回CPIN: READY说明SIM卡识别成功。如果返回CME ERROR: SIM not inserted或SIM failure就要查SIM卡座的时钟、复位、IO线还有SIM卡本身是不是没插紧。接着查信号强度和服务注册状态ATCSQ ATCEREG?CSQ返回类似CSQ: 20,0这样的值前一个数字范围从0到31越大信号越好。我记得有一次在现场看到返回值是99那就是“无信号”但问题不是欠费也不是天线没接而是设备放在地下室。3.2 RNDIS方式拨号上网的完整步骤确认AT命令没问题后切到RNDIS模式。这一步要小心因为模式切换后USB设备会重新枚举串口节点会短暂断开再出现。ATQCFGusbnet,2设置完成后给模块一个复位指令让设置生效ATCFUN1,1复位之后重新查看lsusb这时候设备除了原有的串口应该多出一个网卡。在内核日志里也能看到类似rndis_host的驱动绑定信息。用ifconfig -a查看会看到usb0这样的虚拟网卡接口。然后配置IP地址和路由。RNDIS模式下模块通常自带DHCP服务可以直接用udhcpc获取地址udhcpc -i usb0或者手动分配一个静态IP。手动分配的IP要跟EC20自己所在的网段匹配。我记得EC20默认的子网是192.168.225.x模块自身通常是192.168.225.1客户端分配192.168.225.2即可。ifconfig usb0 192.168.225.2 netmask 255.255.255.0 up route add default gw 192.168.225.1这里有个细节需要注意如果板子同时有以太网口和4G网卡默认路由会冲突。你需要明确指定哪张网卡是默认出口否则数据明明走了网线你却还以为4G模块坏了。我的做法是先把其他网卡down掉或者用ip route精确配置源路由和优先级。3.3 PPP拨号的备选方案如果你因为某些原因必须走PPP模式比如RNDIS在当前内核下有问题或者主控的USB控制器带宽受限那么PPP拨号流程还是要熟悉的。首先设置模块为PPP模式ATQCFGusbnet,0然后重启模块。这时候lsusb看到的设备结构会变化数据通道不再表现为网卡而是作为串口存在。接着用pppd拨号pppd call ec20-ppp /etc/ppp/peers/ec20-ppp文件可以这样写/dev/ttyUSB0 115200 defaultroute noipdefault usepeerdns connect /usr/sbin/chat -v -f /etc/ppp/chat-ec20对应的/etc/ppp/chat-ec20拨号脚本核心就是发送AT命令建立PPP连接TIMEOUT 30 ABORT ERROR ABORT BUSY AT OK ATCGDCONT1,\IP\,\cmnet\ OK ATD*99# CONNECT 拨号成功后ifconfig里会看到ppp0接口并且自动获取到一个运营商分配的公网/内网IP。走PPP时网速会明显低于RNDIS但这个方案的兼容性确实更好尤其是在一些内核驱动有bug的老平台上PPP是保底的选择。3.4 接上云平台EC20的最后一公里驱动和拨号都通了接下来自然就是上云。EC20本身不关心你用哪个云平台对于它来说就是TCP/UDP数据包。合宙Air724是另一条产品线但云平台对接的逻辑是通用的——CoAP、MQTT、HTTPEC20全都支持。我之前用EC20接通过移动云平台OneNET。最简单的方式是用两路透传。EC20的模块里支持ATQMTOPEN、ATQMTCONN这些MQTT相关指令可以直接用AT命令操作MQTT连接。举个例子ATQMTOPEN0,183.230.40.96,1883 ATQMTCONN0,client_id,username,password ATQMTPUB0,0,0,0,topic,hello from ec20如果用OneNET的旧版协议需要在topic里带上设备ID和APIKey数据格式用JSON。这块如果你用的是其他云平台比如阿里云物联网套件原理一样区别在域名、端口、三元组和topic的格式。EC20内嵌的协议栈其实已经很强大了真正让人头疼的反而是鉴权方式和时间戳同步这些细节。我在一个智慧农业项目里就是用EC20的MQTT透传指令把温湿度数据发到云端。测试时先本地起一个MQTT Broker用的mosquitto让模块直接发数据到PC的IP这样调试起来方便很多。等本地通了再切到公网服务器。这个“先本地、后公网”的调试习惯能帮你把网络问题和云平台问题分开排查。4. 常见问题与排查技巧实录4.1 模块识别到了但AT无响应这个现象我碰到过很多次。lsusb能看到厂商ID但发AT死活不回。一般来说先确认你操作的是不是AT命令串口。EC20枚举出来的三个串口ttyUSB0是AT命令口ttyUSB1一般也是AT口或者日志口ttyUSB2是数据口。你用错口了命令发出去没人理。另一个常见原因是模块没真正开机。PWRKEY的电平时序不对模块只处于USB枚举态但基带部分没有启动。用手头一个GPIO来拉高PWRKEY并保持500ms以上模块才算彻底开机。复位过模块后等3到5秒再发AT太急了也不行。4.2 网卡有了但ping不通外网RNDIS模式下网卡能起来说明USN底层的驱动链路是好的。这时候ping不通大概率是路由问题或者DNS没配。先ping 114.114.114.114通了说明网络通再ping www.baidu.com不通就是DNS。DNS配置文件在/etc/resolv.conf加一行nameserver 223.5.5.5阿里DNS或nameserver 114.114.114.114就行。如果你用的udhcpc它会自动覆盖resolv.conf不用手动改。如果连114.114.114.114都ping不通查一下模块是否真的注册上网络。发ATCEREG?看返回1是已注册5是漫游。如果返回3表示被拒绝那基本就是SIM卡欠费、套餐不匹配或者APN设置错了。物联网卡经常需要手动设置APN比如ATCGDCONT1,IP,cmiot如果APN不对数据通道根本建立不起来。4.3 RNDIS网卡时通时断这通常是USB信号质量问题。EC20走的是USB 2.0USB D/D-两根线上的信号完整性非常重要。如果PCB布线时走线过长又没有包地插拔或者震动时就会导致USB总线复位网卡反复掉线。我遇到过一款手持设备电池电压低的时候模块就重启后来查了硬件发现USB_VBUS的电源纹波太大。给模块单独加一颗低ESR的钽电容并在靠近模块VBUS引脚处加一个0.1uF去耦电容问题就消失了。软件层面可以给USB控制器开启USB_DISABLE_AUTOSUSPEND这类配置防止系统在模块空闲时把USB总线挂起导致掉线。很多嵌入式Linux发行版默认开启了USB autosuspend对4G模块这种低功耗但需要保持长连接的外设来说这功能就是坑。4.4 云平台接入失败如果你确认本地网络通了但连接云平台就是失败先检查本地时间。很多物联网云平台的鉴权依赖时间戳设备如果没做NTP同步时间偏差过大会直接被服务器拒绝。我踩过一次这个坑设备跑了好几个月没校时某一天突然再也连不上服务器了后来一查是系统时间差了太多天。另一个是端口被封。有些平台默认用的端口是8083、1883、5683这些端口在某些企业网络或运营商的APN策略下可能被限制。如果你是在客户现场测试第一时间换4G热点验证模块本身没问题再逐步排查APN和路由。4.5 关于Windows侧驱动的一个小提醒有朋友拿到EC20会先插在Windows电脑上用官方驱动跑AT命令很正常。如果你在Windows侧遇到“无法验证驱动程序的数字签名”之类的问题这不是模块坏了是驱动签名策略在作怪。嵌入式开发还是建议主力在Linux下搞Windows就当个串口调试工具用。如果非要在Windows下用一定要先装移远官方提供的带签名驱动注意版本对应别装错了32位和64位。5. 硬件设计上配合驱动稳定工作的几个细节5.1 模块开关机检测电路的设计思路驱动能正常工作离不开硬件的配合。EC20的PWRKEY引脚不是简单的上拉或下拉就能搞定的它需要的是一个脉冲信号。硬件设计上用MCU的一个GPIO通过开漏或推挽输出引到PWRKEY然后在PWRKEY引脚上做一个上拉电阻到模块的VBAT。开机时MCU将PWRKEY拉低至少500ms模块就会启动。有些设计会加上复位检测通过模块的STATUS引脚输出模块工作状态拉高代表模块已开机。这个引脚可以接到MCU的一个普通GPIO中断上用于异常时判断模块是死机了还是只是通信断了。我在产品设计的时候会让硬件把STATUS引出来软件每隔一段时间读一次发现模块掉电就尝试重新点PWRKEY开机这对户外无人值守设备来说特别重要。5.2 天线与信号完整性的经验驱动调整得再好天线匹配不好一切都是白搭。EC20的主天线需要走50欧姆阻抗线并尽量短远离高频干扰源。如果在金属外壳里天线位置必须净空否则信号衰减非常严重。我见过一个样机IPEX天线座子离USB线太近一接USB信号从-65dBm直接掉到-100dBm以上整块板子的数据完全传不出去。分集天线Rx Diversity在一些弱信号场景作用明显有条件就接上。GPS天线如果模块带GPS功能信号走的是无源陶瓷天线或有源天线要特别注意供电和LNA噪声系数。5.3 这模块的供电是整个系统的生命线EC20在发射瞬间电流可能飙到2A这对供电设计是个不小的考验。之前测试中发现如果电源走线太细或者供电能力不足模块会在信号差时反复重启因为发射功率一大电压就被拉低到模块的欠压保护阈值以下。稳妥的方案是模块供电电压要大于模块的欠压阈值并在靠近模块的地方放置一个大容量储能电容比如330uF以上的电容然后在这个电容后面再放置一个100uF的陶瓷电容组合。4G模块的工作电压范围一般是3.4V到4.3V推荐4.0V左右。如果用3.3V的电源给模块供电大概率会不稳定。这条经验听着基础但至少救过我两个项目。6. 关于驱动“移植”到不同主控平台的经验6.1 高通平台、NXP i.MX、瑞芯微、全志EC20的驱动在不同主控上的差别主要是USB Host驱动和电源管理框架的差异。NXP i.MX6ULL的内核比较干净RNDIS驱动基本直接能编过瑞芯微的Rockchip SDK一般也没问题但要注意它们的电源域配置全志的SDK有时候会带一些奇怪的老补丁可能会导致USB枚举不稳定。我的建议是移植之前先不要动任何驱动代码先把原厂SDK默认的内核编译通过然后直接在menuconfig里打开EC20需要的配置项编译烧录验证lsusb能不能识别。能识别后再考虑改设备树、调整GPIO不要一上来就折腾驱动源码否则很难定位问题。6.2 从Linux 3.x老内核迁移到新内核如果你手里的板子SDK用的是远古的Linux 3.x内核而你想让EC20跑得稳最省力的办法是不要自己移植EC20驱动补丁而是升内核或者用PPP模式。老内核的RNDIS驱动质量参差不齐一旦数据量大就会出现网卡死掉、内核报transfer event with invalid urb status之类的问题。与其花时间打补丁不如切换到PPP模式先把业务跑通把升内核的计划排到后面。我有个项目是在Linux 3.10的内核上做迁移最后还是老老实实升级了内核到4.19。升级完以后EC20基本是零成本驱动RNDIS稳定跑了一年没出过问题。老内核可能积累了很多历史包袱新内核的驱动质量和维护度好很多。7. 一个完整的快速验证清单最后我把自己每次调试EC20时必走的流程整理成一个清单你可以直接对着打勾。硬件上电确认模块VBAT电压在3.4V-4.3V之间用示波器看PWRKEY时序确保拉低超过500ms。Linux启动后执行lsusb看到2c7c:0125确认USB枚举成功。查看dmesg | grep -i usb确认rndis_host或option驱动绑定成功。执行ls /dev/ttyUSB*确认串口节点出现。用minicom或echo发AT确认OK。ATCPIN?确认SIM卡READY。ATCSQ确认信号强度最好在15以上。ATCEREG?确认网络注册正常。确认RNDIS网卡接口名usb0或eth1配置IP和路由。ping通114.114.114.114再ping通域名验证DNS。连接云平台发一条测试数据确认端到端链路OK。这一套下来如果有一条不通过就用串口加上dmesg日志基本都能定位到是硬件、内核、网络还是云平台的问题。EC20这个东西说复杂也确实复杂涉及USB、网络协议栈、SIM卡、天线、电源等一堆环节但说简单也真的简单毕竟驱动层面大部分都给你准备好了。我在实际项目里的体会是与其花时间找什么“EC20驱动源码”不如先把内核配置、设备树、拨号流程这三大件吃透再抓住信号、供电、路由几个关键的坑基本上就能让模块稳稳当当地跑起来。最后再分享一个小技巧如果你在做物联网设备别把EC20只在用的时候才开机建议让它常驻在线配合模块自身的低功耗模式比如ATQCFGsleep,1来平衡功耗。这样云端下发指令时设备随时能收到现场调试也会顺畅很多。希望你们的产品也能顺顺利利跑起来少踩几个坑。本文还有配套的精品资源点击获取
返回列表