(一) 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層進行交互的流程了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章