Email me: jollen # jollen.org

more: Jollen 的 Embedded Linux 教育訓練

« October 2008 | (回到Blog入口) | December 2008 »

November 2008 歸檔

November 5, 2008

Android 已經能在 FreeRunner 上執行

自從 Google 正式公開 Android 原始碼後,Openmoko 社群便開始努力將 Android 移植到 FreeRunner 手機上,期間不斷有小報導指出 Openmoko 將推出 Android 手機。不過,正確的說法應該是「Openmoko 將 Android 移植到 FreeRunner 上」,而不是另外打造一支新的手機。

前二天,連「Openmoko 投靠 Android 聯盟」的消息都出現了(其中一則報導還附上 FreeRunner 執行 Android 的照片):

* Openmoko來投 Android聯盟再添一員
* 本月有望推出 Android家族第2款手機

投靠 OHA 聯盟?這還是未經證實的小報導,不過,FreeRunner 能執行 Android 已經是可以官方證實的消息了。Openmoko 的確「已經將 Android 移植到 FreeRunner」,而且也對外釋出,已經可以由網路上下載 Android 的 image 了。我們來看一下 Openmoko 在這裡做了什麼事情:

1. 主要的移植開發者為 Sean McNeil

2. 修改了 Binutils 2.18 以順利編譯 Android 原始碼

3. gcc 4.2.4 加入 gcc41-java-arm4.patch 以順利編譯 Android 原始碼

4. 執行 Android 的 kernel 版本是 2.6.26

這項工作,其實過程都是很透明的,因為 Sean McNeil 陸續都有將大部份的 patch 都丟到 mailing list 上,再加上社群的討論以及網路上的移植工作,「FreeRunner 能執行 Android」已經是預料中的事情了。

針對開發者或教育研究單位來說,Openmoko 所維護的 distribution 將會是一個「super set」,也就是「不同的 Linux distribution 或開放手機軟體,都能在 FreeRunner 硬體裝置上執行」。如同前一篇日記所說的,FreeRunner 能執行 Android 的話,不但可以吸引 Android 的開發者參與 Openmoko 社群的活動,對投入 Android 平臺的教學研究機構來說,也能將成果實際放到 FreeRunner 手機上執行測試。

延伸閱讀

* 2008.10.31: Openmoko FreeRunner 與 Google Android: 現況與想法
* 2008.10.27: 移植 Android 到 Neo1973 與 Neo FreeRunner

FreeRunner 搭載 Android 實機測試

看了這麼久的 Android 消息,今天終於可以實際將 Neo FreeRunner 更新成 Android 系統,進行實機測了。將 FreeRunner 變成 Android 手機的做法,可以在 [Openmoko Wiki] 下載教學簡報。以下是實機測試畫面。

將 FreeRunner 重新燒錄 Android 的 kernel 以及 rootfs 後,直接開機。大約過了1分鐘後,看到了 Android 的開機畫面,開機時間還可接受,但似乎目前的版本並不是相當穩定,仍有開機失敗的機率。

開機後,來到鎖定畫面,必須按一下 FreeRunner 的按鍵,才能進到主選單。

主選單是典型的 Android 畫面,當然是採用觸控方式操作。整個 FreeRunner + Android 給我的第一印像還算不錯,觸控操作挺順手的,不會有「卡卡」的感覺。

來到 Android 的應用程式選單,裡頭有許多 Android 的應用程式。

這是 Android 的撥號器(dailer)程式。雖然沒有很仔細測試整體系統,不過第一時間給我的感覺很不錯、也很有新鮮感。 ;-)

November 10, 2008

Neo FreeRunner: 3 軸加速度感測器程式實作

Neo FreeRunner 搭載二個「3 軸加速度感測器」,這是一個很有趣的硬體,他可 以偵測手機的移動狀態,配合應用程式,可以實作出有趣的小玩具。以 iPhone 為 例,它有一個很人性化的功能,當手機 90 度轉向時,視窗也會跟著 90 度轉換, 這樣的功能就是透過「加速度感測器」晶片來完成的。

Neo FreeRunner 有二個 3 軸加速度感測器,當手機移動時,可以利用程式讀取每 一個軸的加速度值。讀取加速度感測器的方法是透過 Linux 的 input layer:

    /dev/input/event{2,3}

Process 透過這二個裝置檔讀取 input layer 的資料,kernel 會回傳一筆加速度感測器的資料給 process,該筆資料的 data type 為 struct input_event,即 kernel 的 input event 資料結構。程式的做法是,每次讀取一筆加速度感測器資料,再判斷資料的類型,以及各軸的加速度值。

程式寫法如下:

    #include <linux/input.h>

    int main(void)
    {

        struct input_event motion;

        fd = open("/dev/input/event3", S_IRUSR);

        while (1) {
            read(fd, &motion, sizeof(motion));
        }
    }

struct input_event 資料結構的定義如下:

    struct input_event {
        struct timeval time;
        __u16 type;
        __u16 code;
        __s32 value;
    };

