1. 程式人生 > >《Linux作業系統-系統移植》第8章 USB-4G/LTE移植 -第4節 USB-4G移植(移遠EC20開發-Gobi撥號)

《Linux作業系統-系統移植》第8章 USB-4G/LTE移植 -第4節 USB-4G移植(移遠EC20開發-Gobi撥號)

開發環境
主機:ubuntu12.04
開發板核心版本:linux-2.6.35
【注】EC20支援PPP撥號,Gobi撥號和QMI撥號,筆者使用的是Gobi撥號,關於另外兩種撥號請參考官方文件,後文的附件連結中已經給出了參考文件。

3.1 USB Serial驅動

當模組連線到USB序列驅動時,驅動程式將在目錄/dev中建立裝置檔案,
ttyUSB0/ttyUSB1/ttyUSB2…
接下來就是講解如何移植USB Serial。

3.1.1增加PID&VID

要想識別模組,客戶應該在下面新增模組維和PID資訊
File: [KERNEL]/drivers/usb/serial/option.c

static
const struct usb_device_id option_ids[] = { #if 1 //Added by Quectel { USB_DEVICE(0x05C6, 0x9090) }, /* Quectel UC15 */ { USB_DEVICE(0x05C6, 0x9003) }, /* Quectel UC20 */ { USB_DEVICE(0x2C7C, 0x0125) }, /* Quectel EC25 */ { USB_DEVICE(0x2C7C, 0x0121) }, /* Quectel EC21 */ { USB_DEVICE(0x05C6, 0x9215) }, /* Quectel EC20 */ { USB_DEVICE
(0x2C7C, 0x0191) }, /* Quectel EG91 */ { USB_DEVICE(0x2C7C, 0x0195) }, /* Quectel EG95 */ { USB_DEVICE(0x2C7C, 0x0306) }, /* Quectel EG06/EP06/EM06 */ { USB_DEVICE(0x2C7C, 0x0296) }, /* Quectel BG96 */ { USB_DEVICE(0x2C7C, 0x0435) }, /* Quectel AG35 */ #endif

這裡其實只需要{ USB_DEVICE(0x05C6, 0x9215) }, /* Quectel EC20 */ 這一項,其他是無關緊要的,可以不放進去。option_ids[]就是一usb serial的裝置pid,vid表。
【注】還有另外一種方式檢視PID和VID,將EC20和微控器連線,就可以進入系統檢視USB裝置。

3.1.2新增零包處理

根據USB協議的要求,客戶需要新增處理零資料包的機制。
For Linux Kernel Version newer than 2.6.34:
File: [KERNEL]/drivers/usb/serial/usb_wwan.c

static struct urb *usb_wwan_setup_urb(struct usb_serial *serial, int endpoint,
int dir, void *ctx, char *buf, int len,void (*callback) (struct urb *))
{
……
usb_fill_bulk_urb(urb, serial->dev,
usb_sndbulkpipe(serial->dev, endpoint) | dir,
buf, len, callback, ctx);
#if 1 //Added by Quectel for zero packet
if (dir == USB_DIR_OUT) {
struct usb_device_descriptor *desc = &serial->dev->descriptor;
if (desc->idVendor == cpu_to_le16(0x05C6) && desc->idProduct == cpu_to_le16(0x9090))
urb->transfer_flags |= URB_ZERO_PACKET;
if (desc->idVendor == cpu_to_le16(0x05C6) && desc->idProduct == cpu_to_le16(0x9003))
urb->transfer_flags |= URB_ZERO_PACKET;
if (desc->idVendor == cpu_to_le16(0x05C6) && desc->idProduct == cpu_to_le16(0x9215))
urb->transfer_flags |= URB_ZERO_PACKET;
if (desc->idVendor == cpu_to_le16(0x2C7C))
urb->transfer_flags |= URB_ZERO_PACKET;
}
#endif
return urb;
}

這裡寫圖片描述
For Linux kernel version lower than 2.6.35:
File: [KERNEL]/drivers/usb/serial/option.c

