顯示具有 openmoko 標籤的文章。 顯示所有文章
顯示具有 openmoko 標籤的文章。 顯示所有文章

2007年11月13日 星期二

OWB:以WebKit為基礎的嵌入式網路瀏覽器

幾個月前介紹了「WebKit的Gtk+支援」新進展,現在openmoko已正式採納為web engine,提供為網頁瀏覽與RSS reader使用。Origyn Web Browser (OWB)則是另一個以WebKit為基礎的開放原始碼網路瀏覽器 (BSD license + LGPL + misc),針對嵌入式環境做了許多微調與修正,引入一層簡化描繪與底層操作的軟體層,稱為OWB Abstraction Layer (OwBal),得以銜接WebKit與消費性電子產品需求。具體來說,原本的WebKit需要heavyweight UI toolkit去作widget/font描繪,但OWBOwBAL巧妙地補齊介面部份,並允許lightweight UI呈現,也就是 "render itself by its own toolkit"。詳細的技術介紹可參考「Introducing OWB, an open-source browser for consumer devices」一文。

建構方式如下:

  • 取得開發中的程式碼:
svn checkout http://www.sand-labs.org/svn/trunk owb
  • CMake調整組態設定:
cd owb && ccmake .
具體情況如下圖: 按下[c]則可進行組態設定,過程中會提示缺乏的開發套件。
最後按下[g]即可產生必要的Makefile
  • 開始建構,當然是執行make
目錄下應該會有名為"owb"的執行檔。注意,建議安裝CJKUnifonts以支援中日韓文顯示支援,並且需作以下修正:
Index: BAL/Implementations/Fonts/freetype/BTFont.cpp
===================================================================
--- BAL/Implementations/Fonts/freetype/BTFont.cpp (revision 147)
+++ BAL/Implementations/Fonts/freetype/BTFont.cpp (working copy)
@@ -114,7 +114,7 @@
int size = static_cast<int>(m_fontDescription.specifiedSize());

if (m_fontMap[size] == 0)
- m_fontMap[size] = d->open("/usr/share/fonts/owb.ttf", size, 0);
+ m_fontMap[size] = d->open("/usr/share/fonts/truetype/arphic/ukai.ttf", size, 0);
d->m_ttfFont = m_fontMap[size];
if (d->m_ttfFont == NULL)
logml(MODULE_FONTS, LEVEL_EMERGENCY, make_message("open : \n"));
以「Jserv's blog」為例,OWB的呈現效果如下:

在組態設定時,指定了以FreeType作為字型描繪引擎 (即 "WEBKIT_USE_FONTS_FREETYPE" 選項),以取得更加的顯示效果。可發現網頁周圍沒有視覺捲軸 (但可使用方向鍵或PageUp/Down),而且HTML按鈕則是OWB自行描繪的,輸入框亦然。

OWB現在的空間使用量與網頁呈現正確度相當不錯,除了使用curl的方式還需要效能調整外,整體已相當穩定,目前的參考圖形引擎實做為SDL,官方網頁提供相當好的移植文件「OWBAL Porting Guide to Embedded Systems」。依據發展方向,OWB適合應用於Set-Top Box、數位電視、Kiosk等環境,並且對DirectFB的支援也開始進行。

2007年10月21日 星期日

EGLIBC於S3C2410 ARM SoC的體驗

稍早於「EGLIBC初探」提過CodeSourcery與諸多系統廠商合作,針對glibc的改進計畫 (自2.5版開始),實做出更適合Embedded環境的C Library實做 ── EGLIBC,前文也提及快速建構的script,而OpenEmbedded也正式納入對EGLIBC的支援。所以現在要建構與測試都可以相當快速,以下是參考的option groups組態:

jserv@venux:/home/moko/build$ cat ../org.openembedded.dev/packages/glibc/eglibc-svn/option-groups.config
# This file sets default values for all option group variables
# mentioned in option-groups.def; see that file for a description of
# each option group.

OPTION_EGLIBC_ADVANCED_INET6 = n
OPTION_EGLIBC_BSD = n
OPTION_EGLIBC_CATGETS = n
OPTION_EGLIBC_CHARSETS = n
OPTION_EGLIBC_DB_ALIASES = n
OPTION_EGLIBC_ENVZ = n
OPTION_EGLIBC_FSTAB = n
OPTION_EGLIBC_GETLOGIN = n
OPTION_EGLIBC_INET = y
OPTION_EGLIBC_LIBM = y
OPTION_EGLIBC_LOCALES = n
OPTION_EGLIBC_LOCALE_CODE = n
OPTION_EGLIBC_NIS = n
OPTION_EGLIBC_NSSWITCH = y
OPTION_EGLIBC_RCMD = n
OPTION_EGLIBC_SPAWN = n
OPTION_EGLIBC_SUNRPC = n
OPTION_EGLIBC_UTMP = y
OPTION_EGLIBC_UTMPX = n
OPTION_EGLIBC_WORDEXP = n
OPTION_POSIX_REGEXP = y
具體的細節可參考Jim Blandy發表於mailing-list的文章「EGLIBC size measurements for option groups」,EGLIBC透過option groups可讓C runtime的建構更加模組化,可輕易挑選Embedded環境所需的特徵,大幅降低code size與memory footprint,以常見組態來說,後者相較於glibc縮減為85%。筆者實際在openmoko GTA01bv4硬體 (based on S3C2410 ARM SoC)測試,在Smartphone的使用情境中,free memory從原本58444 bytes (glibc) 增加到67404 bytes (eglibc),幅度達13%,功能卻沒有因此打折,這與uClibc或其他小型的C Runtime來說,是很大的優勢。

取得筆者建構的EGLIBC-based openmoko 2007.2 image:http://people.openmoko.org/jserv/images/

2007年7月26日 星期四

SMS PDU

