2007年12月27日 星期四

聖誕夜驚魂

這全台僅有的活動, 已是外語學院的傳統了, 也吸引我每年都來參加. 專程從台南趕過來, 原班人馬我, 廖哥, 皓呆, 老伯, 育誠, 這次還加入許多新血, 都是lab的朋友.
一票難求的盛況, 不排個3小時是進不去的, 在門外當然是亂哈拉, 有這幾個好朋友在不怕冷場, 隨便個話題就笑翻了, 即使沒多大意義. 等了許久也輪到我們, 擺明就是進去惡搞的, 希望這次不要再破壞人家的道具.
阿嘉比較大膽走第一個, 對於未知的世界總是充滿畏懼, 儘管知道裡面都是人扮的還是會被嚇到. 不過照著固定的動線走, 少了點冒險個感覺, 燈光過於昏暗, 看不清楚用心的場佈小可惜. 我們太會拖了, 頻頻被趕, 看得出來他們生氣了, 有好幾隻還笑場 真的好可愛.

嘉義, 好久沒回去了, 比起台南的繁榮, 這邊的步調比較適合我, 至少有山可以看, 還有蘭潭 這個交情很深的地方. 文化路豆奶擔都有店面了, 真可說是看著他長大阿. 時間太晚了,沒到經國新城去探一下.
晚上住在宿舍, 幾個男人住一起不外乎就是亂, 啤酒罐砌成的牆壁, 地板舖滿巧拼, 充氣床墊, 給人一種悠閒放蕩的感覺. 一堆運動器材, 在宿舍沒事就鍊身體, 還有拳擊手套, 怪不得隔壁的宅宅看了都會怕. 好久沒用公共衛浴了, 想到以前洗澡都抓整群的, 大聲說話都沒人管.
man's talk~ 當晚聊到快天亮, 關起門來什麼都能講, 報了好多八卦, 久了沒見面我的思想都快跟不上他們.
一個什麼事都幹得出來的地方, 令人流連忘返.

2007年12月13日 星期四

Porting QT/Embedded-3.3.6 on PXA270

QT/Embedded 3.3.6
Cross-Compiler: gcc-4.0.2
以下流程為編譯QTE並驅動Touch Screen(尚未成功)

事前工作
編kernel時要加入touch screen及LCD module
->UCB1400 Touchscreen support
->LCDtype(MTLCD-0353224A 3.5 inches)

下載:
qt-x11-free-3.3.5.tar.bz2
qt-embedded-free-3.3.6.tar.bz2
tslib-1.0.tar.bz2

編譯Qt-X11 (後面會用到)
./configure -thread -no-xft -no-cups -no-stl -no-ipv6 -no-freetype -disable-opengl -disable-xml -disable-canvas -shared
make

編譯tslib (後面會用到)
將toolchain路徑加入$PATH
echo "ac_cv_func_malloc_0_nonnull=yes" > arm-linux.autogen
//解決rpl_malloc的error
CONFIG_SITE=arm-linux.autogen ./configure CC=arm-unknown-linux-gnu-gcc CXX=arm-unknown-linux-gnu-g++ --host=arm-linux --target=arm-linux --prefix=$PWD/_install
make; make install

編譯QT/Embedded
QTE對路徑要求嚴格,在target的library路徑需和編譯時的一樣,這邊預設為/opt/qte
為了讓QT支援Touch Screen
修改qte/src/embedded/qmouselinuxtp_qws.h, 加入
#define QT_QWS_IPAQ
#define QT_QWS_IPAQ_RAW