/* Helper functions used by option_setup_urbs */
static struct urb *option_setup_urb(struct usb_serial *serial, int endpoint,
int dir, void *ctx, char *buf, int len,
void (*callback)(struct urb *))
{
……
usb_fill_bulk_urb(urb, serial->dev,
usb_sndbulkpipe(serial->dev, endpoint) | dir,
buf, len, callback, ctx);
#if 1 //Added by Quectel for zero packet
if (dir == USB_DIR_OUT) {
struct usb_device_descriptor *desc = &serial->dev->descriptor;
if (desc->idVendor == cpu_to_le16(0x05C6) && desc->idProduct == cpu_to_le16(0x9090))
urb->transfer_flags |= URB_ZERO_PACKET;
if (desc->idVendor == cpu_to_le16(0x05C6) && desc->idProduct == cpu_to_le16(0x9003))
urb->transfer_flags |= URB_ZERO_PACKET;
if (desc->idVendor == cpu_to_le16(0x05C6) && desc->idProduct == cpu_to_le16(0x9215))
urb->transfer_flags |= URB_ZERO_PACKET;
if (desc->idVendor == cpu_to_le16(0x2C7C))
urb->transfer_flags |= URB_ZERO_PACKET;
#endif
return urb;
}

3.1.3增加休眠後喚醒介面

當MCU進入暫停/休眠模式時,一些USB主機控制器/USB集線器將失去電源或重新設定,並且在MCU退出暫停/休眠模式後,它們不能恢復USB裝置。請新增以下語句以啟用重新設定恢復過程。
For Linux kernel version higher than 3.4:
File: [KERNEL]/drivers/usb/serial/option.c

static struct usb_serial_driver option_1port_device = {
……
#ifdef CONFIG_PM
.suspend = usb_wwan_suspend,
.resume = usb_wwan_resume,
#if 1 //Added by Quectel
.reset_resume = usb_wwan_resume,
#endif
#endif
};
```c
For Linux kernel version lower than 3.5:
File: [KERNEL]/drivers/usb/serial/usb-serial.c
```c
/* Driver structure we register with the USB core */
static struct usb_driver usb_serial_driver = {
.name = "usbserial",
.probe = usb_serial_probe,
.disconnect = usb_serial_disconnect,
.suspend = usb_serial_suspend,
.resume = usb_serial_resume,
#if 1 //Added by Quectel
.reset_resume = usb_serial_resume,
#endif
.no_dynamic_id = 1,
.supports_autosuspend = 1,
};

這裡寫圖片描述

3.1.4 Enlarge Bulk out URBs

For Linux kernel version lower than 2.6.29, bulk out URBs need to be enlarged to get faster uplink speed.
File: [KERNEL]/drivers/usb/serial/option.c

#define N_IN_URB 4
#define N_OUT_URB 4 //Quectel 1
#define IN_BUFLEN 4096
#define OUT_BUFLEN 4096 //Quectel 128

3.1.5使用 GobiNet or QMI WWAN

如果客戶使用ucxx/ec2x/egxx/EP06/EM06/BG96/AG35,並要求GobiNet或QMI WWAN,請新增以下語句,以防止這些模組介面4被用作USB序列裝置。
For Linux Kernel Version newer than 2.6.30:
File: [KERNEL]/drivers/usb/serial/option.c

static int option_probe(struct usb_serial *serial, const struct usb_device_id *id) {
struct usb_wwan_intf_private *data;
……
#if 1 //Added by Quectel
//Quectel UC20's interface 4 can be used as USB network device
if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6) &&
serial->dev->descriptor.idProduct == cpu_to_le16(0x9003)
&& serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4)
return -ENODEV;
//Quectel EC20's interface 4 can be used as USB network device
if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6) &&
serial->dev->descriptor.idProduct == cpu_to_le16(0x9215)
&& serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4)
return -ENODEV;
//Quectel EC25&EC21&EG91&EG95&EG06&EP06&EM06&BG96/AG35's interface 4 can be used as USB network device
if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2C7C)
&& serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4)
return -ENODEV;
#endif
/* Store device id so we can use it during attach. */
usb_set_serial_data(serial, (void *)id);
return 0;
}

這裡寫圖片描述
For Linux kernel version lower than 2.6.31:
File: [KERNEL]/drivers/usb/serial/option.c

