I.MX6UL评估板4G模块的驱动集成与测试

来源:互联网 发布:js 定义集合对象 编辑:程序博客网 时间:2024/06/05 01:53
之前跟大家分享过I.MX6UL评估板3G模块调试。




现在跟大家分享下关于4G的

驱动集成与测试:
ME909s-821、EC20-C、SIM7600CE三个模块的驱动安装与联网测试。驱动集成一般流程如下:

ME909s-821驱动集成与测试:

华为模块在Linux侧使用的驱动分为两部分。
l  自研接口:对应使用的内核驱动名称为option,这部分接口需要将华为模块的驱动适配数据添加到驱动中才能正常使用。
l  通用接口:如ECM、MBIM。对于这部分接口,华为模块直接适配通用驱动,无需修改代码。
两部分驱动都需要进行内核编译配置项设置,确保驱动编译进内核。
驱动信息
Linux系统中,ME909s-821配置为多个端口形态,端口次序为1~7,如表3-1所示:
在Linux系统【注2】中使用 usb-devices指令查看模块的详细信息,如图3-1所示:
说明:图中的0、1端口(cdc_ether)分别对应表中NCM端口的1、2,NCM端口不能作为USB串口使用,内核驱动屏蔽该端口,以免映射成USB串口。此外,图中还显示了设备版本、厂商、设备ID等信息。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif【注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。如图3-2所示:
说明:获得一个USB设备的ID,可分别在未安装、安装USB设备,先后执行lsusb。MINI PCIE接口的模块,不建议带电插拔,以免损坏模块。
驱动集成
         ME909s 的驱动修改,包括两部分:一,USB串口驱动集成;二添加USB零包机制。涉及以下三个内核文件:
l  imx6u/ include/linux/usb.h
l  imx6u/drivers/usb/serial/option.c
l  imx6u/drivers/usb/serial/usb_wwan.c
l 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 ”结构体内,如图3-6所示:
说明:NCMSerial Port为通用接口,不需要修改代码。Linux 3.14.38版本的内核中已经支持NCM驱动,选择该驱动编译即可。关于选中NCM驱动,请参考下文的 3.1.3配置内核与编译
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) },

图3-4中,ME909s-821的端口的赋值,由厂商提供,请《HUAWEIModule USB Interface Descriptor Guide》中的3.7.3节,MODEM Serial Port ”、“DIAG Serial Port ”、“PCUI Serial Port ”、“Ctrl Serial Port ”、“Serial B Port ”各表格的值。如图3-7~图3-11红色矩形框标注所示:

说明:以上插图红色矩形框标注内容,对应图3-3中的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

代码的添加位置如图3-12红色矩形框标注所示:
代码清单如下:
#define HW_bcdUSB 0x0110
       #define HUAWEI_VENDOR_ID 0x12d1
步骤2  在imx6ul/drivers/usb/serial/usb_wwan.c源码的usb_wwan_write函数添加定义:structusb_host_endpoint *ep=NULL;

代码的添加位置如图3-13红色矩形框标注所示:
代码清单如下:
       struct usb_host_endpoint *ep=NULL;

步骤3 在imx6ul/drivers/usb/serial/usb_wwan.c文件的usb_wwan_write函数增加对零包的判断,代码的添加位置如图3-14红色矩形框标注所示:

