[应用方案] nuc977 添加EC20 4G 网卡

[复制链接]
 楼主| 观海 发表于 2021-8-1 17:56 | 显示全部楼层 |阅读模式
4G, EC20, NUC, USB, vi, ic
内核版本:linux-3.10

1. Add VID and PID
在/drivers/usb/serial/option.c添加:

static const struct usb_device_id option_ids[] = {
#if 1 //Added by Quectel
{ USB_DEVICE(0x05C6, 0x9090) }, /* Quectel UC15 */
{ USB_DEVICE(0x05C6, 0x9003) }, /* Quectel UC20 */
{ USB_DEVICE(0x05C6, 0x9215) }, /* Quectel EC20 */
{ USB_DEVICE(0x2C7C, 0x0125) }, /* Quectel EC25/EC20 R2.0 */
{ USB_DEVICE(0x2C7C, 0x0121) }, /* Quectel EC21 */
#endif
然后在/drivers/usb/serial/qcserial.c 和/drivers/usb/serial/qcserial.c两个文件中注释掉如下语句

{USB_DEVICE(0x05c6, 0x9215)}, /* Acer Gobi 2000 Modem device (VP413) */

853061066fcfae3e2.png
网上说是由于历史的原因,导致VID和PID重复了。


 楼主| 观海 发表于 2021-8-1 17:57 | 显示全部楼层
2. Add the Zero Packet Mechanism

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 == NULL) {
                dev_dbg(&serial->interface->dev,
                        "%s: alloc for endpoint %d failed.\n", __func__,
                        endpoint);
                return NULL;
        }

        /* Fill URB using supplied data. */
        usb_fill_bulk_urb(urb, serial->dev,
                          usb_sndbulkpipe(serial->dev, endpoint) | dir,
                          buf, len, callback, ctx);

        //ADD bye sky for zero packet
        if (dir == USB_DIR_OUT)
        {
                struct usb_device_descriptor *desc = &serial->dev->descriptor;
                if (desc->idVendor == cpu_to_le16(0x05C6) && desc->idProduct == cpu_to_le16(0x9090))
                    urb->transfer_flags |= URB_ZERO_PACKET;
                if (desc->idVendor == cpu_to_le16(0x05C6) && desc->idProduct == cpu_to_le16(0x9003))
                    urb->transfer_flags |= URB_ZERO_PACKET;
                if (desc->idVendor == cpu_to_le16(0x05C6) && desc->idProduct == cpu_to_le16(0x9215))
                    urb->transfer_flags |= URB_ZERO_PACKET;
                if (desc->idVendor == cpu_to_le16(0x2C7C))
                    urb->transfer_flags |= URB_ZERO_PACKET;
        }
        //===

        return urb;
}


 楼主| 观海 发表于 2021-8-1 17:58 | 显示全部楼层
3. Add Reset Resume
File: [KERNEL]/drivers/usb/serial/option.c

static struct usb_serial_driver option_1port_device = {
……
#ifdef CONFIG_PM
.suspend = usb_wwan_suspend,
.resume = usb_wwan_resume,

#if 1 //Added by Quectel
.reset_resume = usb_wwan_resume,
#endif

#endif
};


 楼主| 观海 发表于 2021-8-1 17:59 | 显示全部楼层
4. Use GobiNet or QMI WWAN
File: [KERNEL]/drivers/usb/serial/option.c


static int option_probe(struct usb_serial *serial, const struct usb_device_id *id) {
struct usb_wwan_intf_private *data;
……
#if 1 //Added by Quectel
//Quectel UC20's interface 4 can be used as USB Network device
if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6) &&
serial->dev->descriptor.idProduct == cpu_to_le16(0x9003)
&& serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4)
return -ENODEV;
//Quectel EC20's interface 4 can be used as USB Network device
if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6) &&
serial->dev->descriptor.idProduct == cpu_to_le16(0x9215)
&& serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4)
return -ENODEV;
//Quectel EC21&EC25&EC20 R2.0's interface 4 can be used as USB Network device
if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2C7C)
&& serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4)
return -ENODEV;
#endif
/* Store device id so we can use it during attach. */
usb_set_serial_data(serial, (void *)id);
return 0;
}


 楼主| 观海 发表于 2021-8-1 18:00 | 显示全部楼层
5.Enable CONFIG_USB_SERIAL_OPTION

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FpYW54aWxpbg==,size_16,color_FFFFFF,t_70.jpg

重新烧写内核,然后将模块连接到USB HOST上。 重新上电稍等一下就可以检测到模块了。


在dev下发现:


3993061067059233c6.png


用AT命令测试下:


cat /dev/ttyUSB2 &

echo "AT\r\n" >/dev/ttyUSB2

如果可以看到有数据返回,那就表明驱动已将OK了。硬件连接也没有问题了。。



 楼主| 观海 发表于 2021-8-1 18:02 | 显示全部楼层
6. GobiNet Driver for UC20/EC20/EC21/EC25/EC20 R2.0
下一步就是:GobiNet Driver for UC20/EC20/EC21/EC25/EC20 R2.0

类似这样的效果,会创建一个eht1的网卡设备。

538766106707a42a3c.png

将一些代码文件拷贝到“[KERNEL]/drivers/net/usb/目录下,代码来自官网,或者网上找找。

544546106707f96448.png

修改目录下的[KERNEL]/drivers/net/usb/Makefile文件 加入:

7905761067085a4f67.png

然后重新编译内核,并烧写内核。

上电后加载的驱动信息:

57881610670942581c.png

然后输入ifconfig -a查看

938806106709ad69ab.png

7 . Test GobiNet

编译quectel-CM

make CROSS-COMPILE=arm-linux-
caigang13 发表于 2021-8-2 08:20 来自手机 | 显示全部楼层
这是用的哪个厂家的4G模块?
twjiang 发表于 2021-8-2 08:42 | 显示全部楼层
本帖最后由 twjiang 于 2021-8-2 08:59 编辑

USB网卡分三种技术路径
  • Microsoft MBIM (USB-CDC-NCM based)
  • Qualcomm QMI + TTY (USB-CDC-ECM based)
  • USB-ECM based

从驱动源码的前缀 QMI 推测,该型网卡是高通的!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

139

主题

4331

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部