海思3518C 4G模块移植及运用
来源:互联网 发布:informix查看数据库 编辑:程序博客网 时间:2024/05/17 07:51
本章程主要介绍LTE模块使用及驱动移植、pppd拨号软件移植,LTE模块主要使用中兴ME3630、韦德S600模块、龙尚U9300C模块、美格SLM730、移远EC20、有方N720;各模块AT指令基本一样,只有几个特定指令不一样(4G信号查询指令、软复位指令)。
1、Pppd移植
本章使用的是ppp-2.4.4版本,开发包为ppp-2.4.4.tar.gz;
需要修改内容:
1.1、修改ppp-2.4.4\pppd\ipcp.c
修改该文件主要是为了在拨号软件获取到网络参数DNS时,工具不会自动设置到嵌入式系统中,需要我们自己进行操作。
在ipcp_up函数中添加:
char cmd1[100] = {0x00}; char cmd2[100] = {0x00};-------notice("local IP address %I", go->ouraddr);notice("remote IP address %I", ho->hisaddr);//写入配置脚本if (go->dnsaddr[0]){ notice("primary DNS address %I", go->dnsaddr[0]); sprintf(cmd1, "echo nameserver %s > /mnt/mtd/resolv_wirless.conf", ip_ntoa(go->dnsaddr[0])); system(cmd1);}if (go->dnsaddr[1]){ notice("secondary DNS address %I", go->dnsaddr[1]); sprintf(cmd2, "echo nameserver %s >> /mnt/mtd/resolv_wirless.conf", ip_ntoa(go->dnsaddr[1])); system(cmd2);} //清除默认网关cifdefaultroute(0,0,0); //设置新的网关SetGateway(ifname,ip_ntoa(ho->hisaddr));
设置网关主要是因本章程设计了一个有线\无线自动切换功能,在有线环境下,拨号软件退出(偶尔因信号差退出拨号连接),当需要切换成无线时,重新拨号,这时需要清除原来默认网关,重新设置无线网关。
设置网关函数
static bool SetGateway(char* _szInterface, char* _szGateway){int s32Ret;int s32Socketfd = socket(AF_INET, SOCK_DGRAM, 0);if(s32Socketfd < 0){printf("socket failed by %d", errno);return -1;}struct rtentry rt;memset(&rt, 0, sizeof(struct rtentry));memset(&rt.rt_dst, 0, sizeof(rt.rt_dst));rt.rt_dst.sa_family = AF_INET;((struct sockaddr_in *)(&rt.rt_dst))->sin_addr.s_addr = inet_addr("0.0.0.0");memset(&rt.rt_gateway, 0, sizeof(rt.rt_gateway));rt.rt_gateway.sa_family = AF_INET;((struct sockaddr_in *)(&rt.rt_gateway))->sin_addr.s_addr = inet_addr(_szGateway);memset(&rt.rt_genmask, 0, sizeof(rt.rt_genmask));rt.rt_genmask.sa_family = AF_INET;((struct sockaddr_in *)(&rt.rt_genmask))->sin_addr.s_addr = 0L;rt.rt_dev = _szInterface;rt.rt_flags = RTF_GATEWAY;s32Ret = ioctl(s32Socketfd, SIOCADDRT, &rt);if(s32Ret < 0){printf("ioctl SIOCADDRT failed by %d", errno);close(s32Socketfd);return -1;}close(s32Socketfd);return 0;}
以上函数是将拨号获取到的dns写到系统文件缓存中,应用程序需要将该缓存写到系统的dns文件中(linux系统:/etc/resolv.conf,安卓系统:需要通过dnsproxy2工具进行设置该工具将有另外章节介绍);
1.2、判断拨号获取DNS是否正确
因为拨号软件在执行拨号时,当信号非常差的时候,从基站获取到的DNS会错误,所以这里必须在获取DNS时进行过滤。
修改main.c函数:
添加函数
void checkdns __V((char *fmt, ...)){ va_list pvar;#if defined(__STDC__) va_start(pvar, fmt);#else char *fmt; va_start(pvar); fmt = va_arg(pvar, char *);#endif int n; char buf[1024]; n = vslprintf(buf, sizeof(buf), fmt, pvar); va_end(pvar); //IPCP ConfAck id=0x2 <addr 10.138.113.2> <ms-dns1 210.21.4.130> <ms-dns3 221.5.88.88> /* * 该段函数是为了防止拨号后获取到错误的DNS后还继续使用该 * 该参数,解决方案是当获取到配置应答指令后判断是否获取 * 到IP地址和对于的DNS,如果没获取到DNS则推出该拨号程序。 */ char *pu8ConfAck; char *pu8addr; char *pu8msdns; pu8ConfAck = strstr((char*) buf,"ConfAck"); if(pu8ConfAck != NULL) if(strncmp(pu8ConfAck,"ConfAck",strlen("ConfAck")) == 0) { printf("---ConfAck[%s]\n",pu8ConfAck); pu8addr = strstr((char*) pu8ConfAck,"addr"); if(pu8addr != NULL) if(strncmp(pu8addr,"addr",strlen("addr")) == 0) { printf("---addr[%s]\n",pu8addr); pu8msdns = strstr((char*) pu8addr,"ms-dns"); if(pu8msdns == NULL) exit(1); printf("---msdns[%s]\n",pu8msdns); } }}static voidget_input(){ ----------------- dump_packet("rcvd", p, len); //-------edw------------------------// checkdns( "%P", p, len);//------end-------------------------//
到此基本拨号软件基本修改完成。
注意:android系统移植,安卓sdk自带pppd工具(external\ppp目录下),修改内容和上述基本一样,只有在设置dns时不同,安卓系统使用命令“setprop net.dnsx”进行设置DNS。
1.3、编译程序
生成makefile文件;
编译make CC=arm-hisiv100nptl-linux-gcc
获取到pppd chat
1.4、运营商连接点
联通节点wcdma
移动节点cnmet
电信节点evdo
内容:
debugnodetach/dev/ttyUSB2115200usepeerdnsnoauthnoipdefaultnovjnovjccompnoccpdefaultrouteipcp-accept-localipcp-accept-remoteconnect '/system/bin/chat -s -v -f /etc/ppp/peers/chat-wcdma-connect'disconnect '/system/bin/chat -s -v -f/etc/ppp/peers/chat-disconnect'
三个节点文件内容类似,只有连接点不同:chat-wcdma-connect。
联通连接点方式chat-wcdma-connect
内容:
ABORT 'NO CARRIER'ABORT 'ERROR'ABORT 'NO DIALTONE'ABORT 'BUSY'ABORT 'NO ANSWER''' ATOK ATZOK AT+CGDCONT=1,\"IP\",\"3gnet\",,0,0OK AT+CFUN=1OK ATDT*99#CONNECT ''
移动连接点方式chat-cnmet-connect
ABORT 'NO CARRIER'ABORT 'ERROR'ABORT 'NO DIALTONE'ABORT 'BUSY'ABORT 'NO ANSWER''' ATOK ATZOK AT+CGDCONT=1,\"IP\",\"cmnet\",,0,0OK AT+CFUN=1OK ATDT*98*1#CONNECT ''
电信连接点方式chat-evdo-connect
ABORT 'NO CARRIER'ABORT 'ERROR'ABORT 'NO DIALTONE'ABORT 'BUSY'ABORT 'NO ANSWER''' ATOK ATZOK AT+CGDCONT=1,\"IP\",\"ctlte\",,0,0OK AT+CFUN=1OK ATDT*99#CONNECT ''
1.5、启动拨号
联通运营商:pppd call wcdma&
移动运营商:pppd call cnmet&
电信运营商:pppd call evdo&
2、驱动移植
http://blog.csdn.net/skdkjzz/article/details/22206949
stty -F /dev/ttyUSB0 raw speed 9600 min 0 time 10
使用龙尚4G模块,修改驱动:
1. 在内核中添加USB串口驱动和USB网卡驱动,可以选择将其直接编入内核,或者编译为模块待内核启动时加载,总之,要确保Linux内核启动完成后,这两个驱动是运行在内核当中的。
通常,配置内核是通过指令make menuconfig,执行该指令后:
l 添加USB串口驱动:
device drivers-->
usb support-->
usb serial converter support-->
USB driver for GSM and CDMA modems
l 添加USB网卡驱动
devices drivers-->
Network device support-->
usb Network Adapters-->
Mulil-purpose USB Networking Framework
* 注:如果您的内核结构与上面不一致,可能需要在其它的路径下面选择,总之,只要确保源文件中的 option.c 及其相关的部分(USB串口驱动),cdc_ether.c及其相关部分(USB网卡驱动)参与编译即可
2. 在内核中添加PPP组件
通常,配置内核是通过指令make menuconfig,执行该指令后:
devices drivers-->
Network device support-->
ppp support-->
ppp filtering
ppp support for async serial ports
ppp support for sync tty ports
ppp deflate compression
ppp BSD-compress compression
3. 在内核驱动源文件中添加ZTE模块相关的信息:USB网卡驱动可以自动识别到ZTE模块,因此,其对应的cdc_ether.c文件中不需要添加任何内容。但是USB串口驱动不能自动识别,必须要添加ZTE模块的设备信息到源文件option.c中。
文件路径:/kernel/drivers/usb/serial/option.c
l 添加USB端口的VID和PID信息,见下面蓝色部分。这里0x0199为ME3860模块和ME3760_V2模块的PID,0x1476为ME3620模块的PID,如果您使用的是其它模块,将其中的PID值更换为相应的值即可。
static const struct usb_device_id option_ids[] = {
+{ USB_DEVICE(0x19d2, 0x1476) }, //add me3630
+{ USB_DEVICE(0x19d2, 0x0016) }, //add me3630
+{ USB_DEVICE(0x1c9e, 0x9b05) }, //add 8300
+{ USB_DEVICE(0x1c9e, 0x9b3c) }, //add 9300
+{ USB_DEVICE(0x05C6, 0x9025) }, //add S600
+{ USB_DEVICE(0x05C6, 0xf601) }, //add slm730
+{ USB_DEVICE(0x2c7c, 0x0125) }, //add yiyuan
+{ USB_DEVICE(0x05C6, 0x9008) }, //add n720……
}
以上ID可以在进入系统中,通过命令“lsusb”,查看模块ID。
l 添加黑名单信息,上面添加模块信息是只添加了设备的VID和PID,没有附加任何额外的端口信息,这样会导致设备的网卡也被加载成为USB串口,下面提供的是一种类似于黑名单的方式,在option_probe函数中,将网卡对应的端口加入黑名单,防止USB网卡被加载成为USB串口。
对于ME3860和ME3760_V2,其网卡对应的端口为0和1,对于ME3620,其网卡对应的端口为3和4。请将以下代码添加到option_probe函数中
printk("idVendor=%x, idProduct=%x, bInterfaceNumber =%d\r\n", serial->dev->descriptor.idVendor, serial->dev->descriptor.idProduct,serial->interface->cur_altsetting->desc. bInterfaceNumber); if (serial->dev->descriptor.idVendor == 0x19d2 && serial->dev->descriptor.idProduct == 0x1476 && serial->interface->cur_altsetting->desc. bInterfaceNumber == 3) return -ENODEV;if (serial->dev->descriptor.idVendor == 0x19d2 && serial->dev->descriptor.idProduct == 0x1476 && serial->interface->cur_altsetting->desc. bInterfaceNumber == 4) return -ENODEV;if (serial->dev->descriptor.idVendor == 0x19d2 && serial->dev->descriptor.idProduct == 0x0199 && serial->interface->cur_altsetting->desc. bInterfaceNumber == 0) return -ENODEV;if (serial->dev->descriptor.idVendor == 0x19d2 && serial->dev->descriptor.idProduct == 0x0199 && serial->interface->cur_altsetting->desc. bInterfaceNumber == 1) return -ENODEV;if (serial->dev->descriptor.idVendor == 0x1c9e&& //龙尚 serial->dev->descriptor.idProduct == 0x9b05&& serial->interface->cur_altsetting->desc. bInterfaceNumber == 3) return -ENODEV;
* 注:第一行的printk是为了方便调试而打印的,虽无实际效果,最好能带上。下面的几个if语句分别判断了需要加入黑名单的端口号,如果您使用的是除ME3860,ME3760_V2和ME3620之外的模块,上面if语句中的判断条件也要做相应修改。
加载驱动后如需加载其他模块,可以通过命令加载:
echo "19d2 1476" >/sys/bus/usb-serial/drivers/option1/new_id
注意:内核补丁会在海思3518C 4G模块移植文件中得到;
- 海思3518C 4G模块移植及运用
- 移植域格4G模块-海思3531
- 中兴ME3720无线4G模块移植及ppp方式拨号
- DM368开发 -- 华为3G/4G模块移植
- 移植4G模块到7.1出现的问题【笔记】
- 移远EC20 4G模块Linux驱动移植和测试
- Linux 开发板4G转WiFi热点 手机连接热点上网(三 WiFi模块的移植及AP的建立)
- android平台4G模块驱动及功能调试
- Linux 开发板4G转WiFi热点 手机连接热点上网(二 4G模块的移植)
- 4G上网模块ME3760移植到arm开发板上(6410)
- 嵌入式开发-迅为i.MX6Q开发板移植移动4G模块分享
- 嵌入式开发-迅为iMX6开发板移植移动4G模块
- OPENWRT-4G-移植-ALT3800
- 4G模块CDC_NCM上网
- 4G模块使用总结
- 4G模块网络通信
- openwrt 支持4G模块
- ZK 4G常见问题分析及处理(可用于有移动网络模块的设备)
- QT获取控件焦点,判断对象类型,模拟发送按键消息
- 如何给信号加噪声,matlab
- SeleniumIDE的安装、使用入门
- 分针网—每日分享:nodejs取参四种方法req.body,req.params,req.param,req.body
- Memcache服务搭建
- 海思3518C 4G模块移植及运用
- Android NFC的初次使用——公交卡信息读取
- mysql查询今天、昨天、上周
- 新路程------hi3516a uboot更换spi flash(1)
- Form表单问题
- spring4学习记录07-调用远程服务RPC(同步)
- 斐波拉切数列
- Revit2015 API变化
- Linux安装后的一些问题