讀出的資料如下:

  • motion.time: 讀取到該筆資料的時間
  • motion.type: 值為 2 時,表示該筆資料為加速度值
  • motion.code: 表示讀取的加速度方向,0 = x 軸、1 = y 軸、2 = z 軸
  • motion.value: 該軸的加速度值,正負號代表「正負方向」

本範例讀取 FreeRunner 上的第二個 3 軸加速度感測器,x/y/z 軸所代表的方向如下圖。

(Source: Openmoko Wiki)

如果想要讀取 x 軸的加速度:

    int x;

    /* 資料有效且為 x 軸 */
    if (motion.type == 2 && motion.code == 0) {
        x = motion.value;
    }

若 x 為負值,表示手機往左邊的方向移動。再舉一個例子,讀取 y 軸的加速度:

    int y;

    /* 資料有效且為 y 軸 */
    if (motion.type == 2 && motion.code == 1) {
        y = motion.value;
    }

若 y 軸的加速度為正值,表示手機往下移動。更多有關 FreeRunner 加速度感測器(accelerometer)的資訊,可參閱 Openmoko wiki [Accelerometer data retrieval]。

November 21, 2008

安裝 Android 應用程式(apk)至 Neo FreeRunner

首先,依照 Android 文件上的說明 [先安裝 SDK],再 [撰寫 Hello, Android!] 應用程式後,打包成 apk 格式;本文使用的 Android SDK 搭配的 Eclipse 版本是 3.4(Ganymede)。接著,再照 [Android Documentation] 的說明撰寫一個 Android 應用程式,再將程式編譯後打包成 HelloMoko.apk 檔案。

當然,必須將 FreeRunner 更新為 Android 系統,更新方式可至 Openmoko 中文 wiki 下載投影片:http://wiki.openmoko.org/wiki/Main_Page/zh_tw。請依以下步驟將 HelloMoko.apk 安裝至 FreeRunner 手機上。以下的實驗環境為 Ubuntu 8.04.1。

1. 連接 FreeRunner 與 PC

將 FreeRunner 以 USB 連接 PC,再將 FreeRunner 手機開機至 Android 環境。請注意,依照 Openmoko wiki 上的說明,若在開機後再連接 PC,可能會有問題。可利用 lsusb 指令檢查 FreeRunner 是否順利連到 PC 上:

$ lsusb
Bus 007 Device 002: ID 04b4:1724 Cypress Semiconductor Corp. 
Bus 007 Device 001: ID 0000:0000  
Bus 003 Device 001: ID 0000:0000  
Bus 006 Device 001: ID 0000:0000  
Bus 005 Device 034: ID 1457:5117 
Bus 005 Device 001: ID 0000:0000  
Bus 004 Device 001: ID 0000:0000  
Bus 004 Device 004: ID 04d9:0499 Holtek Semiconductor, Inc. 
Bus 002 Device 001: ID 0000:0000  
Bus 001 Device 001: ID 0000:0000

2. 殺掉 adb server

執行 adb 時,adb-server 會自動啟動。因此,若是先前曾利用 Eclipse 啟動過 Android 模擬器來測試 HelloMoko 的話,adb-server 己經在背景執行了。啟動 adb server 後再連接 FreeRunner,可能會讓 adb server 找不到 FreeRunner,因此,最可靠的做法是:先檢查系統是否有 adb server,將執行中的 adb server kill 掉後,再重新啟動 adb server。

$ ps ax|grep adb
20092 ?        S+     0:00 grep adb
21032 ?        Sl     0:00 adb fork-server server
$ sudo kill -9 21032

adb 是 Android SDK 所提供的工具,可於 Android SDK 的 tools/ 目錄下取得。

3. 設定 PC 端 IP

接下來設定 PC 端的 IP 位址為 192.168.0.x,例如:

$ sudo ifconfig usb0 192.168.0.200

FreeRunner 的預設 IP 為 192.168.0.202,可以 ping 此位址測試是否能正常連線。

4. 啟動 adb server

設定 ADBHOST 環境變數:

$ export ADBHOST=192.168.0.202

ADBHOST 的值為 FreeRunner 的 IP 位址。再執行 adb 啟動 adb server,adb server 會自動偵測 Android 手機:

$ adb devices
* daemon not running. starting it now *
* daemon started successfully *
List of devices attached 
emulator-5554   device

在 'List of devices attached' 項目可以看到系統自動偵測到的 Android 手機。

5. 安裝 HelloMoko.apk

使用 adb 將 HelloMoko.apk 安裝到 FreeRunner / Android 手機:

$ adb install HelloMoko.apk

安裝完成後,重新啟動 FreeRunner 即可在應用程式選單裡看到 HelloMoko。

關於 November 2008

此頁面包含了在November 2008發表於Jollen's Blog的所有日記,它們從老到新列出。

前一個存檔 October 2008

後一個存檔 December 2008

更多信息可在 主索引 頁和 歸檔 頁看到。

Top | 授權條款 | Jollen's Forum: Blog 評論、討論與搜尋
Copyright(c) 2006 www.jollen.org