ETSI (GSM 03.40 and GSM 03.38)中規範SMS的encoding可有以下幾類:

  • 7 bit encoding:最多可以包含160個characters,其中每個character只用一個或兩個byte的 7-bit data來作encoding。7 - bit encoding table 在.. http://www.dreamfabric.com/sms/default_alphabet.html 和ASCII Code比較後,除了0123456789、A-Z、a-z,和%$!*& ' ' 相同外,其他都不一樣。
  • 8 bits encoding:最多可以包含140 個字。通常用作非文字SMS,而拿來當作Data傳輸使用。
  • 16 bit encoding:最多只可以有 70 個'字',是用來傳送Unicode text messages。 可以當作文字讀取。
另外,還規範傳送的方式(Mode):
  • Text Mode
  • Pdu Mode
PDU (Protocol Description Unit)

PDU封包中,除了內文外,還包含其他的information,像是:
  • Sender
  • SMS service center
  • time stamp
傳送的data是以"hexa-decimal" or "decimal semi-octents"。

這個encoding有點麻煩,採用7 bit encoding是為了減少資料量。所以一個「字」就佔不滿一個byte,多的bit,就拿下一個「字」的bit,拿法是:
從下一個「字」中 ,從後算起,還沒被拿走的bit 拿起。
這一篇文章,有很好的示範.. http://www.dreamfabric.com/sms/hello.html

2007年6月14日 星期四

WebKit的Gtk+支援

khtml是在KDE 2中,集合檔案檢視系統與網頁瀏覽器於一身的Konqueror內部主幹,是極為精美細膩的設計,如果說為一窺 KDE 技術最佳的進入點,那真是一點都不為過。由於khtml卓越的設計,很快就出現以khtml為基礎的網路瀏覽器專案,比方說運作於Qtopia (Core)之下的Konqueror/Embedded,而Apple Inc.也採納khtml,部分重新設計與最佳化就變成WebCore (MacOS X內建瀏覽器Safari的核心基礎建設)。而業界的應用也很廣泛,像是韓國嵌入式系統廠商Mizi Research就曾將Konqueror/Embedded經過一番調整,成為相當強悍的瀏覽器。

Apple Inc.提供了大量的修改,讓khtml的品質獲得極大的提昇,又在KDE開發者的斡旋下,Apple Inc.終於採納了社群開放發展的模式,於是KDE與Apple Inc.兩組開發人馬傾向共享WebKit的程式碼基礎 (codebase)。接著,Nokia也宣佈WebKit為基礎的S60WebKit (針對S60手機平台)與gtk+-webcore (針對Gtk+/X11環境),並依循LGPL與BSD License的方式,將修改貢獻回WebKit專案。

WebKit在這三年內蓬勃發展,提供了許多不同軟硬體平台的移植,值得一提的是新出現的GDK (Gtk+的低階圖形處理部份) 移植,這意味著WebKit可運作於GDK支援的環境,就嵌入式系統來說,我們會關注linux-fb與DirectFB兩個Gtk+/GDK所支援的backend。在近半年來的發展,WebKit的Gtk+/GDK移植已到堪用的地步,針對Nokia770/MaemoOpenMoko的硬體移植也出現成功案例。

為了降低建構WebKit/Gtk+的難度,我做了簡單的建構系統 (檔案:webkit-build-script.tar.bz2),允許從Subversion取出最新的發展版本,並作必要的設定,最後進行編譯。下載並解開後,直接執行以下script:

# ./BUILD.sh
中間會透過apt-get取得必要的開發套件。建構完畢後,大致的執行畫面如下:
(1) wiki.openmoko.org
(2) Google MapsWebKitOpenMoko GTA01也開始運作了,但還是有很多需要調整之處,這也是今年Google Summer of Code的項目之一,期待這方面的新進展。

2007年6月11日 星期一

從Chrasis談手寫辨識引擎在移動裝置的機會

Gentoo TaiwanPalatis日前公開他發展中的手寫辨識引擎與訓練程式,可參考blog文章「Chrasis 0.1.0 alpha!」,專案發展紀錄可參考Chrasis - Chinese Handwriting Recognition As-Is」,正如版本號所宣示的,現在還有很大的改進空間,不過已經初步可運作,以下是其訓練手寫辨識程式的執行畫面:
程式碼可透過Subversion存取:

# svn co svn://svn.berlios.de/chrasis/Engine/libchrasis/trunk libchrasis
# svn co svn://svn.berlios.de/chrasis/Linux/ChrasisTrainer/trunk ChrasisTrainer
libchrasis為手寫辨識引擎,其相依性有: (以Ubuntu 7.04為例)
  • libxml++2.6-dev
  • libsqlite3-dev
  • sqlite3
  • libboost-dev
ChrasisTrainer顧名思義就是訓練程式,以Gtk+打造,其相依性如下:
  • libgtkmm-2.4-dev
  • llibxml++-2.6-dev
測試了幾個簡單的中文字,都能正確辨識,算是不錯了。當然,手寫辨識的議題很複雜,以下是筆者在wiki - ChineseInformationProcessing的「手寫輸入」段落紀錄的部份資訊l:

以下為 rabit 的個人見解 (Modified by User:jserv):

  • KanjiPad 本身使用的辨識方法是很簡單的字典法,當使用者透過手寫版或滑鼠寫出字時,程式辨識出筆劃種類,並紀錄每個筆劃的順序,然後根據字典查出候選字。也因此,KanjiPad 根本不考慮寫出來的字形貌是否相似,只求筆劃順序相符。

