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

沒有留言:

 
Creative Commons License
著作 係採用創用 CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款授權.