代码清单如下:
      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$ makeARCH=arm menuconfig
       依次选择:
       Device Drivers  --->
              
  • USB support  --->
  •                      <*>   USB Serial Converter support  --->
                                <*>USB driver for GSM and CDMA modems
           如图3-15红色矩形框标注所示


    配置CDC驱动,依次选择
           Device Drivers  --->
                  
  • Network device support  --->
  •                      USB Network Adapters  --->
                                <*> Multi-purpose USB NetworkingFramework
                                       <*>  CDC Ethernet support (smart devices such ascable modems) (NEW)
                                       -*-   CDC NCM support
                                       <*>   Huawei NCM embedded AT channel support
                                       <*>   Simple USB Network Links (CDC Ethernetsubset) (NEW)
    如图3-16红色矩形框标注所示:




    ME9090S-821联网测试
    在未上电前安装SIM卡、模块,模块连接天线。
           将上一节编译的内核,下载到EVB-P6UL驱动正常的情况下,显示驱动加载信息,并且在/dev目录创建ttyUSB0~ttyUSB4 5个设备节点。如图3-17所示:






    各端口功能描述如下:
    l  MODEM:MODEM串口,用于拨号上网
    l  DIAG:普通串口,用于调试和收集日志信息
    l  PCUI:用于应用程序进行AT指令通信
    l  Ctrl:用于eCall业务
    l  Serial B:用于配合Diag端口用于模块log收集
    使用NDIS协议,在评估板给MODEM端口发送AT指令连接4G网络:
    target$echo "AT^NDISDUP=1,1" > /dev/ttyUSB0
           动态获取IP地址:
    target$dhcpcd
           查看获取的IP地址情况。如图3-18所示:
    target$ifconfig


    注意:网络设备名为usb0,在模块驱动安装时可见该设备(见图3-17)。
    使用usb0设备,ping外部网络,通则表示ME909s-821工作正常。如图3-19所示:
    target$ping www.embedall.com
    EC20-C 驱动集成与测试
    EC20-C的驱动使用模块官方提供GobiNet,而非USB CDC子类协议。使用GobiNet驱动与APN工具联网,有别于CDC EMC,方法在下文中介绍。
    驱动信息:
    EC20模块的端口映射关系如表3-3所示:
    其中,/dev/ttyUSB0~3为USB串口,第四个接口用于网络连接。
          在Linu系统中使用 usb-devices 指令查看模块的详细信息,如图3-20所示:

    说明:从图中并未看到CDC相关的驱动端口,使用模块配套的驱动程序。

    驱动集成:
    EC20驱动集成,首先添加USB串口驱动,然后解除USB串口驱动对NDIS接口的绑定,最后将驱动程序添加到内核源码树中。
    添加串口驱动
           若想Linux支持USB串口,需在option.c文件的ID列表中添加设备ID。过程如下:
    步骤1在内核源码的imx6ul/drivers/usb/serial/option.c文件的option_ids列表中添加EC20的ID。如图3-21、3-22红色矩形框标注所示:

    代码清单如下:
           #defineQUECTEL_VENDOR_ID                        0x2c7c
           #defineQUECTEL_PRODUCT_EC20                   0x0125
    代码清单如下:
           {USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC20) },
    解绑NDIS接口
           步骤1在内核源码的imx6ul/drivers/usb/serial/option.c文件的option_probe结构体添加以下语句。如图3-23所示;



    代码清单如下:
               if (dev_desc->idVendor ==cpu_to_le16(0x2c7c) &&
                dev_desc->idProduct ==cpu_to_le16(0x0125) &&
                iface_desc->bInterfaceNumber ==0x04)
                    return -ENODEV;
    添加驱动程序
           Quectel提供了EC20的源码与APN工具。如图3-24所示:
    步骤1、把GobiNet驱动源码保存到imx6ul/drivers/net/usb目录。即,图3-20“Quectel_Linux_GobiNet_SR01A02V15.zip”文件中“src”目录下的*.c与*.h文件。
    host$ cp../Quectel_Linux_GobiNet_SR01A02V15/src/*.c  drivers/net/usb/
    host$ cp../Quectel_Linux_GobiNet_SR01A02V15/src/*.h  drivers/net/usb/

    步骤2、添加内核配置菜单,将“config USB_GOBI_NET”到imx6ul/drivers/net/usb/Kconfig中。如图3-25红色矩形框标注所示:
    代码清单如下:
    config USB_GOBI_NET
            tristate"Gobi USB Net driver for Quectel module"
            help
            Support Quectelmodule.
            
            A modemmanager with support for GobiNet is recommended.
            Tocompile this driver as a module, choose M here: the module will be calledGobiNet.

    步骤3、修改imx6ul/driver/net/usb/Makefile,Makefile文件的末尾添加图3-26红色矩形框标注的内容。
    代码清单如下:
    obj-y += GobiNet.o

    GobiNet-objs := GobiUSBNet.o QMIDevice.o QMI.o

    配置内核与编译
    在宿主机的Linux内核源码根目录执行以下指令,配置内核。添加GobiNet驱动:
    host$make ARCH=arm menuconfig
    Kernel Configuration 界面,依次选择:
           DeviceDrivers  --->
             
  • Network device support  --->
  •                 USB Network Adapters  --->
                         <*>Gobi USB Net driver for Quectel module
    如图3-27所示:
    在Linux内核源码目录执行make,编译内核:

    host$make ARCH=armCROSS_COMPILE=arm-linux-gnueabihf-
    移植APN工具
    解压Quectel_Linux_ConnectManager_SR01A01V21.zip,并交叉编译。
    host$ unzip -x Quectel_Linux_ConnectManager_SR01A01V21.zip
    host$ make CROSS_COMPILE=arm-linux-gnueabihf-          //APN工具源码目录编译

           编译完成后,生成APN工具,名为quectel-CM。如图3-28所示;

    EC20-c联网测试
    在未上电前安装SIM卡、模块,模块连接天线。
           将3.2.3节编译的内核,下载到EVB-P6UL。驱动若正确加载,显示图3-29所示的信息:


    从上图可以看出,网络设备为eth1,在/dev目录分别穿件了USB串口ttyUSB0~3 ,以及qcmqi1设备。以上信息说明驱动已经正确加载。
           将APN工具下载到评估,先查看该是否有执行权限,再拨号。成功拨号后会获取IP,如图3-30所示:
    target$ ./quectel-CM &

    说明:quectel-CM 拨号工具需要udhcpc 指令支持,请确保文件系统中有该指令。驱动加载成功后,在/dev目录生成 qcqmi1设备,网络设备名为eth1。“PS:Attached,DataCap:LTE”表示链接至4G网络。
           查看获取的IP地址情况。如图3-31所示:
    target$ifconfig

    指定网络设备号,ping外部网络,如图3-32所示则表示EC20-C工作正常。