chinput_5.gif

  • 以 Cinput (修改自 Kanji Pad) 的圖為例,「林」這個字辨識出來的候選字有「林、杯、枝、板、茂」,這幾個字右半邊的「木、不、支、反」筆劃順序都是跟「木」是相似的。這樣的演算法辨識 率是不高的,一但筆順不對,就很難辨識出來,不過話說回來,也不能太苛求 KanjiPad,因為它原本的用途就是日本人寫來學習漢字用的,可以說本來就是當作字典使用。
  • 中文手寫辨識是難度相當高的, 困難的地方有二:
    • 就技術而言,在辨識方面會用到許多數學模型,如 Baysian Decision Theory hidden Markov models、類神經網路等,而辨識中文還必須對中文字作分析,找出每個中文字的特徵 (筆形、筆順等),若要更精準,需拆解中文字成基本的部件,來作分析 (有點像漢字跡因工程),這時就要處理寫字上連筆的問題,技術上有實現的複雜度,但或許還不是最困難的。
    • 必須對每一個字的分析,建立資料庫,這是需要大量的成本 (包含時間、人力等),中文字尤其複雜,除了大量的漢字,還有異體字、罕用字等,我想這對 open source 是最困難之處,這跟 open source license 中文字型的狀況有些類似。
看似這是NP-Hard的問題,但如果我們思考Mobile 2.0對我們的衝擊,可以發現,大多數的手持裝置都需要手寫、筆跡、觸碰軌跡辨識的技術,而且也依賴原本在桌面系統的軟體元件與操作習慣,此時,危機反而就是轉機。具體來說,我們可思考「新酷音」一類智慧型輸入法如何移植到手持式裝置如PDA或SmartPhone一類的裝置,基本上,運算速度與儲存裝置都不是大問題 (早在兩年前,「新酷音」輸入法系統就證明在某隻SmartPhone上正確運作),真正的難題反而是輸入法的「輸入」本身。是的,以「新酷音」來說,支援兩種基本符號:
  • 注音符號
  • 拼音字母
這兩者背後也有學問,光是注音符號對照的鍵盤排列就可玩許多花樣,諸如許氏注音、倚天26鍵等等,拼音系統就不必多說,在台灣根本就是多頭馬車。以往,「新酷音」的開發者花了很大的心力去維護這些子系統的可用性與正確度,整合到libchewing (核心函式) 中,但如今要整合到手持式裝置,就面臨新問題:
「如何將傳統鍵盤的行為導入輸入法系統?」
我們首先會想到手寫辨識,就目前的系統來說,多半會內建OSK (On-Screen Keyboard),所以「新酷音」理所當然可架構於OSK之上,不過這與我們中文打字者的思維有很大的落差。何以此說?試想,「新酷音」的中文簡介是什麼?就是「智慧型注音輸入法」,透過統計與預測方式,大幅降低同音字詞的出現率,進而改善注音輸入的速度,使用鍵盤只是一種過度,真正使用者腦海中的思維,仍是「注音」(或拼音)本身,所以,日前筆者也跟Palatis聊到一種新途徑:
「何不直接辨識注音符號,然後導入新酷音輸入法引擎去作猜字處理?」
這種技術難度對於Chrasis一類的簡化手寫辨識引擎來說,算是綽綽有餘,如果不討論太複雜的連寫與草寫議題的話。某種角度來說,這說明了Mobile 2.0的思維方式:「過去的桌面技術有機會走入移動裝置之中」與「打破過去封閉技術的藩籬,個人也得以貢獻新的技術元素到移動裝置設計」,如今,我們有完全開放程式碼並開放手機規格與實做的openmoko、有高效率的動態組字技術,以及最寶貴的資源,也就是富有高度創意的自由軟體開發者,其整體的影響將會很有趣,手持裝置才正要作更有意義的應用,咱們拭目以待。

2007年6月1日 星期五

build u-boot from sources

因為openmoko patch的u-boot有支援Samsung S3C24xx的stepping stone,所以build看看。

主要是follow這一篇文章 "Migration to bad block tolerant builds",說明比u-boot那一篇仔細 (但是我apply 609的patch沒有成功,所以還是使用main stream)。

工作的目錄是 /home/openmoko

裝好subvesion,設定svn使用proxy,在~./subversion/server中加入proxy server,port :

http-proxy-host = 10.1.1.200
http-proxy-port = 3000
checkout openmoko 到 openmoko 目錄
$ svn co https://svn.openmoko.org/ openmoko
安裝git-core,改變default git tool (debian etch)
$ aptitude install git-core
$ update-alternatives --config git
== 選 "git-scm"
export 好http_proxy,checkout u-boot
$ git clone http://www.denx.de/git/u-boot.git
(需要等待一段時間)

取得cross toolchain : 因為monotone出不去proxy (雖然mailing list中聲稱新版的monotone可以經過proxy,可是我這裡還是出不去),所以只好直接從 openmoko拿build 好的cross tool
$ wget -r -L http://buildhost.openmoko.org/tmp/cross
(需等待更長時間,且lib/下的檔案有些沒有抓回來,要確認一下,加上 "-c"抓沒抓到的folder。修改 bin 下的file,設為可執行。)

把抓下來的toolchain copy到 ..
/space/fic/openmoko/gta01/tmp/cross
設好PATH:
$ export PATH=/space/fic/openmoko/gta01/tmp/cross/bin:$PATH
u-boot - apply patch: (要先裝好quilt)
$ cd u-boot
$ export QUILT_PATCHES=/home/openmoko/openmoko/trunk/src/target/u-boot/patches
$ quilt push -a
Ok,沒有error message。

build u-boot - config and make:
$ make ARCH=arm gta01bv2_config
$ make ARCH=arm
完成。

2007年5月30日 星期三

GSM modem裝置模擬

系統模擬對於嵌入式系統開發來說,是相當重要的里程,不僅晶片層面如此,對於週邊來說,更可對應用程式開發帶來立即的效益,現在,OpenMoko-emulator也提供虛擬GSM modem的模擬。首先,依據之前的文章「透過USB連線與OpenMoko模擬裝置互動」,建立虛擬USB network連線,並透過ssh連線到虛擬硬體中,接下來就可以進行GSM modem的操作,畫面如下:(粗體字是打入的指令)

$ ssh root@192.168.0.202
root@192.168.0.202's password:
root@fic-gta01:~$ libgsmd-tool -m shell
libgsm-tool - (C) 2006 by Harald Welte
This program is Free Software and has ABSOLUTELY NO WARRANTY

