embedall--i.mx6ul开发板4G通讯驱动集成与测试!
i.MX 6系列应用处理器是目前NXP主推的一个功能和性能可扩展的多核平台,其中,基于高能效比的ARM Cortex-A7处理器的i.MX 6系列产品,因为具备较强的可扩展性、高性能和低功耗等特性,非常适合目前流行的物联网、车载信息处理、家庭能源管理系统、工控领域等应用。说明:
不久前拿到了盈鹏飞基于ARM Cortex-A7处理器的NXP i.MX 6UL系列处理器的工控板EVB-P6UL,板子适配了高速4G LTE模块!第一眼看到EVB-P6UL,会让人觉得外设资源非常的丰富,到底还是有别于简单的微控制器板,EVB-P6UL板卡采用了核心模块CoM-P6UL以及底板的设计,通过双列直插式排针接口连接,可靠性要比很多SODIMM接口稳定,同时也便于工程师日后的扩展或者直接将核心板移植到现有的项目中去,非常方便!
4G模块用的是华为的ME909s-821
以ME909s-821、EC20-C等4G模块为例,介绍4G模块的Linux下驱动移植、联网测试。
Linux指令提示符,作如下说明:
target$ 以此提示符开头的指令,在EVB-P6UL中执行(目标板上测试所用)
host$ 以此提示符开头的指令,在宿主机中执行(交叉编译所用)
开发环境
宿主机:Ubuntu 14.04.5 LTS ,x86_64,3.13.0-128-generic
嵌入式平台:EVB-P6UL(i.MX6UL)
嵌入式系统:Linux 3.14.38
驱动集成与测试
ME909s-821、EC20-C、SIM7600CE三个模块的驱动安装与联网测试。驱动集成一般流程如下:
ME909s-821驱动集成测试:
华为模块在Linux 侧使用的驱动分为两部分。
自研接口:对应使用的内核驱动名称为option,这部分接口需要将华为模块的驱动适配数据添加到驱动中才能正常使用。
通用接口:如ECM、MBIM。对于这部分接口,华为模块直接适配通用驱动,无需修改代码。
两部分驱动都需要进行内核编译配置项设置,确保驱动编译进内核。
驱动信息:
Linux系统中,ME909s-821配置为多个端口形态,端口次序为1~7,如表所示
在Linux系统【注2】中使用 usb-devices 指令查看模块的详细信息,如图所示:
说明:图中的0、1端口(cdc_ether)分别对应表中NCM端口的1、2,NCM端口不能作为USB串口使用,内核驱动屏蔽该端口,以免映射成USB串口。此外,图中还显示了设备版本、厂商、设备ID等信息。
【注1】NCM端口用于PS(Packet Switch)域数据业务传输。包括两个接口,1为 控制接口,2为数据接口。
【注2】此操作在x86架构的Linux完成,由于EVB-P6UL的文件系统中未移植usb-devices指令,通过USB-MINIPCIE座连接到PC。
备ID还可以使用 lsusb 指令获得。lsusb显示的USB的ID,使用冒号“:”间隔,“:”的左边为Vender ID,右边为Product ID。如图所示
说明:获得一个USB设备的ID,可分别在未安装、安装USB设备,先后执行 lsusb。MINI PCIE接口的模块,不建议带电插拔,以免损坏模块。
驱动集成:
ME909s 的驱动修改,包括两部分:一,USB串口驱动集成;二添加USB零包机制。涉及以下三个内核文件:
imx6u/ include/linux/usb.h
imx6u/drivers/usb/serial/option.c
imx6u/drivers/usb/serial/usb_wwan.c
imx6ul /drivers/usb/serial/usb-wwan.h
USB 串口驱动集成可满足模块最基本功能的使用。USB串口驱动集成,代码修改如下:
步骤1 在 imx6ul/ include/linux/usb.h 头文件中添加宏定义
步骤2 在imx6ul/drivers/usb/serial/ option.c 中的ID列表中,查看是否有ME909s-821的厂商ID与MODEM端口的代码,如图3-4与3-5红色矩形框标注所示。ID列表位于“tic const struct usb_device_id option_ids ”结构体内,如图所示
说明:NCM Serial Port 为通用接口,不需要修改代码。Linux 3.14.38 版本的内核中已经支持NCM驱动,选择该驱动编译即可。
HUAWEI_VENDOR_ID代码清单:
#define HUAWEI_VENDOR_ID 0x12D1
端口代码清单:
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x10) },
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x13) },
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x12) },
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x06) },
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x1B) },
ME909s-821的端口的赋值,由厂商提供,请《HUAWEI Module USB Interface Descriptor Guide》中的3.7.3节,“MODEM Serial Port ”、“DIAG Serial Port ”、“PCUI Serial Port ”、“Ctrl Serial Port ”、“Serial B Port ”各表格的值
说明:以上插图红色矩形框标注内容,对应上图中的usb.h宏定义。若需要添加HUAWEI其他型号的模块,方法类似。
USB零包机制是关于传输数据中零包的处理机制。USB零包机制代码修改如下:
步骤1 在imx6ul/drivers/usb/serial/usb-wwan.h中添加对bcdUSB与华为vid值的定义:
增加对bcdUSB 值的定义:#define HW_bcdUSB 0x0110
增加对华为VID值的定义:#define HUAWEI_VENDOR_ID 0x12d1
代码的添加位置如图红色矩形框标注所示:
代码清单如下:
#define HW_bcdUSB 0x0110
#define HUAWEI_VENDOR_ID 0x12d1
步骤2在imx6ul/drivers/usb/serial/usb_wwan.c源码的usb_wwan_write函数添加定义:struct usb_host_endpoint *ep=NULL;
代码的添加位置如上图红色矩形框标注所示:
代码清单如下:
struct usb_host_endpoint *ep=NULL;
步骤3 在imx6ul/drivers/usb/serial/usb_wwan.c文件的usb_wwan_write函数增加对零包的判断,代码的添加位置如图红色矩形框标注所示
代码清单如下:
if((HUAWEI_VENDOR_ID == port->serial->dev->descriptor.idVendor)
&& (HW_bcdUSB != port->serial->dev->descriptor.bcdUSB)){
ep = usb_pipe_endpoint(this_urb->dev, this_urb->pipe);
if(ep && (0 != this_urb->transfer_buffer_length)
&& (0 == this_urb->transfer_buffer_length %
ep->desc.wMaxPacketSize)){
this_urb->transfer_flags |= URB_ZERO_PACKET;
}
}
配置内核与编译
在宿主机的Linux内核源码根目录执行以下指令,配置内核。添加USB串口驱动的配置选项:
host$ make ARCH=arm menuconfig
依次选择:
Device Drivers--->
[*] USB support--->
<*> USB Serial Converter support--->
<*> USB driver for GSM and CDMA modems
如图红色矩形框标注所示:
配置CDC驱动,依次选择
Device Drivers--->
[*] Network device support--->
USB Network Adapters--->
<*> Multi-purpose USB Networking Framework
<*>CDC Ethernet support (smart devices such as cable modems) (NEW)
-*- CDC NCM support
<*> Huawei NCM embedded AT channel support
<*> Simple USB Network Links (CDC Ethernet subset) (NEW)
如图红色矩形框标注所示:
在宿主机的Linux内核源码目录执行make,编译内核;
host$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
ME909s-821联网测试
在未上电前安装SIM卡、模块,模块连接天线。
将上一节编译的内核,下载到EVB-P6UL。驱动正常的情况下,显示驱动加载信息,并且在/dev目录创建ttyUSB0~ttyUSB4 5个设备节点。如图所示:
驱动加载信息:
模块的端口映射关系如表所示
各端口功能描述如下:
MODEM:MODEM串口,用于拨号上网
DIAG:普通串口,用于调试和收集日志信息
PCUI:用于应用程序进行AT指令通信
Ctrl:用于eCall业务
Serial B:用于配合Diag端口用于模块log收集
使用NDIS协议,在评估板给MODEM端口发送AT指令连接4G网络:
target$ echo "AT^NDISDUP=1,1" > /dev/ttyUSB0
动态获取IP地址:
target$ dhcpcd
查看获取的IP地址情况。如图所示:
target$ ifconfig
注意:网络设备名为usb0,在模块驱动安装时可见该设备。
使用usb0设备,ping外部网络,通则表示ME909s-821工作正常。如图所示:
target$ ping www.embedall.com
可以搞一个4G 工业路由器
很火的!
ljt80158015 发表于 2017-10-31 11:02
可以搞一个4G 工业路由器
很火的!
关注获取更多技术资料!!!谢谢
页:
[1]