本次调试还是踩了不少坑,在此记录一下。
总的来说这个模块不需要太多的支持,linux系统的自身驱动已经足够,只是可能嵌入式端的某些配置未开放出来导致模块工作不正常。
本项目硬件连接为合宙AIR780eg的USB口,其主要加载两个驱动一个是CDC - ACM 一个是RNDIS。
CDC - ACM用于将USB设备驱动的实现视为tty驱动,该设备会虚拟出3个ttl端口用于进行串口通讯。
RNDIS是指Remote NDIS,基于USB实现RNDIS实际上就是TCP/IP over USB,就是在USB设备上跑TCP/IP,让USB设备看上去像一块网卡。
海思默认是没有将两个驱动打开的,需要进入内核进行配置
在Linux内核界面输入make menuconfig 进行配置
我们首先使能 cdc-acm支持
在下图所示路径下可以找到该驱动选项,直接编译进内核。
再来使能rndis支持
输入/ 查找rndis
将其中 USB_CONFIGFS_RNDIS 、USB_ETH_RNDIS 、USB_FUNCTIONFS_RNDIS 、USB_F_RNDIS 、USB_G_MULTI_RNDIS 、USB_ETH_RNDIS_HOST 均设置为y编译进内核。HOST选项刚开始这边是编译的模块,单独加载还会报错鼓捣了半天也没个结果,后面就统一编译进内核进行操作,一下子就成功了。
此时linux内核可以支持两种驱动能力,但还需为其添加air780eg设备支持。
可在官网或者linux系统使用lsusb查看设备VID和PID 查询值应同官方说明一致。
在.\drivers\usb\serial\option.c
1.添加两个宏
#define AIR780E_PRODUCT_01 0x0001
#define AIR780E_VENDOR_ID 0x19d1
2.在usb_device_id option_ids[]中增加
{ USB_DEVICE(AIR780E_VENDOR_ID, AIR780E_PRODUCT_01)},
3.在 option_probe函数中增加
struct usb_device_descriptor *dev_desc = & serial->dev->descriptor;
/* ADD for air 780e */
/* Never bind to the CD-Rom emulation interface */
if (iface_desc->bInterfaceClass == USB_CLASS_MASS_STORAGE)
return -ENODEV;
/* ADD for air 780e */
if(dev_desc->idVendor == cpu_to_le16(AIR780E_VENDOR_ID) && dev_desc->idProduct == cpu_to_le16(AIR780E_PRODUCT_01) && iface_desc->bInterfaceNumber <= 1)
return -ENODEV;
/* ADD for air 780e */
在.\drivers\usb\serial\usb_wwan.c
1.同样新增vid和pid数值的两个宏
#define AIR780E_PRODUCT_01 0x0001
#define AIR780E_VENDOR_ID 0x19d1
2.在usb_wwan_setup_urb函数中新增
/* ADD for air 780e */
if(dir == USB_DIR_OUT)
{
struct usb_device_descriptor *desc = &serial->dev->descriptor;
if((desc->idVendor == cpu_to_le16(AIR780E_VENDOR_ID) && desc->idProduct == cpu_to_le16(AIR780E_PRODUCT_01)))
urb->transfer_flags |= URB_ZERO_PACKET;
}
/* ADD for air 780e */
此时内核部分均已修改完成
编译内核,烧录进板卡。
不出意外可以看到如下打印信息
说明网卡已经注册并联网成功,其中rndis_host 1-1:1.0 eth0 便是将网卡挂载到了eth0上面。ttyACM0-2就是虚拟出的三个串口。
可以在网上查找串口测试程序对三个串口进行测试,其中ttyACM0可进行AT指令操作对设备进行相关配置。
后续其他功能调试再更吧。