Email me: jollen # jollen.org

more: Jollen 的 Embedded Linux 教育訓練

« April 2007 | (回到Blog入口) | June 2007 »

May 2007 歸檔

May 2, 2007

Neo1973 份量夠,但樂趣足!

今天在閱讀 OpenMoko 的 mailing-list 時,讀到一篇有趣的文章 [Size and weight considerations for future Openmoko devices]。驚!社群上的朋友 Sven Neuhaus 將 Neo1973 /iPhone/M600i/LG Prada 做了個比較,不過對照項目並非功能面或是作業系統,而是針對裝置的大小與重量做比較,還挺有趣的。結果如下:

             Neo1973  iPhone   M600i   LG Prada
length (mm)   120.7    115      107     98.8
width         62       61       57      54
height        18.5     11.6     15      12
weight (g)    184      135      112     85
screen (inch) 2.8      3.5      2.6     3.0

作者提到,Neo1973 在大小與尺寸上都是相對較大較重的,不過由於目前 OpenMoko 釋出的手機都是「開發機」,所以當然未來一定會在這個部份做改進的;LG Prada 似乎是最近頗熱門的手機,一推出就 touching women's heart,而且「Pra*a」的品牌魅力好像也頗為驚人。

文中提及,Neo1973 在重量與厚度,幾乎是 LG Prada 的二倍,所以作者說「When designing future models, I'd really like to see something light and small (but still with a touchscreen).」;當然,以目前的硬體製造能力來說,這是能解決的問題。

後續的回應也都提到目前的 Neo1973 開發機都太重太厚,看來「輕」與「薄」會是手機的重要 feature;話說回來,以開發機來說,「輕、薄」不是重點,畢竟「樂趣」才是目前我們想要在這台機器上得到的東西!

May 3, 2007

Linux 2.6.21 報馬仔

Linux 2.6.21 於二個星期前(25 April, 2007)正式釋出,詳細更新可參考 [ChangeLog-2.6.21] ;Linux 2.6.15 後,每一次的正式版本都更新了相當多東西。觀察近年來 kernel 及相關應用的發展趨勢,注意到了一些現象,這些「異象」意謂著 Linux kernel 的發展正進入所謂的「壯年期」,同時也說明了 Linux kernel community 及 Linux ecosystem 正快速的進步與演化。

雖然 Linux 2.6.21 早在二星期前就釋出,不過近期業務繁忙,一直到這幾天才能安排這項工作。

本次更新包含了以下幾個與我有關,或是較感興趣的項目:

1. VMI 驅動程式如果先前所提到的消息,已正式加入 kernel。

2. 值得注意的是,KVM 驅動程式也加入了 "paravirtualized" 的支援,"paravirtualized KVM" 驅動程式在 context-switch 的效能上有相當大的改進。此部份可參考 LKML 裡的原文:[[announce] [patch] KVM paravirtualization for Linux]。

3. "devres" subsystem 的更新,讓我們在撰寫驅動程式時,更容易 allocation / map "resource",例如:IRQ request、memory mapped I/O 等;devres 簡化驅動程式的 resource allocation / map 程式碼,詳細介紹可參考 [The managed resource API]。

4. Embedded Linux 的應用經常需要撰寫 GPIO 相關的驅動程式,現在 Linux 2.6.21 加入了 GPIO API 的支援。

5. ARM 的部份,加入了 Samsung s3c2443 的 SOC 支援

6. 此外,知名的 Samsung s3c2410 clone 'QT2410' 也正式加入至 Linux 2.6.21;另人有點小驚訝的是,這個 patch 是由 OpenMoko 所貢獻的實作:

