閆敬文,李明峰
(汕頭大學工學院電子系,廣東 汕頭 515063)
隨著3G網絡的大范圍覆蓋,加上Android、IOS、WindowsPhone等智能手機的普及,通過3G網絡來觀看網絡視頻已經越來越普遍了.但由于可以運行Android等界面操作系統(tǒng)的設備,一般都采用具有較高主頻和較強處理能力的處理器,內存和Flash容量至少在128MB以上[1],成本較高,不適宜大量應用于某些場合,如移動電視,網絡廣告機,視頻會議等.在這些場合中,往往需要用到一些廉價的專用型設備,本文介紹的3G移動媒體播放終端采用S3C2410作為處理器,內存和Flash也只需64MB,在滿足系統(tǒng)需求的前提下很大程度地降低了系統(tǒng)的成本.
硬件框架如下圖1-1所示.
圖1 -1硬件框架圖
硬件部分是由一個帶顯示器的ARM9開發(fā)板加上一個3G上網卡組成.開發(fā)板包括了嵌入式的基本系統(tǒng),例如CPU、內存、Flash、穩(wěn)壓電源、USB接口、網卡、聲卡等[2].軟件框架如圖1-2所示.軟件部分主要包括以下四個部分:一是驅動部分,二是chat和PPP撥號軟件部分,三是MPlayer播放器部分,四是QT界面部分.接下來的內容,將會圍繞這幾個部分進行詳細的分析.
圖1 -2 軟件框架圖
由于關于ZTE AC580 3G網卡硬件組成方面的資料較少,所以筆者決定拆解該網卡,其拆解圖如圖1-3所示.
圖1 -3 AC580 3G網卡硬件拆解圖
AC580 3G網卡的硬件組成框架圖如圖1-4所示.這款3G網卡主要由以下5個部分組成:QUALCOMM QSC6085處理器,Hynix Flash芯片,電源管理器,射頻收發(fā)器和一個多用的讀卡器.QSC6085芯片集成了ARM926EJS~192MHz,QDSP~100MHz兩個處理器.支持EVDOrA標準,支持MP3,MPEG4,H.263,H.264的解碼等等[3].雖然3G網卡的內部結構看似復雜,但從本質上來看,它只是一個Modem加上一個串口轉USB而已.Modem通過串口轉USB來與用戶設備連接.要說明的是AC580 3G網卡是一個混合USB設備,Modem只是它的其中一個功能模塊.
從3G網卡的硬件分析得知,3G網卡使用的雖然是一個USB接口,但實質上是一個虛擬的串口.該3G網卡在Linux底層是一個USB串口設備,所以在開發(fā)板端需要進行加載USBSerial的驅動.在Linux中,串口屬于tty設備,對于一個USB串口設備而言,其驅動主要由兩部分組成:usb_driver的成員函數和tty設備的tty_operations結構體成員函數[4].在USB串口設備驅動的模塊加載函數中,將注冊對應于USB串口的usb_driver,并初始化和注冊tty驅動.在Linux內核里,自帶USBSerial驅動,所在的路徑為driversusbserial,AC580 3G網卡只要用內核自帶的USBSerial驅動就可以了.
我們可以把USBSerial驅動程序編譯成模塊,或者將其直接編進內核.由于AC580 3G網卡是一個USB混合設備,系統(tǒng)在設備識別方面與一般設備不一樣,USB串口設備模塊需要在系統(tǒng)識別到Modem后才能起作用,所以,針對AC580 3G網卡的這種情況,選擇把編譯成模塊,然后再等網卡被識別為Modem后才進行加載.把USBSerial驅動編譯成模塊一般使用以下兩種方式:一是直接從內核中編譯出來;二是自己編寫Makefile,再使用編譯模塊命令來調動內核機制來編譯.下面只對直接從內核中編譯進行說明.
首先要配置內核:
[*]Enable loadable module support---> //啟用可裝載模塊支持
---Enable loadable module support
[*]Module unloading //支持模塊卸載
[*]Automatic kernel module loading //自動加載的內核模塊
Device Drivers --->
[*]USB support--->
***USB port drivers***
---USB SerialConverter support
[*]USB Generic Serial Driver
然后,進入內核所在的目錄,運行以下命令:
#make modules //開始編譯模塊
在編譯的信息中看到
CC drivers/usb/serial/usbserial.mod.o
LD[M]drivers/usb/serial/usbserial.ko
證明USBSerial驅動已經編譯成usbserial.ko了,此時可以在drivers/usb/serial目錄下找到它.當然在編譯之前請確保選擇的是交叉編譯.也就是說在Linux內核目錄中要把Makefile中的ARCH和CROSS_COMPILE改為以下信息.
ARCH ?=arm
CROSS_COMPILE ?=arm-linux
arm-linux-gcc的版本可以用以下命令查看
#arm-linux-gcc-v //查看交叉編譯器的版本文中用的arm-liunx-gcc版本為3.4.1
AC580 3G網卡是一個混合設備,它既是CD-ROM,也是USB Mass Storage,也是Modem.在PC機上,有強大的操作系統(tǒng)支持下我們使用起來覺得很方便,但是在嵌入式環(huán)境下,就不一樣了,因為嵌入式系統(tǒng)在同一時間內只能使用某一個設備,如果不對設備進行切換的話那就不能使用另外的設備.在該文使用的嵌入式平臺中,一插入網卡,系統(tǒng)只識別它為CD-ROM.并不是所想要的Modem.如果直接加載驅動模塊,則無法建立與Modem的連接.以下介紹一種可行的驅動加載方法.網卡驅動的加載流程如圖2-1所示.
圖2 -1 3G網卡的驅動加載流
到這里,可以查看到/dev目錄下多了ttyUSB0這個設備.這個ttyUSB0其實就是Modem的接口.這樣3G網卡的驅動就加載成功了.但是,此時還不能上網,要上網還要進行撥號.
2.3.1 撥號軟件編譯
文中使用的ppp軟件版本為ppp-2.4.5.ppp-2.4.5軟件包中含有很多個獨立的程序代碼包,包括chat,pppd,pppdump,pppstats等.2.4.5版本的pppd可以跟好地支持3G的調制解調器.這里只需要chat和pppd兩個軟件包[5].
圖2-2為撥號軟件編譯流程圖.打開chat軟件包,里面除了有源代碼外,還有for linux系統(tǒng)的Makefile和for sol2系統(tǒng)的Makefile,因為該文用的是linux系統(tǒng),所以,這里使用for linux Makefile.
圖2 -2撥號軟件編譯流程
看到圖2-2最后的輸出信息則表明chat二進制文件已經編譯成了.編譯出來的chat二進制文件就可以直接在嵌入式平臺中使用了.編譯pppd的步驟跟chat的編譯步驟一樣.
要進行3G上網,以下的配置是必不可少的,在內核配置中要打開PPP支持:Networking --->
[*]Network device support---><*>PPP(point-to-point protocol)support //支持點對點協議[*]PPP multilink support(EXPERIMENTAL) //支持多鏈路
另外,需要在文件系統(tǒng)加入chat、pppd程序,同時需要創(chuàng)建他們所依賴的文件目錄.該文使用的根文件系統(tǒng)為cramfs,在博創(chuàng)的cramfs根文件系統(tǒng)的基礎上,加入需要的命令和目錄.這里要做的是,把前面編譯好的chat和pppd復制到/bin目錄下,同時,在/etc下添加一個ppp文件夾,并且把它鏈接到/mnt/yaffs/ppp.同時在/etc下建立一個resolv.conf文件,并且把它鏈接到/mnt/yaffs/resolv.conf.等到啟動系統(tǒng)后,再創(chuàng)建/mnt/yaffs/ppp文件夾和文件/mnt/yaffs/resolv.conf,resolv.conf用于保存DNS等信息.
AC580 3G網卡與GRPS,GSM模塊都是同樣使用AT指令進行撥號連接.由于篇幅有限,具體的指令使用,在這里就不一一介紹了.下面是AC580 3G上網的撥號腳本.
/bin/pppd connect'/bin/chat-v"""AT""""ATE0 OK""""AT+CMGF=1 OK""""AT^PREFMODE=8 OK""""AT+CSQ OK""""ATDT#777 CONNECT"'user ctnet@mycdma.cn password vnet.mobi/dev/ttyUSB0 115200 nodetach nocrtscts debug usepeerdns defaultroute ipcp-accept-local ipcp-accept-remote&
3G網卡的撥號連接過程如圖2-3所示.
運行撥號腳本后,終端會顯示連接過程的相關信息.連接成功后會顯示所獲取的IP和DNS.
用ifconfig命令查看網絡接口的信息可以發(fā)現在網絡信息中多了一個ppp0設備,顯示的IP跟撥號時獲取后的IP一樣.這證明ppp0就是系統(tǒng)通過3G網絡連接Internet的設備了.同時在/etc/ppp目錄下,自動生成了一個resolv.conf文件,里面有DNS的地址信息,只要把/etc/ppp/resolv.conf復制到/etc/resolv.conf,這樣就可以實現域名解析了,現用ping命令來測試一下.
[root@/mnt/yaffs]#ping www.baidu.com
PING www.baidu.com(121.14.89.10):56 data bytes
64 bytes from 121.14.89.10:seq=0 ttl=56 time=61.818 ms
Ping測試成功,3G上網已經實現了.如果需要斷開網絡連接則運行kill來關掉pppd的線程就可以了.
#kill$(pidof pppd)
MPlayer是一款開源多媒體播放器,支持大部分常用的視頻格式,同時支持RTP、RTSP、HTTP、FTP、MMS等網絡協議,所以大部分的網絡流媒體都可以通過直接輸入URL的方式來進行播放[6].在X11,Xmga,DirectX等顯示架構中可以通過-geometry控制視頻的定位輸出.而在嵌入式系統(tǒng)中使用的顯示設備為fbdev,MPlayer源碼不支持在fbdev的定位播放.筆者通過分析MPlayer源碼,添加了fbdev定位播放的功能.MPlayer播放流程如下圖3-1所示.
圖3 -1 MPlayer的播放流程
在嵌入式環(huán)境下,視頻輸出主要通過vo_s3cfb.c和vo_fbdev.c控制.而實際的輸出由vo_fbdev.c中的draw_slice函數控制.要實現視頻輸出的定位則要從這個函數入手.可以通過在vo_fbdev,c中添加geometry的庫從而實現定位播放.添加流程如下圖3-2所示.
其中,fb_x、fb_y為自定義的以像素為單位的定位平移量.偏移的參考原點為LCD的最左上角.修改完源代碼之后就可以進行交叉編譯了.MPlayer的移植過程不會太復雜,關鍵是配置.下面簡單介紹一下如何配置MPlayer,由于篇幅有限這里只列出部分內容.
./configure--cc=arm-linux-gcc //選用系統(tǒng)默認交叉編譯器,筆者使用的是3.4.1
--target=arm-armv4-linux //支持armv4架構的arm-linux
--enable-fbdev //支持開發(fā)板的fb設備
--disable-mp3lib //不使用內部的MP3界面庫
--disable-mad //支持mad作為MP3解碼的庫,這個需要另外編譯的
--enable-static //靜態(tài)編譯
--with-extraincdir=/usr/local/arm/3.4.1/arm-linux/sys-include/:/usr/local/arm/3.4.1/lib/include //指明libmad的頭文件--with-extralibdir=/usr/local/arm/3.4.1/arm-liunx/lib:/usr/local/arm/3.4.1/lib/lib//指明libmad的庫地址
配置的時候可以建一個腳本文件.這里就不詳細講述了.配置完之后就直接make.中途可能會出現一些錯誤.可以根據具體情況對源代碼進行修改,直到編譯成功為止.編譯成功后,需要把生成的可執(zhí)行程序mplayer放到嵌入式系統(tǒng)中進行測試運行.視頻輸出位置是通過-geometry參數進行輸出位置控制.例如,執(zhí)行./mplayer panda.mpg-vo fbdev-geometry+50+50,這樣視頻的輸出參考點就會從原來的最左上角(0,0)的位置移動到(50,50)的位置.具體播放定位位置要根據QT的顯示窗口位置來設定.
3.2.1 UI設計
由于整個播放器的界面所占篇幅較大,這里只截取按鈕布局,如圖3-3所示.
圖3 -3 播放器按鈕布局
在MPlayer的基礎上,用QT界面對播放器實現來播放、暫停、停止、全屏播放的控制功能.同時,還增加了播放列表功能,可以通過選擇播放列表中的文件來實現本地以及URL的播放.
3.2.2 控制原理
在這個播放器中QT界面用于實現對MPlayer的可視化控制.在QT中創(chuàng)建一個線程調用MPlayer并且通過輸入MPlayer的控制命令來實現暫停,停止等功能.具體的控制原理如圖3-4所示.
圖3 -4 QT對MPlayer實現控制
在s_mp中如果需要可以根據QT播放器窗口的位置來控制MPlayer視頻的輸出位置.圖中的s_mp輸入命令為640x480全屏顯示.如果需要定位視頻輸出位置,則在后面添加-vo fbdev-geometry+x+y參數(x、y為具體偏移量)即可.詳細的控制參數可以參考MPlayer的使用說明.
3.2.3 Qt移植
播放界面的具體移植過程分為3個驟步,分別為:交叉編譯、尋找需要的庫文件和編寫運行腳本.下面就每一步進行簡單的說明.
(1)交叉編譯.QT官網中有提供QtEmbedded的開發(fā)包,安裝成功后,用里面的命令編譯出來的程序可以在ARM-linux嵌入式系統(tǒng)中運行.可以輸入以下命令進行編譯.
#/opt/local/Trolltech/QtEmbedded-4.5.3/bin/qmake-project//建立工程,需要制定為QtEmbedded的make.
#/opt/local/Trolltech/QtEmbedded-4.5.3/bin/qmake //生成頭文件和Makefile
#make //編譯
在編譯成Embedded版之前,最好make clean一下,同時確保所寫的程序可以編譯成x86或x11的版本,而且編譯后可以在PC中運行.成功編譯之后,在播放器的工程目錄下就會有一個二進制可執(zhí)行文件.但是直接下載到板上運行會出錯的,原因是它依賴于很多庫文件.必須指定了庫文件的路徑,程序才可以正常運行.
(2)尋找需要的庫文件.在工程目錄下運行arm-linux-readelf命令可以查看文件所依賴的庫文件.
#arm-linux-readelf-d MicrophoneTV
Dynamic segment at offset 0x17340 contains 31 entries:
Tag Type Name/Value
0x00000001(NEEDED) Shared library:[libQtGui.so.4]
0x00000001(NEEDED) Shared library:[libts-0.0.so.0]
......
0x00000001(NEEDED) Shared library:[libc.so.6]
0x0000000f(RPATH) Library rpath:[/opt/local/Trolltech/Qtarm-4.5.3/lib]
這里的庫文件有四類:一是QtEmbedded的庫文件,二是arm-linux-gcc的庫文件,三是觸摸屏的庫文件,四是字體的庫文件.可以分別到各個對應的目錄去復制需要的庫文件.然后把它整理到一個文件夾,筆者用的文件夾命名為Qtlib.前面三類可以在上面的列表中看到,文字庫需要另外制作或者到網上去下載.把字體的庫文件放到Qtlib/fonts目錄下.另外還需要一個觸摸屏的校正程序,筆者用的版本為tslib-1.4,交叉編譯tslib之后把它里面的文件放到Qtlib/ts中.
(3)編寫運行腳本.這一步最為關鍵,這個要根據具體的嵌入式環(huán)境來編寫.下面是筆者根據使用的系統(tǒng)編寫的腳本.這個腳本的作用是設定環(huán)境變量,實質是指定程序運行所依賴的文件的路徑.
#!/bin/sh
rm-fr/tmp/* //清除內存
export TSLIB_CONSOLEDEVICE=none
//tslib運行需要的控制臺,默認為/dev/tty,none則為LCD;
export TSLIB_FBDEVICE='/dev/fb0'//這是LCD的設備名
export TSLIB_TSDEVICE='/dev/event0'//這是觸摸屏的設備名
export TSLIB_PLUGINDIR='/mnt/yaffs/Qtlib/ts/lib/ts'//觸摸屏的庫
export TSLIB_CALIBFILE='/mnt/yaffs/pointercal' //校正文件
export TSLIB_CONFFILE='/mnt/yaffs/Qtlib/ts/etc/ts.conf'//觸摸屏配置
export QTDIR='/mnt/yaffs/Qtlib' //Qt庫
export QT_QWS_FONTDIR='/mnt/yaffs/Qtlib/fonts'//字體庫
export PATH=$QTDIR/BIN:$PATH //命令程序
export QWS_DISPLAY=LinuxFb:/dev/fb0 //設定顯示設備
export QWS_SIZE=640x480 //分辨率
export QWS_SW_CURSOR=1 //顯示鼠標
export QT_ONSCREEN_PAINT=0
export POINTERCAL_FILE='/mnt/yaffs/pointercal'//觸摸校正值
export QWS_MOUSE_PROTO='tslib:/dev/event0'//觸摸屏為鼠標
export LD_LIBRARY_PATH=$QTDIR/:/lib:/usr/lib:$LD_LIBRARY_PATH
cd /mnt/yaffs/Microphone
./MicrophoneTV qws //運行播放界面程序
運行命令中的-qws參數是用來解除所運行程序對原來系統(tǒng)庫依賴關系.
按照本文中的方法重新配置內核,文件系統(tǒng),然后寫到嵌入式系統(tǒng)中,同時把qt程序,程序所以依賴的庫,mplayer等文件拷貝到相應的文件夾,運行以上的腳本就可以讓播放器運行起來.
4結語
最后來看一下系統(tǒng)的運行效果.在運行播放界面之前,要先運行觸摸校正程序,然后進行網卡驅動加載和3G撥號,確保連接上互聯網后,可以直接在列表中添加一些URL或者本地文件.添加完成后,可以在列表中選擇要播放的頻道,然后點擊OK按鈕.播放列表如圖4-1所示.選擇完播放頻道后,點擊播放按鈕,就可以播放相應的視頻.在開發(fā)板的LCD中可以看到流暢的網絡電視畫面.圖4-2中為播放廈門衛(wèi)視的效果圖.
到這里整個系統(tǒng)的設計已經完成了.本文介紹了在嵌入式linux平臺上3G網絡媒體移動播放終端的實現技術方案.詳細分析了3G網卡的硬件和驅動,3G網絡接入的ppp撥號實現,MPlayer嵌入式系統(tǒng)下定位播放,QT可視化控制MPlayer,QT移植等主要技術,在嵌入式平臺實現了3G網絡流媒體的播放功能.實驗測試結果表明,本終端既可以流暢播放本地視頻,也可以通過3G網絡實現在線視頻點播.經過轉化可以做成移動電視,網絡廣告機,視頻會議等終端設備.值得一提的是,整個系統(tǒng)的硬件配置還不到Android平臺最低配置要求的一半,可見若能實現本終端的產業(yè)化,無疑可以有效地降低生產成本,從而促進移動電視,網絡廣告機等產品的普及.
[1]Google公司,Android Porting Guide,[EB/OL].[2008-06-09].http://www.netmite.com/android/mydroid/development/pdk/docs/index.html
[2]北京博創(chuàng).S2410經典實驗指導書[M].北京博創(chuàng)興業(yè)科技有限公司,2009.
[3]QUALCOMM公司,QSC6085 Hardware Training,[EB/OL].[2007-04].http://www.datasheet.co.kr/datasheet-html/Q/S/C/QSC6055_QUALCOMM.pdf.html
[4]宋寶華.Linux設備驅動開發(fā)詳解[M].北京:人民郵電出版社,2008.
[5]李善平,瀏文峰,王煥龍.Linux與嵌入式系統(tǒng)[M].北京:清華大學出版社,2006.
[6]MPlayer工作組,MPlayer-電影播放器,[EB/OL].[2010-02].http://www.mplayerhq.hu/DOCS/HTML/zh_CN/index.html