)
在hi3516平台上移植4G模块合宙CAT1air724UG1.前言2.修改源代码SDKa.添加设备VID和PIDb.添加reset_resumec.增加零包机制3.修改内核选项4.加载驱动文件5.查看是否出现新的模块网卡ethx6.启动网卡模块网卡ethx7.添加模块网卡的默认网关解決方法需要设置一次ethx的默认网关问题a.linux下多个usb设备不固定名称输入命令或者输入命令添加在/etc/udev/rules.d/xxxxx.rules 文件b.minicom移植1.前言4G模块合宙推出的Air724UG Cat1Linux版本linux4.9硬件平台hi3516dv300 SDK版本rp-hi3516dv300-sdk020-20201214.tgzhi3516dv300的SDK源码不做任何配置或修改再编译的话开发板是不能正确识别4G模块的。为了能让开发板正确识别4G网卡以及能够上网则有必要对源码进行配置和修改。2.修改源代码SDKa.添加设备VID和PID-进入内核目录文件 [KERNEL]/drivers/usb/serial/option.c-在结构体 static const struct usb_device_id option_ids[]中添加如下内容//add by airm2m for Air72x{USB_DEVICE(0x1782,0x4e00)},//CAT1// { USB_DEVICE(0x1286, 0x4e3d) },//CAT4//-add by airm2m for Air72x结果如下staticconststructusb_device_idoption_ids[]{//add by airm2m for Air72x{USB_DEVICE(0x1782,0x4e00)},//CAT1// { USB_DEVICE(0x1286, 0x4e3d) },//CAT4//-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_AND_INTERFACE_INFO(WETELECOM_VENDOR_ID,WETELECOM_PRODUCT_WMD200,0xff,0xff,0xff)},{USB_DEVICE_AND_INTERFACE_INFO(WETELECOM_VENDOR_ID,WETELECOM_PRODUCT_6802,0xff,0xff,0xff)},{USB_DEVICE_AND_INTERFACE_INFO(WETELECOM_VENDOR_ID,WETELECOM_PRODUCT_WMD300,0xff,0xff,0xff)},{USB_DEVICE_AND_INTERFACE_INFO(0x03f0,0x421d,0xff,0xff,0xff)},/* HP lt2523 (Novatel E371) */{}/* Terminating entry */};-在函数 option_probe中添加如下内容//add by airm2m for Air72x//CAT1if(dev_desc-idVendorcpu_to_le16(0x1782)dev_desc-idProductcpu_to_le16(0x4e00)iface_desc-bInterfaceNumber1){return-ENODEV;}//CAT4if(dev_desc-idVendorcpu_to_le16(0x1286)dev_desc-idProductcpu_to_le16(0x4e3d)iface_desc-bInterfaceNumber1){return-ENODEV;}//-add by airm2m for Air72x结果如下staticintoption_probe(structusb_serial*serial,conststructusb_device_id*id){structusb_interface_descriptor*iface_descserial-interface-cur_altsetting-desc;structusb_device_descriptor*dev_descserial-dev-descriptor;conststructoption_blacklist_info*blacklist;/* Never bind to the CD-Rom emulation interface */if(iface_desc-bInterfaceClass0x08)return-ENODEV;/* * Dont bind reserved interfaces (like network ones) which often have * the same class/subclass/protocol as the serial interfaces. Look at * the Windows driver .INF files for reserved interface numbers. */blacklist(void*)id-driver_info;if(blacklisttest_bit(iface_desc-bInterfaceNumber,blacklist-reserved))return-ENODEV;/* * Dont bind network interface on Samsung GT-B3730, it is handled by * a separate module. */if(dev_desc-idVendorcpu_to_le16(SAMSUNG_VENDOR_ID)dev_desc-idProductcpu_to_le16(SAMSUNG_PRODUCT_GT_B3730)iface_desc-bInterfaceClass!USB_CLASS_CDC_DATA)return-ENODEV;//add by airm2m for Air72x//CAT1if(dev_desc-idVendorcpu_to_le16(0x1782)dev_desc-idProductcpu_to_le16(0x4e00)iface_desc-bInterfaceNumber1){return-ENODEV;}//CAT4if(dev_desc-idVendorcpu_to_le16(0x1286)dev_desc-idProductcpu_to_le16(0x4e3d)iface_desc-bInterfaceNumber1){return-ENODEV;}//-add by airm2m for Air72x/* Store the blacklist info so we can use it during attach. */usb_set_serial_data(serial,(void*)blacklist);return0;}b.添加reset_resume-进入内核目录文件 [KERNEL]/drivers/usb/serial/option.c-在结构体中static struct usb_serial_driver option_1port_device添加如下内容//add by airm2m for Air72x.reset_resumeusb_wwan_resume,//-add by airm2m for Air72x结果如下staticstructusb_serial_driveroption_1port_device{.driver{.ownerTHIS_MODULE,.nameoption1,},.descriptionGSM modem (1-port),.id_tableoption_ids,.num_ports1,.probeoption_probe,.openusb_wwan_open,.closeusb_wwan_close,.dtr_rtsusb_wwan_dtr_rts,.writeusb_wwan_write,.write_roomusb_wwan_write_room,.chars_in_bufferusb_wwan_chars_in_buffer,.tiocmgetusb_wwan_tiocmget,.tiocmsetusb_wwan_tiocmset,.ioctlusb_wwan_ioctl,.attachoption_attach,.releaseoption_release,.port_probeusb_wwan_port_probe,.port_removeusb_wwan_port_remove,.read_int_callbackoption_instat_callback,#ifdefCONFIG_PM.suspendusb_wwan_suspend,.resumeusb_wwan_resume,//add by airm2m for Air72x.reset_resumeusb_wwan_resume,//-add by airm2m for Air72x#endif};c.增加零包机制-进入内核目录文件 [KERNEL]/drivers/usb/serial/usb_wwan.c中-在函数 usb_wwan_setup_urb中添加如下内容//add by airm2m for Air72xif(dirUSB_DIR_OUT){structusb_device_descriptor*descserial-dev-descriptor;//CAT1if(desc-idVendorcpu_to_le16(0x1782)desc-idProductcpu_to_le16(0x4e00)){urb-transfer_flags|URB_ZERO_PACKET;}//CAT4// if(desc-idVendor cpu_to_le16(0x1286) desc-idProduct cpu_to_le16(0x4e3d))// {// urb-transfer_flags | URB_ZERO_PACKET;// }}//-add by airm2m for Air72x结果如下staticstructurb*usb_wwan_setup_urb(structusb_serial_port*port,intendpoint,intdir,void*ctx,char*buf,intlen,void(*callback)(structurb*)){structusb_serial*serialport-serial;structurb*urb;urbusb_alloc_urb(0,GFP_KERNEL);/* No ISO */if(!urb)returnNULL;usb_fill_bulk_urb(urb,serial-dev,usb_sndbulkpipe(serial-dev,endpoint)|dir,buf,len,callback,ctx);//add by airm2m for Air72xif(dirUSB_DIR_OUT){structusb_device_descriptor*descserial-dev-descriptor;//CAT1if(desc-idVendorcpu_to_le16(0x1782)desc-idProductcpu_to_le16(0x4e00)){urb-transfer_flags|URB_ZERO_PACKET;}//CAT4// if(desc-idVendor cpu_to_le16(0x1286) desc-idProduct cpu_to_le16(0x4e3d))// {// urb-transfer_flags | URB_ZERO_PACKET;// }}//-add by airm2m for Air72xreturnurb;}3.修改内核选项makeARCHarmCROSS_COMPILEarm-himix200-linux- menuconfig以下是部分可以参考一下 链接: https://blog.csdn.net/weixin_46158019/article/details/138217036Enable CONFIG_USB_SERIAL_OPTION[]Device Drivers →[] USB Support →[] USB Serial Converter support →[] USB driver for GSM and CDMA modems[] Device Drivers →[] Network device support →[*] PPP (point-to-point protocol) supportmake 之后makeARCHarmCROSS_COMPILEarm-himix200-linux- uImage-j32结果如下4.加载驱动文件将以下内核驱动文件拷贝到根文件系统中[kernel]/drivers/net/usb/usbnet.ko[kernel]/drivers/net/usb/cdc_ether.ko[kernel]/drivers/net/usb/rndis_host.ko加载到内核insmod usbnet.ko insmod cdc_ether.ko insmod rndis_host.ko结果如下5.查看是否出现新的模块网卡ethxifconfig-a结果如下6.启动网卡模块网卡ethxifconfigeth1 up7.添加模块网卡的默认网关Ifconfig -a出现了新的模块网卡之后,这个时候模块网卡无法ping通外网必须把本地网卡网线拔掉才能使用模块网卡ping通外网解決方法需要设置一次ethx的默认网关1.查看系统当前路由表iproute show#或者route2.设置一次ethx的默认网关route add default gw xxx.xxx.xxx.xxx ethx例子routeadddefault gw192.168.5.1 eth1结果如下3.实现一个脚本开机自启动echo---------------------------------------ifconfigeth1 up#route add default gw 192.168.5.1 eth1ipifconfigeth1|grepinet addr|seds/^.*Bcast://g|seds/Mask.*$//gaecho$ip|awk-F.{print $1}becho$ip|awk-F.{print $2}cecho$ip|awk-F.{print $3}decho$ip|awk-F.{print $4}routeadddefault gw$a.$b.$c.1 eth1echoroute add default gw$a.$b.$c.1 eth1问题a.linux下多个usb设备不固定名称输入命令ls/sys/class/tty/ttyUSB*-l// 查看usb设备信息其中的1-1:1.2/1-1:1.3/1-1:1.4为固定的串口编号。或者输入命令udevadm info --attribute-walk--name/dev/ttyUSB0 udevadm info --attribute-walk--name/dev/ttyUSB1 udevadm info --attribute-walk--name/dev/ttyUSB2 udevadm info --attribute-walk--name/dev/ttyUSB0|grepKERNELS#通过对比信息中的不同可以提取出区别与各个串口的KERNELS值udevadm info --attribute-walk--name/dev/ttyUSB1|grepKERNELS#通过对比信息中的不同可以提取出区别与各个串口的KERNELS值udevadm info --attribute-walk--name/dev/ttyUSB2|grepKERNELS#通过对比信息中的不同可以提取出区别与各个串口的KERNELS值添加在/etc/udev/rules.d/xxxxx.rules 文件创建一个10-local.rules 文件root权限下建立命名可以自定义并添加以下内容KERNELS1-1:1.4,KERNELttyUSB*, MODE:0777,SYMLINK4G_uart#KERNELS是工控机usb插口编号、#KERNEL是内核设备名称#OWNER, GROUP, MODE是设备设定权限#SYMLINK是为 /dev/下的设备文件产生符号链接。由于 udev 只能为某个设备产生一个设备文件所以为了不覆盖系统默认的 udev 规则所产生的文件推荐使用符号链接。保存退出。重新插拔设备(或重启)就会在/dev目录下生成固定的设备名本实例为4G_uart。也可以重启服务#分别在终端输入以下命令要保持一定的时间间隔sudoserviceudev reloadsudoserviceudev restart备注1.固定好之后usb设备插入的usb端口不能再改变。2.操作中如果提示权限问题用root用户操作即可。3.若ttyUSB设备过多找不到自己要固定的串口设备可以对要固定的设备进行拔插通过比较插拔前后ls /sys/class/tty/ttyUSB* -l命令输出结果来找到所需要固定的串口号。4.此方法也适用其他usb设备的固定例如usb摄像头。。b.minicom移植