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

簡介 0xlab 新的開放原始碼專案

我們在今年八月中旬的 COSCUP 研討會中,很榮幸地向與會的朋友介紹 0xlab 若干新的開放原始碼專案,本文稍作整理回顧。0xdroid 是 0xlab 最早的一項整合性開放原始碼專案,目的是建構於 Beagleboard 開放的硬體之上,提供 Android 的參考實做環境,經過一年多的累積,裡頭的成果被帶到不同的移動裝置中,比方說手機與 Tablet。今年二月份,有幸在 Mobile World Congress 2010 展示基於 Android 的移動裝置,Tieto 也在 TI OMAP3 平台展示 0xdroid,這些都讓我們更有信心,擴展到多元的應用。

這半年間,延續
0xdroid 的經驗,我們發展 / 貢獻以下專案:

  • 0xRobocat : 與 CATCAN 合作的專案,目的是打造一組控制伺服馬達與相關零組件的軟體框架,可提供給 Android 或 GNU/Linux 使用,以 Apache License 2.0 授權釋出。除了用於打造機器人外 (是真的可走動的 "Android"),本專案可用於 Android 裝置 (如手機) 的自動測試
  • 0xBench : 有鑑於 Android 上的系統效能評比程式,不是不完整,就是非開放原始碼,所以我們決定重新打造一個。0xBench 可從 C 函式庫/系統呼叫的層面,一路從 Dalvik VM 評測到 Android framework,仍持續擴充,並且我們提供 Web service,允許貢獻評測的結果,用互動的方式來分析。程式主體是 Apache License 2.0 授權
  • android-toolchain : 0xlab 特製的 GNU Toolchain,以 Android team 的成果為基礎,整合來自 Linaro Toolchain Working Group 的改善。這些主要是 GNU GPLv3 授權
  • Android Open Source Project (AOSP) : 提交 0xlab 過去在 TI OMAP 與 Qualcomm 72xx 平台的一些修改,經過公開的 Review 機制,慢慢整合到 AOSP
  • CyanogenMod : 社群版本的 Android,在 Nexus One, HTC Dream 等裝置有相當優越的表現,收錄若干來自 0xlab 的改良,比方說 Bluetooth HID profile
除了以上的開放原始碼專案,我們內部正進行一個基於 Android 的新型態應用,未來也會將相關的專案程式碼,以開放原始碼的形式釋出,完整的列表可參考 0xlab Projects。至於 AOSP,我們現有更改的項目是:
  • build - 調整 Android build system、修正工具程式的瑕疵
  • bionic - 提供 ARM optimizations,針對 ARMv6/ARMv7
  • PixelFlinger - 基本的 refactoring,以及 ARM 實做的改良
  • libpng / libz - 利用 GCC visibility,進一步縮減 code size
  • elfcopy - ELF 工具的調整
  • bionic / apriori / build - 支援 DT_GNU_HASH,加快動態連結的速度
  • toolchain - 加強 build system 的彈性
以上,歡迎舊雨新知給我們支持與指教,謝謝。

read on
Posted 張貼者: jserv 於 凌晨1:47 on 2010年9月1日 星期三 | 0 意見
Filed under: , , , , , , ,
 

0xdroid 正式支援 DevKit8000 開發板

沈寂的一段時間,現在 0xdroid 又恢復活躍的開發。正如稍早在 0xlab-devel 郵件討論區提及 "Return back to open source world",我們陸續將之前開發的成果,貢獻到自由軟體的世界,環繞在 0xdroid 的項目有:

  • 對 Beagleboard 一貫的完整支援,不只是將 Android 運作起來,還要提昇整體的效能與可用性
  • 除了支援 Beagleboard 外,對 DevKit8000 也有充分的支援
  • 擴充 esuit 並整合 Android CTS (Compatibility Test Suite) 與 Sikuli,提供涵蓋 board-level, API-level, Application-specific 的自動測試框架
  • 對 Android 為基礎的系統作全面性的功能、效能,與可靠度評比,以及整合上述的自動測試框架,以驗證量化系統的品質