O
# # Power-On
R
# Register
也可以不透過OpenMoko的工具,直接下AT command:(粗體字是打入的指令)
root@fic-gta01:~$ /etc/init.d/gsmd stop
Shutting down gsmd: Terminated
root@fic-gta01:~$ echo 1 >/sys/bus/platform/devices/gta01-pm-gsm.0/power_on
root@fic-gta01:~$ cu -E @ -l /dev/ttySAC0
Connected.

ATE1
OK
詳情可參考Marcin Juszkiewicz的文章 "How to check does GSM modem works",但對於openmoko-emulator也適用,甚至我們還可以模擬出各種不同的反應,卻不需要任何實體環境介入,這是相當有意思的手機軟體開發方式。

quilt - patch tools

quilt 是用來patch很多patches時使用,使用的方法是

quilt cmd
可以用
quilt cmd -h
來看可用的command有哪些。

因為是多個patch files,所以有一定的patch 順序,quilt會幫我們handle這些順序 (因為當初這些patch 也是由quilt 產生的呀)。就像stack操作一樣,push (apply) 一個patch;用pop 把sourcecode回到上一個沒patch的狀態。

所以,quilt也可以當作是簡易的Version control system用。

quilt的操作,將所有的pacth檔都放在要patch的source directory中的"patches"目錄。 (可以是symbolic link)

剛剛講的patch stack (patch 順序) 就紀錄在 "patches/series" 這個file中。

所以openmoko 的bootloader patch apply 的方法就是:
  • download u-boot latest versio (svn checkout lateset version)
  • download openmoko u-boot patch (是一個folder)
  • 把這個patch folder copy 到 download 的u-boot folder中
  • run quilt push -就會依照應有的順序apply 所有的patch.
That's all.

2007年5月25日 星期五

OpenMoko演講影片上線


psilotum的協助下,5/8在Tossug聚會所演講的「Free your phone! OpenMoko」過程都完整的錄影下來了,在 Google Video 上甚至還可以清楚看到簡報內容。請享用!

Credits:

Speakers: Sean Moss-Pultz/Harald Welte
Host: Tossug/Ping Yeh
Organizer: Rex Tsai
Producer: psilotum


備註: 我們不是在甚麼奇怪的地方,背景是天邊一朵雲的法國版海報,Cafe Lumiere 只是一家貼滿海報的咖啡店而已。


Source: http://people.debian.org.tw/~chihchun/2007/05/25/talk-of-openmoko-is-online/

2007年5月23日 星期三

ARM模擬的狀態保存

前文「透過USB連線與OpenMoko模擬裝置互動」指出現在透過qemu來模擬openmoko已有相當便利的互動機制,我們也隨時可在Qemu Monitor中監看與控制虛擬機器的狀態,Andrzej Zaborowski最近實做了ARM模擬的狀態保存,所以現在可快速load/save vm,如此一來,應用程式的開發與驗證更加便利。目前也整合到openmoko-emulator中,取得最新的發展版本:

$ svn co https://OpenSVN.csie.org/openmoko_addons/openmoko-emulator
現在openmoko/run.sh這個script已處理qemu-img的操作,所以我們只要如往常一般編譯與執行即可。舉例來說,我們希望保存開機完成、見到整個OpenMoko UI的狀態,那麼只要按下Ctrl-Alt-2以切換到Qemu Monitor畫面,在提示符號下先暫停虛擬機器的系統模擬動作:
(qemu) stop
接著就可以保存狀態:
(qemu) savevm mainwindow
參數 "mainwindow" 只是一個識別名稱,事實上我們可以在不同的狀態給予特定的識別,這時候我們可以結束虛擬機器的執行:
(qemu) quit
然後我們重新啟動openmoko-emulator (run.sh),立刻切換到Qemu Monitor,隨後在命令提示打入指令以查看保存的狀態:
(qemu) info snapshots
應該會得到類似以下的輸出:
Snapshot devices: mtd
Snapshot list (from mtd):
ID TAG VM SIZE DATE
1 mainwindow 22M 2006-05-23 11:11:35
要還原已保存的狀態相當直覺,只要打下指令:
(qemu) loadvm mainwindow
再按鍵Ctrl-Alt-1切回執行畫面,這時候就可以看到上次我們保存的狀態與畫面了,當然,配合前次提到的Linux gadgetfs,我們還可存取USB (emulated) network,這樣進行應用程式開發的彈性也提昇許多,若再引入自動化的機制,未來要實做「時光機器」也是相當可行的。

2007年5月21日 星期一

OpenMoko at Tossug

Sean Moss-Pultz

5/8在Tossug舉辦的分享活動算是相當成功,當天總共來了超過五十位聽眾。許多朋友也留下聯絡資訊,或許可以加入開發社群或即將成立的OpenMoko公司

演講分為兩節,Sean Moss-Pultz介紹關於OpenMoko的背景故事、起源與目標。而 Harald Welte 則介紹軟硬體等技術細節。

Harald Welte

演講完整錄影,影片將上傳至網路,簡報一併於稍後提供。謝謝psilotum攝影,以及Tossug工作人員的辛苦籌備。

原文: http://people.debian.org.tw/~chihchun/2007/05/17/openmoko-at-tossug/

Working on Neo1973

Working on Neo1973

這是4/14在Mix coffee & tee的工作畫面 (工作紀錄, Minicom log for reflash images on Neo 1973),我們將Neo1973拆解,並試著reflash與裝上debug board。我很喜歡這張照片,謝謝psilotum的攝影。

原文: http://people.debian.org.tw/~chihchun/2007/05/17/working-on-neo1973/

2007年5月19日 星期六

透過USB連線與OpenMoko模擬裝置互動

