35、在JZ2440上使用3G上网卡

1. 简单使用:
1.1 选型:
中国联通:E网时空 EW65 (64元), ZTE中兴 MF637U (160多)
中国电信:Benton/本腾 EQ10B (35元)
中国移动:华为 ET128 (99元), 不要用ZTE A371(Linux下不支持)

更多型号可参考: usb_modeswitch的device_reference.txt

1.2 使用步骤(以windows为例)
a. 接上发现移动硬盘,里面有安装程序和驱动程序
b. 安装完后,移动硬盘消失;
c. 发现新硬件,自动安装好驱动程序后,发现2个串口和一个modem
d. 运行程序即可拨号上网

zeroCD: 3G上网卡自带程序,接到PC后先作为移动硬盘使用,安装程序后切换为modem

对于Linux使用过程:
a. 接上后切换mode: usb_modeswitch
b. 安装驱动程序: linux内核自带, 会出现3个ttyUSB0,1,2
c. 拨号上网:pppd

1.3 交叉编译应用程序并测试
配置内核
-> Device Drivers
  -> Network device support
    <*> PPP (point-to-point protocol) support
    <*> PPP BSD-Compress compression
    <*> PPP Deflate compression
    [*] PPP filtering
    <*> PPP MPPE compression (encryption) (EXPERIMENTAL)
    [*] PPP multilink support (EXPERIMENTAL)
    <*> PPP over Ethernet (EXPERIMENTAL)
    <*> PPP support for async serial ports
    <*> PPP support for sync tty ports
-> Device Drivers
  -> USB support
    <M> USB Serial Converter support
    <M> USB driver for GSM and CDMA modems

make uImage && make modules

应用程序源码:
http://www.draisberghof.de/usb_modeswitch/
http://www.libusb.org/
ftp://ftp.samba.org/pub/ppp/

交叉编译:
libusb:
./configure --host=arm-linux --prefix=$PWD/tmp
make
make install
cd把头文件和库复制进交叉工具链里

cd ./tmp/include/libusb-1.0

sudo cp libusb.h /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include

cd ./tmp/lib

sudo cp * -rfd /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib

把库复制到根文件系统的lib目录下
sudo cp *so* -d /work/nfs_root/fs_mini_mdev_new/lib/

usb_modeswitch:
修改Makefile
CC = arm-linux-gcc
LIBS = -lusb-1.0//根据前面安装的libusb库libusb-1.0 把“ib”去掉

make DESTDIR=$PWD/tmp
make DESTDIR=$PWD/tmp install

cd tmp
sudo cp * -rfd /work/nfs_root/fs_mini_mdev_new

usb-modeswitch-data-20131113:
make DESTDIR=$PWD/tmp install
cd tmp//在usr/share/usb_modeswitch中有一大堆配置文件

sudo cp * -rfd /work/nfs_root/fs_mini_mdev_new

pppd:
修改这6个文件, "$(INSTALL) -s"改为"$(INSTALL) "//-s 在make install的时候会提示一些符号无法识别,具体意思可查看install指令,这里也可以把-s改为-strip-program = arm-linux-strip
chat/Makefile.linux
pppd/plugins/radius/Makefile.linux
pppd/plugins/rp-pppoe/Makefile.linux
pppd/Makefile.linux
pppdump/Makefile.linux
pppstats/Makefile.linux

./configure --host=arm-linux --prefix=$PWD/tmp
make CC=arm-linux-gcc
make CC=arm-linux-gcc install
cd tmp
sudo cp * -rfd /work/nfs_root/fs_mini_mdev_new