在 kanru 的努力與若干網友的貢獻 (hychen, Fred, itszero) 下,現在對 DevKit8000 的支援已加入到 GIT repository,以下是執行時期的照片:
(0xdroid 的桌面與 Launcher)
(調整為直式顯示,符合原本 Android 的預期輸出假設)
目前支援 Android Donut 與 Eclair,在 0xdroid 即是 beagle-donut 與 beagle-eclair,需要搭配最新的 0xlab-kernel,對 DevKit8000 週邊做出更好的支援。以下是簡要的功能特徵描述:
  • 支援 DevKit8000 特有週邊:Ethernet, LCD panel / touchscreen, keypad
  • 提供對應的使用者介面 (UI) 設定程式,包含 Ethernet 與 Touchscrren calibration UI
  • 延續之前 0xdroid 在 TI OMAP3 平台的效能改善成果
近期內我們將會釋出新的 image installer,並持續改善 TI OMAP3 平台的 Android Eclair,而在今年的 OSDC.tw 研討會上,有個針對 0xdroid 的議程,歡迎前來指教,也希望對 0xlab 一系列開放原始碼專案有興趣的朋友,可來 0xlab-devel 郵件討論區參與討論,謝謝!

read on
Posted 張貼者: jserv 於 中午12:15 on 2010年3月10日 星期三 | 1 意見
Filed under: , , , , , ,
 

在 0xdroid 充分發揮 Beagleboard/OMAP3 的硬體特性

最近 0xlab 的開發者持續改善 0xdroid,在 gitorious 的團隊排名維持在前五名的活躍程度,除了稍早提及針對 ARMv7 與底層軟體架構的改進外,0xdroid 也加入了對 Beagleboard / TI OMAP3 硬體更充分的支援。現在與多媒體處理相關的架構圖可參考以下:

紅色的部份是 Android 的 framework 層面 (Media framework, Media server),而藍色則是實做 framework 所需服務的元件 (如 OpenCore),剩下綠色的地方自然是 0xlab 關注、與硬體平台相關的元件,這裡簡要列出:

  • libaudio : 透過 ALSA 處理 Audio In/Out,針對 TI OMAP3 平台做了調整
  • libcamera : 以 V4L2 (Video For Linux) API 為基礎,提供上層 Android framework 對 camera 所需的硬體支援。透過 TI OMAP3 平台的 video overlays 作 preview 影像處理,並善用 TI DSP 的能力作 JPEG 處理
  • libopencorehw : 銜接 OpenCore,允許透過 TI OMAP3 平台的 video overlay 作高效能顯示處理
  • liboverlay : 讓 libcamera 與 libopencorehw 共用的 video overlay 操作模組
  • TI DSP / OMX : 透過 OpenMAX 標準介面,使用 TI DSP 實做的硬體多媒體 codec 運算
  • FFmpeg / OMX : 透過 OpenMAX 標準介面,使用針對 ARMv7/NEON 優化的硬體多媒體 codec 運算,這部份採納 FFmpeg 的基礎
目前上述的硬體特有的元件已有初步實做,待驗證與調整 HAL 後,就會陸續整合到 0xdroid 的公開 repository,至於開發相關的議題,可到 0xlab 的郵件討論群組 0xlab-devel 交流,謝謝。

read on
Posted 張貼者: jserv 於 下午2:38 on 2009年9月18日 星期五 | 0 意見
Filed under: , , , , ,
 

在 Beagleboard 上比較 Dalvik 與 CVM-jit 的效能

前文「對 String 操作的改進」與「Android Dalvik VM vs. Java VM」談及基於 CVM 引擎的 Java VM 與 Dalvik 的效能差異後,最近 0xlab 內部也因為挑選硬體平台,持續分析 Embedded CaffeineMark 一類量化效能的報告。參考的硬體組態是 OMAP3/ARMv7 500 MHz,粗略的效能評比如下圖:

Dalvik 取自 0xdroid (cupcake + backported from donut),而 CVM-jit 則源自 phoneME CVM svn r19264,整體分數為:

  • Dalvik VM : 1034
  • CVM + jit : 7526
CVM 的組態設定:
  • cached constant
  • cached constant inlining
  • array init bounds check elimination
  • Hardware fpu = NEON
  • AAPCS
當然 Just-In-Time compiler 不是萬靈丹,從上述效能評比可發現,CVM 在若干地方做了重要的微調,比方說透過 CNI 實做若干 class library 的關鍵 method,以及善用硬體 floating-point 操作 (注意:本組態未引入 ARMv6 與 ARMv7 的 Thumb2/Thumb-EE 指令集)。儘管 Android 團隊中 Dalvik 開發者 fadden 在郵件討論群組談及:
Four String methods -- charAt, compareTo, equals, and length -- are
"inlined" by the VM, and are not going to get much faster.

There are probably a few others that could benefit from this
treatment, but I'm guessing that most string-centric processing in
Java will likely be dominated by the cost of String allocations. (The
above weren't inlined because of a measured performance need -- the
inlining was an experiment that needed a test subject.)
Dalvik 理論上可施加這些優化技術 (string allocation / native method inlining),不過目前開放的實做中,尚未引入 (至少在 donut branch 中)。即便在保持 pure interpreter 的架構下,現有 class library 與 GC (garbage collector) 仍可作些調整,以改善 Android 的應用程式執行效能與 (圖形應用導向的) 使用者互動反應表現。

read on
Posted 張貼者: jserv 於 上午10:54 on 2009年8月25日 星期二 | 4 意見
Filed under: , , , ,
 

強化 Android 的 shell

Android 預設的 shell 就是 /system/bin/sh 這個 process,移植自 NetBSD 早期的 sh 程式,原本功能算是完整,但被 Android 開發團隊移去相當多功能,致使在 shell 下的操作苦不堪言,只好透過 adb 作遠端指令的下達,但問題是,移植 Android 的平台在初期往往缺乏有效的連線機制,又需要作些調整與嘗試,實在很不方便。所以筆者就在 0xlab 最近釋出的 0xdroid 專案上,引入來自 Busybox 的 ash 實做,試著保持相近的 footprint 的前提下,提供更多的功能。

因此,我們有以下考量:

  • 必須動態連結到 bionic libc
  • 簡化 Busybox 的實做,修改 libbb 與對應的 applet
  • 保有 bash 相容模式, Line edit, history, readline 等 Busybox 特徵
稍早,0xlab 的成員 walkingice 就做了評估與實驗,讓整個 Busybox 得以動態連結到 bionic libc 並確保功能可運作,這部份有很多 hacking,暫時不談。現在這些更動已初步提交到 system/core repository。在 0xdroid 的 beagle-cupcake branch 下,相關的 ash 設定組態如下:
  • CONFIG_ASH_BASH_COMPAT
  • CONFIG_ASH_READ_NCHARS
  • CONFIG_ASH_READ_TIMEOUT
  • CONFIG_ASH_ALIAS
  • CONFIG_ASH_GETOPTS
  • CONFIG_ASH_BUILTIN_ECHO
  • CONFIG_ASH_OPTIMIZE_FOR_SIZE
  • CONFIG_ASH_EXPAND_PRMT
佔用的磁碟空間:
[build_host]$ ls -lh system/bin/{ash,sh}
87K 2009-08-13 02:24 system/bin/ash
98K 2009-08-13 01:15 system/bin/sh
佔用的記憶體空間:
[beagleboard] # ps
USER PID PPID VSIZE RSS WCHAN PC NAME
root 1 0 300 192 c00b2394 0000ca6c S /init
root 777 1 736 324 c0057648 afe0c3fc S /system/bin/sh
root 835 777 744 356 c0057648 afe0c3fc S /system/bin/ash
可以發現,新引入的 /system/bin/ash 佔用的磁碟與記憶體空間相似,但功能完整度卻大不相同,後者允許我們回顧歷史指令並編輯, 以及在 Embedded Linux 熟悉的操作環境。目前 ash 的移植還有很多調整改進的空間,不過算是堪用了,可在 init.rc 檔案中,將預設的 shell 指定為 /system/bin/ash。