前幾篇文章介紹如何透過qemu來模擬openmokoPoky,這部份的開發逐漸穩定,而qemu現在對於硬體的模擬也頗完整,很多時候我們可直接指定Ethernet模擬來作PXE/BOOTP/TFTP開機或DHCP,於是Host與(Emulated) Target互動就相當簡單。但,如果是openmoko Neo1973/GTA01這類沒有Ethernet (頂多只有Wifi或Bluetooth)的硬體裝置,該如何互動呢?最近加入USB gadget模擬的支援,可將USB slave轉包到Linux 2.6的gadgetfs,如此一來,我們就可建立USB (emulated) network,兩端也可用NFS或sshfs來作檔案分享存取。

在Ubuntu 7.04上操作的方式如下,注意,建議使用一般權限進行,並善用sudo的機制。

取得Linux Kernel原始程式碼:

$ apt-get install linux-source-2.6.20
解開檔案並給予目前的組態:
$ cd /usr/src
$ tar jxf linux-source-2.6.20.tar.bz2 && cd linux-source-2.6.20
$ cp /boot/config-`uname -r` .config
因為Ubuntu預設的USB Gadget/Peripheral controller是實體裝置,但我們需要dummy_hcd (Dummy/Loopback USB host and device emulator driver),所以我們得調整設定:
$ patch -p0 < dotconfig_dummy_hcd.patch
然後建構我們需要的核心模組:
$ make MODVERDIR=drivers/usb/gadget \
drivers/usb/gadget/dummy_hcd.ko \
drivers/usb/gadget/gadgetfs.ko
順利的話就會有兩個 .ko檔,接著就安裝:
$ sudo insmod drivers/usb/gadget/dummy_hcd.ko
$ sudo insmod drivers/usb/gadget/gadgetfs.ko default_uid=`id -u`
Host端需要一個名為/dev/gadget的目錄,以掛載gadgetfs:
$ sudo mkdir -p /dev/gadget
$ sudo mount -t gadgetfs gadget /dev/gadget -o noauto,user,group
核心的部份告一段落,接著我們要來建構qemu,取得最新的openmoko-emulator:
$ svn co https://OpenSVN.csie.org/openmoko_addons/openmoko-emulator
編譯時期需指定kernel header (Ubuntu預設沒有打包全部USB gadget的header):
$ cd openmoko-emulator
$./configure --cc="gcc-3.4 -I/usr/src/linux-source-2.6.20/include"

在最後一行輸出應該要有以下字樣:
USB Gadgetfs support yes
接著就打 "make",順利的話會在arm-softmmu目錄產生名為qemu-system-arm的執行檔。我們可透過script自動下載u-boot、kernel,與rootfs等images並「燒」入我們的模擬硬體中,操作如下:
$ ./openmoko/download.sh
$ ./openmoko/flash.sh
正確的話,畫面會提示run.sh的script檔案被生成,咱們就來跑看看:
$ ./openmoko/run.sh
操作方式在前文「OpenMoko/Neo1973硬體模擬」已提及,不贅述。等X Window的畫面都出現後,就是運用gadgetfs的時機。按下Ctrl-Alt-2組合鍵切入Qemu Monitor,我們可監控與管理Qemu的狀態,當我們打入"info usbslave"指令時,應該有如下的輸出:
USB2.2 device 1457:5122:
Manufacturer: Linux 2.6.20.7-moko8/s3c2410_udc
Product: RNDIS/Ethernet Gadget
Configuration 0: RNDIS
Configuration 1: CDC Ethernet
因為openmoko在啟動X的時候會順便將USB network帶起,這時候我們就可透過gadgetfs去讓Host與(emulated) target互動。同樣在Qemu Monitor畫面,打入 "usb_add gadget:1" 指令,若無錯誤訊息,表示已成功。在Host上的終端機檢查USB gadgetfs的狀態:
$ lsusb -v | grep -A10 -B12 s3c2410
應該會有以下輸出:
Bus 004 Device 003: ID 1457:5122
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 2 Communications
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x1457
idProduct 0x5122
bcdDevice 2.12
iManufacturer 1 Linux 2.6.21.1-moko8/s3c2410_udc
iProduct 2 RNDIS/Ethernet Gadget
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 80
bNumInterfaces 2
bConfigurationValue 1
iConfiguration 7 CDC Ethernet
這時候就可透過CDC Ethernet操作USB network,openmoko在啟動該裝置時就設定IP與route,所以我們只要在Host設定必要的網路組態,即可連線到模擬的裝置:
$ ifconfig usb0 inet 192.168.0.200 netmask 255.255.255.0
$ ssh root@192.168.0.202
順利的話就會看到命令提示畫面:
root@fic-gta01:~$
當然,拿到shell後,什麼事情都可以作。

注意,在關閉openmoko-emulator前,請切換到Qemu Monitor,並打入"usb_del gadget"的指令,要求將gadgetfs的存取關閉,否則很可能會kernel panic。這時候Host的dmesg輸出應該類似以下:
[ 4751.700000] dummy_udc dummy_udc: unregister gadget driver 'gadgetfs'
[ 4751.700000] gadgetfs: disconnected
[ 4751.700000] dummy_hcd dummy_hcd: port status 0x00010100 has changes
[ 4751.700000] dummy_hcd dummy_hcd: port status 0x00010100 has changes
[ 4751.700000] usb 4-1: USB disconnect, address 3
[ 4751.700000] usb0: unregister 'cdc_ether' usb-dummy_hcd-1, CDC Ethernet Device
[ 4753.856000] usb usb4: dummy_bus_suspend
另外,Win32的USB redirection實做我也開始進行,希望不久後也可在Win32進行openmoko的模擬與開發工作。本文內容僅供參考與進度展示,後續的更新會發佈於openmoko官方的wiki: OpenMoko_under_QEMU

2007年5月14日 星期一

Install OpenMoKo from MokoMakefile

如果你想安裝OpenMoKo from scratch有二種方法,除了直接下載SVN來編譯之後,我們還可使用 Rod Whitby 所編寫的 MokoMakefile Makefile,好處是我們可以利用簡單的make指令取代一些煩雜的指令 。以下為我的安裝過程:

1. 確認建構主機安裝必要的套件:

