(一) Porting USB 3G MODEM to Android

由于prima2 本身不带有3G modem 模块,所以调试模块使用的是Huawei USB接口的无线上网卡,Huawei E1780,如其他型号Huawei E1750等都是兼容的。目前大多数3G无线上网卡内部含有windows驱动,第一次插入的时候,作为一个闪存,并提示你安装驱动,安装驱动之后,会自动切换到usb设备模式,存储设备消失,新的modem设备产生。这种特征被无线设备的制造商称其为“免CD”设备。

如果将3G上网卡用在linux设备上,默认为USB Storage模式,同样需要进行模式切换,将存储设备切换为modem设备,才能进行正常的数据收发。所以android支持usb 上网卡的第一步就是对usb modem进行模式切换,所用到的切换工具是 usb_modeswitch。为了便于调试,我们先手动切换无线上网卡设备,待测试成功后,再将转换工具集成到android中。

一. 需要的源码包

(1) usb库:libusb-0.1.12.tar.gz

Libusb是一个c库,它为了便于应用程序访问usb设备,提供一套系统API usb_modeswitch需要这套系统API的支持

 http://sourceforge.net/projects/libusb/files/libusb-compat-0.1 libusb-1.0 libusb-0.1

Note:libusb分为1.0版本和0.1两种版本,但是1.0并不向下兼容0.1,需要

libusb-compat的支持。使用过程中, 不可同时安装0.1版和libusb-compat。

根据 usb_modeswitch的说明,他是基于libusb 0.1.12库编译生成的,所以只需要单独

安装 libusb-0.1.12即可。如果特别需要安装libusb1.0版,那么也必须同时安装libusb-compat。否则1.0版本库不支持usb_modeswitch.

详情查看: http://www.libusb.org/

(2) usb_modeswitch-1.2.3.tar.bz2(newest version)

USB设备工作模式转换工具

 http://www.draisberghof.de/usb_modeswitch/#download

(3) usb_modeswitch-data-20110805

配置usb_modeswitch.conf时使用

 http://www.draisberghof.de/usb_modeswitch/#downloadNote:由于usb_modeswitch 与libusb 之间的版本依赖很强,所以尽量使用推荐的版本进行编译,可减少很多麻烦和错误。二.交叉编译usb_modeswitch

1.交叉编译libusbA.解压并进入libusb-0.1.12目录,建立子目录install用于存放

最后生成的库文件和头文件。$ mkdir install

  1. 配置并生成Makefile文件

$./configure –host=arm-none-linux-gnueabi

--prefix=解压包所在目录/install

  1. make
  2. make install

执行成功后,在install 目录下生成所需要的库文件和头文件。其中 在include下就有我们需要的usb.hNote:如果使用的是 libusb1.0 版的,那么需要libusb-compat库的支持。交叉编译libusb-compat库的步骤和方法与编译libusb类似。2.交叉编译usb_modeswitch

A.修改Makefile文件

CC = arm-none-linux-gnueabi-gccCFLAGS += -Wall

-I /home/wls/modeswitch/libusb-0.1.12/install/include/

-L /home/wls/modeswitch/libusb-0.1.12/install/lib/LIBS = -l usb

  1. make all

在当前目录下生成可执行文件usb_modeswitch.三、usb_modeswitch-data-20120120

为usb_modeswitch准备配置文件 usb_modeswitch.conf

首先找到所使用的上网卡ID:将上网卡插到prima2 板子上,进入终端,输入命令lsusb,查看本上网卡的vendor ID 和 product ID.

Huawei E1780的vendor ID: Product ID = 12d1:1446$ cd usb_modeswitch.d找到所用上网卡ID命名的文件,将这个文件内容追加到配置文件usb_modeswitch.conf 中。

$ cat 12d1:1446 >> usb_modeswitch.conf

NOTE:编辑usb_modeswitch.conf 配置文件,添加如下行:DefaultVendor?=0x12d1DefaultProduct?=0x1446TargetClass?=0xffTargetVendor?= 0x12d1TargetProduct?= 0x1436CheckSuccess?=10HuaweiMode?=0Default Vendor 和 Default Product 是上网卡在mass storage模式下被检测到的ID号;TargetVendor和 Target Product 是上网卡被转换到modem 模式后的ID。CheckSuccess是检查转换是否成功的最大次数,也就是转换所需要耗费的最大时间。超过这个时间还没有转换成功就认为此次转换失败。HuaweiMode?=0严格注意这一行是必须要加的。很多人都是因为没有添加这一行,而一直不能转换成功。#EnableLogging?=0EnableLogging?=1这个标志用来使能 输出日志到/var/log/usb_modeswitch_xxx,xxx为设备名。四、在开发板上执行模式转换将以上生成的liblusb 动态库 拷贝到开发板的库目录(system/lib)下,将上面生成的modeswitch可执行程序拷贝到 data目录下,将usb_modeswitch.conf 配置文件下载到开发板的/etc/目录下。

  1. 启动prima2开发板,将3G上网卡通过usb转接口连接到prima2上,在终端输入命令:lsusb, 查看已经识别到设备

Bus 001 Device 003: ID 12d1:14462.进入modeswitch所在目录,保证此目录的文件有可执行权限,运行以下命令。

./usb_modeswitch -I –c /etc/usb_modeswitch.conf

开始执行模式转换,如果转换成功,终端会显示Found correct target deviceMode switch succeeded. Bye.此时,在终端输入命令:lsusb,查看设备信息:Bus 001 Device 003: ID 12d1:1436说明转换成功,3G上网卡已经转换为 modem模式。五、配置内核支持

  1. 在驱动中添加对上网卡的支持在linux下面,对应的3G上网卡驱动为kernel/drivers/usb/serial/opticon.c#define HUAWEI_PRODUCT_E1780 0x1436

注意这个product ID 是转换之后的ID。在文件option.c里面有个结构体数组static const struct usb_device_id option_ids[],这个数组就是记录内核所能识别的上网卡型号,将刚才转换成功后的USB ID加到数组里面就可以了。这个option.c文件,就是内核里面的GSM/CDMA MODEM驱动程序。{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1780, 0xff, 0xff, 0xff) },

  1. 选择上USB转串口驱动,选择直接编译进内核Device Drivers ---> USB support ---> USB Serial Converter support---->USB Serial Converter support

配置完成后,编译内核,烧写到开发板。

  1. 验证USB转串口成功

此时执行usb_modewitch进行模式转换, 等待转换成功后,执行命令: ls -l /dev/ttyUSB*可以看到串口节点已创建成功 /dev/ttyUSB0 、/dev/ttyUSB1、/dev/ttyUSB2。六、移植modeswitch和libusb到android目录下,实现自动转换Usb上网卡能转换成功,说明usb_modeswitch版本与libusb库相匹配,且能正常工作。接下来,要把modeswitch与libusb移植到android/external目录下,分别创建目录modeswitch和libusb,将对应code拷贝过来,并编写对应的Android.mk。Modeswitch编译生成的可执行文件存放到 /system/binLibusb 编译生成的库文件存放到 /system/lib/Modeswitch.conf 配置文件存放到 /etc/此时,我们为modem工作准备好了通信端口,可以对其进行命令的发送和接受,底层工作基本准备好了,接下来,我们要看modem如何跟RIL层进行交互的流程了。

你可能感兴趣的:(usb,modeswitch)