1 /* linux/arch/arm/mach-s3c2410/mach-qt2410.c
2  *
3  * Copyright (C) 2006 by OpenMoko, Inc.
4  * Author: Harald Welte <laforge@openmoko.org>
5  * All rights reserved.
6  *
...

延伸閱讀

2007.03.29: Kernel 2.6.21 將正式加入 VMI(Virtual Machine Interface)

2006.10.19: Kernel 2.6 的 KVM (Kernel Virtual Machine) 驅動程式來了

May 8, 2007

Ubuntu Mobile and Embedded

方才在 OpenMoko 的 community mailing-list 上看到一則 post,標題是:

Ubuntu Mobile and Embedded

原來,二天前在 ubuntu-devel-announce maling list 上出現了一則 post,全文詳 [Ubuntu Mobile and Embedded Edition]。雖然還沒有正式的消息,不過,「Mobile and Embedded」可望再加入一個強而有力的大型 community 的支援。

Ubuntu 也開始參與 Mobile and Embedded 的 Linux distribution 製作,如果「Ubuntu Mobile and Embedded Edition」的 project 能順利,未來可望結合一些 Linux mobile framework,推出標準且好用的 Linux distro。根據 post 的內文了解,第一個釋出版本會是在今天的 10 月份,引述一段全文如下:

We will start more detailed planning at the Ubuntu Developer Summit next week in Seville and the first release of this edition will be in October with Ubuntu 7.10. If you are interested in the project, please get involved. We will be working through our normal development processes on Launchpad, the developer mailing lists and IRC.

有興趣的朋友,可透過 mailinst list 與 IRC 與此 project 保持同步。

May 11, 2007

Ubuntu Mobile and Embedded 後續報導

繼前一則日記「Ubuntu Mobile and Embedded」紀錄了 Ubuntu 將發展 "Mobile and Embedded" 的 Linux distrio 專案後,後續追蹤 LinuxDevices.com 上的二則新聞如下:

- Ubuntu eyes mobile Linux devices

「The Ubuntu Mobile and Embedded Project」將在今年 10 月份與 Ubuntu 7.10 同步推出 Mobile and Emedded 的 Linux distro,但是這個特殊版本並非是要給 Linux mobile phone 使用,可參考另一則相關報導:

- Ubuntu Mobile to target MIDs, not phones

引述一段該報導如下:

Contrary to widespread rumors, Ubuntu Mobile will not target mobile phones. Instead, the "mobile and embedded" version of the popular desktop Linux distribution will be developed in partnership with Intel, and will target "mobile Internet devices" (MIDs), along the lines of Nokia's N800 web tablet.

MID(Mobile Innteret Devices)概念與先前 Intel 所提的 UMPC 相近;目前,據該報導所描述,Ubuntu Mobile and Embedded 將會與 Intel 合作,並率先針對 Nokia N800 web tablet 產品線做推展。

struct map_desc 與抽象化程式碼小談

前日與客戶進行 Linux device driver 教育訓練時,簡單討論到有關 JK2410 的 IO memory layout 描述方式。在 linux 2.6.20.x 的 BSP 實作中,kernel 提供用來描述 board-level(machine)IO mapping 的資料結構稱為 'struct map_desc',其定義如下:

1 /*
2  *  linux/include/asm-arm/map.h
3  *
4  *  Copyright (C) 1999-2000 Russell King
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  *  Page table mapping constructs and function prototypes
11  */
12 struct map_desc {
13         unsigned long virtual;
14         unsigned long pfn;
15         unsigned long length;
16         unsigned int type;
17 };
18 
19 #define MT_DEVICE               0
20 #define MT_CACHECLEAN           1
21 #define MT_MINICLEAN            2
22 #define MT_LOW_VECTORS          3
23 #define MT_HIGH_VECTORS         4
24 #define MT_MEMORY               5
25 #define MT_ROM                  6
26 #define MT_IXP2000_DEVICE       7
27 #define MT_NONSHARED_DEVICE     8
28 
29 #ifdef CONFIG_MMU
30 extern void iotable_init(struct map_desc *, int);
31 #else
32 #define iotable_init(map,num)   do { } while (0)
33 #endif
34 

這是一個非常「輕薄」的設計,以 Jollen-Kit! Pro. 開發板來說,我的實作程式碼如下:

diff -Naur linux-2.6.20.4_orig/arch/arm/mach-s3c2410/mach-smdk2410.c linux-2.6.20.4/arch/arm/mach-s3c2410/mach-smdk2410.c
--- linux-2.6.20.4_orig/arch/arm/mach-s3c2410/mach-smdk2410.c	2007-03-24 03:52:51.000000000 +0800
+++ linux-2.6.20.4/arch/arm/mach-s3c2410/mach-smdk2410.c	2007-04-04 17:48:05.000000000 +0800
@@ -55,7 +55,13 @@
 #include "common-smdk.h"
 
 static struct map_desc smdk2410_iodesc[] __initdata = {
-  /* nothing here yet */
+    /* ISA IO Space mapping for CS8900. Memory space is selected by A24. */
+        {
+                .virtual        = 0xd0000000,
+                .pfn            = S3C24XX_PA_CS8900,
+                .length         = 0x00100000,
+                .type           = MT_DEVICE,
+        }
 };

程式碼簡單乾淨,這能讓不懂 kernel 的硬體開發人員也能快速上手維護。這讓我們了解到,一些「抽象」設計的 kernel 程式碼,雖然在某個程度來說,會讓 developer 多花一些時間才能 trace 到底層,但卻能適度提供硬體開發人員一些彈性空間。例如,不需要懂 kernel 的硬體工程師,也能有自行修改 IO mapping 設定的能力。

附帶一提,S3C24XX_PA_CS8900 是 IO memory 的實體位址(physical address)。

Embedded Device 等於 PC

就現代的硬體來說,embedded device 和 PC 的界線是越來越小了,雖然有時參與的 project 是 'embedded device',但是技術本質上就好像在做 PC 一樣。本週二參加 tossug 的心得分享,主辦單位邀請到 OpenMoko 來演講,而在整個活動的過程中,也多少透露了這個重要的技術轉變概念;[魔法設計師] 在他的 blog 也提到這點,全文可參考 [OrzLab] 的轉載

這幾天持續關注 Ubuntu Mobile and Embedded 專案的新聞,很湊巧,在 OpenMoko 的 mailing list 裡看到一則 Ubuntu 專案成員所回覆的訊息,全文轉貼如下:

============ cut ============
On 5/9/07, Vincent *** wrote:
> I just read this: http://www.linuxdevices.com/news/NS2403415870.html
> Contrary to widespread rumors, Ubuntu Mobile will not target mobile phones. Instead, the "mobile and embedded" version of the popular desktop Linux distribution will be developed in partnership with Intel, and will target "mobile Internet devices" (MIDs), along the lines of Nokia's N800 web tablet.

As a member of the Ubuntu project, I can confidently say that the
embedded space is one of the key targets since 3 releases ago, but on
what area of embedded, we haven't really tackled in detail
. The most
realistic that we could probably deliver by October of this year, is
have it running very smoothly on Intel's Classmate PC (some of the
Edubuntu people have actually made it happen already) or similar
devices
.

Best,

Jerome Gotangco
============ end ============

重要的概念部份,我用了粗體字標示。所以說,MID 就是 PC ;-0

May 15, 2007

Embedded Linux 應用的痛處: OpenEmbedded

日前與 [jserv] 兄聊天時談論到 OpenMoko 的 build system,我們都一致覺得基於 OpenEmbedded 的 OpenMoko build system 太過於複雜,雖然 OpenEmbedded 目前是一套頗流行的 meta data build system,但是對一些想要了解 OpenMoko 的朋友來說,這反而是一個無形的門檻。

今天在 [OrzLab] 上看到 jserv 將 OpenEmbedded 的 'repository' 轉成 Subversion 系統的做法,全文可參閱 [轉換OpenEmbedded的repository為Subversion系統]。OpenEmbedded 原本採用的是 [monotone] 版本管理系統,現在將 OpenEmbedded 的版本管理系統轉換成 SVN 後,就可以延續以往 SVN 的使用經驗來降低入門難度,並實現一些分支管理的需求。

關於分支管理方面,有一個小小的問題。OpenEmbedded 以 [bitbake] 為基礎,建構了一套「彈性相當高」的 meta data build system,因此,我們可以針對自己的需求,用力修改 OpenEmbedded 的 bb file,特別是對 deploy 的方式做調整。如果我們對 OpenEmbedded 的 *.bb 做了客製化修改,也做了一套自己的分支,那麼要怎麼跟 upstream 的更新做合併(同步)呢?

客製化的 OpenEmbedded 要怎麼與 upstream 的 OpenEmbedded 做合併(同步),針對這個問題,jserv 兄採用 SVN 與 SVK 來進行。如此一來,透過「合併」的方式便解決了如何同步「分支」與「upstream」的問題。Embedded Linux 經常需要做分支(branch)的開發,SVN/SVK 解決了許多「管理面」的問題,這部份可參考 OrzLab 的介紹 [SVK與嵌入式系統開發]。

回到 OpenEmbedded 與 OpenMoko 的議題。OpenEmbedded 的目標是針對常見的 FOSS 套件編寫 metadata(即 bb file),完整的 OpenEmbedded 已經收錄超過 4000 個套件了。但是 OpenMoko framework 只使用到 OpenEmbedded 裡頭大約 30 個套件而己。

對於做出一個專給 OpenMoko 使用的 OpenEmbedded 分支來說,第一個工作便是對 OpenEmbedded 的 repository 進行瘦身簡化的工作。許多套件並未包含在 OpenMoko framework 裡,因此需要將不用的部份移除;這個「簡化」的工作實行上並不算太難。

只是,當我們後續維護此分支時,需要不定期與 upstream 做合併,原本採用 monotone 的 OpenEmbedded 在這個地方又要讓 Embedded Linux 開發者抱頭痛哭了。還好,將 OpenEmbedded 的版本管理系統轉換成 Subversion 後,一切的工作突然變得簡單許多。

不過,在教育訓練的經驗裡讓我知道,這樣的 build system 對入門者而言仍然是一個大門檻;因此,提供一個彈性較低,但使用上較簡單的環境,將會是一個重要的工作。日後再將這個部份做整理分享。

May 20, 2007

無痛入門:OpenMoko Toolchain

接續幾天提到的「Embedded Linux 應用的痛處: OpenEmbedded」。對初入門的使用者或是學生來說,比較好的方法就是儘量提供一個使用簡便的開發環境,才能降低 Embedded Linux 開發的「恐懼感」。

針對 OpenMoko 的開發應用來說,目前我初步提供一個簡單的解決方案,大致概念如下:

- 希望可以 build applications,而不是 build the 'system'。
- OpenMoko framework 本身以原始碼形式提供,因為這是 OpenMoko 的核心,並且我們也會經常修改程式碼。
- OpenMoko 的 architecture 部份,除了 OpenMoko framework 本身外,其它的 library、dependencies library 以及相關的 infrastructure(例如 sysvinit、busybox 等),以 binary 形式提供。
- 如上,可略過 OpenEmbedded 的 build 程序。
- 由此可知,重點在於 toolchain 的建立。

以下大略展示一下此環境的操作。首先,是「OpenMoko-toolchain」的部份:

-rw-r--r-- 1 jollen jollen 119555927 2007-05-17 21:05 openmoko-toolchain-20070517.tar.bz2

這個概念相當簡單:我為大家事先建立了 'openmoko-toolchain',因此,想要在 OpenMoko framework 上發展應用的同學,只需要事先安裝此 toolchain;接著,再將 OpenMoko 本身利用此 toolchain 做編譯(cross-compile)即可。整個過程,能呈現出以往我們所熟悉的「Hello, World!」編譯觀念,對使用者來說,是非常直覺的。

再來,準備好要進行編譯的 OpenMoko framework:

openmoko-toolchain-1.JPG

執行後,先喝杯咖啡,因為需要一點點時間才能完成編譯。

不過,這種方式還有幾個小問題,需要再花點時間解決:

- 利用 openmoko-toolchain 來編譯 OpenMoko framework,犧牲了許多彈性。
- 後續最重要的 deploy 工作,需要一個自動化的 script,由 openmok-toolchain 將大量的 library 佈署至 root filesystem。

以下是編譯完成的 'libmokoui':

openmoko-toolchain-2.JPG


提供 openmoko-toolchain 的目的是希望能打造一個「無痛入門」的環境;在 OpenEmbedded 提供 'OpenMoko Distribution' 前,應該可以透過這個環境,提供一個輕鬆的入門環境。

May 24, 2007

開放原碼架構設計:D-BUS 觀念小談

近期以來,因為工作上的需求,花費許多時間在開放原碼的架構設計上;最近已經將相關的作業都準備的差不多了,我想,可以跟大家分享一些架構設計的小觀念。

首先,先由 [D-BUS] 介紹起。使用 D-Bus 來取代傳統的 IPC,並與外部工具(eg. mjpegtools)做整合。

D-BUS 本身屬於 low-level 的 library(libdbus),實務上,我採用了 glib binding 來實作程式,以簡化工作:

http://dbus.freedesktop.org/doc/dbus-glib/index.html

D-BUS 是一種 'message bus',未來將取代傳統 IPC 的使用。傳統 IPC 實作,必須將程式架構成 monolithic process,因此在 process 的行為控制,以及 application 間的整合上,都很一定的難度,非常不易於實作「系統」。

引進 D-BUS 技術後,傳統的 monolithic process 被區分為「pieces of D-BUS services」,每個服務,都可以透過「D-BUS patch」來尋找並叫用(invoke);透過 D-BUS 所建立的框架(framework)或是架構,解決了以往難以整合各種應用程式的困境。此外,D-BUS 目前也透過 kobject 與 kernel 做整合,如此一來,D-BUS 便能輕易整合 kernel、application 與 desktop,真正解決以往「系統整合」所遇到的障礙。

例如,如何實作「按鍵觸發應用程式」的系統?

傳統的做法,會讓程式設計師進入「不斷使用 low-level C API 來 try-and-error」的可怕輪迴,但是使用 D-BUS 的架構後,我們只要修改 device driver,將按鍵的動作透過 kobject event layer 傳送(經由 netlink socket)給 D-BUS 即可,D-BUS 會根據我們所定義的路徑,來叫用 application。

D-BUS 所提供的 message bus 分為二種:

* system bus
* local bus

System bus 最大的用途便是整合 kernel 與 application;local bus 為 session bus,即訊息的傳遞只限於該 session。

來源: www.jollen.org

May 25, 2007

開放原碼架構設計:Glib 小談 (1)

前言

就程式碼內部的組織來說,以往我們經常重新定義一些基本的東西,並透過這些 're-defidition' 的巨集或函數(亦稱為 wrapper function)來撰寫程式。有時,也能透過重新定義的方式,將框架(framework)的實作隱藏起來。這種技巧,大量被應用在許多軟體專案中。

Glib 小談

Glib 是 GTK+ 計畫下的「副產品」,Glib 原本主要是給 GTK+ 與 GNOME 使用,不過,現在也有越來越多的應用程式開始使用 Glib 來開發軟體。Glib 就本質來看,他提供一套重新定義過的 data type、event loop 框架、thread 框架、以及物件(object)系統。

Glib 以一種「宏觀」的方式,提供 C 語言一套高度可攜性、簡單易學且通用的工具庫(toolkit)。由於 Glib 實在太優異了,除了 GTK+ 與 GNOME 本身外,也有非常多的 Free / Open Source Software 也開始採用 Glib 來開發軟體。

Glib 主要提供的內容,以及使用 Glib 來撰寫程式時需要具備的核心觀念,簡單說明如下。

Data Type

Glib 提供一組簡單易用且可攜性佳的 data type 定義。例如,我們想要擺放身高的資料,那麼傳統的 ANSI C 會以 unsigned int 來宣告變數;但是,改用 Glib 來做的話,就要改用 guint 這個由 glib 提供的 data type 來宣告變數。

以 guint 來說,Glib 的內部實作為:

typedef unsigned int	guint;

雖然 Glib 仍以 ANSI C 的 data type 來定義 guint,但提供了高度可攜的 data type。

Event Loop

以前,如果您要規劃一套以事件驅動(event-driven)為主的應用程式框架(application framework),在 event loop 的設計上常會遭遇到許多困難;我想,對 Linux system programming 有經驗的朋友,也一定曾遇過「如何與硬體事件整合」的麻煩題目。

Event loop 的程式架構往往「長的很像」,所以我們以前常會思考,是否能寫出一套「萬用」的 event loop 框架;以後,只要是撰寫事件驅動程應用程式,就照著套用就好了!

Glib 把這個想法實現了。對於「core application」的支援,Glib 不僅提供一套宏觀且通用的 event loop 定義,連其他好用的技術也都一併定義完成了。

我們在規劃程式的核心架構時,經常使用的技術也都有包含在 Glib 的支援裡。除了 Event Loop 外,還包含:

  • Threads
  • Dynamic Loading of Modules,也就是 plug-ins 的功能。
  • Memory Allocation
  • IO Channels,也就是檔案、pipes 與 sockets 的功能。
  • Message Output and Debugging Functions,常常用 printf() 在做除錯嗎?Glib 也定義了一組通用的介面!
  • Message Logging

天啊!真是太好了,Glib 把以前常用的技術都「提出共通的部份」,讓我們更容易寫程式。

Threads

POSIX thread(亦稱為 pthread)是重要的 Linux user-space thread 函數庫,雖然 pthread 並無法做到所謂的「效能提昇」,但是因為 application framework 規劃的需要,因此還是被大量採用。以往,有鑑於 thread 的產生與管理經常都是「差不多」的程式碼,因此我也會定義一組屬於自己的 thread 通用 API,大部份都是以 macro 形式來定義。Glib 也提供一組彈性相當好、高度可移植且容易使用的 thread 介面,透過 Glib 的定義來實作 multi-threaded application 不但簡單,而且也很容易管理所有的 thread。 《待續》

來源: www.jollen.org

May 30, 2007

週三的 stack-based coroutine 範例

週三至工研院進行教育訓練,其中提到了「Linux pthread」的議題,並透過作業系統的觀念(sys_fork),簡單分析了一下為何 Linux pthread 是「bad」。在講解過程中,展示了一個 video surveillance 的應用程式,說明如何改用 event-driven / event-loop / feedback scheduling 的方式來取代傳統的 multi-threaded 架構。

此外,也提到 co-routine(協同式多工)的概念,建議可先行閱讀 [jserv] 兄的「使用 coroutine 實做 user-level thread」。

只以程式語言的技巧,來實作「多工」是一種很有用的做法,課程中,撰寫了一個「stack-based coroutine」的簡單實例,程式碼如下:

#include <stdio.h>
#include <pthread.h>

int count = 0;
int state = 0;

#define CHECK_POINT      \
if (count > 3) { \
   count = 0; \
   state = 1; \
   return; \
}

int foo(void)
{
   static unsigned int i;

   switch (state) {
        case 0: goto L0;
        case 1: goto L1;
   }
L0: /* start of function */
   i = 0;

   while (1) {
      i++;
      CHECK_POINT;
L1:
      printf("i = %d\n", i);
      if (i == 30) break;
      sleep(1);
   }

   printf("---------- foo exits ------------\n");
   state = 0;
   return 0;
}

void *counter(void *p)
{
   while (1) {
      count++;
      sleep(1);
   }
}

int main(void)
{
   pthread_t tid;
   pthread_create(&tid, NULL, &counter, NULL);

   count = 0;
   state = 0;

   while (1) {
      foo();
      printf("Enter event looping ...\n");
   };
}

Stack-based coroutine 是一種基於「function call」的「交錯執行」做法,最大的用途是,我們可以在「event handler」裡埋入「check point」,以達到「協同式」多工的效果。

以下是執行結果:
$ ./co
i = 1
i = 2
i = 3
i = 4
Enter event looping ...
i = 5
i = 6
i = 7
i = 8
Enter event looping ...
i = 9
i = 10
...
Enter event looping ...
i = 29
i = 30
---------- foo exits ------------
Enter event looping ...
i = 1
i = 2
i = 3
Enter event looping ...
i = 4
非常有趣 ;-)

關於 May 2007

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

前一個存檔 April 2007

後一個存檔 June 2007

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

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