static int option_startup(struct usb_serial *serial)
{
……
dbg("%s", __func__);
#if 1 //Added by Quectel
//Quectel UC20's interface 4 can be used as USB network device
if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6) &&
serial->dev->descriptor.idProduct == cpu_to_le16(0x9003)
&& serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4)
return -ENODEV;
//Quectel EC20's interface 4 can be used as USB network device
if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6) &&
serial->dev->descriptor.idProduct == cpu_to_le16(0x9215)
&& serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4)
return -ENODEV;
//Quectel EC25&EC21&EG91&EG95&EG06&EP06&EM06&BG96/AG35's interface 4 can be used as
USB network device
if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2C7C)
&& serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4)
return -ENODEV;
#endif
……

3.1.6修改核心配置

第一步:進入核心,並進入核心配置環境
$make menuconfig
第二步:新增USB 串列埠 GSM 和 CDMA 驅動選項。

[*] Device Drivers →
	[*] USB Support →
		[*] USB Serial Converter support →
			[*] USB driver for GSM and CDMA modems

這裡寫圖片描述

3.1.7編譯

以上操作完成後就是編譯核心原始碼了。
$ make uImage -j4
將核心燒寫進入板子中,會看到以下資訊表示有USB裝置了。
這裡寫圖片描述
可以在dev目錄下檢視裝置。
這裡寫圖片描述

3.2 GobiNet移植

3.2.1修改核心配置

第一步:進入核心,並進入核心配置環境

$make menuconfig

第二步:啟用USB網路支援

[*] Device Drivers →
	[*]Network device support →
			[*]usb Network Adapters →
 

這裡寫圖片描述
【注】筆者是直接編譯進核心的,也可編譯後成模組動態載入。

3.2.2新增驅動程式碼

當使用Gobinet驅動移遠模組時,Gobinet將會建立一個網路裝置(ethX)和一個QMI channel(qcqmiX),**將驅動原始碼放到[KERNEL]/drivers/net/usb/ (or [KERNEL]/drivers/usb/net/ if the kernel version is lower than2.6.22).。如果是把Gobinet編譯到核心中,可以忽略。GoniNet原始碼中的Makefile,直接將原始碼中的.c和.h檔案拷貝到上述目錄中。**網路裝置用於網路傳輸 QMI channel要用於QMI 的資訊互動。然後新增以下宣告到file [KERNEL]/drivers/net/usb/Makefile (or [KERNEL]/drivers/usb/net/Makefile if the kernel version is lower than 2.6.22)。

obj-y += GobiNet.o
GobiNet-objs := GobiUSBNet.o QMIDevice.o QMI.o

【注】原始碼在後文的附件中,請下載。

3.2.3編譯

以上操作完成後就是編譯核心原始碼了。
$ make uImage -j4

3.2.4測試

將編譯後的Image在板子上跑起來可以看到啟動資訊有qcqmil。
這裡寫圖片描述
另外在dev下多了一個qcqmil。
這裡寫圖片描述
說明GobiNet驅動已經生效了。

3.3撥號上網

撥號程式仍然使用移遠提供的quectel-CM,這是一個4g連線管理程式,這裡沒什麼說的,直接下載原始碼交叉編譯後得到可執行bin“quectel-CM”,把這個bin放到板卡上啟動後上述USB和Gobi沒有問題的情況下直接執行該bin就可以
【注】移動式[cmnet],電信是[ctnet]。
$ ./quectel-CM -s cmnet &
【注意】筆者使用的移動卡。
撥號成功會分配IP,接下來就是ping一下看是否可以聯網。
$ping www.baidu.com

【注意】這裡需要UDHCPC ,檢測你的busybox是否有這個東西,如果不存在,你需要重新移植busybox,啟用CONFIG_UDHCPC選項。還需要配置一個配置檔案,注意檢查。
可以在開發板中輸入busybox中檢視,筆者的檔案系統有,所以就不需要配置了。

【附件】
點選進入

Gobinet/QMI-WWAN/ppp撥號區別

1.Gobinet撥號
GOBI 高通Gobi無線寬頻晶片技術,只需一個模組即可支援多種移動寬頻網路和眾多移動運營商。高通公司稱全新的晶片將基於Gobi 4G LTE無線基帶、MDM9615和MDM9215。這種技術可以在FDD和TDD網路下進行LTE連線,同時支援HSPA+和EV-DO網路、2G/3G網路。這意味著使用者可以在本地使用高速4G LTE網路,在其他地方使用3G網路。Gobi平臺在MDM晶片組的基礎上還提供了軟體增強層,這樣可以使用不同技術下的無線連線更簡單。