使用:
A. 以mf637为例
参考 HI3515海思开发板移植3G模块笔记 - 倔强的晓奇 - 博客频道 - CSDN.NET.htm
http://blog.csdn.net/alangdangjia/article/details/9413009
a. 用新内核启动开发板
复制驱动: sudo cp drivers/usb/serial/*.ko /work/nfs_root/fs_mini_mdev_new
b. 接上3G上网卡,用lsusb查看VID/PID
lsusb
Bus 001 Device 002: ID 19d2:2000

c. 使用usb_modeswitch切换工作模式
它需要一个配置文件,使用上面得到的VIP/PID在device_reference.txt里找到一段配置值,
写入一个文件mf637.cfg
把它放到开发板的/etc目录
usb_modeswitch -c /etc/mf637.cfg(执行后lsusb会发现ID值有改变:TargetProduct

d. 安装驱动程序
insmod usbserial.ko
insmod usb_wwan.ko
insmod option.ko

ls /dev/ttyUSB*会发现三个usb设备节点,pppd切换模式的时候使用其中一个串口,需要在/etc/ppp/peers/下的配置文件中指定然后尝试

e. 用pppd拨号
对于mf637:
修改/etc/ppp/peers/wcdma-dailer, 使用/dev/ttyUSB2
pppd call wcdma-dailer &
cp /etc/ppp/resolv.conf /etc/resolv.conf
ping news.qq.com

B. 以EW65为例
在device_refeence.txt里选取一段存为ew65.cfg
板上接入EW65后执行:usb_modeswitch -c /etc/ew65.cfg
修改/etc/ppp/peers/wcdma-dailer, 使用/dev/ttyUSB0
pppd call wcdma-dailer &
cp /etc/ppp/resolv.conf /etc/resolv.conf
ping news.qq.com

C. 中国电信:Benton/本腾 EQ10B (35元)
在device_refeence.txt里选取一段存为eq10b.cfg
板上接入EQ10B后执行:usb_modeswitch -c /etc/eq10b.cfg
修改/etc/ppp/peers/evdo-dailer, 使用/dev/ttyUSB0
pppd call evdo-dailer &
cp /etc/ppp/resolv.conf /etc/resolv.conf
ping news.qq.com

D. 中国移动 ET128
在device_refeence.txt里选取一段存为et128.cfg
板上接入EQ10B后执行:usb_modeswitch -c /etc/et128.cfg

D的设置需要参考下面文章,因为其使用的不是ttyUSB串口,其使用的是ttyACM:
http://wenku.baidu.com/link?url=pVNn9okBYfUAHiNDBdtpGXselQ9uYVj1lKL5WPmEYaOpMawiYamLrtRcdRZgy5LslcPQL28ySW7q282o1VdBqciHZmsjaRsQ5Xj97oYDqce

配置内核:
-> Device Drivers
-> USB support
<M> USB Modem (CDC ACM) support

sudo cp drivers/usb/class/cdc-acm.ko /work/nfs_root/fs_mini_mdev_new/

ls /dev/ttyACM*
/dev/ttyACM0 /dev/ttyACM1 /dev/ttyACM2

根据下面的贴子修改td-dailer脚本:
http://wenku.baidu.com/link?url=pVNn9okBYfUAHiNDBdtpGXselQ9uYVj1lKL5WPmEYaOpMawiYamLrtRcdRZgy5LslcPQL28ySW7q282o1VdBqciHZmsjaRsQ5Xj97oYDqce

pppd call td-dailer &

2. 编写控制程序自动使用各种型号3G上网卡
a. usb_modeswitch -c /etc/... // 1. 对于不同的3G上网卡配置信息不一样
b. insmod ...
c. pppd call wcdma-dailer // 2. 对于不同的3G上网卡使用不同的/dev/ttyUSB
pppd call evdo-dailer
pppd call td-dailer

写一个控制程序:
a. 接上3G上网卡后它会调用usb_modeswitch并提供对应的配置信息
b. 当识别出/dev/ttyUSB...后, 它创建一个链接文件/dev/gsmmodem指向拨号时要用的/dev/ttyUSB

参考PC上对3G上网卡的识别过程:
在PC上编译、安装: libusb-1.0.9.tar.bz2, usb-modeswitch-2.0.1.tar.bz2, usb-modeswitch-data-20131113.tar.bz2, ppp-2.4.5.tar.gz7
重启电脑
接上USB 3G上网卡
分析PC操作过程:
a. 从/lib/udev/rules.d/40-usb_modeswitch.rules可知
接上3G上网卡后将执行: usb_modeswitch '%b/%k'
执行的是:/lib/udev/usb_modeswitch
它又会调用/usr/sbin/usb_modeswitch_dispatcher
b. /usr/sbin/usb_modeswitch_dispatcher会调用usb_modeswitch进行模式切换
它调用:/usr/sbin/usb_modeswitch -W -D -s 20 $configParam $busParam $devParam -v $usb(idVendor) -p $usb(idProduct) -f "$configBuffer"
它并不使用配置文件,而是使用-f参数, 这些参数来自/usr/share/usb_modeswitch
在/usr/share/usb_modeswitch里有众多文件,已"vid:pid"为名

/usr/sbin/usb_modeswitch_dispatcher根据3G上网卡的vid,pid找到/usr/share/usb_modeswitch里的文件,
然后执行:usb_modeswitch -V vid -P pid -f "文件里的内容"

以上操作见源码中写的应用程序,同时修改/etc/mdev.conf ,添加:

usbdev[0-9]+.[0-9]+ 0:0 777 @ 3g_manager switch &MDEV > /dev/console//MDEV就是指的usbdev1.X设备

可以实现插入网卡后自动切换
c. 怎么创建接文件/dev/gsmmodem:(见代码里面的ln指令,同时修改etcppppeers下的配置文件把/dev/TTYUSBX改为/dev/gsmmodem)下面说明在/usr/sbin/usb_modeswitch_dispatcher中
# The facility to add a symbolic link pointing to the
# ttyUSB port which provides interrupt transfer, i.e.
# the port to connect through.
# Will check for interrupt endpoint in ttyUSB port (lowest if
# there is more than one); if found, return "gsmmodem[n]" name
# to udev for symlink creation
/dev/gsmmodem是指向一个/dev/ttyUSBX, 这个/dev/ttyUSBX所对应的interface含有"中断类型的端点"
如果有多个/dev/ttyUSBX有中断类型端点, 则/dev/gsmmodem指向最小的/dev/ttyUSBX

以上操作见源码中写的应用程序,同时修改/etc/mdev.conf ,添加:

TTYUSB[0-9]+ 0:0 777 @ 3g_manager link &MDEV > /dev/console//MDEV就是指的usbdev1.X设备

可以实现插入网卡后自动切换

怎么判断ttyUSB有无中断类型端点:
# In case the device path is returned as /sys/class/tty/ttyUSB,
# get the USB device path from linked tree "device"
/* 1. 对于每一个/dev/ttyUSBX
* 都有一个对应的/sys/class/tty/ttyUSBX
* 2. 它是一个链接文件, 指向: /sys/......../1-1:1.0/ttyUSB0/tty/ttyUSB0(ls ttyUSB* -l)
* 3. 进入/sys/......../1-1:1.0/   目录下查看,
* 里面有多个"ep_"的子目录cat ep_01/type 可以查看端点类型
* 4. 子目录里有名为type的文件
* 5. 如果这个文件的内容为Interrupt, 则返回1
*
*/

