DSP

海思3G模块开发

2019-07-13 19:48发布

一、开发环境 环境 详细 3G模块 ZTE MF190(中兴) SIM 中国联通3G 嵌入式Linux内核  Linux (none) 3.0.8 开发环境 Ubuntu10.10 二、开发步骤 修改内核配置,并重新编译 内核配置增加usb转串口的驱动,配置成模块。 内核配置增加ppp协议支持 重新编译烧写内核 编译usb_modeswitch 交叉编译usb_modeswitch,并把可执行文件和配置文件拷贝到开发板上 编译ppp和编译拨号脚本文件 交叉编译ppp,并把可执行文件和配置文件拷贝到开发板上 验证usb转串口是否成功 这部很关键,如果转串口没有成功或者使用的不是ttyUSB0会使后面的ppp拨号不成功。 运行pppd pppd call wcdma-call
三、详细开发步骤 
1、内核中增加usb转串口的驱动,配置成模块。增加ppp协议支持。重新交叉编译并下载到开发板上。 1.1 增加ppp协议支持   清除内核配置文件:make ARCH=arm CROSS_COMPILE=arm-linux- clean CROSS_COMPILE=arm-linux- 这个要根据自己arm编译器的名字   配置内核:make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig 进入Device Drivers--> Network device support--> <*>PPP (point-to-point protocol) support 选择所有的PPP协议   ppp协议配置完成
1.2、增加usb转串口的驱动模块,编译为模块 使其选中对USB转串口的支持 进入Device Drivers-->USB support-->USB Serial Converter support 选中USB Deiver for GSM and CDMA Modems    
到此3G卡驱动已经添加完 注:本人这里把USB转串口驱动配置成模块,看个人需求也可配置成编译到内核中。   接着要修改option.c文件,在linux-3.0.y/drivers/usb/serial目录下,然后找到 static const struct usb_device_id option_ids[] = { }向这里面增加我们的3G模块设备信息,(有可能你的设备信息已经存在) 本人的3G设备信息添加如下: #define ZTE_VENDOR_ID 0x19d2 //代码中已经定义 厂家ID #define ZTE_PRODUCT_MF190 0x2000 //本人3G模块的设备ID { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF190) }, 解释这两个参数的意义:  ZTE_VENDOR_ID:厂家ID(这是中兴厂家的ID号)  ZTE_PRODUCT_MF190:本人3G模块设备ID 那么如何得知这两个ID号呢?3G设备插入开发板上使用 lsusb 命令就可看到两个ID # lsusb Bus 001 Device 001: ID 1d6b:0002 Bus 002 Device 001: ID 1d6b:0001 Bus 001 Device 002: ID 19d2:2000   到这里所有内核的配置都完成。 重新编译内核make ARCH=arm CROSS_COMPILE=arm-linux- uImage 编译模块:make ARCH=arm CROSS_COMPILE=arm-linux- modules  //因为本人把驱动配置成模块所以这里需要编译模块。在linux-3.0.y/drivers/usb/seria目录下会出现三个驱动模块   把这三个驱动复制到开发板上,本人复制开发板路径/lib/modules/3.0.8/serial 在系统启动脚本中添加驱动加载,在/etc/init.d/rcS中添加下面几行 insmod /lib/modules/3.0.8/seria/usbserial.ko maxRSize=16384 maxWSize=512 maxISize=64 ##设置缓冲大小,挺高速度。 nsmod /lib/modules/3.0.8/seria/usb_wwan.ko nsmod /lib/modules/3.0.8/seria/option.ko 加载完驱动后/dev目录下出现ttyUSB0 ttyUSB1 ttyUSB2那么恭喜你usb转串口已经成功。   问题: (1)、加载完驱动后/dev目录下没有出现ttyUSB0 ttyUSB1 ttyUSB2 查看设备: cat /proc/devices   如果没有ttyUSB那么加载驱动有问题,查看option.c文件添加的设备ID是否有错误 如果有ttyUSB跳到(问题解决一
2、测试转出的串口是否可用 使用Linux串口代码进行测试。本人测试代码链接:http://download.csdn.net/detail/lin_jianbin/8339773 分别打开串口ttyUSB0 ttyUSB1 ttyUSB2 发送字符串数据“AT ”  或者十六进制数据 0x41 0x54 0x0D 0x0A 如果接收到数据为OK表示成功 测试出成功的设备比如ttyUSB0 后面配置需要使用到。(不是所有的设备都是使用ttyUSB0发送和接收数据的)所以这需要测试   3、交叉编译pppd,移植 下载路径:ftp://ftp.samba.org/pub/ppp/ 本人下载的是ppp-2.4.5.tar.gz 解压:tar -zvxf ppp-2.4.5.tar.gz 进目录:cd ppp-2.4.5 配置:./configure        生成Makefile文件 编译:make CC=arm-liunx-gcc AR=arm-liunx-ar LD=arm-liunx-ld STRIP=arm-liunx-strip 成功后会在pppd目录下生成可执行文件pppdchat目录下生成可执行文件chat   创建拨号的配置文件 在/etc.ppp/目录下创建文件 wcdma-chat 内容如下: TIMEOUT 15 ABORT 'NO CARRIER' ABORT 'ERROR' ABORT 'NO DIALTONE' ABORT 'BUSY' ABORT 'NO ANSWER' "" 'AT' OK 'ATDT*99#' CONNECT  /etc.ppp/目录下创建文件 disconnect-chat 内容如下: ABORT "BUSY" ABORT "ERROR" ABORT "NO DIALTONE" SAY "/nSending break to the modem/n" '' "/K" '' "+++ATH" SAY "/nGoodbye/n"   在/etc.ppp/目录下创建文件 wcdma-call 内容如下: debug lock nodetach /dev/ttyUSB0  ### 这个要根据第二步测试成功的设备结点 115200 user "card" password "card" crtscts show-password usepeerdns noauth noipdefault novj novjccomp noccp defaultroute ipcp-accept-local ipcp-accept-remote connect '/usr/sbin/chat -v -t3 -f /etc/ppp/chat/wcdma-connect' disconnect '/usr/sbin/chat -s -v -f /etc/ppp/chat/disconnect'
pppd配置参数可参考: http://blog.csdn.net/hens007/article/details/7255455 这里的配置文件是针对联通3G卡的,如果需要支持其他的SIM卡可更改这些配置。   移植: /pppd/pppd  拷贝到开发板 /usr/sbin /chat/chat   拷贝到开发板 /usr/sbin /etc.ppp/目录下的文件 chap-secrets  options pap-secrets 拷贝到开发板 /etc/ppp目录下 /etc.ppp/目录下的文件 wcdma-chat disconnect-chat  拷贝到开发板 /etc/ppp/chat目录下 /etc.ppp/目录下的文件 wcdma-call  拷贝到开发板 /etc/ppp/peers目录下   到这里开发板移植完毕可到开发板上进行拨号: #pppd call wcdma-call Script /usr/sbin/chat -v -t3 -f /etc/ppp/chat/wcdma-connect finished (pid 891), status = 0x0 Serial connection established. using channel 1 Using interface ppp0 Connect: ppp0 <--> /dev/ttyUSB2 sent [LCP ConfReq id=0x1    ] rcvd [LCP ConfReq id=0x0     ] sent [LCP ConfAck id=0x0     ] rcvd [LCP ConfAck id=0x1    ] sent [LCP EchoReq id=0x0 magic=0xfd880529] rcvd [LCP DiscReq id=0x1 magicdc467] rcvd [CHAP Challenge id=0x1 , name = "UMTS_CHAP_SRVR"] sent [CHAP Response id=0x1 <606f317e42edafc7e3653ea6b>, name = "card"] rcvd [LCP EchoRep id=0x0 magic=0x2bdc467 fd 88 05 29] rcvd [CHAP Success id=0x1 ""] CHAP authentication succeeded CHAP authentication succeeded sent [IPCP ConfReq id=0x1   ] rcvd [IPCP ConfNak id=0x1    ] sent [IPCP ConfReq id=0x2    ] rcvd [IPCP ConfReq id=0x0] sent [IPCP ConfNak id=0x0 ] rcvd [IPCP ConfRej id=0x2  ] sent [IPCP ConfReq id=0x3   ] rcvd [IPCP ConfReq id=0x1] sent [IPCP ConfAck id=0x1] rcvd [IPCP ConfNak id=0x3   ] sent [IPCP ConfReq id=0x4   ] rcvd [IPCP ConfAck id=0x4   ] Could not determine remote IP address: defaulting to 10.64.64.64 Cannot determine ethernet addresxy ARP local  IP address 10.30.208.139 remote IP address 10.64.64.64 primary   DNS address 218.104.128.106 secondary DNS address 58.22.96.66   拨号成功   问题解决一 方法一:手动创建设备结点 mknod /dev/ttyUSB0 c 188 0     //188即使主设备号 如上的cat /proc/devices 可以得知。为次设备号。 mknod /dev/ttyUSB1 c 188 1     mknod /dev/ttyUSB2 c 188 2     测试创建的设备结点是否可用: 这种方法只能实现简单的测试,更为准确的测试最好用自己写的串口代码测试。 # cat /dev/ttyUSB0     cat: can't open 'ttyUSB0': No such device //表示设备结点不可用 只能用方法二。   方法二:使用usb_modeswitch usb_modeswitch是对USB设备的工作模式进行转换usb工作模式:usb存储模式,usb serial模式。 我们要把3G模块转为usb serial模式。 参考文章:http://blog.csdn.net/lin_jianbin/article/details/42520419