2.QMI-WWAN協議撥號
QMI: Qualcom Message Interface
MSM: Mobile station mode
AP: Application Procesor

高通平臺目前都是非對稱多核心,最主要的是AP和Modem。
兩個處理器怎麼進行通訊呢,我們把AP和Modem當作兩個主機,問題就變得了很簡單,TCP/IP協議不是一種非常成功的程序間跨主機通訊方式。高通沒有采用這種方式,但是借鑑了TCP/IP的框架設計。
Qualcomm MSM Interface,作用用於AP和BP側的互動,通俗說法就是讓裝置終端TE(可以是手機,PDA,計算機)
對高通BP側的AMSS系統進行操作,如呼叫函式,讀取資料,設定其中的NV項等。
參考:http://blog.csdn.net/u012439416/article/category/7004974

3.ppp協議撥號:點對點協議
PPP(點到點協議)在撥號過程中用於MS和PC間資料互動、協商。在撥號流程的初期首先開啟的就是PC和MS直接的PPP過程,在撥號成功後,還需要依靠PPP協議對IP包進行封裝傳輸資料。
官網原始碼:https://ppp.samba.org

相關推薦

Linux作業系統-系統移植8 USB-4G/LTE移植 -4 USB-4G移植EC20開發-Gobi撥號

開發環境 主機:ubuntu12.04 開發板核心版本:linux-2.6.35 【注】EC20支援PPP撥號,Gobi撥號和QMI撥號,筆者使用的是Gobi撥號,關於另外兩種撥號請參考官方文件,後文的附件連結中已經給出了參考文件。 3.1 USB Serial

Linux作業系統-系統移植8 USB-4G/LTE移植 -3 USB-4G移植AG35開發-GPS解析及程式設計

檢視參考手冊,移遠帶有GPS的晶片的USB Serial如下。 2.1應用簡介 1、若不使用 AT+QGPSCFG 指令對AG35進行配置,則會以預設引數開啟GPS引數,NMEA埠開始上報,"gpsnmeatype"預設值為31,上報間隔為1s,每次上報所有種

Linux作業系統-系統移植8 USB-4G/LTE移植 -2 USB-4G移植中興ME3760移植