参考文章:
嵌入式Linux下3G USB Modem的使用 - 空之轨迹~约修亚 - 博客频道 - CSDN.NET.htm
http://blog.csdn.net/ling1874/article/details/8148822
http://wenku.baidu.com/link?url=HLRk3U9Jbr2Zx35e5knamYeUKYs14bhV3F9-hzC6rWMwdxCu2gTtAR89VBAdpoAF4UC9LmxCPxGLbjAu_XoSXuy065ZbbvfwtWm9vLy5UWe

配置文件最全:
HI3515海思开发板移植3G模块笔记 - 倔强的晓奇 - 博客频道 - CSDN.NET.htm
http://blog.csdn.net/alangdangjia/article/details/9413009

好文章:ppp及usb_modeswitch等工具移植说明_百度文库.htm
http://wenku.baidu.com/link?url=Y7gsW5izmXwzur3VS3hGYWV_k_glZwzmu7Prdh_F69LuFxcOGT1LwhtsmXA3TVhR6F0l8_ozspcQvO08nlHex2yss0EW7wWIzysw9cZn-wu


1. http://www.draisberghof.de/usb_modeswitch/
http://www.libusb.org/

wvdial arm移植笔记 .-UP-NETARM2410-ChinaUnix博客.htm
http://blog.chinaunix.net/uid-20759926-id-3337026.html

