Air720模块Linux USB驱动以及PPP拨号说明

    本文地址:http://tongxinmao.com/Article/Detail/id/375

    Air720模块Linux USB驱动以及PPP拨号说明

    2018年12月26日 16:04:27  阅读数 476

    个人分类: android

     http://ask.openluat.com/article/37

    本文章介绍了在linux系统下,如何修改usb驱动支持合宙 Air720模块,以及使用Air720进行ppp拨号上网流程     Air720正常启动后,通过USB连接到linux设备上,驱动正常加载后会在/dev/下产...

        本文章介绍了在linux系统下,如何修改usb驱动支持合宙 Air720模块,以及使用Air720进行ppp拨号上网流程

     

        Air720正常启动后,通过USB连接到linux设备上,驱动正常加载后会产生如下设备:


     

    一、修改驱动

       

        首先需要对Linux内核驱动做一定的修改,使操作系统能够支持Air720

     

        1.Add VID add PID

        File: [KERNEL]/drivers/usb/serial/option.c

    static const struct usb_device_id option_ids[] = {
        //+add by airm2m for Air72x
        { USB_DEVICE(0x1286, 0x4e3d) },
         //-add by airm2m for Air72x
       { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_LIGHT) },
        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_QUAD) },
        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_QUAD_LIGHT) },

        

        2. Add the Zero Packet Mechanism   

        ⦁For linux Kernel Version newer than 2.6.34:

         File: [KERNEL]/drivers/usb/serial/usb_wwan.c

    static struct urb *usb_wwan_setup_urb(struct usb_serial_port *port,
                          int endpoint,                                                              
                          int dir, void *ctx, char *buf, int len,
                          void (*callback) (struct urb *))
    {
        struct usb_serial *serial = port->serial;
        struct urb *urb;
        urb = usb_alloc_urb(0, GFP_KERNEL); /* No ISO */
        if (!urb)
            return NULL;
        usb_fill_bulk_urb(urb, serial->dev,
                  usb_sndbulkpipe(serial->dev, endpoint) | dir,
                  buf, len, callback, ctx);
        //+add by airm2m for Air72x
        if(dir == USB_DIR_OUT){
            struct usb_device_descriptor *desc = &serial->dev->descriptor;
            if(desc->idVendor == cpu_to_le16(0x1286) && desc->idProduct == cpu_to_le16(0x4e3d))
            {
                urb->transfer_flags |= URB_ZERO_PACKET;
            }
        }
        //-add by airm2m for Air72x
        return urb;
    }

     

        ⦁For linux Kernel Version older than 2.6.35:

        File: [KERNEL]/drivers/usb/serial/option.c

    static struct urb *option_setup_urb(struct usb_serial *serial, int endpoint,
    int dir, void *ctx, char *buf, int len,
    void (*callback)(struct urb *))
    {
    ......
    /* Fill URB using supplied data. */
    usb_fill_bulk_urb(urb, serial->dev,
          usb_sndbulkpipe(serial->dev, endpoint) | dir,
          buf, len, callback, ctx);
    //+add by airm2m for Air72x
    if(dir == USB_DIR_OUT)
    {
            struct usb_device_descriptor *desc = &serial->dev->descriptor;
            if(desc->idVendor == cpu_to_le16(0x1286) && desc->idProduct == cpu_to_le16(0x4e3d))
            {
                urb->transfer_flags |= URB_ZERO_PACKET;
            }
    }
    //-add by airm2m for Air72x
    return urb;
    }

     

         3. Add Reset Resume

        ⦁For linux Kernel Version newer than 3.4:

           File: [KERNEL]/drivers/usb/serial/option.c

    static struct usb_serial_driver option_1port_device = {
        .driver = {                                                                                                  
            .owner =    THIS_MODULE,
            .name =     "option1",
        },   
        ....
    #ifdef CONFIG_PM
        .suspend           = usb_wwan_suspend,
        .resume            = usb_wwan_resume,
        //+add by airm2m for Air726
        .reset_resume      = usb_wwan_resume,
        //-add by airm2m for Air726

    #endif

    };

     

        ⦁For linux Kernel Version older than 3.5:

        File: [kernel]/drivers/usb/serial/usb-serial.c

    /* Driver structure we register with the USB core */
    static struct usb_driver usb_serial_driver = {
    .name ="usbserial",
    .probe =usb_serial_probe,
    .disconnect =usb_serial_disconnect,
    .suspend =usb_serial_suspend,
    .resume =usb_serial_resume,
     //+add by airm2m for Air72x
              .reset_resume      = usb_serial_resume,
              //-add by airm2m for Air72x
    .no_dynamic_id = 1,
    };

     

        4. Modify Kernel Configuration

        Step 1:

        cd <your kernel directory>

        Step 2:

        make menuconfig

        Step 3:Enable CONFIG_USB_SERIAL_OPTION

    [*] Device Drivers →
      [*] USB Support →
        [*] USB Serial Converter support →
          [*] USB driver for GSM and CDMA modems

     

    attachments-2018-09-UvLI6qjo5b8b7c3fabe04.png

        Step 4:Configure Kernel to Support PPP

    [*] Device Drivers →
      [*] Network device support →
        [*] PPP (point-to-point protocol) support

     

    attachments-2018-09-0MkDlKPS5b8b7cde500a3.png

     

       5.编译内核

        make

        将编译好的内核下载到开发板。

        

     二、模块测试

        将重新编译好的内核下载到开发板之后,待系统重新启动,如果是带RNDIS网卡的驱动,在/dev/目录下会出现如下设备节点:


     

    Air726的AT端口是/dev/ttyUSB2,现在你可以使用UART端口工具如“minicom”或“busybox microcom”测试AT功能,结果如下:

    attachments-2018-09-VciAwk855b8b81601e624.png

     

     

     

    三、PPP拨号

        通过几个不同的配置文件,在拨号的时候选择相应的配置文件,现将配置文件列举如下: 

        /etc/ppp/peers/air720-ppp

    # /etc/ppp/peers/air720-pppd                                                                      # Usage:root>pppd call air720-pppd
    #Modem path, like /dev/ttyUSB3,/dev/ttyACM0, depend on your module, default path is /dev/ttyUSB3
    /dev/ttyUSB3 115200
    #Insert the username and password for authentication, default user and password are test
    user "" password ""
    # The chat script, customize your APN in this file
    connect 'chat -s -v -f /etc/ppp/peers/air720-chat-connect'
    # The close script
    disconnect 'chat -s -v -f /etc/ppp/peers/air720-chat-disconnect'
    # Hide password in debug messages
    hide-password
    # The phone is not required to authenticate
    noauth
    # Debug info from pppd
    debug
    # If you want to use the HSDPA link as your gateway
    defaultroute
    # pppd must not propose any IP address to the peer
    noipdefault
    # No ppp compression
    novj
    novjccomp
    noccp
    ipcp-accept-local
    ipcp-accept-remote
    local
    # For sanity, keep a lock on the serial line
    lock
    modem
    dump
    nodetach
    # Hardware flow control
    nocrtscts
    remotename 3gppp
    ipparam 3gppp
    ipcp-max-failure 10
    # Ask the peer for up to 2 DNS server addresses
    usepeerdns

     

        /etc/ppp/peers/air720-chat-connect

    #/etc/ppp/peers/air720-chat-connect                                                
    ABORT "BUSY"
    ABORT "NO CARRIER"
    ABORT "ERROR"
    #ABORT "NO ANSWER"
    TIMEOUT 10
    "" AT
    "OK-+++\c-OK" ATH0
    OK ATE0
    OK ATI;+CESQ;+CPIN?;+COPS?;+CEREG?;+CGREG?;&D2
    #china unicom's apn is 3gnet
    #OK AT+CGDCONT=1,"IP","3gnet",,0,0
    #OK ATD*99#
    #China mobile APN
    OK AT+CGDCONT=1,"IP","cmnet"
    #OK ATDT*99***1#
    OK ATD*99#
    CONNECT ""

     

        /etc/ppp/peers/air720-chat-disconnect           

    #/etc/ppp/peers/air720-chat-disconnect            
    TIMEOUT 5
    ABORT "ERROR"
    ABORT "NO DIALTONE"
    ABORT "NO CARRIER"
    #SAY "\nSending break to the modem\n"
    "" "+++\c"
    OK "ATH0"
    SAY "\nGoodbay\n"

     

        编辑好这几个文件之后,便可以通过pppd进行拨号:

        # pppd call air720-ppp &

       如果拨号成功会有以下信息打印出来:

    attachments-2018-09-IlJCjHPz5b8b8a394bfdf.png

    attachments-2018-09-fFu9jAXX5b8b8a7160164.png

    此时通过ifconfig命令查看网卡就有一个ppp0网卡出现,这时可以禁用其他网卡,就可以用Air720模块连接到互联网了。

    attachments-2018-09-GGlDY8xC5b8b8aa468bb5.png


    上一篇:NU970 板子调试
    下一篇:LINUX GADGET 虚拟串口 g_serial.ko USB描述符