ME3760 是一款Mini PCI-E介面的LTE 模組,支援LTE TDD band38(2.6GHz),band39(1.9GHz),band40(2.3GHz); LTE FDD band7(2.6GHz),向下相容TD-SCDMA A頻段(2.1GHz

Linux作業系統-系統移植8 USB-4G/LTE移植 -1 USB-4G移植C華為E392u­924G移植

1.3 PPP編譯 1.獲取原始碼 PPP官網下載:https://download.samba.org/pub/ppp/ 下載解壓ppp-2.4.7.tar.gz原始碼,存放在/home/farsig

Linux作業系統-系統移植8 USB-4G/LTE移植 -1 USB-4G移植 F華為E392u­924G移植

1.6啟動撥號指令碼 $mkdir shell_script $cd /shell_script $ vi usb.sh 輸入以下內容,然後儲存退出。 usb_modeswitch -W -c /etc

Linux作業系統-系統移植7 工具移植 -3 Mini-xml移植

開發環境: 主機環境:Ubuntu 12.04 目標機環境:Exynos4412開發板(Linux 3.0.5) 一個輕量級的xml庫,可完成讀寫。適合系統資源受限的嵌入式裝置。 原始碼下載:https

Linux作業系統-系統移植7 工具移植 -2 SSH服務移植

開發環境: 主機:Ubuntu12.04 開發板:Exynos4412 2.1編譯相關檔案 SSH協議族可以用來進行遠端控制, 附加的SFTP協議可輕鬆實現在計算機之間傳送檔案。而實現此功能的傳統方式,如telnet(終端模擬協議)、 rcp ftp、 rlog

Linux命令應用大詞典-8 日期和時間

硬件時鐘 顯示 linu 時鐘 主機 style hwclock 硬件 暫停 8.1 cal:顯示日歷信息 8.2 date:顯示和設置系統日期和時間 8.3 hwclock:查看和設置硬件時鐘 8.4 clock:查看和設置硬件時鐘 8.5 clockdiff:主機之間

Linux學習筆記】8 Linux shell基礎知識

linux centos shell 通配 8.1shell介紹shell是一個命令解釋器,提供人機交互。支持特定語法。每個用戶都可以有自己特定的shell(bash)。CentOS7默認bash(Bourne Agin Shell)。其他還有zsh、ksh等。 8.2命令歷史命令歷史存放於

易學筆記-Linux命令-8:從shell眼中看世界

第8章:從shell眼中看世界/8.0 echo:單詞分割機制 echo:單詞分割機制 格式:echo  結果集,這裡的結果集可能是 某個字串:abc 多個字串:abc  edf 命令結果: ls  

連結裝載與庫 8 linux共享庫的組織

由於動態連結的優點,大量的程式使用動態連結機制,導致系統裡面存在數量極為龐大的共享物件。必須得有很好的機制來管理這些共享庫,否則這些共享物件散落在各個目錄下,長期的維護,升級,都有會很大的問題。 8.1 共享庫版本 8.1.1 共享庫的相容性 共享庫的版本會不斷的更新,以修正原有

linux核心設計與實現 —— 中斷和中斷處理78

中斷和中斷處理 中斷的目的:讓處理器最快地響應外部硬體的請求。 中斷本質上是一種特殊的電訊號,由硬體裝置發向處理器,處理器反映到作業系統中,最後由作業系統處理這個中斷電訊號。 不同的裝置對應的中斷不同。每個中斷都通過一個唯一的數字標記,這個標記通常被稱為中

82講特殊函數介紹

turn 函數介紹 spl .cn scan margin urn printf return #include"stdio.h" int fact(int n) //求階乘函數 { int f=1,i; fo

8:Shell腳本歸檔與壓縮

extract config 生成 -- dir exclude 硬盤分區 txt name 第8章:Shell腳本歸檔與壓縮   定期備份不可小視,我們可以通過shell腳本來實現備份自動化。其中數據備份一般要使用到歸檔與壓縮,歸檔與壓縮對於系統

82《MonkeyRunner源代碼剖析》MonkeyRunner啟動執行過程-解析處理命令行參數

path 轉載 iss 命令 code rst pri bsp ack MonkeyRunnerStarter是MonkeyRunner啟動時的入口類,由於它裏面包括了main方法.它的整個啟動過程主要做了以下幾件事情:解析用戶啟動MonkeyRunner時從命令行傳輸

8 包管理

重新 裝包 自己的 align love ocs 重定向 客戶端程序 target 本文目錄: 8.1 Linux上構建C程序的過程 8.2 包基礎知識 8.3 rpm管理包 8.4 yum管理包 8.5 補丁工具diff和patch 8.6 源碼編譯安裝程序 8.1

【C語言學習】《C Primer Plus》8 字符輸入/輸出和輸入確認

multipl 字符輸入 信號 first while 目的 bcd 問題 img 學習總結 1、緩沖區分為完全緩沖區(fully buffered)I/O和行緩沖區(line-buffered)I/O。對完全緩沖輸入來說,當緩沖區滿的時候會被清空(緩沖區內容發送至

Java編程思想讀書筆記_8

讀書筆記 div spl class alt oid ava 函數 opened 覆蓋私有方法 1 class Father { 2 private void f() { System.out.println("Father::f()"); } 3

8 傳輸層1_TCP/UDP協議的應用場景

一個數 選擇 str 根據 connect .cn eight 安全 器) 1. 傳輸層的兩個協議 1.1 TCP和UDP協議的應用場景 (1)TCP協議:如果要傳輸的內容比較多,需要將發送的內容分成多個數據包發送。這就要求在傳輸層用TCP協議,在發送方和接收方建立連接

8 傳輸層2_UDP協議

之前 用戶數 發送數據 1-1 效率 沒有 strong 而是 系統 2. 用戶數據報協議(UDP) 2.1 UDP的特點 (1)UDP是無連接的,即發送數據之前不需要建立連接,因此減少了開銷和發送數據之前的時延。 (2)UDP使用了盡最大努力交付,即不保證可靠交付,因此主