$ apt-get install python patch m4 make python-psyco ccache perl diffstat \
wget curl ftp cvs subversion git
2. 於建構系統安裝Openembedded
i. 在apt檔案庫追加Openembedded所需的套件:
$ echo "deb http://www.openembedded.org/dl/ packages/" >> /etc/apt/sources.list
ii. 安裝monotone 0.32
$ wget http://monotone.ca/downloads/0.32/monotone_0.32-0.1_i386.deb
#版本若不一樣可能會造成問題,此版本是我使用過沒問題的

$ update-alternatives --config git
#選擇 /usr/bin/git-scm來提供git的實做,而非用/usr/bin/git.transition
3. 安裝輔助性的套件:
$ apt-get install libxml2-utils xmlto passivetex
$ apt-get install docbook
4. 建立專屬的$OMDIR目錄:
$ export OMDIR=$HOME/moko ; mkdir $OMDIR ; cd $OMDIR
5. 取得MokoMakefile:
$ wget http://www.rwhitby.net/files/openmoko/Makefile
6. 設定環境
$ make setup
PS: 請確定/bin/sh指向bash,如為dash則編譯perl-native時會有問題
7. 開始建構:
$ make openmoko-devel-image
8. 以模擬環境來執行:
$ make build-qemu
$ make flash-qemu-local
$ make run-qemu
以下是參考的執行畫面:





2007年5月10日 星期四

OpenMoko的OpenGL/ES實做

兩年前我建立名為PicoGL的專案計畫,目標是建立高可攜性、高彈性,且輕量級的OpenGL實做,日前展開OpenGL ES的初步支援,現在已可在OpenMoko/GTA01上順暢的執行。週二晚上的活動「【5/8 TOSSUG 心得分享】 Sean, LaForge: Free your phone! OpenMoko」,我展示這些進展給Sean Moss-PultzHarald Welte看過,結果Harald Welte還一眼就認出這是PicoGL。以下是執行的畫面:

這是OpenGL知名的齒輪展示程式,原本由Mesa 3D Graphics的老大Brian Paul撰寫,現在移植到OpenGL ES API,另外一張:

展示OpenGL ES的Texture Objects (EGL_TEXTURE_2D),等做了些performance tuning後,應該就可以準備新的釋出版本。此外,之前的文章「當Java遇到OpenMoko」提過我正在進行的OpenMokoCacao/CLDC移植,現在也有新進展,這是展示畫面:
我的途徑是直接跳過X Window System,直接在Linux framebuffer上作影像輸出,現在Java ME/CLDC的效能已經可接受,但細部的處理如Graphics renderer則還有很大的進步空間,而我也正在與MIDPath專案開發者合作。

2007年5月9日 星期三

TOSSUG心得分享:Free your phone! OpenMoko

魔法設計師是位對OpenMoko很有興趣的朋友,日前他耳聞TOSSUG的新聞「【5/8 TOSSUG 心得分享】 Sean, LaForge: Free your phone! OpenMoko」,興致高昂的參與,隨後他則做了一份簡要的紀錄與感想,取得同意轉貼如下:


昨天,跟阿江、yap一起去土虱社群的第五場心得分享聚會活動,這次是加開的分享場次,是openmoko計劃的兩員大將:Sean Moss-Pultz(任職於大眾電腦)、Harald Welte(是個hacker,也是linux kernel的iptable維護人)分享,這麼難得的機會,當然要去的囉。

Sean 的娓娓道來openmoko計劃,透過開放系統與封閉系統的過去發展,當是開放的體制時,像internet,本來的設計,是國防科技的用途,但在開放以 後,一飛沖天,衍生出許許都多當初原始設計所無的應用,個人電腦更是不用說了,在1983年,IBM推出的Personal Computer開放架構,結束了之前個人電腦數個封閉系統各自稱王的時代。然而手機呢,從發明的那一天開始到現在,想要一支使用者有完整掌控力的手機根 本是緣木求魚,因為他們都是封閉式系統。

想要有完整掌控力?別說笑了,不要說手機發展了那麼多年,到了近年,已經有手機的硬體能力已經逼 近Desktop,Desktop軟體理論上可以毫無困難的在手機上使用,但這幾年最主要的給使用者控制手機權力,不談基本的電話、簡訊、電話簿等機能, 其實沒什麼進步,ok給你變變桌布、變變鈴音的權力,再多一點,給了你java執行環境、或是讓你可以安裝一些原生程式,但是我的手機實際上能取得哪些軟 體?能讓我的手機有什麼新的機能?很遺憾的,幾乎是手機商不然就是系統商給你定義好的,這對發展手機軟體的人與廠商也很苦手,想發展一個軟體,且推到終端 消費者手上,只有電信系統商下載、手機隨機bundle,幾乎沒什麼獨立通路。更甚,近幾年也有很多廠家在特種的Linux核心上做出了號稱的Linux 手機,最近幾年Linux手機發光發亮,光是在中國大陸的智慧手機市場,Linux手機有30%的佔有率(symbian居首,微軟平台居末),只可惜雖 然系統核心是Linux,可是Linux上面堆出來的不同層次系統服務,一點也不open,而那個特種Linux核心呢?很抱歉,原廠只會給你那舊舊他們 覺得夠用的系統核心,新核心?想都別想,手機公司要維護那麼多的手機產品線,怎麼可能光顧你那麼一個「特定」需要呢?反正手機用久大家都會換的嘛,我做手 機公司的,只要顧著把手機賣出去就好啦,再來就是推出新手機勸你換更好的一台,幹嘛一台一台去幫你維護手機系統軟體的更新呢?