read on
Posted 張貼者: jserv 於 凌晨3:33 on 2009年8月13日 星期四 | 0 意見
Filed under: , ,
 

提供給 Beagleboard 的 Image Installer

這幾周,0xlab 的開發者都在準備新的 Android distribution,標的平台是 Beagleboard,可望在 COSCUP 到來前釋出,過程中順便寫了一個簡單易用的 Image Installer,可從 SD card 開機並將可運作的 Android system image 植入 Beagleboard 之上的 NAND flash,而不必依據繁瑣的流程,才能體驗我們的新創作。目前已有初步成果,可參見下圖:
已實做的特徵有:

  • 僅需要放置單一檔案 (uImage.bin) 到 VFAT 格式的 SD card 中,在 Beagleboard 插入 SD 開機進入 Image Installer,即有簡單俐落的 UI
  • 整個 Image Installer (kernel + busybox + file system + MTD tools + UI) 佔用不到 2Mb 的空間
  • 預設讀取 SD card 裡頭的 android_beagle.ubi 與 0xkernel-beagle.bin 兩個檔案,自動寫入 NAND flash,並設定必要的 u-boot 環境參數。放置 image 檔案的動作可在多數的作業系統平台下進行,舉凡 MS-Windows, GNU/Linux, Mac OS X 等等,只要支援 VFAT 與 SD/MMC 讀寫即可
貌似單純的 Image Installer 開發,卻折騰了好幾天,歸納有若干因素:
  • 準備在 Beagleboard/OMAP3 環境下可最小可啟動的 Linux image,需要考慮到 device driver 間的相依性,比方說若將 USB subsystem 完全移除的話,很可能無法正常開機。又,OMAP3 內建的 MFD (Multi-Function Device) 要注意到驅動順序的議題,不然功能無法正確運作
  • 要留意 TI OMAP3 / Beagleboard 啟動順序,即使 boot from SD,但 u-boot 與其 u-boot bootenv 很可能仍讀取自 NAND flash,這導致後續啟動的 Linux kernel 採用了預設值,致使 Image Installer 無法在預期的環境參數下啟動
  • ARM/Linux 啟動過程中,會試圖自一段特別的記憶體空間讀取 command line parameters,這空間稱為 ATAGS,係由 boot loader (以 Beagleboard 來說就是由 X-Loader 帶起的 u-boot) 填寫的記憶體內容,也就是所謂的 u-boot bootenv。但對 Image Installer 來說,雖然 u-boot 給予頗大的彈性,但也使得執行環境充滿不確定性
關於 ARM/Linux 的 ATAGS 實做程式碼可參考 arch/arm/boot/compressed/head.S 與 arch/arm/kernel/setup.c 兩個檔案,筆者做了簡單的 hack 以迴避:
--- android-omap.orig/arch/arm/kernel/setup.c 2009-08-08 18:40:30.000000000 +0800
+++ android-omap/arch/arm/kernel/setup.c 2009-08-08 18:43:09.000000000 +0800
@@ -613,7 +613,6 @@

static int __init parse_tag_cmdline(const struct tag *tag)
{
- strlcpy(default_command_line, tag->u.cmdline.cmdline, COMMAND_LINE_SIZE);
return 0;
}


由此可見,原本的動作是將 u-boot 對 ATAGS 寫入的資料寫入預設的 command line。至於安裝 Linux kernel image 與 root file system image 到 NAND flash 後,還得作 (NAND 裡頭的) u-boot bootenv 的編輯動作,這部份的工作原理可參考 Openmoko 開發的 Devirginator。喔,忘了說,這些惱人的限制,會在轉換到 Qi boot-loader 後迎刃而解 :)

read on
Posted 張貼者: jserv 於 晚上9:45 on 2009年8月8日 星期六 | 1 意見
Filed under: , , ,
 
Developer at 0xlab.