Email me: jollen # jollen.org

more: Jollen 的 Embedded Linux 教育訓練

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

January 2008 歸檔

January 1, 2008

2008 開工了!

新的 2008 年,「Jollen's Blog」會把重點放在「Linux kernel」與「Linux device driver」,並且也會將一些時間放在 Embedded Linux 教育訓練的課程規劃上;期待您的意見與指教。

延伸閱讀

2007.01.01: 2007 開工了!

January 8, 2008

1/8 tossug 分享活動:用中文寫 Python / 周蠎

今天 [tossug] 的分享主題是 [使用 Python 與周蟒],周蠎(zhpy)是一個可以執行中文 Python 程式的軟體,周蠎讓我們可以用中文來寫 Python 程式,真是一個有趣的主題。zhpy 的下載位址是:

http://code.google.com/p/zhpy/

現場 gasolin 展示了一個用 Python 設計的文字遊戲編輯引擎,叫做 [Ren'Py],這是一個可以製作類似角色扮演遊戲的編輯器。

最後 gasolin 也提到,Python 是去年(2007)成長速度最快的程式語言,也是目前相當受到重視的程式語言。網路上常見的「懶人包」就是利用 Python 撰寫的工具製作的,最近 Google 也在招募 Python 高手,顯見 Python 真的是一個重要的程式語言。

January 9, 2008

First Android Phone?

來自台灣的 [啟碁科技(WNC)] 在 CES 上展示一支 GSM/VoWiFi 的雙模手機,並且是採用 Linux 作業系統核心,同時,也有小道消息指出,Google Android 平臺也會移植到該手機,並且可能的時間是在今年三月,若消息屬於,WNC 將會是第一個發佈 Android 相容手機的廠商。新聞全文 [First Android phone?]。

同一時間,另一個也是開放手機平臺的 OpenMoko 也公佈 Dash Express 的消息,以及 Neo FreeRunner(GTA02)的產品規格。單純以「開放手機系統」來講的話,雖然這二個被廣為注目的開放手機產品有機會同時現身,但嚴格來講,Google Android 平臺似乎己經佔了上風,因為目前尚沒有其他廠商能夠利用 OpenMoko 平臺來生產 end-user 手機,但 Android 己經快做到了。

延伸閱讀

2007.11.09: Android 與 Gphone 觀察
2007.12.02: Google Android 採用 Apache License: 為什麼不是 GPL?

January 17, 2008

下週二的嵌入式系統大拜拜:DTF 2008 Embedded World

下週二即將舉行的 DTF 2008 Embedded World 是嵌入式系統年度的大拜拜,當天的議程相當精采,還沒報名的朋友要趕快把握機會喔!全程都是免費參加,有興趣的朋友可參考 [詳細的活動說明]。

當天的議程之一是「嵌入式系統發展機會-我們能做什麼?」,這是由教育部嵌入式軟體聯盟召集人金仲達教授所帶來的演說。[嵌入式軟體聯盟] 多年來致力於規劃嵌入式系統課程,在校園培育許多嵌入式軟體的人才。金教授的演說我想會由教育層面切入,這是一個了解目前嵌入式系統在校園紮根狀況的很好機會。

x86 架構近來在嵌入式系統應用佔用非常重要的角色,Track I 的議題針對 x86 嵌入式解決方案做介紹,也是很不錯的議題規劃。Graphics solution 一直是嵌入式系統應用的關鍵技術,許多應用都需要 graphics 的解決方案。

Track II 的議題偏向 SOC 的設計,我自己對「Natural Evolution in the embedded world」這個議程相當感興趣,這是由 ARM 公司行銷部門的經理 Tom Wang 所帶來的演說,ARM 一直是嵌入式 SOC 的領導者,這場演說必定可以吸收到許多新觀念。

Track III 的議題則是著重在嵌入式應用與服務,觸控面板在嵌入式的應用佔用重要地位,圖形化設計也是我自己很感興趣的主題。

January 20, 2008

Linux 驅動程式的 Semaphore 觀念小談

這二天在進行 Linux 驅動程式的訓練,課程裡談論到 semaphore 可以用來宣告 critical section。在作業系統所述敘的 critical section 觀念中提及,critical section 具備互斥性(mutual exclusive)與單一性(atomic)。對單一性來講,我們必須確保在 critical section 裡不會發生任何的排程(scheduling)動作,wait queue 的使用就是一個例子。Linux kernel 提供的 wait queue 可以讓驅動程式在進行 I/O polling 時,以睡覺(sleep)方式進行,以讓出系統時間;若以 busy-loop 方式進行,是不正確的做法。

所以,sleep 的動作就不能寫在 critical section 裡面,必須先做一個釋放的動作,再呼叫 wait queue 的 API 做睡覺的動作,醒來後再進入 critical section。但是,事情並沒有這麼單純,若是驅動程式的架構設計,能支援多個 minor device,就必須考慮可重覆進入的問題,這個時候,semaphore 的信號燈(semaphore variable)就要放在私有空間裡,Linux 驅動程式用 struct file 裡的 private_data 欄位來實作。對 wait queue 來講,我們也是將 wait queue 變數擺放在私有空間裡。

從互斥性的角度來講,semaphore 的使用可能是要用來保護資料,以避免資源衝突,因此將程式碼互斥。只是,kernel 所提供的睡覺 API,在真正重做排程前,還有對傳入的參數做存取,而這個參數就是擺在私有空間裡的 wait queue,於是便可能仍有同步(race condition)的問題。

January 21, 2008

OpenMoko 近況更新:Neo FreeRunner、Job Positions 與 Education

自從先前分享了 OpenMoko 的 OpenLab 活動後,己經很久沒有再跟大家更新相關消息了。在這裡一次將 OpenMoko 的近況做更新。

Neo FreeRunner

OpenMoko 在今年的 [CES 2008](美國消費性電子大展)上,正式揭露新一代產品 Neo FreeRunner。新的 Neo FreeRunner 的對象是終端消費者,並且在硬體端加入了 WiFi、motion sensor 以及 3D 處理器。Neo FreeRunner 的軟體也是基於 OpenMoko,不過以現在的軟體狀況來看,要面對真正的消費者,還需要一些時間。

OpenMoko Open Job Positions

在臺灣的朋友有福了,OpenMoko 正式提供工作機會,詳情可參考 [OpenMoko Visits and Hiring Day]。這是 OpenMoko 首次提供公開的工作機會,過去 OpenMoko 的開發者都是在 open source 社群裡找來的高手,或是透過朋友介紹。

OpenMoko Education

OpenMoko 因為開放源碼的特性,因此也很適合應用在教學或研究用途。OpenMoko 將在下學期支持幾個學校的研究計畫,並提供學生實習機會,讓學生也能在學校進行「手機軟體」的研究計畫。

延伸閱讀

2007.11.21: OpenMoko 專案介紹與 OpenLab

January 25, 2008

libusb 簡介與第一個範例

[libusb] 是一個 user-space 的 USB 程式庫,在 embedded linux 應用實作上,我們會使用 libusb 實作一個 host 端的應用程式,並透過 USB 介面存取或控制 target device。

找到所有 USB bus 與 USB device

要撰寫一支 user-space 的 USB device 控制程式,最首要的工作就是找到自己的 USB 裝置。這個工作主要透過以下 4 個函數來進行:

  • usb_init: 初始化 libusb
  • usb_find_busses: 尋找系統裡的所有 USB bus
  • usb_find_devices: 尋找所有的 USB bus 上的所有 USB device
  • usb_get_busses: 傳回找到的 USB bus

程式一開始必須先呼叫 usb_init 將 libusb 做初始化,這是 libusb 程式第一個要呼叫的函數。接著依序呼叫 usb_find_busses 與 usb_find_devices 找到所有的 USB bus 與 USB device。

最後,呼叫 usb_get_busses 取得所有找到的 USB bus。程式如下:

    usb_init();
    usb_find_busses();
    usb_find_devices();

    struct usb_bus *busses;
    busses = usb_get_busses();

*busses 指向一個串列資料結構(struct usb_bus),訪問這個串列即可找到所有的 USB 裝置。

偵測 USB 裝置

接下來,我們要在所有的 USB bus 上偵測系統是否有我們的 USB device。以下是這段程式的框架:

    struct usb_bus *bus;
    for (bus = busses; bus; bus = bus->next) {
	    struct usb_device *dev;

	    for (dev = bus->devices; dev; dev = dev->next) {
               struct usb_device_descriptor *desc;

               desc = &(dev->descriptor);
               printf("Vendor/Product ID: %04x:%04x\n", desc->idVendor, desc->idProduct);
	    }
    }

這段演算法可以將系統上所有 USB device 的 vendor id 與 product id 印出來。假如,我們想找到特定的 USB 裝置,這時就可以設計一個這樣的函數(假設我們想要找的 USB 裝置是 0xffff/0x0001):

struct usb_device *usbio_probe()
{
    struct usb_bus *busses, *bus;
    int c, i, a;

    usb_init();
    usb_find_busses();
    usb_find_devices();

    busses = usb_get_busses();

    for (bus = busses; bus; bus = bus->next) {
	struct usb_device *dev;

	for (dev = bus->devices; dev; dev = dev->next) {
	    struct usb_device_descriptor *desc;

	    desc = &(dev->descriptor);
	    printf("Vendor/Product ID: %04x:%04x\n", desc->idVendor,
		   desc->idProduct);
	    if ((desc->idVendor == 0xffff) && (desc->idProduct == 0x0001)) {
		return dev;
	    }
	}
    }

    return NULL;
}
開始操作 USB 裝置

找到我們的 USB device 後,接著就可以對它進行操作(讀/寫)。如同操作檔案般,我們要先對 USB device 做開啟的動作,方式是呼叫 usb_open 函數:

usb_dev_handle *usb_open(struct *usb_device dev);

開啟成功後,會傳回此裝置的 handle

第一個 libusb 程式

以下提供學習 libusb 的第一個範例程式:

/*
 * findusb.c - A libusb sample program.
 *
 *  Authored by Jollen Chen 
 *
 *  Copyright (C) 2008 www.jollen.org
 *  Copyright (C) 2008 Jollen's Consulting, Inc.
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU Public License as published by
 *  the Free Software Foundation; version 2 of the license.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Lesser Public License for more details.
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <usb.h>
#include <libusb.h>

void usbio_main(struct usb_device *dev)
{
    usb_dev_handle *dev_handle;

    dev_handle = usb_open(dev);

    if (dev_handle == NULL) {
	printf("USB IO open failed.\n");
	return;
    }

    usb_close(dev_handle);
}

struct usb_device *usbio_probe()
{
    struct usb_bus *busses, *bus;
    int c, i, a;

    usb_init();
    usb_find_busses();
    usb_find_devices();

    busses = usb_get_busses();

    for (bus = busses; bus; bus = bus->next) {
	struct usb_device *dev;

	for (dev = bus->devices; dev; dev = dev->next) {
	    struct usb_device_descriptor *desc;

	    desc = &(dev->descriptor);
	    printf("Vendor/Product ID: %04x:%04x\n", desc->idVendor,
		   desc->idProduct);
	    if ((desc->idVendor == 0xffff) && (desc->idProduct == 0x0001)) {
		return dev;
	    }
	}
    }

    return NULL;
}

int main()
{
    struct usb_device *dev;
    struct usb_device_descriptor *desc;

    dev = usbio_probe();
    desc = &(dev->descriptor);

    if (dev == NULL) {
	printf("USB IO Card not found.\n");
	return -1;
    }

    printf("SUB IO Card found.\n");
    printf("Vendor/Product ID: %04x:%04x\n", desc->idVendor,
	   desc->idProduct);

    usbio_main(dev);
}

檔案可由 [http://tw.jollen.org/findusb/] 下載。這裡提供一個 Makefile 檔案;編譯時,請記得安裝 libusb 並與 libusb 做連結。

網路資源

* libusb API 文件. http://libusb.sourceforge.net/doc/

January 29, 2008

Nokia 收購 Trolltech

今天來自 linuxdevices.com 上的一則消息 [Nokia to acquire Trolltech for $150 million] 表示,Nokia 將以 1.5 億美金的代價收購 [Trolltech] 公司。Trolltech 是一家知名的跨平臺 GUI 軟體製造商,同時也在 Linux 手機領域中享有盛名。

Symbian 是一家獨立的手機軟體公司,Nokia 擁有將近五成(47.9%)的持股,Nokia 過去大多以 [symbian] 作業系統來製造手機,近年來也有少量使用 Linux 的產品問世。Trolltech 的 Qtopia 產品是專門針對行動與嵌入式裝置所開發的 application platform 與 UI,Qtopia 能夠支援 Linux 與 Windows CE 平臺,並且能讓製造廠完整客製化 UI。

Nokia 在收購 Trolltech 後,將會持續開發 Trolltech 的產品線,並且也會持續保持授權的商業模式。原有的手機製造商,以及有意願採用 Qtopia 的新客戶,都能向 Trolltech 取得商業授權。此外,可以預料的是,Qt 以及 Qtopia 也將能支援 Symbian 平臺,未來搭載 Symbian 作業系統的智慧型手機,都會有更棒的 UI。

Nokia 在行動裝置軟體以及桌面應用軟體採取跨平臺的策略,在收購 Trolltech 後,將可以加速此項策略的推行;同時,可以預期 Nokia 將會製造更多 Linux 平臺的手機。過去 Nokia 在 Linux 平臺的努力有目共睹,[maemo] 專案以 Linux 以及 GTK+ 打造的 maemo SDK 已成為知名的 Linux 開放源碼專案,maemo 的開發者社群也相當熱絡,Nokia 的 [N800] 就是採用 maemo 平臺所開發的產品 。

關於 January 2008

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

前一個存檔 December 2007

後一個存檔 February 2008

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

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