然 而今天openmoko這個新平台完全打破了這個封閉性,openmoko手機從最底層一直到最表面的應用層,完全都是opensource,而且還不是 普通的opensource,而是對應PC桌面軟體的應用!openmoko軟體stack大致是linux kernel-glibc-X11-GTK+-matchbox桌面,簡而言之,PC的GTK系的應用程式,只要開發者重新拉拉介面調成適合手機的版面, 然後編譯成arm的cpu平台,就可以放到openmoko手機上跑,簡單說Desktop的Gnome系有什麼可以跑的程式,就可以很容易放到 openmoko上去(這個大家可能還沒什麼感覺,但要是說到即時通超級瑞士刀:gaim,msn/yahoo messenger/icq/msn/jabber/gtalk/irc 就因此可以在手機上....、用手機做簡報....),甚至更新系統核心等等,而怎麼安裝程式、更新程式呢?就是Debian、Ubuntu使用者耳熟能 詳的apt-get,使用者要怎麼用手機、要用什麼軟體、甚至說自己有能力寫寫命令稿語言,要做量身而定的運用時,完全是使用者的自由,對軟體開發者而 言,不用經過系統業者、手機廠商,也能有自己自由的發佈通路!這讓人很有想像空間,例如說自己把手機外接usb的智慧卡讀卡機,用手機就可以查帳、自動打 電話給指定名單公告特定事情、手機照完相後相片自動上傳到特定網路相簿、密文簡訊、也許還可以做自製電話答錄系統(按1聽我的個人介紹、按2直接跟我說) 呢,這讓人有許多想像空間,從硬體到軟體都可以hack。從某種角度而言,openmoko其實應該也算是一種Linux distribution,只不過是給手機這種迷你電腦用的。

待續

2007年5月6日 星期日

反組譯 OpenMoko Steppingstone Code

在正式的內文之前,先來說個小故事。前一陣子在Atmel AT91RM9200這顆ARM9微處理器的實驗板上寫了一個簡單又迷你的kernel,後來想想認識的人裡面都沒人玩這顆,不免有點孤單。於是打算把它移植到比較多人玩並且有模擬器可用的平台,剛好jserv推薦OpenMoko,OpenMoko 的第一支手機Neo1973/GTA01所使用的微處理器是Samsung S3C2410也是 ARM9,我想應該不難移植,還有jserv掛保證的模擬器可用,所以就決定來玩OpenMoko/S3C2410啦!

既然我的出發點是要開發kernel,那麼對於處理器的啟動程序就不可不知。S3C2410啟動時,會從NAND flash的開頭複製4KB 內容到內部的SRAM,然後跳到SRAM開始執行,這4KB SRAM就稱為Steppingstone。這段小程式就是處理器最先執行的程式,但4KB空間當然放不下U-Boot,於是我們只把這段小程式當作踏腳石(steppingstone),由它來幫忙載入完整的U-Boot bootloader。

在好奇心作祟之下,想來看看這段steppingstone code寫些什麼(其實也沒什麼,真的很無聊吧 XD)。在 http://buildhost.openmoko.org/tmp/deploy/images/ 抓了lowlevel_foo開頭檔名的".bin" 檔,問題是我只知道可以用arm-linux-objdump來反組譯 ELF 格式的程式,那麼binary檔怎麼反組譯呢?上網Google了一下沒有找到ARM反組譯器(其實是前幾個連結沒有就懶得繼續找了),網友說IDA Pro這套軟體可以反組譯ARM程式,但我懶得安裝這麼龐大的東西。只好換個關鍵字繼續 Google 看看,結果找到了這個網頁:

firmware_reverse_engeneering_methodology
原來可以把binary檔轉成ELF檔再進行反組譯,方法如下:

先把binary轉成ELF格式:
$ arm-linux-objcopy -I binary -O elf32-littlearm foo.bin foo.elf
再進行反組譯:
$ arm-linux-objdump -marm9 -D foo.elf > foo.asm
輸出結果foo.asm是個純文字檔,內容就是反組譯出來的組合語言。簡單吧?不需要安裝其它軟體,只要利用toolchain就能辦到。學會這招後,手邊如果有實驗板沒開放bootloader原始碼,或者想hack PDA bootloader,都不是問題啦(當然得有耐心去trace組合語言程式碼)!

2007年5月2日 星期三

Xorz/Embedded作為Phone UI

之前在「動態組字技術於Embedded領域」提過我們最近實做的動態組字技術基礎建設,與其適用的場合和思維方向,其中也提到Xorz/Embedded (展示1/展示2)。整合動態組字技術,對於原本即以向量繪圖為核心架構的Xorz/Embedded來說,是今年的規劃,可作為低階裝置的UI (User Interface) 或者是進行能源管理處理時的圖形操作,甚至可以植入kernel space或boot loader。

最近又對Xorz/Embedded做了refactoring與改進,現在backend有SDLX11,與Linux framebuffer。在週二晚上與OpenMokoSean Moss-Pultz & Harald WelteJollenChihchun等人聚會時,展示了最新的成果,以下是運作於Neo1973 GTA01的畫面:

關鍵技術有:向量繪圖、快速座標轉換、半透明處理、動態字型描繪、輕量級視窗管理等,近期內會開放實做,允許創造更多應用。同時也與Sean Moss-Pultz談及Linux-based feature phone的可能性,就技術上本身來說是可行的,而且他也給予正面回應。我想,如果這些基礎建設都穩固後,自身對GreenPhonegpephonOpenMoko的設計有更好的掌握後,或許我可在OpenMoko的基礎上建構以Xorz/Embedded為核心的Phone (UI) stack,或許可稱為"OpenMoko-Lite"。

憶及之前閱讀的報導「Linux well-positioned in feature phones, Trolltech founders say」,雖然已過一年,但其中有些觀點仍是值得思考的。我們不僅得思考BOM (Bill-Of-Materials) cost,Trolltech的兩位創辦人Eirek Chambe-Eng與Havaard Nord也提醒我們:

"The line between smartphones and feature phones will be totally blurred."
訪談也談及single-chip、virtualization,與系統複雜度等議題,所以在設計的同時,也得有清楚的思維與定位。

2007年4月30日 星期一

當Java遇到OpenMoko

對許多人來說,openmoko真是個令人驚奇的平台,這不僅是個開放系統,而且也引入許多原生於桌面環境的技術,甫成立的GMAE (GNOME Mobile & Embedded Initiative) 就是個極佳的切入點。作為一個Free Java (VM) hacker,最大的樂趣就是廣泛讓Java技術散佈到世界上不同的角落,當然,也包含了openmoko,考量到openmoko的行為模式比較類似桌面系統,而非傳統的CDC/CLDC執行環境,所以我選擇了KaffeCacao這兩個以GNU GPL發佈的Java Virtual Machine實做,這兩者都以GNU Classpath作為Class Library實做,所以有不錯的相容度。

經過一番努力,KaffeCacao這兩個Free JVM都可在openmoko上運作,而我則對後者予以很大的關注,因為其ARM jit engine日前已經以GPL釋出,而且Cacao這兩年內的效能提昇幅度相當不錯。我在Planet Classpath寫了一篇紀錄「Cacao VM running on openmoko」,節錄如下:


Then, back to Free Java world, I met several hackers around the world in #kaffe, #classpath, and #cacao IRC channel. Since I had portd Kaffe to Xscale-based mobile phones, I decide to take Cacao for a try. After some slight modifications (with the help from twisti), Cacao works on OpenMoko GTA01, and here is the output for typical "Hello World" application in Java:
root@fic-gta01:/var/tmp/cacao$ ls *.class
fp.class hello.class
root@fic-gta01:/var/tmp/cacao$ cd bin
root@fic-gta01:/var/tmp/cacao/bin$ ./cacao -cp .. hello
Hello world
root@fic-gta01:/var/tmp/cacao/bin$ uname -a
Linux fic-gta01 2.6.20.7-moko8 #1 PREEMPT Sat Apr 14
07:40:05 UTC 2007 armv4tl unknown
It is based on Cacao SVN (along with GPL'd ARM jit engine) + GNU Classpath version 0.95. However, I still manage to let gtk-peer work on Cacao inside GTA01 device. But I am of the opinion that it is really a good start point for joint of the power from Free Java (GNU Classpath, Cacao, Kaffe, etc.), OpenMoko, and Embedded Linux.

Also, I met guillaum1 in #cacao, who is the developer of MIDPath, and he suggested me to try the combination of cacao-cldc (cacao without GNU Classpath) + MIDPath. The design of MIDPath is very flexible, and it allows to have MIDP2 working on top of cacao-cldc (without Classpath) or standard cacao (i.e with Classpath). I will do that later.

很快收到許多回應:
當然,這只是個出發點,可說是銜接桌面技術到OpenMoko這類裝置的概念驗證,我仍在評估Sun的PhoneME (逐漸以GNU GPL釋出) 的整合性,同時也希望AWT/Swing仍可「有限度」使用。

Have fun with OpenMoko/Neo1973

chihchun今天早上寫了一篇關於OpenMoko/Neo1973的blog文章「Have fun with OpenMoko/Neo1973」,取得同意轉載如下:


自從我寫了「I Want A Personalized Phone」後,就持續注意TuxPhoneGreenPhoneOpenEZXgpephon的消息。當然還包含了OpenMoko,OpenMoko是真的令人興奮的計畫,因為除了此計畫是真實使用自由軟體的開發平台,而非採用多授權或非商業授權的平台產品外:也完全採用有GPL驅動程式的硬體元件,如「挑選 WiFi 模組」。而且OpenMoko與FIC的合作模式使量產上市變成可能,你不需要逐一的「自行 DIY」,大幅降低自訂軟體的門檻。

話說Jserv是周遭朋友第一個拿到Neo1973的人,當然要跟他凹來把玩一番,於是就在4/14 OSDC結束後的晚上,把Jserv拉到Mix coffee & tee進行了一場小型的 BoF

目前FIC/Neo1973的硬體功能是:
  • 120.7 x 62 x 18.5 (mm)
  • 2.8" VGA (480×640) TFT Screen
  • Samsung s3c2410 SoC @ 266 MHz
  • Global Locate AGPS chip
  • Ti GPRS (2.5G not EDGE)
  • Unpowered USB 1.1
  • Touchscreen
  • micro-sd slot
  • 2.5mm audio jack
  • 2 additional buttons
  • 1200 mAh battery (charged over USB)
  • 128 MB SDRAM
  • 64 MB NAND Flash
  • Bluetooth (2.0)

Neo1973 running OpenMoko

OpenMoko的wiki網站上有著驚人豐富的資訊,甚至連如何拆解機器的步驟都詳實記載,依照站上的資訊逐一進行,很快的就一步一步的把機器拆開,順道也reflash一下最新版的kernel與rootfs,感興趣的話請參考我倒出來的一些資訊: ipkg list,dmesg,cpuinfo。但顯然硬體與應用軟體尚有許多項目待完成,急需開發者的參與。

Neo1973 unboxed

有意思的是 Gnome 基金會在幾天前於Embedded Linux Conference宣佈 GMAE 計畫 (Gnome Mobile & Embedded Initiative),引起產業與社群的極大迴響。忠實希望與期待可以在此平台上,建立一個共用的開放嵌入式系統應用軟體架構。

jserv with a nameless girl

在此感謝Jserv借玩手機 (照片男方是Jserv,女方為不知名,但Jserv很願意主動搭訕認識的女生。其實我也很願意認識,啊!只要是女生我都願意認識)。週末很榮幸的與Sean Moss-PultzHarald Welte、Jserv、Jollen與大眾電腦的幾位長輩/前輩們聚餐,收穫甚多。Jollen在自己的的 blog上撰寫了相當深入的OpenMoko報導與嵌入式系統的開發知識,值得一讀。現在只希望我能夠拿到下一波生產的手機,這樣才有機會 happy hacking。

BTW,我正在安排Sean與Harald於Tossug聚會上提供演講,Sean Moss-Pultz是OpenMoko的產品經理,而Harald Welte是OpenMoko首席軟體架構師,也是Netfilter/iptables的開發者,同時也是gpl-violations.org的創辦人。如對此聚會感興趣,請告知我吧。:-)