wvdial:
http://alumnit.ca/wiki/index.php?page=WvDial

How to interface USB modem to ARM board (for android or linux)
http://embeddlinux.blogspot.com/2013/01/how-to-interface-usb-modem-to-arm-board.html


嵌入式Linux下3G无线上网卡的驱动移植
http://www.embeddedlinux.org.cn/html/yingjianqudong/201303/15-2489.html

pppd
ftp://ftp.samba.org/pub/ppp/


嵌入式Linux下3G USB Modem的使用 - 空之轨迹~约修亚 - 博客频道 - CSDN.NET.htm
http://blog.csdn.net/ling1874/article/details/8148822
http://wenku.baidu.com/link?url=HLRk3U9Jbr2Zx35e5knamYeUKYs14bhV3F9-hzC6rWMwdxCu2gTtAR89VBAdpoAF4UC9LmxCPxGLbjAu_XoSXuy065ZbbvfwtWm9vLy5UWe

配置文件最全:
HI3515海思开发板移植3G模块笔记 - 倔强的晓奇 - 博客频道 - CSDN.NET.htm
http://blog.csdn.net/alangdangjia/article/details/9413009

好文章:ppp及usb_modeswitch等工具移植说明_百度文库.htm
http://wenku.baidu.com/link?url=Y7gsW5izmXwzur3VS3hGYWV_k_glZwzmu7Prdh_F69LuFxcOGT1LwhtsmXA3TVhR6F0l8_ozspcQvO08nlHex2yss0EW7wWIzysw9cZn-wu

udev详解-ChinaUnix操作系统频道.htm
http://os.chinaunix.net/a2008/0626/982/000000982085.shtml


Linux USB FAQ.htm
http://www.linux-usb.org/FAQ.html

lsusb
https://www.kernel.org/pub/linux/utils/usb/usbutils/

/lib/udev/usb_modeswitch /1-1
if [ -e "/etc/init/usb-modeswitch-upstart.conf" ]; then
exec /sbin/initctl emit --no-wait usb-modeswitch-upstart UMS_PARAM=$1

/usr/sbin/usb_modeswitch_dispatcher --switch-upstart /1-1
/sbin/initctl emit --no-wait usb-modeswitch-upstart UMS_PARAM=/1-1

/usr/sbin/usb_modeswitch_dispatcher --switch-mode $1

/usr/sbin/usb_modeswitch -W -D -s 20 -u -1 -b 1 -g 7 -v 19d2 -p 2000 -f # ZTE devices TargetVendor= 0x19d2 TargetProductList="0001,0002,0015,0016,0017,0019,0031,0037,0052,0055,0061,0063,0064,0066,0091,0108,0117,0128,0157,0177,1402,2002,2003" MessageContent="5553424312345678000000000000061e000000000000000000000000000000" MessageContent2="5553424312345679000000000000061b000000020000000000000000000000" MessageContent3="55534243123456702000000080000c85010101180101010101000000000000" NeedResponse=1

# The facility to add a symbolic link pointing to the
# ttyUSB port which provides interrupt transfer, i.e.
# the port to connect through.
# Will check for interrupt endpoint in ttyUSB port (lowest if
# there is more than one); if found, return "gsmmodem[n]" name
# to udev for symlink creation

# This is run once for every port of LISTED devices by
# an udev rule


# In case the device path is returned as /class/tty/ttyUSB,
# get the USB device path from linked tree "device"

原文地址:https://www.cnblogs.com/liusiluandzhangkun/p/8921698.html