当前位置: 首页>編程日記>正文

海思3518C 4G模块移植及运用

海思3518C 4G模块移植及运用

    本章程主要介绍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);
#elsechar *fmt;va_start(pvar);fmt = va_arg(pvar, char *);
#endifint 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 void
get_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

内容:

debug
nodetach
/dev/ttyUSB2
115200
usepeerdns
noauth
noipdefault
novj
novjccomp
noccp
defaultroute
ipcp-accept-local
ipcp-accept-remote
connect '/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'
'' AT
OK ATZ
OK AT+CGDCONT=1,\"IP\",\"3gnet\",,0,0
OK AT+CFUN=1
OK ATDT*99#
CONNECT ''

移动连接点方式chat-cnmet-connect

ABORT 'NO CARRIER'
ABORT 'ERROR'
ABORT 'NO DIALTONE'
ABORT 'BUSY'
ABORT 'NO ANSWER'
'' AT
OK ATZ
OK AT+CGDCONT=1,\"IP\",\"cmnet\",,0,0
OK AT+CFUN=1
OK ATDT*98*1#
CONNECT ''

电信连接点方式chat-evdo-connect

ABORT 'NO CARRIER'
ABORT 'ERROR'
ABORT 'NO DIALTONE'
ABORT 'BUSY'
ABORT 'NO ANSWER'
'' AT
OK ATZ
OK AT+CGDCONT=1,\"IP\",\"ctlte\",,0,0
OK AT+CFUN=1
OK 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,执行该指令后:

添加USB串口驱动:

device drivers-->

  usb support-->

usb serial converter support-->

  USB driver for GSM and CDMA modems

 

添加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

 

添加USB端口的VIDPID信息,见下面蓝色部分。这里0x0199ME3860模块和ME3760_V2模块的PID0x1476ME3620模块的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

 

添加黑名单信息,上面添加模块信息是只添加了设备的VIDPID,没有附加任何额外的端口信息,这样会导致设备的网卡也被加载成为USB串口,下面提供的是一种类似于黑名单的方式,在option_probe函数中,将网卡对应的端口加入黑名单,防止USB网卡被加载成为USB串口。

对于ME3860ME3760_V2,其网卡对应的端口为01,对于ME3620,其网卡对应的端口为34。请将以下代码添加到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语句分别判断了需要加入黑名单的端口号,如果您使用的是除ME3860ME3760_V2ME3620之外的模块,上面if语句中的判断条件也要做相应修改。

 

 

加载驱动后如需加载其他模块,可以通过命令加载:

echo "19d2 1476" >/sys/bus/usb-serial/drivers/option1/new_id

 

注意:内核补丁会在海思3518C 4G模块移植文件中得到;



https://www.fengoutiyan.com/post/13375.html

相关文章:

  • 2C4G
  • HFC4GA3
  • hi3521芯片
  • 华为海思351四核处理器
  • 海思3519
  • 宝马4GC
  • 新一代红旗CA4GC20TD解析
  • 海思3531
  • 鏡像模式如何設置在哪,圖片鏡像操作
  • 什么軟件可以把圖片鏡像翻轉,C#圖片處理 解決左右鏡像相反(旋轉圖片)
  • 手機照片鏡像翻轉,C#圖像鏡像
  • 視頻鏡像翻轉軟件,python圖片鏡像翻轉_python中鏡像實現方法
  • 什么軟件可以把圖片鏡像翻轉,利用PS實現圖片的鏡像處理
  • 照片鏡像翻轉app,java實現圖片鏡像翻轉
  • 什么軟件可以把圖片鏡像翻轉,python圖片鏡像翻轉_python圖像處理之鏡像實現方法
  • matlab下載,matlab如何鏡像處理圖片,matlab實現圖像鏡像
  • 圖片鏡像翻轉,MATLAB:鏡像圖片
  • 鏡像翻轉圖片的軟件,圖像處理:實現圖片鏡像(基于python)
  • canvas可畫,JavaScript - canvas - 鏡像圖片
  • 圖片鏡像翻轉,UGUI優化:使用鏡像圖片
  • Codeforces,CodeForces 1253C
  • MySQL下載安裝,Mysql ERROR: 1253 解決方法
  • 勝利大逃亡英雄逃亡方案,HDU - 1253 勝利大逃亡 BFS
  • 大一c語言期末考試試題及答案匯總,電大計算機C語言1253,1253《C語言程序設計》電大期末精彩試題及其問題詳解
  • lu求解線性方程組,P1253 [yLOI2018] 扶蘇的問題 (線段樹)
  • c語言程序設計基礎題庫,1253號C語言程序設計試題,2016年1月試卷號1253C語言程序設計A.pdf
  • 信奧賽一本通官網,【信奧賽一本通】1253:抓住那頭牛(詳細代碼)
  • c語言程序設計1253,1253c語言程序設計a(2010年1月)
  • 勝利大逃亡英雄逃亡方案,BFS——1253 勝利大逃亡
  • 直流電壓測量模塊,IM1253B交直流電能計量模塊(艾銳達光電)
  • c語言程序設計第三版課后答案,【渝粵題庫】國家開放大學2021春1253C語言程序設計答案
  • 18轉換為二進制,1253. 將數字轉換為16進制
  • light-emitting diode,LightOJ-1253 Misere Nim
  • masterroyale魔改版,1253 Dungeon Master
  • codeformer官網中文版,codeforces.1253 B
  • c語言程序設計考研真題及答案,2020C語言程序設計1253,1253計算機科學與技術專業C語言程序設計A科目2020年09月國家開 放大學(中央廣播電視大學)
  • c語言程序設計基礎題庫,1253本科2016c語言程序設計試題,1253電大《C語言程序設計A》試題和答案200901
  • 肇事逃逸車輛無法聯系到車主怎么辦,1253尋找肇事司機