修改qte/src/embedded/qmouselinuxtp_qws.cpp, 指定TS的device node為/dev/ts
...
#if defined(QT_QWS_IPAQ)
# ifdef QT_QWS_IPAQ_RAW
if ((mouseFD = open( "/dev/ts", O_RDONLY | O_NDELAY)) < 0) {
# else
if ((mouseFD = open( "/dev/ts", O_RDONLY | O_NDELAY)) < 0) {
# endif
qWarning( "Cannot open /dev/ts (%s)", strerror(errno));
return;
}
...

將QT-X11編出來的bin/uic, bin/moc copy到 qte/bin底下
將tslib編出來的include/tslib.h copy到qte/include底下
修改qte/mkspecs/qws/linux-arm-g++/qmake.conf, 修改gcc為自己所用的
arm-linux-gcc -> arm-unknown-linux-gnu-gcc
arm-linux-g++ -> arm-unknown-linux-gnu-g++

開始編譯
./configure -thread -embedded ipaq -shared -depths 16 -no-cups -no-ipv6 -thread -no-gfx-qvfb -no-freetype -disable-opengl -disable-xml -disable-canvas -qt-libjpeg -qt-mouse-linuxtp -xplatform qws/linux-arm-g++ -L/tslib/lib -L/tslib/lib/ts -I/tslib/include -lts
make sub-src
-L接tslib的library, -I接tslib的include 編譯時一同加入
make完成在qte/lib下產生libqte-mt.so, libqte-mt.so.3, libqte-mt.so.3.3, libqte-mt.so.3.3.6, 前三個為link, 最後一個即為object檔

安裝到target
受限於空間的不足, 可以將object檔放在flash,再用link的方式完成
假設libqte-mt.so.3.3.6放在sda1的根目錄mount /dev/sda1 /mnt/sda1
ln -s /mnt/sda1/libqte-mt.so.3.3.6 /opt/qte/lib/libqte-mt.so
ln -s /mnt/sda1/libqte-mt.so.3.3.6 /opt/qte/lib/libqte-mt.so.3
ln -s /mnt/sda1/libqte-mt.so.3.3.6 /opt/qte/lib/libqte-mt.so.3.3

寫一個hello world放上去跑, 經測試可以正常顯示, 不過touch screen的部份不能使用, 目前僅能以外接滑鼠的方式來操控. (註: 執行程式前要記得export QTDIR=/opt/qte)

參考資料:
QT/Embedded-3.3.8初步交叉编译的完全整理
Qt-embedded-3.2.3到PXA270上的移植
Qt/Embedded 2.3.10 到PXA270上的移植

TSLIB相關資料:
QTE與觸摸屏
tslib 1.4 - WeiBing
Qt-embedded-interest Archive - Touchscreen with qt examples?
Embedded Systems-GUI
tslib download and cross compile for arm

2007年12月12日 星期三

Porting MPlayer on PXA270

期末專題要在PXA270上實做一個播放器, 為了要能播mp3而且支援stream的形式選擇MPlayer. (MADPlayer 不支援stream, VLC太過複雜). 移植過程供大家參考.

Target: Create XScale-PXA270
Kernel: 2.6.15.3
Cross-Compiler: gcc-4.0.2
MPlayer-1.0rc2
libmad-0.15.1b (MAD: MPEG Audio Decoder用來mp3解碼)

事前工作:
toolchain路徑加入$PATH
編譯kernel時把audio相關的module一起編入
在target上建立device node (此為OSS預設的device)
mknod /dev/dsp c 14 3
ln -s /dev/dsp /dev/sound/dsp

編譯libmad
CC=arm-unknown-linux-gnu-gcc ./configure --host=arm-linux --prefix=$LIBMAD
make; make install
$LIBMAD為安裝library的目錄

編譯MPlayer
./configure --cc=arm-unknown-linux-gnu-gcc --host-cc=gcc --enable-cross-compile --target=arm-linux --enable-linux-devfs --disable-dvdread --disable-libdvdcss-internal --enable-fbdev --disable-mencoder --enable-liba52 --enable-mad --disable-libmpeg2 --disable-mp3lib --enable-static --disable-dvb --disable-dvbhead --disable-live --with-extraincdir=$LIBMAD/include --with-extralibdir=$LIBMAD/lib 2>&1 | tee logfile
make
--enable-static 用靜態編譯, 避免安裝library到板子上麻煩.
--enable-mad 採用mad的codec
--with-extraincdir 指向libmad的include
--with-extralibdir 指向libmad的lib
因為我只需要播放mp3的功能, 其他configure的參數就沒太理會, 其實大多可以disable. 只是過程可能會遇到error, 大部分都可以找的解決方法.
make 完之後在目錄下產生mplayer執行檔, 大概7mb, 可以用strip在將其大小縮減.

放到板子上測試
./mplayer -ao oss -ac mad test.mp3
./mplayer -ao oss -ac mad http://192.168.0.1/test.mp3
-ao指定device
-ac指定codec
經測試後播放時delay很嚴重,使用mad library來解碼,將浮點運算轉成整數運算,以滿足沒有浮點數運算的cpu,理論上應該很順才對.

補充: PXA270上對應的audio device node是/dev/dsp 需自行建立.

參考資料:
摩托學園討論區-embedded system
最新版本mplayer移植pxa270成功
MPlayer播放選項