3G卡片在开发板上的详细解决方法(适用于大多数3G卡片)

Advertisement

3G卡片在开发板上的详细解决方法(适用于大多数3G卡片)

Anson Luo /Gray Luo(罗国辉)

一. 环境

1. 开发板内核:linux kernel 2.6.14

2. 3G卡片:HUAWEI E1750

二. 相关工具与库文件下载

1. usb_modeswitch-1.0.6.tar.bz2(http://www.draisberghof.de/usb_modeswitch/)

建议下载较新版本,如果怕麻烦就下载与我一样的版本,下同。

Usb_modeswitch是对USB设备的工作模式进行转换一种万能工具,当然这种宝贝,只有在linux下才能体现其巨大的作用。随着移动通信,无线通信的发展,越来越多的设备被制作成USB接口,像一些无线网卡,3G数据卡等等。这些设备的厂家一般都会提供windows 下驱动,这些设备在第一次插上机子的时候,它们处于CDROM+闪存模式,可以从中提供驱动程序安装驱动,在驱动程序安装完成后,驱动会转换成3G模式,此时就会出现usb modem设备,目前的3G卡片全都是这样,这就是所谓的“ZeroCD”。

而在linux下我们可没有那么好的待遇,厂家一般不会给我们提供linux下面的驱动,而目前的内核还不能自动识别并驱动。所以我们需要用usb_modeswitch这个工具来进行模式转换,设备模式依赖usb-storage和usbserial模式,所以,在开发板上需要有这两种模块的支持,设备并能够正常工作于这两种模式下。

2usb_modeswitch-current_data.tar.bz2(http://www.draisberghof.de/usb_modeswitch/)

这个包里包括提供给UDEV的驱动设备信息,和很多设备使用usb_mdoeswitch进行转换模式时需要配置的参数。下载它用于参考。

3. libusb-1.0.6.tar.bz2 (http://sourceforge.net/projects/libusb/files/libusb-1.0/)

Libusb才是我们的真正骨干力量,提供给usb_modeswitch一套系统API,所以,自然usb_modeswitch这个包工头要想工作,肯定不能离开libusb这个工人为其服务。

4.libusb-compat-0.1.3.tar.bz2 (http://www.linuxfromscratch.org/blfs/view/svn/general/libusb-compat.html

libusb分为0.1和1.0两年版本,而1.0版本与0.1有较大的不同,并不向下兼容,必须依赖libusb-compat。

三. 交叉编译usb_modeswitch

1. 交叉编译 libusb

A. 解压并进入libusb-1.0.6目录,建立子目录install用于存放最后生存的库文件与头文件。

[[email protected]]# mkdir install

B. 配置并生成Makefile文件

[[email protected]]#./configure --build=i686-linux --host=arm-linux --prefix=/home/Anson/libusb-1.0.6/install

C. [[email protected]]#make

D. [[email protected]]# make install

2. 设置PKG_CONFIG_PATH环境变量,以使我们后面的编译能够顺利找到libusb

A.设置环境变量

[[email protected]]# export PKG_CONFIG_PATH=/home/Anson/libusb-1.0.6/install/lib/pkgconfig:$PKG_CONFIG_PATH

B.查看是否设置正确

[[email protected]]#echo $PKG_CONFIG_PATH

3. 交叉编译lib_compat

与上面编译libusb的方法类似:

A[[email protected]]#.mkdir install

B . [[email protected]]#./configure --build=i686-linux --host=arm-linux --prefix=/home/Anson/libusb-compat-0.1.3/install

C. [[email protected]]#make

D. [[email protected]]#make install

说明:如果此时出现"-Wno-pointer-sign"、"-fvisibility=hidden"这类错误,则是由于编译器版本过低不支持导致的,可以直接在Makefile和libusb/Makefile文件中删除这些编译选项即可。

4. 交叉编译usb_modeswitch

A.修改Makefile文件

修改STRIP和CC选项为:

STRIP = arm-xxx-linux-strip

CC = arm-xxx-linux-gcc

B. 可以将上面的libusb和libusb-compat的库和头文件拷贝到交叉编译器的lib和include目录下,或者直接加上编译选项指令库的路径即可如下:

INCLUDEDIR = /home/anson//libusb-1.0.6/install/include/libusb-1.0

LIBDIR = /home/anson/libusb-1.0.6/install/lib

$(PROG): $(OBJS)

$(CC) $(CCFLAGS) -I $(INCLUDEDIR) -L $(LIBDIR) -o $(PROG) $(OBJS)

这里的usb.h就是libusb-compat目录下的,如果没有usb.h,usb_modeswitch是编译不过去的。

C. make

5. 编辑usb_modeswitch目录下的usb_modeswitch.conf文件,加入以下内容:


DefaultVendor= 0x12d1

DefaultProduct= 0x1446

TargetVendor = 0x12d1

TargetProduct= 0x1001

MessageContent="55534243000000000000000000000011060000000000000000000000000000"

MessageEndpoint=0x01

CheckSuccess=5

HuaweiMode=0 (特别注意这个参数,我在开发板上的麻烦就出在这个参数上面)

6. 将上面生成的libusb动态库拷贝到开发板的库目录下,将上面生成的usb_modeswitch可执行程序和usb_modeswitch.conf配置文件下载到开发板某目录下。

四. 交叉编译3G卡片驱动

1. 编译 3G模块的驱动option.ko

在内核源码包中找到usb的3G驱动文件 driver//usb/serial/option.c在其中加入3G卡片的 HUAWEI_VENDOR_ID 0x12D1和HUAWEI_PRODUCT_E1750 0x1446。然后修改Kconfig将option编译成模块。将编译生成的option.ko下载到开发板中并使用insmod加载。

五. 加载驱动

1. 挂载usb虚拟文件系统:mount -t usbfs usbfs /proc/bus/usb/

2. 弹出3G卡片的cdrom: eject /dev/cdroms/cdrom0

3. 现在就可以使用usb_modeswitch –W –c ~/usb_modeswitch.conf切换3G卡片的模式了。此时会出现一些信息,你会看到转换成3G模式后的几个串口信息,ttyUSB0, ttyUSB1, ttyUSB2,如下:

option 1-1:1.0: Option 3G data card converter detected
usb 1-1: Option 3G data card converter now attached to ttyUSB0
option 1-1:1.1: Option 3G data card converter detected
usb 1-1: Option 3G data card converter now attached to ttyUSB1
option 1-1:1.2: Option 3G data card converter detected
usb 1-1: Option 3G data card converter now attached to ttyUSB2

如果没有使用udev,就不会自动生成这些结点,所以需要手动创建这些字符节点。

mknod /dev/usb/ttyUSB0 c 188 0

mknod /dev/usb/ttyUSB1 c 188 1

mknod /dev/usb/ttyUSB2 c 188 2

此时你可以在/dev/usb/tts下面找到生成了3个节点1,2,3.如果在PC上面使用发行版,一般都会使用udev做/dev下面的节点,这样子就可以直接在/etc/udev/rules.d/下面添加相应的设备信息和处理就可以了,但是由于开发板上并没有udev,它会生态太多设备节点,对嵌入式开发资源有较大浪费,这里,根据提示信息说明driver在X1地址处找到了Y1设备,它在/dev下面的节点叫Z1,所以此时我们需要手动创建。我的意思就是说这个节点本身已经注册了相应的ioctl了,只是设备节点没有生成而以,所以这时手动创建是完全没有问题的。

4. 使用串口的测试工具发送AT指令测试几个串口是否可用。

六. 交叉编译pppd拨号工具,并编写拨号脚本

1. 交叉编译pppd拨号工具(这里不详细讲解,可参考后续文章的详细说明)

2. 编写拨号脚本,与GPRS的拨号脚本类似。

A. 联通WCDMA-HSDPA:

(1)wcdma:


debug

nodetach

lock

/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 -s -v -f chat-wcdma-connect'

disconnect '/usr/sbin/chat -s -v -f chat-wcdma-disconnect'

(2) chat-wcdma-connect:


TIMEOUT 5

ABORT 'NO CARRIER'

ABORT 'ERROR'

ABORT 'NO DIALTONE'

ABORT 'BUSY'

ABORT 'NO ANSWER'

'' /rAT

OK /rATZ

OK /rAT+CGDCONT=1,"IP","3gnet",,0,0

OK-AT-OK ATDT*99#

CONNECT /d/c

(3) chat-wcdma-disconnect


ABORT "BUSY"

ABORT "ERROR"

ABORT "NO DIALTONE"

SAY "/nSending break to the modem/n"

'' "/K"

'' "+++ATH"

SAY "/nGoodbay/n"

B. 移动TD-CDMA

(1)td:


debug

logfile /var/log/pppd.log

lock

/dev/ttyUSB0

115200

user "card"

password "card"

crtscts

connect '/usr/sbin/chat -v -t3 -f td-connect-chat'

disconnect '/usr/sbin/chat -s -v -f td-disconnect-chat'

show-password

usepeerdns

noauth

noipdefault

novj

novjccomp

noccp

defaultroute

ipcp-accept-local

ipcp-accept-remote

(2) td-connect-chat:


ABORT 'NO CARRIER'

ABORT 'ERROR'

ABORT 'NO DIALTONE'

ABORT 'BUSY'

ABORT 'NO ANSWER'

'' /rATZ

OK-AT-OK ATD#777

CONNECT /d/c

(3) td-disconnect-chat:


ABORT "BUSY"

ABORT "ERROR"

ABORT "NO DIALTONE"

SAY "/nSending break to the modem/n"

'' "/K"

'' "+++ATH"

SAY "/nGoodbay/n"

C. 电信CDMA1x

(1) cdma1x:


debug

nodetach

lock

/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 -s -v -f cdma1x-connect-chat'

disconnect '/usr/sbin/chat -s -v -f cdma1x-disconnect-chat'

(2) cdma1x-connect-chat:


TIMEOUT 5

ABORT 'NO CARRIER'

ABORT 'ERROR'

ABORT 'NO DIALTONE'

ABORT 'BUSY'

ABORT 'NO ANSWER'

'' /rATZ

OK /rAT/^PREFMODE=2

OK-AT-OK ATD#777

CONNECT /d/c

(3) cdma1x-disconnect-chat:


ABORT "BUSY"

ABORT "ERROR"

ABORT "NO DIALTONE"

SAY "/nSending break to the modem/n"

'' "/K"

'' "+++ATH"

SAY "/nGoodbay/n"

D. 电信CDMA2000-EVDO

(1) evdo


debug

nodetach

lock

/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 -s -v -f evdo-connect-chat'

disconnect '/usr/sbin/chat -s -v -f evdo-disconnect-chat'

(2)evdo-connect-chat


TIMEOUT 5

ABORT 'NO CARRIER'

ABORT 'ERROR'

ABORT 'NO DIALTONE'

ABORT 'BUSY'

ABORT 'NO ANSWER'

'' /rATZ

OK-AT-OK ATD#777

CONNECT /d/c

(3)evdo-disconnect-chat


ABORT "BUSY"

ABORT "ERROR"

ABORT "NO DIALTONE"

SAY "/nSending break to the modem/n"

'' "/K"

'' "+++ATH"

SAY "/nGoodbay/n"

3. 使用pppd拨号 :pppd file td(wcdma/evdo/cdma1x)

4. 此时将会使用脚本中设置的端口进行拨号,如果成功后会获得IP地址,电信的3G卡片获取的是外网IP地址,而其它则是获取的一个内网IP,将获取到的DNS添加到/etc/resolv.conf.中,并使用route添加一条默认路由,ping一下外网的地址,如果能够ping通,则说明完成了本篇的工作了,电信,移动,联通有的网络会禁ping,所以ping不通,所以这果,就需要使用自己的测试工具,发送tcp/udp包,确定是否成功完成本篇工作。

七. 可参考文章:

1. http://blog.chinaunix.net/u3/106318/showart_2110454.html

2. http://blog.chinaunix.net/u3/106318/showart_2102540.html

后记:很多朋友给我发邮件讨论一些问题,但是很多网友根本没有严格按照我文中讲的方法进行一步一步的操作,有的跳过了一些步骤,有些使用了软件的最新版本,这里我说明一下,我上面使用方法都是只限于我使用的软件版本,如果你使用最新的版本,可能你需要自己进行调试,本文只能作为参考 ,对于最新的版本我没有测试过,所以如果你想节约时间,请严格使用我文章各软件版本。当你的工作陷入问题的时候,请不要急于找人帮助,而是先确定问题,然后再重新仔细地读我的文章,如果你完全按照我的文章来做,不应该会出现一些问题的。在此谢谢大家的关注!

Similar Posts:

  • 在MIPS开发板上建立Linux系统及开发环境

    介绍了利用已有的MIPS版Linux源文件包,编译可运行的Linux内核的方式:讨论了在主机上建立相关服务器,通过NFS服务从主机上下载内核,在无盘开发板上启动Linux的方法. 一.引言 大多数基于MIPS处理器的平台上都没有提供软.硬盘接口,一般情况下,也没有在板载Flash里烧入可使用的操作系统.没有操作系统,用户的使用就会受到很多限制,应用程序的开发.调试过程就会变得相当复杂.因此,建立合适的操作系统及开发环境,可以方便用户,简化开发调试过程.本文以RedHat Linux 为例,说明在

  • linux系统有关交叉编译和移植到6410开发板上的简单过程

    我没有写过博客,这是我的第一篇博客,如果有些地方用词或表意不清楚的话,敬请原谅!闲话不多说了,下面开始步入正题! 在进行移植之前,要检查一下目标机(这里指6410开发板)与宿主机之间的接线问题,即串口线.网线是否正确连接,目标机的电源是否插好!在接线问题解决后,才能保证交叉编译正常进行! 个人理解,移植的主要思想是在宿主机上新建一个网络文件系统,将该网络文件挂载到目标机上,通过建立共享网络文件系统来实现在目标机的终端控制运行在宿主机上交叉编译后的执行文件(如果涉及到库时,还需要交叉编译库,将交叉

  • 2530 开发板上的某个按键修改

    对于手上拥有一个2530开发板的Zstack初学者来说,最经常做的事情也许就是按下开发板上的某个按键,进行绑定或者远程控制另一个开发板上的LED的亮灭.自然而然地,大家都想知道这个过程是如何实现的,协议栈的按键处理函数在哪里,如果想自己设计开发板,假如按键接口和2530标准开发板不一样的话,又应当修改哪些参数才能保证按键能够起作用,这里我就来详细地解释一下. 按键的配置是在hal_key.c里实现的,在文件的顶端,我们能够找到如下的预编译内容: /* SW_6 is at P0.1 */ #de

  • linux-2.6.32在mini2440开发板上移植(8)之添加ADC驱动程序

    添加ADC驱动程序 编者:由于内核没有支持S3C2440的ADC驱动,在这里增加ADC驱动.友善的手册对这个介绍的还算相当详细,所以直接按照手册进行.里面的代码也有详细的注释.ADC驱动属于字符型设备,在这里以杂项设备也有的翻译为混杂设备,进行实现. 1 .关于S3C2440 的ADC 和触摸屏接口 Linux-2.6.32.2 内核并没有提供支持S3C2440 的ADC 驱动程序,因此我们自行设计了一个,这个驱动比较简单,属于字符设备,它位于drivers/char 目录下,驱动程序的文件名为

  • 在开发板上挂载NFS(转)

    网络文件系统(NFS,Network File System)是一种将远程主机上的分区(目录)经网络挂载到本地系统的一种机制,通过对网络文件系统的支持,用户可以在本地系统上像操作本地分区一样来对远程主机的共享分区(目录)进行操作.     在嵌入式Linux 的开发过程中,开发者需要在Linux 服务器上进行所有的软件开发,交叉编译后,通用FTP 方式将可执行文件下载到嵌入式目标系统运行,但这种方式不但效率低下,且无法实现在线的调试.因此,可以通过建立NFS,把Linux 服务器(PC端)上的特

  • 学习 ARM 系列 -- FS2410 开发板上 Nand Flash 到内存的代码搬移

    一.目的 前面做过一个实验,搬移 Nand Flash 里的前 4k 代码到内存指定位置,这其实是把 SRAM 从 0x40000000 开始的 4K 代码复制到 SDRAM 的指定位置,并没有涉及到对 Nand Flash 的操作.究其原因,开发板上电后,Nand Flash 开始的前 4K 数据会被自动复制到 SRAM 0x40000000 开始的 4K 区域里,这个区域被称为 "Steppingstone".那我们这次就来 操作 Nand Flash,读取它 4K 后的代码到 S

  • 浅析busybox的tftp命令在arm开发板上的使用实例

    浅析busybox的tftp命令在arm开发板上的使用实例 # cp /bin/busybox /gliethttp_ftpd_dir/ # tftp -l /gliethttp_ftpd_dir/busybox -r gliethttp_buxybox -p 172.20.0.1 将arm开发板本地的/gliethttp_ftpd_dir/busybox文件-p参数表示put,发送到tftpd服务器172.20.0.1上,并将文件重命名为gliethttp_buxybox 在pc上使用如下命令

  • linux2.6.37.4内核在XC2440开发板上移植(七)之以太网卡驱动移植

    XC2440开发板上使用的以太网卡芯片是DM9000A,内核中的驱动文件为:drivers/net/dm9000.c,我们需要在mach-xc2440.c文件中加入对dm9000网卡的驱动支持,并创建平台数据: 加入dm9000头文件: #include 在xc2440_devices[ ]平台设备结构体数组中加入ethernet设备: &xc2440_ethernet_device, 创建platform_device和platform_data: /* DM9000A Net */ stat

  • 交错编译mkfs.vfat工具格式化开发板上分区

    busybox已经提供了fdsik和mkfs.vfat工具,可以使用busybox提供的fdisk和mkfs.vfat来格式化开发板上分区,当然如果非要使用纯正原始版本的mkfs.vfat也可以,需要从源码交叉编译, mkfs.vfat就是mkdosfs, 通过如下信息可以看到 [email protected]:~$ mkfs.vfat mkfs.vfat 2.11 (12 Mar 2005) No device specified! // 这里可以看到为mkdosfs程序,只是程序名变为了mk

  • 在ARM开发板上通过GPRS发送数据

    我用的GPRS模块是德信公司 ,德信的PIML-900/1800模块的推荐的典型电源电压为3.8V,有2A的电流输出能力.由于周围网络很好,所以我在实际的使用中电源设计采用的是LM2941,输出电流为1A,调整电阻使输出在3.8v左右,模块工作正常.在周围网络不好的情况下,模块不停的搜寻网络,这时将消耗较大的电流,此时应采用输出电流能力较大的电源芯片.为了防止模块电源电压产生突然的降低导致模块死机,在靠近模块的输入端加了一个470uf的电容,增强模块在发送数据期间供电电压的稳定性. 由于模块内嵌

Tags: