2008/12/26

Neo FreeRunner 新手手冊 (10) 認識 Openmoko 社群, 環境, 工具以及開發人員


Neng-Yu Tu (Tony Tu)

Openmoko 是一個非常特別的專案, 也是目前唯一軟體及硬體都完全根據 Open source 社群精神公開的專案. 2006 年底, 第一個產品 Neo1973 (GTA01) 在市場上販售前, 所有相關的程式碼及開發資訊就已在網路上公開. 在2008 年 6 月 FreeRunner (GTA02) 發售後, 相關的電路圖 (schematics: http://downloads.openmoko.org/developer/schematics/ ) 以及外型設計 CAD 檔 (Housing: http://downloads.openmoko.org/developer/CAD/) 也都開放給開發人員下載. 同時也提供了大部分的硬體 datasheet 供開發人員有機會 base on 在原設計下進行自己的設計.

[開放原始碼社群常使用的工具]
這幾年來, 許多硬體產品除了原先的出貨的功能外, 會有開放原始碼社群加入開發或以 hack 的方式增加原先產品的功能. 比較有名的例如最早建立在 Linksys 的 WRT54G 的 OpenWRT ( http://openwrt.org/ ) 專案, 提供了無線 AP 的相關 firmware. 或是最近的 Google Android 也提供了幾乎完整的原始碼在 http://android.git.kernel.org/ .

而其它的像是 Gumstix ( http://gumstix.com/ ) 也有 Windows CE (http://www.codeplex.com/gumstix) 及 OpenEmbedded (http://www.gumstix.net/) 不同的討論社群. 基本上, 開放原始碼社群進行開發 (極端的分散式開發 ;) ) 使用的工具有下列幾項:

* 郵件/即時線上討論: IRC, mailing list, jabber
* 原始碼管理: svn 及 git
* 知識管理: wiki
* Developer 個人的分享: planet/blog
* Bug 追蹤/Issue tracker: Trac/Bugzilla
* Project 管理: taskjuggler
* 常用的免費服務: sourceforge, google xxx (code/calendar/docs) 等
* 釋出版本及套件下載

[線上討論]
Oopenmoko 的線上公開討論區是在 Freenode 的 #openmoko , Windows 的使用者可以用 mIRC 或是其他 IRC 軟體.

[郵件討論]
在開放原始碼社群 (open source community)中, 傳統的 mailing list 是最常見的討論方式, 以及 irc. 這一點和國內常用的討論區方式不同. Openmoko 的 mailing list 列表在這裡: http://lists.openmoko.org/mailman/listinfo/ 如果你習慣討論區的介面, 可以透過http://lists.openmoko.org/nabble.html 來加入討論.

最重要的有:

* community: 社群主要的討論區, 包含常見問題, 發展方向, 抱怨, 希望...等
* devel: 軟體相關討論: 主要是在應用程式 level, 包含工具, 各個 distribution, release package 討論
* kernel: 相關 kernel porting/driver bugs, 以及介於 software 和 hardware 相關的問題
* hardware: 硬體相關問題討論, hardware bugs
* support: 常見的 distribution 問題, 硬體瑕疵和軟體使用問題等

在這些 mailing list 進行訂閱動作後, 相關的討論 mail 就會寄到你的信箱, 通常一個單一 list 一天都會有數封到數十封不等的信件. Android 或其他的 Open Source 專案, 都以類似的方式進行資訊分享與協同開發.

[原始碼伺服器]
Openmoko 是一個開放原始碼專案, 當然提供所有相關的原始碼供使用者下載. Openmoko 使用下列原始碼伺服器:

<git 伺服器>
位址: http://git.openmoko.org/

可能一般開發人員對 svn 或是 virtual source safe 的原始碼管理方式比較熟悉, 但是對於 git 可能會有一些陌生. git 最主要的優點就是分散式設計, 可以快速 branch. 舉例來說, 每個人自己 clone 下來的 git 都是可以自己 branch, 同時可以在本機 commit 自己的 code. 不需要連回原 server 做 commit 的動作. 網路上的有許多的 cheat sheet (http://git.or.cz/gitwiki/GitCheatSheet), 可以印出來, 讓你快速習慣工具使用. Openmoko 的 git 裏, 主要有:

* Linux Kernel 相關的原始碼及 patch
* u-boot 相關原始碼及 patch
* qi 一個精簡的 boot 程式, 最早是 werner 想用 k-boot 換掉 u-boot, 後來變成帶有東方味的 qi (氣)
* xglamo: FreeRunner 用的 X driver
* 產測相關軟體 production-testing
* 開發人員的自己使用的 tools 及 Distribution fork

Openmoko 的 git 基本上是從 vanilla linux kernel (未修改的 linux kernel from kernel.org), 加上 ARM 相關的 patch, 再加上 Ben Dooks 的 S3Cxxxx 的 porting patch, 最後加上 Openmoko 自己的patches. 相關的說明可以參考這一頁:
http://git.openmoko.org/?p=kernel.git;a=summary

<svn 伺服器>
位址: http://svn.openmoko.org/

Neo1973 開發時, Openmoko 使用的主要版本控制系統. 不過目前 kernel 及 u-boot 都已經被移到 git 中繼續開發. Svn 留下的是一些比較小型的專案/工具, 以及開發人員所會用到的開發工具放在 svn 中.

[Bug 追蹤/Issue tracker]
Openmoko 使用 Trac (http://trac.edgewall.org/) 作為主要的 Bug track 及 Issue track. 通常這類 Bug/issue tracker 工具的功能都差不多, Trac 的介面整合了 wiki 跟 issue tracker 的功能, 是用 python 作維護. Openmoko 的 Trac 在 http://docs.openmoko.org/trac/

[知識管理 - wiki]
開放原始碼專案大部分都會提供某一種的 "共筆" 平台, 讓參加專案以及想發表心得的人可以有一個地方把資訊有系統的紀錄下來. 通常許多的話題都是從 mailing list 開始, 然後討論的結果會到 wiki 或是 Trac �. Openmoko.org 的首頁就是 wiki (http://wiki.openmoko.org/wiki/Main_Page), 同時, Openmoko 的 wiki 也是使用 wikipedia 使用的 media wiki.

* Mailing list 討論有明確結果 -> Wiki
* Mailing list 討論有 bug -> Trac/Bugzilla

要新增/修改/刪除 wiki 頁面上的資料, 必須先在 wiki 上建立帳號, 同時 wiki 上有 一些重要頁面是保護狀態. 只有 Wiki Administrator 才能修改.
[釋出版本及套件下載]
Openmoko 目前釋出的版本及對應的套件 (testing/released/un-stable) 都是放在 http://downloads.openmoko.org/ . 各個社群的 Distributions 可以從各自的網站下載. 要使用預先打包好 opkg 應用程式, 可以參考 http://www.opkg.org/

[相關應用開發]
Openmoko 有自己的 project server (http://projects.openmoko.org/), 申請帳號後即可在 project server 建立新專案. 但是 Openmoko 有計畫要 phase out 這個 server. 所以目前 Openmoko 內部的公開 project, 開始 host 在 google code 上, 例如 motion senor (accelerometer) 的 omnewrotate, 新的 contacts/sms/dialer 介面專案 paroli 等.

[主要開發人員]
Openmoko 最早成員是 Sean Moss/Michael Lauer (Framework)/Harald (Low Level driver and HW consultant)/Werner (bootloader and HW consultant), Sean 帶領了大家開始了這個奇妙旅程.

Openmoko 主要的開發人員都在 wiki 的 Who is Who 頁面中 ( http://wiki.openmoko.org/wiki/Who_is_Who ). 透過 mailing list 或是討論區介面的 mailing list nabble (http://lists.openmoko.org/nabble.html) 是最直接的方式.
雖然大部分的 developer 已經成為歷史 (Sad...), 但是我還是把名字列出來 (2009, March upadte)

[SW]

Andy Green: kernel/Driver (http://warmcat.com/_wp/)
Werner Almesberger: Kernel/Driver/u-boot (http://www.almesberger.net/cv/papers.html)
Matt_Hsu: Kernel/Driver (http://matthsu-abacus.blogspot.com/)
Michael 'Mickey' Lauer: FSO/GTK (http://www.vanille-media.de/site/index.php/about/)
Brenda: Wiki
Roh: IT infrastructure
Gismo: IT infrastructure/SysOP
Marek Linder: Project coordinator
John_lee: OE/Distribution maintenance (http://asleepfromday.wordpress.com/)
Holger 'zecke' Freyther: System/QT (http://zecke.blogspot.com/)
Wendy: Testing
Regina: Testing
Tick: opkg/installer/etk/OE (http://linuxocarina.blogspot.com/)
Will: Design, Product manager
Guillaume 'Charlie' Chereau: FSO/Python (http://charlie137-2.blogspot.com/2009/01/paroli-get-website.html)
Julian: Distribution (http://walkingice.twbbs.org/blog/)
Olv: X/LBS application (http://olvaffe.blogspot.com/)
Erin: GTK/Python (http://i-miss-erin.blogspot.com/)
Jeremy: LBS
Willie: Early kernel/production work (http://openmoko.wordpress.com/)
Sean Chiang: gsmd/gps application
Miles: production test
Jelan Hsu: certification/production test
Raster: enlightment/etk/everything (http://www.rasterman.com/)
Harald Welte: kernel/everything (http://laforge.gnumonks.org/weblog/)
Jserv: kernel/application

[HW]

Tim Lee: EE
Allen: EE
Shawn: RF


And Me ;) GTA01/02 PM, the one should be damned :)

2008/12/22

Neo FreeRunner 新手手冊 (9) 安裝 Android, SHR, FDOM, Debian 到 SD (SDHC) 卡


Neng-Yu Tu (Tony Tu)

一般手機或移動式行動裝置只能執行預先安裝的作業系統, 應用程式的寫作也受到 framework 本身的限制, 也不能更換作業系統. Openmoko 的硬體基本上打破了這些人為加上的限制, 透過公開線路圖及取得相關技術文件授權的方式, 提供一般裝置使用者, 可以取得足夠的資訊開發新的移動裝置軟體. 這也是 Openmoko 和 Android 最大不同的地方. 相關完整的說明請參考 http://wiki.openmoko.org/wiki/Boot_from_sd_card

Openmoko 為了解決使用者需要在快速不同作業系統/版本間切換的問題, 所以在 u-boot 設計時, 設計了可從 SD 卡開機的功能, 這個功能同時可由開機的選單啟動或關閉.

FR 的兩份 u-boot, 都可支援 Boot from SD 功能, NOR flash 裡面的 u-boot, 預設開機選單即可選擇從 SD 卡啟動 (先按下 Aux 鍵, 再按電源鈕). 一份是在 NAND flash, NAND u-boot 預設無開機選單.開機看不到開機選單的原因是: u-boot 預設不顯示開機選單, 但可以用先按 power 鍵開機 0.5 至 1 秒後, 按下 AUX 鍵不要放的方式, 使 NAND 的 u-boot 出現開機選單.

注意: 但是 NOR 裡面的 u-boot (可能比較舊) 在 boot SDHC 的 SD 卡時, 可能會無法啟動. 此時就只能使用 NAND 的 u-boot. 同時, 某些 SDHC 有相容性的問題, 請參考: http://wiki.openmoko.org/wiki/Supported_microSD_cards 的內容, 確認你使用的 FR 使用的是支援的 SD 或 SDHC卡, 建議直接使用 SanDisk 的 SD/SDHC 卡可以省去許多相容性的問題.

開機後, u-boot 就會去尋找檔名為 uImage.bin 的檔案 (2008/04 前的 NOR 或 NAND u-boot, 會尋找檔名為 uImage 的檔案)

[修改 NAND 開機選單 (NAND u-boot)]
你可以透過 u-boot 修改環境變數, 加入 menu items 及對應的啟動數值. 或是直接利用 dfu-util 更新環境變數檔案 (可從這邊下載檔案 http://t0ny.net/openmoko/samples/config/env_menu.new). 直接 ./dfu-util -a 2 -R -D env_menu.new . 在 u-boot 的 command prompt, 可以利用 printenv 來看到目前的參數, 用 setenv 來設定每個參數的值.

[製作可開機的 SD 卡]
目前 Openmoko u-boot 對於可開機的 SD 卡的限制, 是必須包含兩個 partition, 第一個 partition 必須是 vfat 格式 (2008/8 月前的 u-boot 都有此限制), 用來放置檔名為 uImage.bin 的 kernel image 檔案. 第 2 個 partition 必須為 ext2/3, 用來放置整個 rootfs 的檔案.

Step 1: 分割 SD (SDHC) 卡 (一般來說, SD 卡原先都會預先 format 成 fat32, 請一樣用 fdisk, 先刪除原有的 fat32 partition)
root@ubuntu:~# fdisk /dev/mmcblk0
The number of cylinders for this disk is set to 125632.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-125632, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-125632, default 125632): +8M
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (246-125632, default 246):
Using default value 246
Last cylinder or +size or +sizeM or +sizeK (246-125632, default 125632):
Using default value 125632
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.

Step 2: 格式化 SD (SDHC) 卡
root@ubuntu:~# mkfs -t vfat /dev/mmcblk0p1
mkfs.vfat 2.11 (12 Mar 2005)
root@ubuntu:~# mkfs -t ext3 /dev/mmcblk0p2
mke2fs 1.40.2 (12-Jul-2007)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
501952 inodes, 1003096 blocks
50154 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1027604480
31 block groups
32768 blocks per group, 32768 fragments per group
16192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 22 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.

格式結束後, 這一張 SD (SDHC) 卡就可以準備放入 uImage.bin (第 1 個 partition vfat)及 rootfs (第 2 個 partition ext2/ext3) 的檔案及目錄.

[下載需要 kernel 及 rootfs]
每一個 Distribution 幾乎都是一組對應的 rootfs 及 kernel 方式存在. 原因大部分都是因為每一個 Distribution 裡面的程式已經都是在某個時間點將所使用的 package 做 snapshot 或是 fork 出來, 同時某些驅動程式版本及設定檔位置, 也會隨著 Distribution 不一樣. 所以幾乎每一個不同的 Distribution 都提供了成組的 kernel 及 rootfs. 目前 (2008 Dec)唯一不同的是 FDOM, 因為 FDOM 預設的 kernel 對象是 2008.X, 所以 FDOM 使用的 kernel 可以從 downloads.openmoko.org 取得.

同時, 開機 SD 卡裏的 rootfs 是直接以目錄及檔案的方式存在, 所以需要 download rootfs.tar.gz 的整包壓縮檔, 而不是使用 flash 到 NAND flash 的 .jffs2 檔.

請到下面網址, 取得 image 檔案, 有一些網站還提供了 gta01 的版本, download 時請注意.

SHR: http://shr.bearstech.com/
FDOM: http://www.tuxbrain.com/fdom_en.html
Debian: http://wiki.debian.org/DebianOnFreeRunner
Android: http://people.openmoko.org/sean_mcneil/ 或是 http://freerunner.android.koolu.com/release-files or http://t0ny.net/openmoko/images/android/ 在這邊放了一份 snapshot

[安裝 SHR]
SHR 是法國的 bearstech 所提供的版本, 主要以 illume 的 theme 為主的 Distribution. 安裝 SHR 很簡單, 只要 download image 後, 直接 copy uImage.bin 及 rootfs 的檔案到 SD 卡中.

Step 1: 製作一張標準的開機 SD 卡 (最好需要 512 MB 或以上)
Step 2: 複製 uImage.bin 到第一個 SD 卡的 vfat partition 中. 請注意, kernel 檔案必須是 uImage.bin , u-boot 才會認得.

root@ubuntu:~/moko/shr_images# ls
shr-image-om-gta02.jffs2 uImage-om-gta02-latest.bin
root@ubuntu:~/moko/shr_images# cp uImage-om-gta02-latest.bin /media/disk-1/uImage.bin

Step 3: 下載並解開 rootfs.tar.gz 檔案 (tar zvxf rootfs.tar.gz)
Step 4: 到解開的檔案根目錄下, 將整個根目錄 structure 複製到 SD 卡的第 2 個 partition (ext2/ext3) 中 (cp -r . /media/disk-2)

root@ubuntu:~/moko/shr# ls
bin dev home linuxrc media proc tmp var boot etc lib local mnt sbin sys usr
root@tony-ubuntu:~/moko/shr# cp -r . /media/disk-2

Step 5: 用 sync 命令確定檔案已經完整複製過去
Step 6: umount 後將 SD 卡放到 FR 中, 由 NAND 或是 NOR boot 開機選擇 Boot From SD card 選單開機.

[安裝 Debian]
在 SD 卡上安裝 Debian 很簡單, 但是程序有些不一樣. 因為 Debian community 寫了一個 script 讓安裝到 SD 卡的動作自動化. 我覺得這個 script 跟 mokomakefile 一樣, 都是發揮 linux 安裝優點, 而且非常有趣的 script.

Step 1: 製作一張標準的開機 SD 卡 (最好需要 512 MB 或以上)
Step 2: 將 SD 卡放到 FR 中, 同時以 2008.X 或 FSO milestone 3/4 開機
Step 3: 建立 FR 到 Internet 的連線 (可透過 USB 或是 WiFi/Bluetooth)
Step 4: 在 home 目錄下執行:
$ wget http://pkg-fso.alioth.debian.org/freerunner/install.sh
$ chmod +x install.sh
$ ./install.sh all

Step 5: 此時 install script 會將所有檔案, 複製到 SD 卡的第 1 個及第 2 個 partition 中.
Step 6: 複製完後, 可檢查 uImage.bin 檔是不是放到第 1 個 partition 中, 以及相關的 rootfs 是不是放到第 2 個 partition 中.
Step 7: 安裝完, 關機, 重新由 NOR 或 NAND u-boot 開機後, 選擇從 SD 卡開機即可.

目前 Debian Distribution 預設的使用者 UI 是 FSO 的桌面, 所以如果你不確定你執行的是 Debian 還是 FSO, 可以直接用 uname -a 看 kernel 的版本.

[安裝 Android]
Android image 跟一般 image 不一樣的地方在於 Android 目前無法單獨放到 SD 卡上執行. Android 執行時, 需要 NAND flash 及一張空白的 SD (非 SDHC)卡在 FR 中. 所以要在 FR 執行 Android, 需要利用 dfu-util 或是 Neotools 安裝 Android 的 uImage 及 Android 的 rootfs 到 NAND flash 中, 並準備一張 128 MB (512 MB 或以上 preferred) 的 "空白" SD 卡.

Android 需要的空白 SD 卡一樣需要 2 個 partition, 第一個 partition 建議還是使用 vfat (非必要), 第 2 個 partition 需要 ext3 格式. 第一個 partition 中, Android 在第一次開機時, 會建立存放 media 檔案 (影像/聲音) 的相關資料夾. 而在第 2 個 partition 中, Android 會建立 kernel 相關需要的設定檔 folder.

Step 1: 準備 Android 所需要的空白 SD 卡 (非 SDHC 卡)
Step 2: 下載 Android 所需要的相關檔案
Step 3: 執行 dfu-util 將 Android 的 uImage.bin 及 rootfs dfu 到 FR 中. 請注意, kernel 檔案必須是 uImage.bin , u-boot 才會認得.

Step 4: 將 SD 卡放到 FR 後開機. 一般來說, 第一次開機需時 2-3 分鐘. 若超過 5 分鐘無法開機, 請重新移除 SD 卡, 放回 SD 卡後, 重新開機.

同時 2008/11 月前的 FR Android kernel 會發生 suspend 後無法 resume 的情形, 請 disable suspend (在 system settings 最下方有一個 suspend 的時間設定) 功能. 2008/11的 image 進入 suspend 無法開機時, 可刪除第 2 個 ext3 partition 的檔案 (kernel/setting 檔), 通常即可開機.
Koolu 目前 update 的 image 可以從下網址下載 http://freerunner.android.koolu.com/release-files

2008/12/9

Neo FreeRunner 新手手冊 (8) 已知的硬體問題


Neng-Yu Tu (Tony Tu)


FreeRunner 和一般的一般的嵌入式硬體開發及使用過程不太一樣的地方, 就是幾乎所有的開發流程跟硬體問題都可以在討論區找到. 同時也會有許多社群上的人會幫忙測試及提供解答. 所以原先當 FR 在開發流程中沒有測試到的 test case 產生的硬體 Bugs, 也都可以看到社群上的人幫忙整理及討論. 比較詳細的問題在以下的 wiki 網頁中.

http://wiki.openmoko.org/wiki/Neo_FreeRunner_Hardware_Issues 以下是一些常見硬體 Bug 的問題及解決辦法.

[你的硬體版本及軟體版本]
FR 到目前已知有 A5, A6, A7 版本, 從 A5 版本起就是真正量產版本. 觀察版本有幾個方法, 一個是透過 part number, 另一個是透過 cat 手機內的硬體版本資訊. 用軟體指令無法區分是 850/1800/1900 或是 900/1800/1900 硬體版本.

1) Software
* kernel : uname -a
* rootfs : cat /etc/version or cat /etc/om-version
* u-boot: grep Bootloader /dev/mtdblock0 (yields the NOR u-boot version) or grep Bootloader /dev/mtdblock0 (yields the NOR u-boot version)

2) Hardware
* cat /proc/cpuinfo 或 cat
從 revsion ATAG 得知目前的版本, 0350 是 A5, 0360 是 A6, 0370 是 A7 等

3) Part number:
* 56-21146-00 A5 850/1800/1900 版本
* 56-21147-00 A5 900/1800/1900 版本
* 56-21176-00 A6 850/1800/1900 版本
* 56-21175-00 A6 900/1800/1900 版本
* 56-21210-00 A7 850/1800/1900 版本
* 56-21209-00 A7 900/1800/1900 版本

[GPS]

* 問題
這是第一個被發現出來的問題, 就是使用者無法利用內建的 GPS 定位系統得到自己的定位. 這個問題會發生在量產品原因是在設計 test case 時, SD 卡及 GPS 協同運作時 GPS 的訊號是從增強過的 GPS 室內天線發出. 同時產測也是使用增強的 GPS 天線以便配合測試. 所以當使用者在正常 GPS 訊號強度下, 同時使用 SD 卡時, GPS 會無法定到位, 或是需要數十分鐘到數小時才能定位. 這個問題被社群反映後一週, 有人確認此情況只在 SD 卡插入時才發生. 之後確認是 SD card 的 sd_clk 產生的背景干擾.

* 修正方式
Openmoko 1 天後提出第一個這個問題的軟體解法, 就是當無 SD 卡存取動作時. 驅動程式會自動關閉 sd_clk 訊號. 這個修正已經套用在所有 2008 年 8 月後的 kernel 驅動程式中. 一週後提供了硬體解法, 該解法是在 sd_clk 跟 sd_gnd 中間加一個 10 pF 的電容過濾/改變/減低會影響 GPS 的高頻雜訊位置. 此修正已套用在 GTA02 A6 版以後的版本. 經過社群的測試, 軟體修正的效果跟硬體修正的效果類似, 所以 FR 的 GPS 問題目前用 2008 年 8 月以後的 kernel 即可解決.

* 測試方式
可以參考前面 GPS 相關的使用說明

[GSM SIM 卡相容性]
一般的手機有區分為 2G/2.5G 手機及 3G 手機, SIM 卡也有區分 2G 及 3G 的 SIM 卡, 同時 SIM 根據本身設計, 還有 5V, 3V, 1.8V 等不同電壓規格.
GTA02 出貨用的 GSM firmware 預設為 moko8 或是 moko9-beta 1 版本. 目前 FR 可用及有問題的 SIM 卡, community 將資訊收集在以下網址:
http://wiki.openmoko.org/wiki/FreeRunner_unable_to_work_with_3G_SIM_cards

由於 GSM firmware 擁有獨立的版本, 記憶體儲存位置. 所以並沒辦法經由更換 kernel 或是 rootfs 解決.必須透過 TI 提供的 calypso firmware 更新程式 fulid 來更新. 目前最新的版本是 moko 10, 初步測試可解決 GSM 3G SIM 卡相容性的問題, 使用者可參考以下網址更新:http://wiki.openmoko.org/wiki/GSM/Flashing

GSM firmware 更新有可能會失敗, 意思是可能會讓 GSM (手機功能) 無法使用.請注意

[GSM Buzz]
FR 在 A5/A6/A7 均受到程度大小不一的 GSM buzz (有些人稱為 TDD noise) 的問題, 這也是已知無法用軟體修正的問題. 主要是 FR 內 GSM RF 干擾發生的.目前討論區已有硬體改電阻加電容的 workaround 解法, Openmoko 提出的 A5/A6 版修正 SOP 在以下位置 http://people.openmoko.org/joerg/GSM_EMI_noise/

[SD 卡相容性]
* 問題
市面上有許多品牌/規格不同的 SD 卡, 並不是每一種 FR 上面都可以直接使用. 原因是因為各家 SD 卡供應商都有自己的控制晶片, 各晶片對於 SD 規格相容程度不一. 同時, 目前有 SD 卡也有兩種規格 SD 及 SDHC, 後者是較新的規格. 目前 2GB 以上的 SD card 均為 SDHC 的規格. 由於 FR 使用的 SD 驅動程式並沒有經過這麼多種類的 SD 卡測試, 所以僅提供了 "有限的" 相容性. 目前測試已知相容性最好的是 Sandisk 的 SDHC flash 卡.
* 修正方式
目前 Community 測試 microSD 卡最大的是 16 G 的 SDHC, 但是可能需要做一些 SD 卡時脈設定及調整的工作. 經過測試可使用的 SD 卡也都列在 wiki 中 http://wiki.openmoko.org/wiki/Supported_microSD_cards

[電池過度放電的問題]
*問題
由於 FR 的軟/硬體組合設計上, 還有可能會發生關機不完全的漏電現象, 導致電池放電至低於 3.4v, 甚至到幾近 0v 的狀態. 此時會發生一個狀況, 就是當電池放到 FR 中後, 即使插上充電器, 還是無法充電的狀態. 原因是因為無法開機到最基本的 u-boot, 電源管理 IC 無法被正確設定可充電. 同時, 因為電池電壓已經過低, 甚至 PMU "不認為" 電池已經放入 FR 中. 所以導致無法即使插入充電器, 還是無法充電.
*修正方式
有幾個方式可以讓過度放電的電池重新充電:

1) 最快, 也最方便的方式就是使用 Nokia BL-4C/5C/6C 相容的電池充電器替 FR 電池充電, 因為 FR 的電池基本上和 Nokia BL-4C/5C/6C 電池相容. 所以一般市面上 200 元的 Nokia 電池相容充電器均可替 FR 電池充電.

2) 利用 BL-4C/5C/6C 的電池替 FR 開機後 (按下 Aux 鍵, 後按電源鈕從 NOR flash 開機), 接著連接 USB 充電器或是電腦的 USB 埠. FR 可以靠 USB 電源維持開機的狀態, 然後放入已過度放電的電池進行充電.

3) 可以試著拔除電池, SIM 卡, 及 SD 卡, 用 USB 線連接 FR 及電腦或直接使用包裝中附的 USB 充電器, 然後按下 AUX 鍵及電源鍵開機至 NOR 的 u-boot (GTA02 A6 版及以後的硬體, 均應該設計搭配此功能), 開機後, 放入已過度放電的電池進行充電.

2008/12/3

Neo FreeRunner 新手手冊 (7) GPS 及 A-GPS 功能


Neng-Yu Tu (Tony Tu)


Openmoko FreeRunner 使用的是 U-Blox 4 ANTARIS 的晶片組, 這個晶片組提供了 16 個 channel 的標準 GPS 及透過輔助資料快速定位的 A-GPS 功能. GPS 功能啟動後, 就可以從 Neo 的 ttySAC1 得到 NMEA 碼. U-Blox 的 GPS 功能跟一般 GPS 一樣, 一般所需時間從 40 秒 (U-Blox 規格) 到數分鐘不等. 這個時候可以透過一般 GPS 軟體 (TangoGPS/Openmoko AGPSUI/Others) 來做定位的動作. 完整 FR 的 GPS 相關資料可參考.

http://wiki.openmoko.org/wiki/GTA02_GPS

U-Blox 的 A-GPS (Assisted GPS) 分為 A-GPS online 跟 A-GPS offline 兩種不一樣的功能, 差別如下:

* AGPS online: 每次使用時, 需連上網路, 到 agps.u-blox.com 下載約 2-3 k 的定位輔助資料. 定位輔助資料包含了目前使用者上方應該有哪些衛星等資料. 每次下載的資料有效時間約 4 小時.

* AGPS offline: 若原先硬體設計時就包含一顆額外的 Flash 記憶體, U-Blox GPS 在啟動時, 會先從該記憶體找輔助定位資料. 輔助定位資料可以預先從 http://alp.u-blox.com/ 下載, 資料大小從數 k 到數十 k 不等, 資料最長有效時間約 2 個星期, 依下載的檔案而定.
這 2 種定位方式都可以有效的將定位時間縮短到 20 秒內, FR 硬體設計只支援 AGPS online 的模式. FR 也提供 GPS 外接天線的 MMCX 插座, 當連接外部天線時, 硬體會自動切換訊號成外部的 GPS 訊號來源, 軟體無法知道硬體是使用內部還是外部的天線. 一般市面上的有 MMCX 的 GPS 天線, "原則" 上都可以使用.
使用 A-GPS 功能可以加快定位的速度, 但是無 A-GPS 輔助, FreeRunner 還是擁有 GPS 的功能.

[** 硬體BUGS**]
A5 版硬體 (ATAG 0350) FR 的 GPS 功能有一個已知的問題, 就是 microSD 卡插入時, sd_clk 訊號, 可能會干擾 GPS 天線. 這個問題有兩種方法可以解決, 一個是更換新的 FR kernel driver, 這個 driver 可在不使用 microSD 卡時, 關閉 sd_clk. 一個是在硬體的 sd_clk 及 sd_gnd 腳位加一個電容, 濾掉部分會干擾 GPS 頻率的雜訊. 目前 kernel driver 修正已經套用在所有 2008/7 月後的 kernel, 相關資料, A6 版及以後的硬體, 也都已套用此修正, 請參考: http://wiki.openmoko.org/wiki/GPS_Problems

[基本 GPS 使用及測試]
使用 GPS 前, 必須先開啟 GPS 的電源. 開啟 GPS 電源可以下命令或是從 2008.X 使用者介面上的 Setting �, 開啟 GPS 電源. 然後接著可以把 ttySAC1 的資料吐出 來.

root@om-gta02:~# echo "1" > /sys/devices/platform/s3c2440-i2c/i2c-adapter/i2c-0/0-0073/neo1973-pm-gps.0/pwron
root@om-gta02:~# cat /dev/ttySAC1
W 80040001*26
$GPTXT,01,01,02,ROM CORE 5.00 Jan 09 200$GPRMC,,V,,,,,,,,,,N*53
$GPVTG,,,,,,,,,N*30
$GPGGA,,,,,,0,00,99.99,,,,,,*48
$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30
$GPGSV,1,1,00*79

如果要檢查是否有得到定位, 可以可以從 ttySAC1 得到 GPS 吐出的 NMEA 資料, NMEA 資料基本的格式是: 項目 - 數據. 簡要的項目說明如下:
$GPBOD - Bearing, origin to destination
$GPBWC - Bearing and distance to waypoint, great circle
$GPGGA - Global Positioning System Fix Data
$GPGLL - Geographic position, latitude / longitude
$GPGSA - GPS DOP and active satellites
$GPGSV - GPS Satellites in view
$GPHDT - Heading, True
$GPR00 - List of waypoints in currently active route
$GPRMA - Recommended minimum specific Loran-C data
$GPRMB - Recommended minimum navigation info
$GPRMC - Recommended minimum specific GPS/Transit data
$GPRTE - Routes
$GPTRF - Transit Fix Data
$GPSTN - Multiple Data ID
$GPVBW - Dual Ground / Water Speed
$GPVTG - Track made good and ground speed
$GPWPL - Waypoint location
$GPXTE - Cross-track error, Measured
$GPZDA - Date & Time

參考這邊可以得到完整 NMEA 的說明. http://www.gpsinformation.org/dale/nmea.htm
由於 NMEA 資料很多, 若你只要定位與否相關資料, 可以cat /dev/ttySAC1 grep GGA , 就可以過濾掉額外的資訊.

[使用 AGPSUI]
Openmoko-agpsui2 是 Openmoko 常用的 GPS 測試程式, 可以以圖形方式, 看到 GPS 訊號強度, 衛星在天頂的位置, 定位詳細資料等. openmoko-agpsui2 可以透過 opkg install openmoko-agpsui2 或是從這邊下載 opkg 檔安裝:

http://t0ny.net/openmoko/opkg/samples/agpsui_0.0+svnr3372-r0_armv4t(3).ipk

下載後, 利用 scp copy 到 FR, 直接執行: opkg install agpsui_0.0+svnr3372-r0_armv4t(3).ipk 接著就可以按下畫面下的 one fix 執行.

Openmoko-agpsui2 的原始程式碼, 可以從: http://projects.openmoko.org/scm/?group_id=127 下載. 但是由於 Openmoko 正在 phase out 目前的 project server 並轉移到其他的 platform (如 google code), 所以你可以這邊 download offline 的 source. 詳細使用 AGPSUI 的方法, 請參考: http://wiki.openmoko.org/wiki/Howto_Test_Your_GPS_with_agpsui

[gpsd 及 TangoGPS]
因為 ttySAC1 對 linux 來說是標準的 serial port, 所以當某一個程式 (如 openmoko-agpsui) 佔住後, 其他程式就無法讀取 GPS 資料. 為了要解決多個程式使用 GPS 的問題, 同時增加客戶端程式寫作的彈性及架構. 所以 community 有人做了一個 GPS 的 daemon, 叫做 gpsd ( http://gpsd.berlios.de/ ). 應用程式可以透過網路連線 (localhost) 方式 (TCP port 2947), 讓多個不同的程式同時取得 GPS 的定位資料. GPSD 相關的說明請參考http://wiki.openmoko.org/wiki/Gpsd#GPS_on_GTA02

TangoGPS ( http://www.tangogps.org/ ) 則是一個使用 gpsd 及 OpenStreetMap/Topo/Aerial 的地圖程式. 它提供了一個類似 2008.X 的 Location 程式的功能, 但是它可以提供更多的定位相關資料, 例如目前速度, 平均速度等. 含還蠻適合運動使用. 要使用 TangoGPS 前, 必須先安裝 gpsd.

root@om-gta02:~# pkill packagekit
root@om-gta02:~# opkg install gpsd
root@om-gta02:~# opkg install tangogps_0.9.3-r1_armv4t.ipk

如果 gpsd 或相關套件找不到, 你可能要把 opkg feed 換到 testing feed (/etc/opkg/*.conf) 安裝完後, 啟動 tangoGPS 前, 必須修改 /etc/default/gpsd �, gpsd 的 tty 設定.

設定成 GPS_DEV="/dev/ttySAC1". 更多的設定 (FSO/others), 請參考 http://www.tangogps.org/gps/articles/7-Installation.html

[使用 A-GPS]
每一間 GPS 廠商都有不同的 A-GPS 實做方法, U-Blox 提供了公開的文件及帳號申請程序, 讓使用 U-Blox 的使用者可以使用 A-GPS 服務. 使用 A-GPS 的流程大致如下:

* 申請 A-GPS 帳號: 發一封主旨跟內容都空白的信, 到 agps-account@u-blox.com 申請一個 A-GPS online 的帳號
* 將 FR 利用 GPRS/Wi-Fi 或其他方式連上 Interent, 利用帳號及目前大略的經緯度, 利用 http://svn.openmoko.org/developers/matt_hsu/agps-online/ 的程式, 連上 U-Blox 網站. 取得 A-GPS 定位輔助資料
* 這個程式會利用 U-Blox 的 binary 指令, 將定位輔助資料送進 GPS 模組
* GPS 模組利用這些資料, 節省搜尋衛星的時間

其他更詳細的方式, 請參閱 http://wiki.openmoko.org/wiki/GTA02_GPS .

2008/12/2

Neo FreeRunner 新手手冊 (6) 使用 Debug Board


Neng-Yu Tu (Tony Tu)

Debug Board 對一般應用程式開發人員來說, 可能並不是十分需要. 但是換個角度來說, Openmoko 擁有完全開放的硬體, 從網路上也可以下載 FreeRunner 以及 Neo1973 的硬體線路圖. 同時, Openmoko 的機器在設計上, 就已經將常用的 debug port 如 JTAG/UART/SPI/I2C 等介面連接到主板上的 Debug Connector, 或是將這些 test point 留在主板上容易接取的地方. 簡單來說 Debug Board 是 FreeRunner 設計完全開放硬體的一部分 ;) 如果要學習或練習嵌入式系統開發, 最好還是有 Debug Board 比較好.


Debug Board 留了 1 個 20 pin 的 JTAG 延伸插座, 以及 2 個 10 pin 的 UART/SPI/I2C 插座, 如果有需要, 焊上這些接頭, 就可以在其他的裝置上使用 Openmoko Debug Board. 不過需要注意的地方是, Debug Board 的 JTAG signaling 是使用 3.3v, 對於一些 1.8v 或 5v 的 JTAG signaling 裝置並不適用.

Openmoko 的 Debug Board 共有 3 個版本, 第 3 版 (v3) 跟前面兩個版本的差別在於: 修改了電源及完全符合 USB 規格的一些設計, 同時也將 FR 上 Debug port 預留的 SPI 及 I2C bus 接出到 Debug Board 上. 同時第 3 版的 Debug Board 也增加一個 GPIO 接腳設定功能, 讓 Debug Board 能透過 pull-high 電路讓 FR 上面的 NOR 可以開啟被寫入模式. Debug Board 的電路圖, 可以從以下網址下載.

http://downloads.openmoko.org/developer/schematics/

若要作 JTAG 和 UART 終端機的 Debug 功能, 這 3 個版本都可以達到一樣的功能. 同時 FreeRunner 預設的 u-boot 環境變數, Debug 輸出是 ttyACM0, 並不一定要使用 Debug Board 才能進行 u-boot 的操控.

Debug board 上有一顆 FTDI FT2232 的晶片, 它本身具備有兩個 UART port, 這個晶片奇特的地方在於它可以透過軟體 (不同的函式庫), 轉換不同的通訊協定 (a little like bitbang), 達到支援 RS-232/482/485, DI/O, Address 或是 JTAG. FT2232 的 JTAG 比 Wiggler 快了大約 20-30 倍, 對於除錯時, 節省大量資料寫入的時間有極大幫助 (例如寫入 kernel 及 u-boot 到 nand flash 中)

目前 Openmoko default 的設定是當成 JTAG (port 1) 及 UART (port 2). 同時, 原本這顆 chip 的標準 USB ID 是 FTDI 0403:6010. 0403 是 FTDI 公司的 USB ID, 而 6010 是依據產品別給的不同 ID.

Openmoko debug board 預設的 USB ID 是 1457:5118. 1457 是 FIC 的公司 USB ID. 而 Openmoko 後期的 Freerunner 使用新申請的 1D50 開頭作為標準 ID.

你可以從下面的網址, 找到所有已註冊 USB.org 的公司/裝置 ID.
http://www.linux-usb.org/usb.ids

或 Openmoko 的 wiki, 也紀錄了使用的 ID 位址.
http://wiki.openmoko.org/wiki/USB_Product_IDs

FTDI 公司也提供了標準的 Windows 驅動程式, 讓你可以在 Windows 利用 FT2232 模擬成雙 UART port 的裝置, 或是一個 JTAG, 一個 UART 裝置. 但是由於 Windows 只認識 FTDI 的 0403:6010 ID, 所以必須修改一下 .inf 檔. 下面可以下載 Windows 下的 FTDI 驅動程式: http://t0ny.net/openmoko/driver/debugboard_win32/

除了 Openmoko 外, Linux 社群也常用另一種類似建立在 FT2232 裝置來做 JTAG, 例如 Amontec JTAGkey: http://www.amontec.com/jtagkey.shtml . 這種裝置比較小巧, 同時支援 1.4V 到 5V 的 JTAG signaling, 常被配合標準公版的 20 pin 插座使用.

[安裝 FTDI lib]

會用到 3 個不同的 package, 分別是 libftdi-dev, libftdi-eeprom, libftdi0, 建議開始使用 Debug Board 前先安裝這些 package.

[連接 FR 的 Debug Output (UART)]

由於 Linux 只認識 Default 的 FTDI 裝置 (0403:6010), 所以 Openmoko Debug Board 需要額外載入 FTDI 的 SIO driver. 利用以下指令可載入 FTDI 的 SIO driver. 請使用 root 或是 sudo 來做 I/O port 設定動作.

root@ubuntu:~# rmmod ftdi_sio
root@ubuntu:~#modprobe ftdi_sio vendor=0x1457 product=0x5118

成功之後會在 /dev 目錄下看到 ttyUSB0 及 ttyUSB1, Openmoko 使用 USB1 作為 UART 連線. 連線參數為 115200, N, 8, 1, no hardware flow control 成功後, 使用 minicom/cutecom 或是 cu 可從 UART 輸出得到 Debug port 輸出資料.

[使用 JTAG]

Openmoko 預設的 JTAG 工具是 OpenOCD + Debug Board . OpenOCD 的功能像是一個 middleware (TCP sever with JTAG protocol), 提供了 JTAG 及 gdb 的介面. OpenOCD 詳細的資料可參考:

http://openocd.berlios.de/web/

OpenOCD 也支援了許多不同的處理器架構, 從 ARM7 到 ARM11 都可以使用, 可以下載原始碼後編譯, 或直接從以下網址下載已經編譯好的執行程式. 同時, OpenOCD 需要 FTDI 的 library - libftdi, 版本需要 0.8 或之後的版本.

http://www.ftdichip.com/Drivers/3rdPartyDrivers.htm#Linux

http://www.intra2net.com/de/produkte/opensource/ftdi/index.php

可試著從前面敘述的 apt-get install 包括 libftdi-dev, libftdi-eeprom, libftdi0,libusb 等必要的 package. 也可以從這

http://t0ny.net/openmoko/util/host/gta02/openocd/ 下載已編譯好的 openocd 執行檔及 openocd 需要的裝置設定檔. 接下來:

<Step 1> 連接 Neo 及 Debug Board, 以及連接 Debug Board 到 PC USB port, 開啟 Neo 電源, 然後執行:

root@ubuntu:~/GTA02-DM1/tmp# ./openocd -f openocd-debugv2.cfg
Info: openocd.c:84 main(): Open On-Chip Debugger (2007-01-31 12:00 CET)

正常執行狀況下, 螢幕會停住在Open On-Chip Debugger (2007-01-31 12:00 CET) 這一行.

<Step 2> 接下來使用 telnet localhost 4444 即可進入 CPU, 透過 JTAG 下 command.

root@ubuntu:~# telnet localhost 4444
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Open On-Chip Debugger


> halt
requesting target halt...
> Target 0 halted
target halted in ARM state due to debug request, current mode: Supervisor
cpsr: 0x60000053 pc: 0x33f8b7ec
MMU: disabled, D-Cache: enabled, I-Cache: enabled
>

<Step 3> 執行需要的 script

OpenOCD 可以透過 script 執行連續的 command, 例如寫入多個不同的位址, 大小的檔案到 NAND/SDRAM 的記憶體中並執行. 命令格式是:

> script "script.ocd"

Openocd 執行檔的下載目錄中, 有一個 script.ocd 範例, 若想要學習如何手動寫 u-boot 到 NAND 記憶體中或更多 script 命令, 請參考:

http://wiki.openmoko.org/wiki/U-boot 的內容.

如果看到以下訊息, 代表 JTAG 連線失敗, 請重新連接 USB, 關閉 FR 電源, 開啟 FR 電源, 按下 Debug Board Reset 鈕, 試試是否可以正常停在 Open On-Chip Debugger (2007-01-31 12:00 CET) 這一行..
root@ubuntu:~/GTA02-DM1/tmp# ./openocd -f openocd-debugv2.cfg
Info: openocd.c:84 main(): Open On-Chip Debugger (2007-01-31 12:00 CET)
Error: jtag.c:1181 jtag_examine_chain(): JTAG communication failure, check
connection, JTAG interface, target power etc.

[打開 NOR flash 的寫入功能]

在 FreeRunner 出廠時, NOR flash 預設是防寫的狀態, 所以即使 NAND flash 裡面的 u-boot 受損, 依舊可按 AUX 鍵及電源鍵, 由 NOR 開機後執行更新 image 的工作. 簡單來說, NOR 裡面的 u-boot 包含以下特性:

* 預設是不可變更的
* NOR u-boot 包含了 u-boot/splash screen/environmental variable 環境變數 (MTD parts, default tty output)
* 開機時按下 AUX 鍵, Samsung stepping stone 會跳到 NOR 執行開機的動作

V3 版的 Debug Board 有提供一個 pull-high 電阻 IO 可以解除 FR 上的 NOR 防寫功能, 這個功能必須要透過一個小的公用程式 norwp 啟動.

norwp 的原始碼可以從 http://svn.openmoko.org/trunk/src/host/norwp/ 下載. 要編譯這個程式, 需要 libusb 及 libftdi . 也可以從下面的網址, 下載編譯過的 binary. http://t0ny.net/openmoko/samples/bin/norwp/

使用這個 Utility 很簡單, 只要連接 Debug Board 及 FR 後, 執行:
root@ubuntu:~/norwp# ./norwp rw

就可以開啟 NOR 寫入的功能, 而:
root@ubuntu:~/norwp# ./norwp ro 可關閉寫入的功能

從 openmoko 的 git server, 可以 download u-boot 及 NOR 版 u-boot 的 source code. http://git.openmoko.org/?p=u-boot.git;a=summary

簡單來說, 用 git clone 下來後, 使用 openmoko 官方的 toolchain 即可編譯出相關的檔案. 關於 toolchain 的用法, 這邊先略過.

2008/12/1

Neo FreeRunner 新手手冊 (5) 透過 sysfs 作硬體開關控制


Neng-Yu Tu (Tony Tu)


在 Openmoko 的官方網頁中, FreeRunner 是基於以下的規格需求所開發出來:
http://wiki.openmoko.org/wiki/Neo1973_GTA02_Hardware

在此網頁中, 包含 3 個重點, 分別是:

* 規格設定條件
* 硬體選擇
* 簡要的改版 - 生產紀錄

簡單來說, 在 FreeRunner 中包含了以下的硬體.

* Samsung S3C2442 B54 MCP (含 64 MB SDRAM, 256 MB NAND), running @400Mhz
* 外接一顆 64 MB SDRAM
* ST 8 MB NOR flash
* NXP PCF50633 04 N3 電源管理 IC
* 2顆 LED, Aux 紅色, Power 藍/橘
* S-Media 圖形加速器
* u-blox 4 A-GPS
* microSD card (插槽) (目前 community 測試最大支援到 16 G 的 SDHC microSD 卡)
* 2 顆 ST 3-axis 的 accelerometer (8G/2G 敏感度及 interrupt 模式)
* Atheros AR6001GZ Wi-Fi, firmware version 2.0.0.89 (Accton module)
* CSR BC4 Bluetooth v2.0 (Delta module)
* USB host (同時可提供 5V power, 不需外接電源)
* Calypso GSM/GPRS modem
* 支援聰明電池 (coulomb battery), 可模擬 HDQ 協定的硬體 GPIO 設計
* 硬體可讀版號, 會對應從 u-boot 傳到 kernel 的 ATAG 值 (0350 = v5 版, 0360 = v6 版)

FreeRunner 的完整電路圖, 也可以從 Openmoko 網站下載:

http://downloads.openmoko.org/developer/schematics/

大部分的硬體, 都可以透過 /sysfs 來作開關及讀取一些基本資料. 詳細的內容, 可參閱 wiki 下的網址. http://wiki.openmoko.org/wiki/GTA02_sysfs 同時, sysfs 對應的位置會因為 upstream 相容性改變, 2.6.28 開始, 因為 upstream 的關係, 目錄位址開始變更. 但是基本使用方式及原則是不變的, 可以用 find 指令來找相關的位置.

舉例來說:

<開關 Aux 鍵的 LED>
要開關 Aux key LED, 可以直接使用以下命令:
echo "255" > /sys/devices/platform/gta02-led.0/leds/gta02-aux:red/brightness
或是
echo "0" > /sys/devices/platform/gta02-led.0/leds/gta02-aux:red/brightness

<讀取電池的充電狀態>
讀取 PMU 的的充電狀態是快充還是其他狀態:
cat /sys/devices/platform/s3c2440-i2c/i2c-adapter/i2c-0/0-0073/chgmode

<讀取電池電量> 讀出的數值以百分比表示
cat /sys/devices/platform/bq27000-battery.0/power_supply/bat/capacity

<讀取硬體版本>
root@om-gta02:~# cat /sys/devices/platform/neo1973-version.0/pcb

利用 sysfs, 就可以利用 script 開關硬體, 或是執行簡單的系統測試. 但是例如像是 wi-fi 模組是直接透過 SDIO 連接, 就無法用硬體的方式 power off 模組, 只能用軟體的方式執行 power off 命令.

2008/11/27

Neo FreeRunner 新手手冊 (4) 建立 FreeRunner 對外網路連線 - Bluetooth


Neng-Yu Tu (Tony Tu)

Bluetooth 和 GPRS 裝置和 FreeRunner (以下簡稱 FR) 上的 USB 連線或 Wi-Fi 連線不一樣, 在使用前, 需要額外透過 command 先將這些裝置開啟, 然後才能執行. 先針對 Bluetooth 裝置說明. 詳細的內容可以參考 wiki 上的 http://wiki.openmoko.org/wiki/Manually_using_Bluetooth 網頁的說明. 此外 FR 上面的 Bluetooth 是 Delta 的模組, chipset 是 CSR 的 Bluetooth 2.0.

FR 使用的 Bluetooth stack 是 Marcel 的 BlueZ, 但是 BlueZ 能提供的功能, 在 FR 上都可以達到. 但 FR 並沒有提供完整的 profile 操作介面供連線/功能操作使用.

直接使用 BlueZ 的公用程式, 確實可以進行常見的 GAP, FTP, HID, PAN 的 "功能", 唯一的問題是: 必須手動完成大部分的功能及 handshake 驗證, 或是需要修改 /etc/Bluetooth/hcid.conf 的設定.

FR 上的 Bluetooth 是透過 USB 介面連接到 CPU, 預設的狀態是關閉的. 所以使用前必須先開啟 Bluetooth. 開啟的方式很簡單, 只要透過 command 就可以直接開關 Bluetooth 裝置.

同時, 由於 etc/network/interfaces 裡面的 Bluetooth 設定, 預設是 iface bnep0

inet dhcp. 建議先用 # disable 掉這個功能.

<Step 1> 開啟 FR 上的 Bluetooth device

root@om-gta02:~# echo 1 > /sys/bus/platform/devices/neo1973-pm-bt.0/power_on
root@om-gta02:~# echo 0 > /sys/bus/platform/devices/neo1973-pm-bt.0/reset

<Step 2> 執行 hciconfig, 透過這個命令我們可以確認 Bluetooth 是否正常執行, 以及取得目前 FR Bluetooth 的位址.

root@om-gta02:~# hciconfig
hci0: Type: USB
BD Address: 00:06:6E:16:DE:BD ACL MTU: 384:8 SCO MTU: 64:8
UP RUNNING PSCAN ISCAN
RX bytes:949 acl:0 sco:0 events:23 errors:0
TX bytes:342 acl:0 sco:0 commands:23 errors:0

如果沒有得到上述訊息, 可以用 hciconfig hci0 up 強迫啟動, 或是重複 Step 1 到 2.

<Step 3>

此時連線步驟要先切回 Host (ubuntu) 端, 請先開啟 Host 端的 Bluetooth, 執行以下命令.
root@ubuntu:~# modprobe bnep
root@ubuntu:~# pand --listen --role NAP

<Step 4> 在 FR 執行以下命令, 00:11:22:AA:BB:CC 處請填上 Host 端的 Bluetooth MAC 位址.
root@om-gta02:~# pand -c 00:11:22:AA:BB:CC --service NAP --autozap
root@om-gta02:~# ip a add 10.0.0.2/24 dev bnep0
root@om-gta02:~# ip r del default
root@om-gta02:~# ip r add default via 10.0.0.1

你可以從這邊下載完整的 script
http://t0ny.net/openmoko/samples/script/bt_net.sh

有時建立連線會失敗, 或 bnep0 沒啟動, 請執行下面這一行指令.

root@om-gta02:~# ip l set bnep0 up

<Step 5> 然後回到 PC 端, 設定 Bluetooth network 及 IP forwarding 的規則

FR 建立連線後, 可先用:

root@ubuntu:~# pand --show --list -l
應該會看到:
Bnep0 00:06:6E:XX:XX:XX NAP
看到這個訊息代表 FR 真的連上線了, 然後執行:
root@ubuntu:~# ip a add 10.0.0.1/24 dev bnep0
root@ubuntu:~# ip l set bnep0 up

接著可以從 Host 端, 及 FR 端分別 ping 10.0.0.210.0.0.1 看看是否可以雙向連上線.

root@ubuntu:~# ping 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=47.2 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=22.0 ms
64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=24.0 ms
64 bytes from 10.0.0.2: icmp_seq=4 ttl=64 time=17.0 ms

或是從 ifconfig 中看到.
root@om-gta02:~# ifconfig
bnep0 Link encap:Ethernet HWaddr 00:06:6E:16:DE:BD
inet addr:10.0.0.2 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::206:6eff:fe16:debd/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:268 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:284 (284.0 B) TX bytes:11737 (11.4 KiB)

<Step 6>

如果需要, 請在 Host 端, 和 USB 連線一樣, 再加入 packet forward 的功能.

2008/11/26

Neo FreeRunner 新手手冊 (3) 建立 FreeRunner 對外網路連線 - USB/Wi-Fi


Neng-Yu Tu (Tony Tu)


FreeRunner 分別可以透過無線 (Bluetooth, Wi-Fi, GPM(GPRS) 以及有線 (USB) 的方式. 但是從使用者介面上可以完成部分 Wi-Fi 連線功能外, 其他的連線方式可能需要進到命令模式, 然後透過手動下 script 的方式完成.

不同的 Distribution 可以用的 script (例如 FSO 有提供許多的 python binding service) 也不一樣, 當然最原始的方式就是直接下 bash script. 以下提供了 Host (PC) 端及 FreeRunner 端的連線 command 方式. 接下來以 ubuntu 為例, 分別設定以下幾種連線.

[USB 連線]

FreeRunner 的 USB port 預設在 USB 1.1 slave 的模式, 可以透過 Host 端電腦的 NAT 和外部的網路建立雙向連線. 下面分別是 Host PC/Neo 端分別需要下的命令.

更詳細的資料可以參考: http://wiki.openmoko.org/wiki/USB_Networking

* Host (ubuntu) 端
Host 端分成兩個步驟, 第一段是建立 SSH 的連線, 第二段是建立 packet forwarding 規則.

<Step 1>

sudo ifconfig usb0 192.168.0.200 netmask 255.255.255.0

ssh root@192.168.0.200

<Step 2>

Sudo iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24
Sudo sysctl -w net.ipv4.ip_forward=1

不同的 distribution/version 會有不同的指令設定, 不同防火牆也可能會有不同的結果. 可以直接參考 http://wiki.openmoko.org/wiki/USB_Networking

* FreeRunner 端:

Host PC 端跟 FreeRunner 連線後, FreeRunner 的預設 image 需要 "額外" 的一項設定, 需要加入 DNS nameserver 的名稱解釋服務.
echo nameserver 208.67.222.222 > /etc/resolv.conf
echo nameserver 208.67.220.220 >> /etc/resolv.conf

當然, 你可以熟悉 FreeRunner 的設定後, 套用到 FreeRunner 的

/etc/network/interfaces 裡面.

[Android Cupcake 0.1.1 and after]
PC side:

iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24
sysctl -w net.ipv4.ip_forward=1

FR side:
route add default gw 192.168.0.200 dev usb0
setprop net.dns1 168.95.1.1

[Wi-Fi 連線]

目前 FreeRunner 的 Wi-Fi Atheros AR6001 module 是透過 SDIO 介面連接 (所以如果你需要 Samsung 的 SDIO host controller code 可以參考 OM 的 implement, OM 的 implement 基本上是 based on OpenHand 的 Samuel 的 implement), 所以並不需要做 power on/off 的動作就可以使用模組. Wi-Fi 連線設定的關鍵, 主要在兩種連線加密模式 WEP 跟 WPA 的設定.

更多的資料可以參考: http://wiki.openmoko.org/wiki/Neo_FreeRunner_Wifi

* WEP

<Step 1>

登入 GTA02 後, 先看附近有哪些無線 AP

iwlist eth0 scan

<Step 2>

Key 欄位填入連接網路 AP 的 key
Essid 填入網路的 AP 名字 (essid)

iwconfig eth0 key 1234567890 essid myAP
ifdown eth0 && ifup eth0
udhcpc

最後一行指令是利用 udhcpc 動態取得 DHCP 的位址

* WPA

<Step 1> 建立 WPA 設定檔
利用 vi 或其他文字編輯程式, 建立如下設定檔

-----------
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0
eapol_version=1
ap_scan=1
fast_reauth=1

# WPA2:

network={
ssid="WPA2_AP_Name"
scan_ssid=1
proto=RSN
key_mgmt=WPA-PSK
pairwise=CCMP TKIP
group=TKIP CCMP
psk="YourPSK"
priority=50
}

# WPA:
network={
ssid="WPA_AP_Name"
proto=WPA
key_mgmt=WPA-PSK
pairwise=TKIP
group=TKIP
scan_ssid=1
psk="YourSPK"
priority=10
}

# WEP:
network={
ssid="WEP_AP_Name"
scan_ssid=1
key_mgmt=NONE
wep_tx_keyidx=0
wep_key0="your WEP key"
priority=8
}
# Open:
network={
ssid=""
key_mgmt=NONE
priority=5
}
-------
<Step 2> 套用 WPA 設定檔, 重新啟動

wpa_supplicant -i eth0 -c /home/root/wpa_supplicant.conf -B
ifup eth0

如果無法連上, 可以試試 ifdown eth0 再試試.
連上後, 可以 ping http://www.hinet.net/ 或是 168.95.1.1 看看是否 DNS 跟網路的連線都 ok 了.

2008/11/25

Neo FreeRunner 新手手冊 (2) 登入 FreeRunner 終端機及安裝/更新套件


Neng-Yu Tu (Tony Tu)

FreeRunner 基本上有兩種終端機 (Terminal) 模式, 分別是 u-boot 時的 UART 終端機模式以及開機完成後, 可以透過 FreeRunner 預設的 SSH server 連進 FreeRunner. 基本上直接用 Linux (或是 vmware 上的 Linux) 的系統做這些連線比較簡單, 只要直接連上就可以直接從 /dev/ttyACM0 或是 ifconfig 看到 USB0. Windows 則需要裝另外的 RNDIS gadget 驅動程式 .inf 檔案. 接下來會針對這幾種方式說明.

Neo 還有一個 debug board (上面還有一顆蠻神奇的 FTDI 晶片), 可以透過主板上的 debug port (UART/JTAG) 對 Neo 做低階除錯動作. 在此先略過.

[U-Boot 終端機]

U-Boot 的終端機是典型的 UART terminal, NOR flash 跟 NAND flash 裡面的 u-boot 預設的輸出導向都是 USB tty. U-boot 終端機可以用來做一些低階的 register 開關或設定動作. 或是像是重設開機環境變數之類. 相關的資料可以從:

http://wiki.openmoko.org/wiki/U-boot 找到. 以 NOR u-boot 來說, 開機時按下 Aux 鍵, 再按下開機鈕, 畫面會停在 u-boot 上. 此時連接 FreeRunner 及手機上的 USB 接頭, 應該可以在 /dev 下看到 ttyACM0.

然後可以挑一個習慣的 COM port 公用程式, 像是 minicom 或是圖形的 cutecom. 或是個人常用的 neocon/cu . neocon 可以從http://svn.openmoko.org/developers/werner/neocon/ 找到.

連接參數為 115200, N, 8, 1, no hardware flow control

[用 SSH 連到 Neo]

FreeRunner 預設的 image 都有 SSH server/client (dropbear), 可以透過 SSH 進到 FreeRunner , 同時可以用 SCP 做一些檔案傳輸的工作. FreeRunner USB 埠預設的

IP address 是 192.168.0.202, netmask 是 255.255.255.0 這些設定都可以在FreeRunner /etc/network/interfaces 下修改.

所以當開機完成後, 連接電腦及 FreeRunner, 然後用 root 帳號登入 192.168.0.202 (使用 sudo or login as root), 密碼是空白:

root@ubuntu:~# ifconfig usb0 192.168.0.200 netmask 255.255.255.0
root@ubuntu:~# ssh root@192.168.0.202
root@192.168.0.202's password:
root@om-gta02:~#

然後接下來你就可以下一般的 linux command 及使用 script 了.

[安裝及更新套件]

Openmoko 使用源自 ipkg 的 opkg 套件管理系統, 改名的原因有很多, 但是重點是: 基本架構 opkg 跟 ipkg 是很類似的. 如果使用過 yum 或是 apt-get, opkg 的用法也是差不多的. 所以安裝套件有 3 種方式, 一種是將套件檔 xxx.ipk 或 xxx.opk 從網路上下載, 然後手動進終端機畫面後安裝. 第 2 種, 是利用 Neo 本身的 USB/Wi-Fi/Bluetooth 網路功能, 連線後透過終端機進行套件的安裝工作. 或是第 3 種, 網路連線後, 透過 2008.x 上面的 Installer 來進行安裝.

由於 Openmoko 本身非常具有 "community development" 的特性 ;) 所以套件的相關位址和狀態一直在變化. 最早隨 FreeRunner 出貨的 200804 GTK (有時也被稱為 2007.x 版) 版本, 是無法直接用 opkg update 或是 opkg upgrade 到最新的 Om2008. 9 or later . 建議直接參考其他資料先進行 FreeRunner 更新 image 的動作. 同時 2008.x 也有 release/un-stable/testing 的幾個不同的 tracking. 不同 Tracking 的差別會稍後說明.

FreeRunner 相關的 opkg feed 設定, 可以在 etc/opkg/ 的 .conf 檔案中找到. opkg 套件管理程式主要的 maintainer 是 tick.

* 手動安裝
Step 1: 搜尋一下哪裡有提供 neo package 的位址, 或可以從 http://t0ny.net/openmoko/opkg/samples/ 下載 orrery_2.0_arm_2008.8.ipk 然後繼續下面的步驟.

Step 2: 透過下面的命令連線:
root@tony-ubuntu:~# ifconfig usb0 192.168.0.200 netmask 255.255.255.0
root@tony-ubuntu:~# ssh root@192.168.0.202
root@192.168.0.202's password:
root@om-gta02:~# scp root@192.168.0.200:~/Desktop/opk/orrery_2.0_arm_2008.8.
ipk root@192.168.0.202:~
WARNING: Ignoring unknown argument '-x'
WARNING: Ignoring unknown argument '-oClearAllForwardings yes'
WARNING: Ignoring unknown argument '-n'
root@192.168.0.200's password:
root@om-gta02:~# ls

Step 3: 直接利用 opkg install orrery_2.0_arm_2008.8.ipk 安裝套件. 有時套件系統會因為某一些系統行為停掉, 此時你必須使用killall packagekitd 來停掉 opkg 服務再重新進行安裝程序.

* 透過網路安裝
透過網路連線需要幾個額外的步驟, 建立 USB/wi-fi/Bluetooth 網路連線及設定 Neo 的 DNS 設定. 設定完後, 就可以直接透過 opkg install 安裝.

root@om-gta02:~#opkg install packagename.opk

* 透過 UI 上的 Installer 安裝
必須先建立網路連線, 才能透過 Installer 安裝相關的 package. 你必須先到 2008.x 的主畫面中, 選擇 Settings, 然後啟動 wi-fi 並輸入 WPA 密碼. 螢幕小鍵盤的使用方式很 tricky, 你必須在鍵盤右側的黑框上, 上下移動選擇數字或其他特殊符號. 由於 2008.x 的 wi-fi 設定程式有些 bug, 建議參考其他方式確認網路連線後, 再透過 Installer 安裝.

[移除 package]
移除 package 可以使用 opkg remove package_name , 相關的命令可以用 opkg --help 找到

Neo FreeRunner 新手手冊 (1) 認識 Distribution 及更新 image


Neng-Yu Tu (Tony Tu)


[認識 Openmoko 的相關 Distribution]

通常拿到 Neo 第一件是要學會的就是如何更新手機裡面的image. 目前 Neo 有以下的 image 可供選擇.

* Om2007.2: 由 Open Hand 主導的使用者介面設計 (work for Intel Moblin now) , 建立在 GTK 的基礎上, image 可以從以下網址找到:
Image: http://t0ny.net/openmoko/images/200804/






















* Om2008.x : 這是目前 (2008 年) 還在維護的版本, 基本上是由 open source 版的 QT/X11 加上 raster 的 illum ETK. ETK 提供了自己的圖形介面 API, 還有自己的 python binding.
Image: http://t0ny.net/openmoko/images/200809/
























* Android: 根據 Google釋出的原始碼, 由 Sean McNeil 維護的 Neo Android 版本, Beta 4 (RC1) / Cupcake 之前的版本在 FR 上需要一張額外的 uSD 記憶卡 (128 MB 以上).
說明: http://wiki.openmoko.org/wiki/Android
Image: http://t0ny.net/openmoko/images/android/























* QT extended: Trolltech(a Nokia company now)/Qtopia 維護的版本, 目前到 4.4.x
http://wiki.openmoko.org/wiki/Qtopia_/_Qt_Extended_on_FreeRunner

image: http://www.qtopia.net/modules/mydownloads/index.php






















* Debian: Debian 社群開發並維護的版本.
* FSO: Mickey 跟 2009 年 openmoko framework 可能方向, 基本上 FSO 是建立在 D-Bus 上的應用程式架構, 透過 python binding 的 toolkit (如 GTK/ETK) 來呈現使用者介面的畫面.
http://wiki.openmoko.org/wiki/OpenmokoFramework























* SHR 及 FDOM: 基本上是社群上的人自己維護的 image, SHR 主要重點在提供 illum/enlightment 標準介面/畫面以及 tangoGPS 程式. FDOM 目的是解決官方版釋出的 image 裡面的套件不足以供一般的開發需要. 同時省掉需要 opkg install/upgrade 的麻煩. 詳細差別可以參考以下網址:
http://wiki.openmoko.org/wiki/SHR

[SHR] http://shr.bearstech.com/























[FDOM] http://www.tuxbrain.com/fdom_en.html




















[更新 FreeRunner image 的方法]

更新 FreeRunner 的 image 有兩種辦法:
<方法 1>
一個是透過 FreeRunner 上面的 USB, 透過 DFU (Device firmware update) 協定及 dfu-util 程式, 然後利用開機進到 kernel 前的 u-boot, 更新 image. 此外, 目前只有 linux 的電腦才能做 DFU update 的工作. 當然如果你用 vmware 之類的 emulator 上跑的 linux 也是可以的, 不過記得連接 FreeRunner 時的程式 focus (視窗) 要是 vmware 的 Linux 才行.

FreeRunner 的 DFU 是由 Werner 維護開發的, 相關的原始碼在 http://svn.openmoko.org/trunk/src/host/dfu-util/ . 更多的資料可以查
http://wiki.openmoko.org/wiki/Dfu-util.


<方法 2>
如果你有 micro SD card, 最快的方法是直接把 image copy 到 micro SD card, 然後從 micro SD card 執行 script. 你可以參考以下 script 來做更新 FreeRunner 裡面的 image.
http://t0ny.net/openmoko/samples/script/dl_finalimg

[更新 FreeRunner image 的步驟]

< Step 1>
從上面的連結中下載 dfu-util 的原始碼自行編譯或是 download 已編譯好的套件

< Step 2>
http://downloads.openmoko.org/releases/ 下載最新的 images, 或從前面的連結中, 找到相關的檔案, 下載到本機上.

< Step 3>
如果是啟動 NOR boot (先按 Aux 鍵, 再按開機紐), 開機畫面就會停住. 同時此時你可以透過 USB 將 FreeRunner 跟你的 Linux 連起來. 然後就可以用 sudo 或是 root 權限執行 dfu-util 進行升級的動作.

<Step 4>

* 更新 rootfs:
./dfu-util -a rootfs -R -D /path/to/openmoko-devel-image.jffs2
OR
./dfu-util -a 6 -R -D /path/to/openmoko-devel-image.jffs2

* 更新 kernel:
./ dfu-util -a kernel -R -D /path/to/uImage
OR
./ dfu-util -a 3 -R -D /path/to/uImage

* 更新 bootloader
./dfu-util -a u-boot -R -D /path/to/u-boot.bin
OR
./dfu-util -a 1 -R -D /path/to/u-boot.bin

* 更新開機 splash image
./dfu-util -a splash -R -D /path/to/splash.gz
OR
./dfu-util -a 4 -R -D /path/to/splash.gz

* 更新開機參數 (environment variable)
./dfu-util -a u-boot_env -R -D /path/to/env_new
OR
./dfu-util -a 2 -R -D /path/to/env_new

<Step 5>

記得檢查 DFU 的結束的訊息, 當進度條結束並不代表更新一定成功. 如果 DFU 一直中斷, 記得檢查 DFU 的參數是不是下錯, 或是 USB cable 是不是沒接好. 如果你是從一般 u-boot (不是從 NOR 的 u-boot) 更新, 可能更新 NAND 裡面的 u-boot 也是一個 方法.

2008/11/14

memorial

2008 Nov 14, really a sad day. 2007 Nov 14, a happy day.

2008/10/29

XTC HB3 2009

Finally, after 5 weeks of waiting, get my second Giant last week.


全部相片請點這 All my XTC HB3 snapshot could click here :)


First ride to Taipei Tamshui is cool, with some Openmoko colleagues, and trip total about 50 Km. I forget bring the sunglass, a little dizzy during whole trip.

Unfortunately, the bike have few serious _dings_ during first ride. Anyway, I love this bike so far :)

2008/10/22

光陽 Racing 的廣告

難得最近看到一個覺得有打動自己某個部分的摩托車廣告, 女主角側面還蠻像 Yanzi 感覺. 不過看了一下她本人無名基本資料 http://www.wretch.cc/mypage/pig2003zoo 比 Yanzi 本人大隻一些 :) 看 blog 的 title: You are reading my shit. 態度十足, 能力就再看看囉

另外歌也還不錯聽, 跟廣告畫面一氣呵成, Sunshine state 的歌果然很有 sunshine 的感覺 http://www.sunshinestate.ca/ 聲音跟編制都很像 Frente 的風格, 蠻適合校 園的青春大學生的 Tune.

A Good CF...

2008/8/4

instant messaging

I have 4 different messaging client installed (MSN/Skype/irc/jabber),
now I understand why some people need trillian as IM client. It so
strange even for the same function, still need so many clients and
protocols. It just a waste from dark side, maybe it also represent the
world diverse in the bright side.

2008/7/31

ghost is everywhere, always

Chinese ghost month will start from tomorrow for 1 lunar month. For Chinese, ghost only could legally out of hell into human world during ghost month. And ghost has another meaning for describe malicious/odd/smart people in Chinese. So, ghost is everywhere, always :D

2008/7/28

Jack Black's Tenacious D in The Pick of Destiny

I thought school rock could be end of jack black's rock BS :) but Tenacious D in The Pick of Destiny is more hilarious. Nowadays rock n' rolls become a joke even in serious duel with devil (well, at least crossroads has some serious fight, IMO). Maybe next time have some movie do JB vs. JB (Jack Black vs. Jack Butler).

Anyway, good job, jack.

2008/7/26

Amazing Community

Well, since I been accept the modernmusician music/theory discussion forum moderator few years ago, and now the openmoko project. I was so amazed community member's insight of on discussion topic. Some people just could see through things even more clearly than people actual working on things. Just very cool!

2008/7/25

Mail and Post

It's first time using mail posting function of blogspot. Posting through
e-mail have strange feel for me, maybe because of the interface remind me the daily work.

And I made a mistake at first post, wrong e-mail address... a usual
un-deliverable reason after several times of check on update.

2008/7/19

重新開始

這幾年在各個地方 post 了一堆東西, 但是卻沒有一個集中的地方放這些東西. 想一想還是就放在一開始接觸 blog 的 blogspot 吧.

從脫離學校以來, 一路走來奇奇怪怪. 呵, 從好處想是各式各樣的生活都體驗過了, 應該可以寫一個有趣的 blog.
 
Creative Commons License
著作 係採用創用 CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款授權.