tag:blogger.com,1999:blog-73531554722916913702024-02-21T13:29:07.594+08:00csl's blogResearch for Linux, Linux Kernel/Driver, Open Source, Embedded systemcslhttp://www.blogger.com/profile/06630784623165312568noreply@blogger.comBlogger28125tag:blogger.com,1999:blog-7353155472291691370.post-47795958988728792562014-09-25T09:12:00.001+08:002014-09-25T09:15:42.197+08:00Linux Device Drivers & Kernel<h3 class='post-title entry-title' itemprop='name'>
動手寫 Linux Driver
</h3>
<div class='post-header'>
<div class='post-header-line-1'></div>
</div>
<div class='post-body entry-content' id='post-body-8649741945819627502' itemprop='description articleBody'>
在 Linux 作業系統上寫一個控制I2C<br />
<br />
<h3>
建構編譯環境</h3>
<br />
首<span style="font-family: inherit;">先我們必須要準備開發 Linux 驅動程式所需的環境,在 Debian 上可以用以下的指令達到這個目的:</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">$ sudo apt-get install build-essential linux-headers-$(uname -r)</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">其中 build-essential 會安裝 gcc, make 等軟體開發必要的工具,而 linux-headers 會安裝開發 Linux 驅動程式必要的 SDK。因為 linux-headers 會隨核心的版本而有所不同,所以我們要使用 $(uname </span>-r) 取得目前核心的版本。<br />
<br />
<h3>
簡單的驅動程式</h3>
<br />
所有的 Linux 驅動程式至少要包含一個 MODULE_LICENSE 用以宣告驅動程式的授權,另外還需要一個 init 與一個 exit 函式,分別處理驅動程式的起始與終止。以下就是一個什麼都沒有的空殼:<br />
<br />
/* example.c */<br />
#include <linux/init.h><br />
#include <linux/module.h><br />
<br />
MODULE_LICENSE("Dual BSD/GPL");<br />
<br />
static int example_init(void) {<br />
printk("<1>EXAMPLE: init\n");<br />
return 0;<br />
}<br />
<br />
static void example_exit(void) {<br />
printk("<1>EXAMPLE: exit\n");<br />
}<br />
<br />
module_init(example_init);<br />
module_exit(example_exit);<br />
<br />
我們可以注意到裡面有一個 printk,他就相當於驅動程式設計當中的 printf。我們如果需要印任何除錯資訊,可以呼叫 printk,然後使用 sudo dmesg 觀看結果。編譯這個檔案之前,我們要先幫他寫 Makefile:<br />
<br />
obj-m := example.o<br />
<br />
ifeq ($(KERNELDIR),)<br />
KERNELDIR=/lib/modules/$(shell uname -r)/build<br />
endif<br />
<br />
all:<br />
make -C $(KERNELDIR) M=$(PWD) modules<br />
<br />
clean:<br />
make -C $(KERNELDIR) M=$(PWD) clean<br />
<br />
在這個 Makefile 裡面,我們會使用 obj-m 這個變數指定我們要編譯的模組,然後再呼叫 make 讓他載入 SDK 的 Makefile。我們先前安裝的 SDK 就會放在 /lib/modules/$(shell uname -r)/build 裡面。<br />
<br />
接下來我們就可以用 make 編譯我們的模組,並使用以下指令載入、卸除模組:<br />
<br />
$ sudo insmod ./example.ko<br />
$ sudo rmmod example<br />
<br />
如果要看我們的模組有沒有輸出任何訊息,可以使用:<br />
<br />
$ sudo dmesg | tail<br />
<br />
<h3>
註冊為 Character Device</h3>
<br />
在 Unix 的設計哲學當中,所有的東西都是檔案,硬體也不例外。我們寫驅動程式的時候要提供一個檔案操作的介面給 Userspace 的程式。為了達到這個目的,我們必須再引入一個標頭檔:<br />
<br />
#include <linux/fs.h><br />
<br />
然後定義若干檔案操作與 file_operations 這個資料結構:<br />
<br />
static int example_open(struct inode *inode, struct file *filp) {<br />
printk("<1>EXAMPLE: open\n");<br />
return 0;<br />
}<br />
<br />
static int example_close(struct inode *inode, struct file *filp) {<br />
printk("<1>EXAMPLE: close\n");<br />
return 0;<br />
}<br />
<br />
static ssize_t example_read(struct file *filp, char *buf, size_t size, loff_t *f_pos) {<br />
printk("<1>EXAMPLE: read (size=%zu)\n", size);<br />
return 0;<br />
}<br />
<br />
static ssize_t example_write(struct file *filp, const char *buf, size_t size, loff_t *f_pos) {<br />
printk("<1>EXAMPLE: write (size=%zu)\n", size);<br />
return size;<br />
}<br />
<br />
static struct file_operations example_fops = {<br />
.open = example_open,<br />
.release = example_close,<br />
.read = example_read,<br />
.write = example_write,<br />
};<br />
<br />
然後在 example_init() 當中用 register_chrdev 把這個驅動程式註冊為一個 Character Device。<br />
<br />
#define EXAMPLE_MAJOR 60<br />
#define EXAMPLE_NAME "example"<br />
<br />
static int example_init(void) {<br />
int result;<br />
printk("<1>EXAMPLE: init\n");<br />
<br />
/* Register character device */<br />
result = register_chrdev(EXAMPLE_MAJOR, EXAMPLE_NAME, &example_fops);<br />
if (result < 0) {<br />
printk("<1>EXAMPLE: Failed to register character device\n");<br />
return result;<br />
}<br />
<br />
return 0;<br />
}<br />
<br />
值得一提的是第一個參數 EXAMPLE_MAJOR 可以是 60, 61, 62。如果是正式要釋出的 Driver,就必須要從 <a href="http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=blob_plain;f=Documentation/devices.txt">Documentation/devices.txt</a> 選取適當的 Major ID。當然,在 example_exit() 我們也必需加上對應的 unregister:<br />
<br />
static void example_exit(void) {<br />
printk("<1>EXAMPLE: exit\n");<br />
<br />
/* Unregister character device */<br />
unregister_chrdev(EXAMPLE_MAJOR, EXAMPLE_NAME);<br />
}<br />
<br />
在重新編譯之後,我們可以用 insmod 載入驅動程式,然後使用 mknod 建立 Device File。然後我們就可以在 User Space 使用一般的檔案讀寫操作這個 Device。<br />
<br />
$ sudo insmod ./example.ko<br />
<br />
$ sudo mknod /dev/example c 60 0<br />
# /dev/example 是我們要存放檔案的路徑,c 代表 Character Device,60 是這個驅動程式的 Major ID,0 是驅動程式的 Minor ID。<br />
<br />
$ sudo chmod 666 /dev/example<br />
# 為了方便測試,我們把這個 Device 改成所有人都可以讀寫。<br />
<br />
$ echo -n 'abcd' > /dev/example<br />
<br />
$ sudo dmesg | tail<br />
<br />
<h3>
讀取 User Space 的資料</h3>
<br />
在前一節當中我們提供了一個 API 讓 User Space 可以操作 Driver。但是其實我們是不能直接存取 buf 的內容。因為 Kernel Space 與 User Space 有不同的位址空間,所以不能直接存取他們。我們必須借助 copy_from_user 這個 API。<br />
<br />
在使用這個 API 之前,我們必需引入 <asm/uaccess.h>:<br />
<br />
#include <asm/uaccess.h><br />
<br />
然後我們就可以使用 copy_from_user 來存取 User Space 的位址空間,舉例來說:<br />
<br />
ssize_t example_write(struct file *filp, const char *buf, size_t size, loff_t *f_pos) {<br />
size_t pos;<br />
uint8_t byte;<br />
printk("<1>EXAMPLE: write (size=%zu)\n", size);<br />
for (pos = 0; pos < size; ++pos) {<br />
if (copy_from_user(&byte, buf + pos, 1) != 0) {<br />
break;<br />
}<br />
printk("<1>EXAMPLE: write (buf[%zu] = %02x)\n", pos, (unsigned)byte);<br />
}<br />
return pos;<br />
}<br />
<br />
值得注意的是 copy_from_user() 會回傳剩下未完成的 byte 數。所以一般來說這個回傳值必須是 0 才是成功地讀入資料。要把資料從 Kernel Space 複製到 User Space 則是使用 copy_to_user() 函式,至於使用方法就不再贅述。<br />
<br />
$ echo -n 'abcd' > /dev/example<br />
$ sudo dmesg | tail <br />cslhttp://www.blogger.com/profile/06630784623165312568noreply@blogger.com0tag:blogger.com,1999:blog-7353155472291691370.post-6628767395261699682012-07-05T15:11:00.001+08:002014-09-25T09:16:52.391+08:00準備release android app這兩年寫了不少Android app,
一直想整理放到market,
但因為時間關係沒空整理,
等這幾天決定要將code release出來,
會先放到github上,
希望有人有興趣能幫忙改,
接下來要做的是Android一些分析。
https://github.com/csl
可參考以上目前專案cslhttp://www.blogger.com/profile/06630784623165312568noreply@blogger.com16tag:blogger.com,1999:blog-7353155472291691370.post-70457085825028779692011-09-08T14:37:00.008+08:002011-09-08T15:56:18.785+08:00timer using msleep最近在改之前寫的slic driver,在送DTMF tone的時候會發生crash,如下:<br /><br /><code>To send DTMF CID sequence [A11111CR]<br />POL_FORWARD <br />getOffhook = 0<br />Freq1 : 13990 <br />Freq2 : 4657 <br />BUG: scheduling while atomic: ash/0x00000100/2020<br />Call Trace:<br />[<800074cc>] dump_stack+0x8/0x34<br />[<80219a04>] schedule+0x778/0x920<br />[<8021a7c4>] schedule_timeout+0x70/0xdc<br />[<80030a18>] msleep+0x24/0x34<br />[<c015b57c>] playDtmfTone+0x148/0x6a4 [slic3217x]<br />[<c015b9cc>] playDtmfTone+0x598/0x6a4 [slic3217x]<br /></code><br /><br />看來root cause是因為在timer中用了msleep<br /><br />造成它reschedule就crash<br /><br />解決方式就是透過將timer的call時間拉長<br />讓Oscillators播放時間p_cid->dtmf_on_ms拉長一點<br /><br /><code>init_timer(&cid_dtmf_timer);<br /> cid_dtmf_timer.function = cid_dtmf_do_timer;<br /> cid_dtmf_timer.expires = jiffies + ms2jiffies(p_cid->dtmf_on_ms);<br /> add_timer(&cid_dtmf_timer);<br /></code><br /><br />才不會造成dtmf signal lostcslhttp://www.blogger.com/profile/06630784623165312568noreply@blogger.com0tag:blogger.com,1999:blog-7353155472291691370.post-3482298881538665712010-09-15T14:49:00.009+08:002010-09-15T17:58:20.109+08:00取得 wifi parameters for linux kernel想抓取wifi的資訊可利用linux kernel的struct netdev<br />所提供的struct iw_handler_def wireless_handlers來拿取<br />這是透過wireless_handlers內有個standard的指標函數,<br />可提供wireless device driver實作,<br />因此我們可透過standard指標函數來拿取wireless相關資訊<br /><br /><code>struct net_device<br />{<br />...<br /> <span style="font-weight:bold;">const struct iw_handler_def * wireless_handlers; </span><br />...<br />}<br /></code><br /><br /><code>struct iw_handler_def<br />{<br />...<br /> /* Array of handlers for standard ioctls<br /> * We will call dev->wireless_handlers->standard[ioctl - SIOCSIWCOMMIT]<br /> */<br /> <span style="font-weight:bold;">const iw_handler * standard;</span><br />...<br />}<br /></code><br /><br /><code>typedef int (*iw_handler)(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra);<br /></code><br /><br />以zd1211rw driver為例:<br /><br /><code>#define WX(x) [(x)-SIOCIWFIRST]<br /><br />static const iw_handler zd_standard_iw_handlers[] = {<br /> WX(SIOCGIWNAME) = iw_get_name, <br /> WX(SIOCGIWNICKN) = iw_get_nick,<br /> WX(SIOCSIWFREQ) = iw_set_freq,<br /> WX(SIOCGIWFREQ) = iw_get_freq,<br />...<br />};<br /></code><br /><br />可以看到這些Wireless Identification的定義:<br /><br /><code>/* Wireless Identification */<br />#define SIOCSIWCOMMIT 0x8B00<br />#define SIOCGIWNAME 0x8B01<br /><br />#define SIOCSIWNWID 0x8B02 /* set network id (pre-802.11) */<br />#define SIOCGIWNWID 0x8B03 /* get network id (the cell) */<br />#define SIOCSIWFREQ 0x8B04 /* set channel/frequency (Hz) */<br />#define SIOCGIWFREQ 0x8B05 /* get channel/frequency (Hz) */<br />...<br />wireless.h:335:#define SIOCIWFIRSTPRIV 0x8BE0<br />wireless.h:351:#define SIOCIWFIRST 0x8B00<br /></code><br /><br />倘若我們想抓取frequency(channel) of current link ,<br /><br />可直接call function<br /><code>net_dev -> wireless_handlers -> <br />standard[SIOCGIWFREQ - SIOCSIWCOMMIT](net_dev, NULL, (void *) & my_freq, NULL);<br /></code><br /><br />然後透過my_freq.m就能抓取現在的freq<br /><br /><code>struct iw_freq my_freq;<br /><br />struct iw_freq <br />{<br /> __s32 m; /* Mantissa */<br /> __s16 e; /* Exponent */<br /> __u8 i; /* List index (when in range struct) */<br /> __u8 flags; /* Flags (fixed/auto) */<br />};<br /></code><br /><br />進而推出wifi的rssicslhttp://www.blogger.com/profile/06630784623165312568noreply@blogger.com4tag:blogger.com,1999:blog-7353155472291691370.post-49520659266432060722010-08-17T11:36:00.004+08:002010-08-17T14:17:24.234+08:00COSCUP 2010今天的[<a href="http://coscup.org">COSCU</a>P]在中研院舉辦,<br />去了第四年XD,還是一樣熱血,<br />而且今年參加人數大爆炸XD<br /><br />今年的議程主要以Open Web and Mobile Technologies為主<br /><br />以下為一些議程的心得:<br /><br /><span style="font-weight:bold;">Frontend Development Enviornment, josephj</span><br /><br />這個議程滿有趣的, <br />透過將HTML/CSS/JavaScript 的模組化與自動化<br />可很嚴謹的制定模組policy<br />這個design pattern或許也可用於其他地方<br /><br /><span style="font-weight:bold;">Debugging: Linux Kernel by Ftrace, AceLan </span><br /><br />Ftrace的工具, 可透過/proc的檔案系統來進行trace kernel function<br />但很可惜, 目前只僅次於function, 誰call誰, 誰被call<br /><br /><span style="font-weight:bold;">Be 「Android」, Tick Chen + Matt Hsu </span><br /><br />很cool的機器人, 透過馬達 <-I2C-> ARM <-buletooth-> Android<br />來控制機器人, 可惜沒看到開全速的樣子XD<br /><br /><span style="font-weight:bold;">打造特製的 Android Toolchain, jserv</span><br /><br />透過"搞系統程式絕對不是「不入流」"開場, 超high<br />jserv前輩很強~~<br />一路trace GNU Toolchain發展開發並發現android toolchain的git中無說明<br />無法自制android toolchain,因此開始打造從無到有的android toolchain, <br />超coolcslhttp://www.blogger.com/profile/06630784623165312568noreply@blogger.com1tag:blogger.com,1999:blog-7353155472291691370.post-18705149054853398472010-01-28T17:03:00.016+08:002010-01-28T23:56:44.723+08:00Add new system callkernel版本:2.6.33-rc2<br /><br />新增自行定義的system call步驟如下:<br /><br />1. edit arch/x86/kernel/syscall_table_32.S, add<br /><br /><code> .long sys_mysystemcall /* 338 */</code><br /><br />2. edit include/asm-i386/unistd.h, add<br /><br /><code>#define __NR_mysystemcall 338</code><br /><br />3. create new file, arch/x86/kernel/systemcall.c <br />(defined filename yourself)<br /><br /><code>#include <linux/linkage.h><br />#include <linux/kernel.h><br /><br />asmlinkage int sys_mysystemcall(void)<br />{<br /> printk("mysystemcall\n");<br /> return 0;<br />}</code><br /><br />4. edit arch/x86/kernel/Makefile, add<br /><br /><code>obj-y += systemcall.o<br /></code><br /><br />5. compiler kernel<br /><br /><code>root@shulong-desktop:/home/shulong/linux-2.6.33-rc2# make clean && make<br /></code><br /><br />6. writing code for user mode, create new file test.c<br /><br /><code>#include <linux/unistd.h><br />#include <sys/syscall.h><br />#include <sys/types.h><br /><br />#define __NR_mysystemcall 338<br />#define mysystemcall() syscall(__NR_mysystemcall);<br /><br />int main ()<br />{<br /> mysystemcall();<br /> return 0;<br />}</code><br /><br />7. compiler test.c<br /><br /><code>root@shulong-desktop:~# gcc -Wall test.c -o systemcall</code><br /><br />8. execute systemcall<br /><br /><code>root@shulong-desktop:~# ./systemcall<br />[ 39.289669] mysystemcall<br /></code><br /><br />就可順利加入自行定義的system call。cslhttp://www.blogger.com/profile/06630784623165312568noreply@blogger.com9tag:blogger.com,1999:blog-7353155472291691370.post-47721032953616846092009-10-30T09:42:00.011+08:002010-01-26T17:27:41.988+08:00GNU C Expand<span style="font-weight:bold;">1. __attribute__ ((variable attributes))</span><br /><br />variable attributes:<br /><br />• aligned<br />• deprecated<br />• mode<br />• nocommon<br />• packed<br />• section<br />• transparent_union<br />• unused<br />• vector_size<br />• weak<br /><br /><code><span style="font-weight:bold;">section ("section-name")'</span><br />extern void foobar (void) __attribute__ ((section ("bar")));<br />puts the function 『foobar' in the 『bar' section.<br /></code><br /><br /><span style="font-weight:bold;">example:</span><br /><br /><br /><code>#define subsys_initcall(fn) __define_initcall("4",fn,4)<br />//用來將指定的函數pointer fn放到initcall.init section<br />//是把fn放到.initcall.init的section.initcall4.init<br /></code><br /><br />initcall4.init defined in arch/i386/kernel/vmlinux.lds.S<br /><br /><code>.initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) <br />{<br /> *(.initcall1.init) <br /> *(.initcall2.init) <br /> *(.initcall3.init) <br /> *(.initcall4.init) <br /> *(.initcall5.init) <br /> *(.initcall6.init) <br /> *(.initcall7.init)<br />}<br /></code><br /><br /><span style="font-weight:bold;">2. likely and unlikely</span><br /><br />in include/linux/compiler.h<br /><br /><code>#define __builtin_expect(x, expected_value) (x)<br /><br />#define likely(x) __builtin_expect(!!(x), 1)<br />#define unlikely(x) __builtin_expect(!!(x), 0)<br /></code><br /><br /><span style="font-weight:bold;">example:</span><br /> <br /><code>if(likely(value)) <br />{<br />}<br />else<br />{<br />}<br /></code><br /><br />//看起來likely和unlikely是一樣的, 但事實上是有差異的<br />//likely表示value的值為true的可能性更大一些,那麼執行if的機會大;<br />//unlikely表示value的值為false的可能性大一些,執行else機會大一些。<br />//有了這種修飾,gcc編成組語後,<br />//會將likely使得if後面的執行語句緊跟著前面的;<br />//unlikely使得else後面的語句緊跟著前面的程序<br />//這樣就會可以讓cache預先讀取,<br />//目的是增加程序的執行速度cslhttp://www.blogger.com/profile/06630784623165312568noreply@blogger.com4tag:blogger.com,1999:blog-7353155472291691370.post-21779980643831869902009-10-06T17:28:00.005+08:002009-10-06T18:03:17.249+08:00Meld : Diff and merge tool比較和合併code的工具,在windows上有[<a href="http://www.araxis.com/merge/?gclid=COLoh5eOqJ0CFZYtpAodxU5GkA">Araxis Merge</a>],但它並非open source software,因此有[<a href="http://winmerge.org/">WinMerge</a>]可以替代,而在linux上比較常見的是[<a href="http://kdiff3.sourceforge.net/">KDiff3</a>]和[<a href="http://meld.sourceforge.net/">Meld</a>]。<br /><br />而我最常用的是Meld,它的操作很容易就可上手。<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://meld.sourceforge.net/meld_file1.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 600px; height: 400px;" src="http://meld.sourceforge.net/meld_file1.png" border="0" alt="" /></a>cslhttp://www.blogger.com/profile/06630784623165312568noreply@blogger.com1tag:blogger.com,1999:blog-7353155472291691370.post-16208259122542818792009-10-02T11:40:00.003+08:002009-10-06T18:06:25.954+08:00Coding tips, Vim顯示當前行輸入":set cursorline".<br />或輸入":set cul".<br /><br />取消當前行:<br />輸入":set no cursorline".<br />或輸入":set no cul"cslhttp://www.blogger.com/profile/06630784623165312568noreply@blogger.com0tag:blogger.com,1999:blog-7353155472291691370.post-91122165719531829762009-09-28T11:18:00.004+08:002009-09-28T12:33:28.428+08:00gcc: warnings being treated as errors在Ubuntu 9.04,編譯linux kernel for mips時出現了這個問題<br /><br />gcc: warnings being treated as errors<br />scripts/kconfig/conf.c:104: error: ignoring return value of 'fgets', declared with attribute warn_unused_result<br />...<br /><br />原來是在./src/Makefile的HOSTCFLAGS variables加了-Werror...<br />把它去掉之後,就能編過了...cslhttp://www.blogger.com/profile/06630784623165312568noreply@blogger.com13tag:blogger.com,1999:blog-7353155472291691370.post-52949719665352634622008-11-07T22:40:00.007+08:002008-11-09T00:47:16.863+08:00Trace code tool以前在Trace OpenSouce code時,常直接用文字編輯器,感覺很不方便,還要自己找檔案。最近發現一套很好用trace code的工具[<a href="http://www.gnu.org/software/global/">GNU Global</a>],它能很神奇的將程式碼變成網頁,而且產生方式超簡單的。<br /><br />產生網頁的方法:<br /><br />1. 進入原始碼的目錄下<br /><br />$ cd ~/speech<br /><br />2. 執行htags<br /><br />$ htags -g -F <br />-g 先執行 gtags<br />-F 代表要將網頁切成多個Frame <br /><br />3. 原始碼目錄下就會產生一個叫HTML的目錄<br /><br />就可以直接用Browser開啟index.html,如下圖所示。<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSyR32XH7KwMsCk859b63lOHvqMxz0svGIZT7XnQzkgaOJvkxMxk1arHHXiW6cI5AuO4Ndq2_-xhW9a1n5Rns3Wd71WKJRrmw_98-RrMOP1349AtgvZXEXJHHK5GKiJ0tbiILNCWO5RXgZ/s1600-h/12.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 420px; height: 324px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSyR32XH7KwMsCk859b63lOHvqMxz0svGIZT7XnQzkgaOJvkxMxk1arHHXiW6cI5AuO4Ndq2_-xhW9a1n5Rns3Wd71WKJRrmw_98-RrMOP1349AtgvZXEXJHHK5GKiJ0tbiILNCWO5RXgZ/s320/12.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5265932544092322498" /></a><br /><br />接下來看code就很快了....cslhttp://www.blogger.com/profile/06630784623165312568noreply@blogger.com0tag:blogger.com,1999:blog-7353155472291691370.post-81334921097799885042008-08-27T20:55:00.006+08:002008-08-29T11:19:52.264+08:00Qemu for ARM System emulator[<a href="http://bellard.org/qemu/">Qemu</a>]是個相當不錯的模擬器,它不只可以模擬x86,還可模擬arm。最近找了很多相關的資料,發現目前已經有很多人寫了不錯的教學,而且qemu支援的arm平台[<a href="http://bellard.org/qemu/qemu-doc.html#SEC63">ARM System emulator</a>]也相當多。但重點是qemu並非所有arm的平台都支援,所以或許可以找找patch或自己試著修改看看,才能符合自己的平台。<br /><br />[<a href="http://opencsl.openfoundry.org/">OPENCSL</a>]這個網站相當不錯,初學者可以很快做出一個"ARM Integrator"(ARMB26EJ-S的架構)的模擬器。另外是OpenMoko[<a href="http://wiki.openmoko.org/wiki/OpenMoko_under_QEMU">Neo1973</a>],目前已有修改過後的qemu,跑出來就跟真的環境一樣。然後[<a href="http://orzlab.blogspot.com/2007/06/palm-5linux.html">Linux on Palm 5</a>]也有修改後的模擬器,都可以實際跑起來。<br /><br />有興趣的朋友,可以玩玩看,我覺得還滿有趣的。cslhttp://www.blogger.com/profile/06630784623165312568noreply@blogger.com0tag:blogger.com,1999:blog-7353155472291691370.post-43097376863913579442008-02-22T11:04:00.008+08:002008-02-22T11:35:20.169+08:00OSDC.TW 2008一年一度的OSDC.TW又要來了。<br /><br />去年OSDC.TW 2007我有去參加,覺得主辦人[<a href="http://hcchien.org/">hcchien</a>]相當用心,而且可以看到很多很厲害的OpenSource高手的"真面目",而且可以見識到現在很多新技術和想法,個人覺得OSDC.TW真的是不錯的Conference...<br /><br />今年的[<a href="http://www.osdc.tw/2008/02/2008412.html">議程</a>],也很令人期待,想報名的人請到[<a href="http://registrano.com/events/osdc">報名</a>],要快哦!!不然很快就滿了><"<br /><br />Reference: [<a href="http://www.osdc.tw/">OSDC.TW</a>]cslhttp://www.blogger.com/profile/06630784623165312568noreply@blogger.com0tag:blogger.com,1999:blog-7353155472291691370.post-78975412393109773362008-02-20T14:41:00.006+08:002008-02-22T11:15:49.176+08:00空閒時間看Linux kernel原始碼看Linux kernel的原始碼是一種很有趣的事情,可以看到很多用C寫奇怪的作法,真很有趣,如jserv所提到的[<a href="http://blog.linux.org.tw/~jserv/archives/001961.html">C 語言的 trigraph/digraph</a>]一文。<br /><br />只是因為只有空閒時間才能看,所以都只能看片段,沒辦法一層一層的往下找"真相",只有大約知道API怎麼CALL、用什麼樣的結構和演算法等等。<br /><br />不過令人驚訝的是Linux kernel有超完整的架構,讓我這個初學者超佩服的,這時才知道自己的渺小。<br /><br />未來,我會找時間來整理一些自己看kernel的想法...cslhttp://www.blogger.com/profile/06630784623165312568noreply@blogger.com1tag:blogger.com,1999:blog-7353155472291691370.post-75424342974075122822007-11-27T13:09:00.001+08:002007-11-27T13:24:12.814+08:00Poring Linux Kernel 2.6 for DIMMPC 520i (Part 1)最近終於找到時間來Porting板子囉!!<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh3.google.com.tw/changshulong/Rz8Vbd7yXzI/AAAAAAAACYI/S1r00Kvaoyk/SUC52087.JPG?imgmax=512"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px;" src="http://lh3.google.com.tw/changshulong/Rz8Vbd7yXzI/AAAAAAAACYI/S1r00Kvaoyk/SUC52087.JPG?imgmax=512" border="0" alt="" /></a><br />測試完IDE介面,發現可以接硬碟和光碟機...<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh5.google.com.tw/changshulong/Rz8Vh97yX0I/AAAAAAAACYQ/ZBWnVrhds_s/SUC52089.JPG?imgmax=512"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px;" src="http://lh5.google.com.tw/changshulong/Rz8Vh97yX0I/AAAAAAAACYQ/ZBWnVrhds_s/SUC52089.JPG?imgmax=512" border="0" alt="" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh5.google.com.tw/changshulong/Rz8WB97yX2I/AAAAAAAACYg/XfmpBiVwvik/SUC52094.JPG?imgmax=512"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px;" src="http://lh5.google.com.tw/changshulong/Rz8WB97yX2I/AAAAAAAACYg/XfmpBiVwvik/SUC52094.JPG?imgmax=512" border="0" alt="" /></a><br />於是很有趣的將之前收到的ubuntu 7.10放進去跑跑看,結果:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh4.google.com.tw/changshulong/Rz8WJt7yX3I/AAAAAAAACYo/mBW3kq-6z3c/SUC52104.JPG?imgmax=512"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px;" src="http://lh4.google.com.tw/changshulong/Rz8WJt7yX3I/AAAAAAAACYo/mBW3kq-6z3c/SUC52104.JPG?imgmax=512" border="0" alt="" /></a><br />天啊,有畫面也可以跑耶!!但...<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh4.google.com.tw/changshulong/Rz8Wdt7yX4I/AAAAAAAACYw/21rmUx7XEyA/SUC52109.JPG?imgmax=512"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px;" src="http://lh4.google.com.tw/changshulong/Rz8Wdt7yX4I/AAAAAAAACYw/21rmUx7XEyA/SUC52109.JPG?imgmax=512" border="0" alt="" /></a><br />kernel還是跑不起來,也只好乖乖porting了...><"cslhttp://www.blogger.com/profile/06630784623165312568noreply@blogger.com6tag:blogger.com,1999:blog-7353155472291691370.post-25783266941040596722007-11-18T00:28:00.000+08:002007-11-18T09:14:27.429+08:00小筆電裝Ubuntu 7.10今天終於跟裝了兩年多的gentoo說byebye了,<br />一直都想要換,畢竟我的小筆電速度不夠快,<br />總不能每裝一套package就一直compiler...吧!!<br /><br />也剛好昨天回家,<br />收到數天前到[<a href="https://shipit.ubuntu.com/">ShipIt</a>]所申請的光碟片,<br />超cool的,還有貼紙...<br /><a href="http://lh5.google.com.tw/changshulong/Rz8VB97yXwI/AAAAAAAACXw/dUEh2WEgOtQ/SUC52082.JPG?imgmax=512"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 450px;" src="http://lh5.google.com.tw/changshulong/Rz8VB97yXwI/AAAAAAAACXw/dUEh2WEgOtQ/SUC52082.JPG?imgmax=512" border="0" alt="" /></a><br />安裝上真的比gentoo方便太多,<br />在加上用[<a href="http://lazybuntu.openfoundry.org/">lazybuntu</a>]來安裝想要的軟體,真的不到一小時就全部裝完囉...cslhttp://www.blogger.com/profile/06630784623165312568noreply@blogger.com0tag:blogger.com,1999:blog-7353155472291691370.post-66570220383645151692007-11-14T00:22:00.000+08:002007-11-18T09:29:02.321+08:00Easy to build toolchain, cross-ng因DIMM-PC只有32 MByte Flash Disk,<br />所以用glibc會太大,<br />因此改用jserv前輩所建議crosstool next generation[<a href="http://ymorin.is-a-geek.org/dokuwiki/projects/crosstool">cross-ng</a>],<br />這個crosstool可以編glibc和uclibc,<br />且介面跟編kernel很類似喔!!<br />真的方便超多的...^^<br /><br />1. install<br /><br />$ wget -c http://ymorin.is-a-geek.org/download/crosstool-ng/<br />crosstool-ng-0.3.2.tar.bz2<br />$ tar -jxvf crosstool-ng-0.3.2.tar.bz2<br />$ cd crosstool-ng-0.3.2<br />$ ./configure --prefix=/opt/cross-ng<br />$ make<br /># make install<br /><br />2. using cross-ng<br /><br />$ export PATH="${PATH}:/opt/cross-ng/bin"<br />$ mkdir toolchain-dev && cd ./toolchain-dev<br />$ ct-ng menuconfig <br /><br /><a href="http://lh6.google.com.tw/changshulong/RznIArqG9CI/AAAAAAAACWw/yD4QGEpE9sM/main.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 600px;" src="http://lh6.google.com.tw/changshulong/RznIArqG9CI/AAAAAAAACWw/yD4QGEpE9sM/main.JPG" border="0" alt="" /></a><strong>需要提供uclibc的設定檔路徑</strong><br /><a href="http://lh3.google.com.tw/changshulong/RznIj7qG9DI/AAAAAAAACW4/zaGyKk0lzUE/uclibc.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 600px;" src="http://lh3.google.com.tw/changshulong/RznIj7qG9DI/AAAAAAAACW4/zaGyKk0lzUE/uclibc.JPG" border="0" alt="" /></a><br />$ ct-ng build<br />...<br />[INFO ] ===============================<br />[INFO ] Installing C library headers<br />[INFO ] Installing C library headers: done in 27.63s<br />[INFO ] ===============================<br />[INFO ] Core C compiler, pass 2<br />[INFO ] =============================<br />[INFO ] Installing static core C compiler<br />[INFO ] Installing static core C compiler: done in 316.46s<br />[INFO ] Core C compiler, pass 2: done in 316.50s<br />[INFO ] ===============================<br />[INFO ] Installing C library<br />[INFO ] Installing C library: done in 124.55s<br />[INFO ] ===============================<br />[INFO ] Installing final compiler<br />[INFO ] Installing final compiler: done in 737.85s<br />[INFO ] ===============================<br />[INFO ] Installing cross-gdb<br />[INFO ] Installing cross-gdb: done in 316.19s<br />[INFO ] ===============================<br />[INFO ] Installing gdbserver<br />[INFO ] Installing gdbserver: done in 11.50s<br />[INFO ] Build completed at 20071114.012858<br />[INFO ] (elapsed: 28:28.51)<br /><br /><strong>成功囉!!<br />toolchain的路徑在$HOME/i386-DIMMPC-linux-uclibc</strong>cslhttp://www.blogger.com/profile/06630784623165312568noreply@blogger.com119tag:blogger.com,1999:blog-7353155472291691370.post-78853816966028736882007-11-11T20:59:00.000+08:002007-11-12T19:50:36.972+08:00ToolChain for DIMM-PC由於x86的toolchain建立的文件相當少,<br />於是使用[<a href="http://kegel.com/crosstool/">crosstool</a>]來建立toolchain可說是相當方便...<br /><span style="font-weight:bold;">[更新]</span><br />$ svn co http://crosstool.googlecode.com/svn/trunk/src crosstool<br />$ cd crosstool<br />$ cp demo-i686.sh demo-i386.sh<br />$ vi demo-i386.sh<br /><span style="font-weight:bold;">將eval `cat i686.dat gcc-4.1.0-glibc-2.3.6-tls.dat` sh all.sh --notest<br />修改成#eval `cat i686.dat gcc-4.1.0-glibc-2.3.6-tls.dat` sh all.sh --notest<br />將eval `cat i686.dat gcc-4.1.0-glibc-2.3.6.dat` sh all.sh --notest<br />修改成#eval `cat i386.dat gcc-4.1.0-glibc-2.3.6.dat` sh all.sh --notest</span><br />$ vi i386.dat<br />TARGET=i486-dimmpc-linux-gnu<br />TARGET_CFLAGS="-O"<br />$ sudo mkdir /opt/crosstool<br />$ sudo chown $USER /opt/crosstool<br />$ sh demo-i386.sh<br />...<br />Cross-toolchain build complete. Result in /opt/crosstool/gcc-4.1.0-glibc-2.3.6/i486-dimmpc-linux-gnu.<br />+ exit 0<br />+ cd /home/shulong/crosstool<br />+ sh testhello.sh<br />+ cd /opt/crosstool/gcc-4.1.0-glibc-2.3.6/i486-dimmpc-linux-gnu<br />+ test '!' -d tmp<br />+ mkdir tmp<br />+ cd tmp<br />+ test x '!=' x<br />+ cat<br />...<br />+ echo testhello: C compiler can in fact build a trivial program.<br />testhello: C compiler can in fact build a trivial program.<br />+ test '' = 1<br />+ test '' = 1<br />+ test '' = 1<br />+ test 1 = ''<br />+ echo Done.<br />Done.<br /><br />看到這個msg就代表成功啦!!<br /><br />toolchain的路徑在:<br />/opt/crosstool/gcc-4.1.0-glibc-2.3.6/i486-dimmpc-linux-gnu/<br /><br />感謝jserv大提供的方向...cslhttp://www.blogger.com/profile/06630784623165312568noreply@blogger.com4tag:blogger.com,1999:blog-7353155472291691370.post-40633822543145345232007-10-05T19:58:00.000+08:002007-11-08T21:34:46.418+08:00COSCUP 2007傳統商業軟體的開發者(coders)和使用者(users)很少交流,是大家都接受的事實。你的軟體用起來有問題?請打技術支援電話,由客服人員為你服務,他或許已經儘其所能,但未必能解決你的問題。如果問題是軟體的臭蟲,你只好痴痴地等待不知幾年後才開賣的下一版。而你當初之所以選用A軟體而不是B軟體,常常是聽信銷售員(sales)的一面之詞或同儕的推薦。在這個行為模式下,users 面對的是銷售員和客服,coders 面對的還是銷售員和客服,users 遇到的問題要間接地才能反應到 coders 手上,中間還可能會被過濾掉。<br /><br /> Open source 這個在 1998 年出現的名詞,大家早已耳熟能詳。這種在網路上已經進行二三十年的軟體開發模式之所以能成功,有許多原因,其中一個極為關鍵的因素,就是 coder-user 的直接接觸。無屏障的交流形成了問題的快速回報和修補機制,而當這個機制被網路效應放大到極限時,Linus 定律就出現了:《臭蟲難逃眾人法眼》(With enough eyeballs, all bugs are shallow),軟體品質因此顯著提昇。在 open source 的模式中,coders 和 users 中間的人不再是銷售員或客服,而是讓軟體更容易被 users 接受的推廣者(promoters),他們打包套件讓軟體更好裝、寫說明文件讓軟體更易學、辦推廣活動讓軟體被更多人接觸到、在網路上回答問題解決使用者的疑惑,而且不會把 coders 藏在背後產生資訊的不對稱。<br /><br /> Coders、users 和 promoters 是讓 open source 軟體發光發熱的支柱,所以我們的 open source 研討會是專為這三種人舉辦的。你可以是 A 軟體的 coder、B 軟體的 promoter、C 軟體的 user。不論你是已經踏入 open source 領域,還是一直站在門口不知如何入門,歡迎你來參加 COSCUP - Conference for Open Source Coders, Users and Promoters!<br /><br /> 今年的 COSCUP 最大的改變,是由各台灣本地社群共同舉辦,也希望能透過這樣的合作,增加社群同好的參與度,正如 COSCUP 的精神,在這個研討會當中,你同時是與會者,推廣者,也參與了大會的運作。<br /><br /> * 時間:2007 年 11 月 3 日(六)- 11 月 4 日(日)<br /> * 地點:台北市和平東路 2 段 106 號 科技大樓 二樓<br /> * 誰應該參加:寫 open source 軟體的開發者、熱衷 open source 軟體的推廣者、熟悉 open source 軟體的使用者、想瞭解 open source 軟體的新手。<br /><br />網址:<a href="http://coscup.org/2007/">http://coscup.org/2007/</a>cslhttp://www.blogger.com/profile/06630784623165312568noreply@blogger.com0tag:blogger.com,1999:blog-7353155472291691370.post-33513675805887910512007-09-21T15:02:00.000+08:002007-09-21T15:10:15.184+08:00Linus says: “C++ is a horrible language”C++ is a horrible language.<br /> It’s made more horrible by the fact that a lot of substandard programmers use it, to the point where it’s much much easier to generate total and utter crap with it. <br />Quite frankly, even if the choice of C were to do nothing but keep the C++ programmers out, that in itself would be a huge reason to use C. <br /><br />– Linuscslhttp://www.blogger.com/profile/06630784623165312568noreply@blogger.com0tag:blogger.com,1999:blog-7353155472291691370.post-28668914115017099962007-08-03T13:52:00.000+08:002007-08-03T14:44:43.449+08:00Taiwan Linux Forum一年一度的台灣Linux論壇又來了,<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh4.google.com.tw/changshulong/RrC6oT8qS3I/AAAAAAAAAh8/AL10EPgR1ak/SUC51526.JPG?imgmax=640"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://lh4.google.com.tw/changshulong/RrC6oT8qS3I/AAAAAAAAAh8/AL10EPgR1ak/SUC51526.JPG?imgmax=640" border="0" alt="" /></a>這次我的感覺是辦的比去年差,<br />雖然請了幾位國外Open Source很厲害的講者,<br />但講都東西不是太淺...<br />不然就是沒什麼技術性的東西...<br />感覺沒學到什麼東西...<br />只有一個心得,英文聽力要加油...><"<br />...<br />這次參與的議程有:<br /><br />8/1, 早上<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh6.google.com.tw/changshulong/RrC6Tz8qSwI/AAAAAAAAAhE/61jHRFGtX70/SUC51500.JPG?imgmax=512"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://lh6.google.com.tw/changshulong/RrC6Tz8qSwI/AAAAAAAAAhE/61jHRFGtX70/SUC51500.JPG?imgmax=512" border="0" alt="" /></a><span style="font-weight:bold;">Overview of the Linux Market Place and the Technical Development Community, Jim Zemlin, Linux Foundation</span><br /><br />心得:<br />大部份的英文都聽的懂,有一些內容很不錯,只不過是有點介紹性的感覺...<br /><br />8/1, 下午<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh4.google.com.tw/changshulong/RrC65T8qS8I/AAAAAAAAAik/aYAkkNsBYdg/SUC51534.JPG?imgmax=512"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://lh4.google.com.tw/changshulong/RrC65T8qS8I/AAAAAAAAAik/aYAkkNsBYdg/SUC51534.JPG?imgmax=512" border="0" alt="" /></a>Real Time Linux, Linux Kernel Device Drivers and Embedded Linux, Theodore Y. "Ted" Tso, Linux Kernel Developer<br /><br />心得:<br />因為下午2:00是我想睡的時候,不過我還是努力的聽(中途不小心...),不過好像只是很簡單的介紹,不夠深入...非常可惜,加上英文講的太快(腔調有點怪怪的)...,聽完只有一個想法,回去開始加強英文聽力><"<br />...<br /><span style="font-weight:bold;">Open Solaris驅動程式開發, 李宗虞</span><br /><br />心得:<br />講的內容很好,只不過是因為是北京工程師的關係,口語上出現一些大陸用法...><"<br />什麼源碼、硬盤...<br />...<br />印表機在Linux系統中之相容性探討, 林靖翔<br /><br />8/2, 早上<br /><span style="font-weight:bold;">避免GPL地雷:A Check List, 葉平博士<br />來自由/開放源碼的警告信, 葛冬梅經理</span><br /><br />心得:<br />講的內容很好,讓人很容易了解GPL,<br />只不過真的有一些情況,企業要用時真的要小心<br /><br />8/2, 下午<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh5.google.com.tw/changshulong/RrIh9D8qTmI/AAAAAAAAApQ/hkc8UcVcHco/SUC51596.JPG?imgmax=512"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://lh5.google.com.tw/changshulong/RrIh9D8qTmI/AAAAAAAAApQ/hkc8UcVcHco/SUC51596.JPG?imgmax=512" border="0" alt="" /></a><span style="font-weight:bold;">使用Fedora 7 做OLPC Live-cd, Pake</span><br /><br />心得:<br />很技術性,講的非常好,很想動手玩玩看...<br />很想弄一台百元電腦...只不過要175元美金><"<br />...<br />802.11無線網路封包監測及分析軟體之研製<br />...<br />應用感測技術之智慧型環境感知緊急救護系統之設計與實作<br />...<br />運用多階層網格技術於2D和3D外形中的呈現<br />...<br /><span style="font-weight:bold;">自由軟體作業系統核心客製化工具組之研製</span><br /><br />心得:<br />雖然說只是簡略說明做了那些東西,但我可以了解教授所說的...很滿有趣的<br />...<br />無線感測網路技術應用於旱災預警與監測通報系統之設計與實作(II)<br />..<br />支援跨語言語料收集之維基百科外覆程式<br />...<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh6.google.com.tw/changshulong/RrIi2T8qTtI/AAAAAAAAAqI/jLBPwKzvqFg/SUC51604.JPG?imgmax=512"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://lh6.google.com.tw/changshulong/RrIi2T8qTtI/AAAAAAAAAqI/jLBPwKzvqFg/SUC51604.JPG?imgmax=512" border="0" alt="" /></a><span style="font-weight:bold;">小心!間諜就在你身邊! 如何增加LAMP安全-現場Demo, Outian</span><br /><br />心得:<br />超厲害的HACKER DEMO,看的很Shock,<br />以後自己管SERVER真的要小心...<br />...<br />粗體是表示我自己覺得不錯的議程...<br /><br />另外,大部份的簡報都可以抓的到了,<br />在[<a href="http://www.oss.org.tw/">自由軟體入口網站首頁</a>]左邊的部份...<br /><br />總之,以後可能也不會想去了吧...<br />不但是太遠了...而且沒有比今年的OSDC精彩~~cslhttp://www.blogger.com/profile/06630784623165312568noreply@blogger.com44tag:blogger.com,1999:blog-7353155472291691370.post-74406279059365418442007-07-19T19:29:00.001+08:002007-11-08T17:38:26.947+08:00Robot need a RTOS,but Linux maybe Realtime?Reference: <br />Jserv前輩在OSDC.tw所發表的RT nanokernel for Embedded Linux議題中<br /><span style="font-weight:bold;"><br />Is Linux Realtime?<br />過去的答案:<br />No,其原因:<br />Monolithic Kernel、Non Preemptible、Resource Lock、Priority Scheduling<br /><br />現在(Kernel 2.6)的答案:Maybe Yes<br />Old: No Kernel Preemption <br />Execution in kernel mode interrupted only by explicit、yields, sleeps, and IRQ’s<br /><br />New: Kernel May Be Preempted <br />New process may be swapped in after servicing an interrupt<br /><br />但「May Be」,問題點:<br />相較於典型RTOS來說,還是太沈重<br />不具備Hard-Realtime能力</span><br /><br />但Robot need a RTOS<br />所以...<br />我的目標將先往RTOS的方向走,可能要建立一個Realtime Linux System...<br />Linux如何Realtime?<br />這也是我最近要達成的方向...cslhttp://www.blogger.com/profile/06630784623165312568noreply@blogger.com7tag:blogger.com,1999:blog-7353155472291691370.post-90026625644970690722007-07-16T13:41:00.000+08:002007-07-18T22:33:26.588+08:00Kontron DIMM-PC<span style="font-weight:bold;">Kontron DIMM-PC/520I</span><br />586 Embedded Controller, Upto 32MB DRAM, 32MB Flash With Optional Ethernet or USB<br /><br />series: 08012-3232-13-0 <br />DIMM-PC/520-I CPU module with 32MB DRAM and 32MB flash<br /><br /><span style="font-weight:bold;">Kontron DIMM-PC/COMBO2 & /VGA2</span><br />LCD/VGA, Ethernet and Serial on one DIMM I/O Module, Full PC functionality at the size of a business card<br /><br />series: 08014-0000-01-0 <br />DIMM-PC/COMBO2 VGA, Ethernet and two serial interfaces<br /><br /><span style="font-weight:bold;">Kontron DIMM-PC/KIT-3</span><br />Starter Kit for use with the DIMM-PC range, Fast assembly and quick operation<br /><br />series: 08005-0000-00-4<br />DIMM-PC/ADA3 Evaluation-board for DIMM-PC<br /><br />這就是我們實驗室嵌入式板子的資料~~<br /><br />Reference:<br /><a href="http://www.dpie.com/dimmpc/dimmpc520.html">http://www.dpie.com/dimmpc/dimmpc520.html</a><br /><a href="http://www.dpie.com/dimmpc/dimmcombo.html">http://www.dpie.com/dimmpc/dimmcombo.html</a><br /><a href="http://www.dpie.com/dimmpc/dimmstarterkit.html">http://www.dpie.com/dimmpc/dimmstarterkit.html</a>cslhttp://www.blogger.com/profile/06630784623165312568noreply@blogger.com47tag:blogger.com,1999:blog-7353155472291691370.post-35638707461340588562007-07-14T09:33:00.000+08:002007-11-07T09:31:56.778+08:00Porting Kernel 2.6 for DIMM-PC純粹好玩來Porting Kernel 2.6 for DIMM-PC<br />大約的步驟...(準備開始)<br />...<br /><strong>Step1: Collecting about Hardware Information</strong><br /><br />CPU: AMD™ Elan SC520 133MHz<br /><br />Memory: 32768k(32 MByte) DRAM, 32 MByte IDE compatible Flash Disk<br /><br />ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xx<br />hda: SanDisk SDC1-32, CFA DISK drive<br /><br />VGA Board: Topro TP6508IQ video controller<br />(VGA Graphics for CRT and flat displays)<br /><br />Ethernet: Crystal LAN™ CS8900 Ethernet Controller(cs8900 rev J found at 0x300 [Cirrus EEPROM])<br /><br />ttyS00 at 0x03f8 (irq = 4) is a 16550A<br />ttyS01 at 0x02f8 (irq = 3) is a 16550A<br />...<br /><strong>Step2: Allocation</strong><br /><br />Bootloader: lilo or u-Boot<br />(Reference jserv's blog [<a href="http://blog.linux.org.tw/~jserv/archives/001840.html">探索 Linux bootloader 的佳作</a>])<br />Linux Kernel: 2.6.20 (or newest)<br />(Realtime Embedded Linux, RTOS)<br /><br />Root File System: BusyBox + uClibc(or eglibc) + initscripts...<br />LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib<br />PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin<br />TERM=vt100<br />SHELL=/bin/ash<br />...<br /><strong>Step3: Create Image file</strong><br />...<br /><strong>Step4: Emulate, Tesing</strong><br />...<br />Testing. If not ok, back to Step 2<br />...<br /><strong>Step5: burn to DIMM-PC Flash ROM</strong>cslhttp://www.blogger.com/profile/06630784623165312568noreply@blogger.com15tag:blogger.com,1999:blog-7353155472291691370.post-76748828063519091422007-07-10T15:57:00.000+08:002007-11-08T23:35:11.819+08:00Where Can I get Memory Image context?明明ml30j53.img的<em>檔案系統就是minix~~~</em><br />...<br />mitelinux:/# cat /proc/mounts<br /><strong>rootfs / rootfs rw 0 0<br />/dev/root / minix ro 0 0<br />none /proc proc rw 0 0<br />none /dev/pts devpts rw 0 0<br />/dev/ram /mnt/ram minix rw 0 0</strong><br />mitelinux:/# cat /etc/fstab<br /><strong>/dev/hda1 / minix defaults 1 1<br />none /proc proc defaults 0 0<br />none /dev/pts devpts gid=5,mode=620 0 0</strong><br />mitelinux:/# df -h<br /><strong>Filesystem Size Used Available Use% Mounted on<br /><em>/dev/hda1 30.2M 10.8M 19.3M 36% /</em>/dev/ram 502.0k 40.0k 462.0k 8% /mnt/ram</strong><br /><br />但我怎麼mount就是沒辦法~~~<br />Where Can I get Memory Image context?<br /><strong>#mount -t minix ml30j53.img rootfs/ -o loop</strong><br />功力還不夠啊~~~誰能幫幫我~~思考中~~<br /><br /><span style="font-weight:bold;">[更新]</span><br />錯錯不是minix,我還在研究到底是什麼??<br />csl@csl-desktop:~$ file ml30j53.img <br /><span style="font-weight:bold;">ml30j53.img: x86 boot sector, LInux i386 boot LOader; partition 1: ID=0x83, starthead 1, startsector 63, 62433 sectors, extended partition table (last)\011</span><br />看起來像是在Memory Image中的大合體??好像是把所有東西放在一起??<br />但要放在一起,難道Memory Image沒有filesystem嗎?<br />...<br />原來<br />csl@csl-desktop:~$ qemu-img info ml30j53.img <br /><span style="font-weight:bold;">image: ml30j53.img<br />file format: raw<br />virtual size: 31M (32047104 bytes)<br />disk size: 31M</span><br />它是一個raw file format,<br />/*<br />raw<br />Raw disk image format (default). This format has the advantage of being simple and easily exportable to all other emulators. If your file system supports holes (for example in ext2 or ext3 on Linux or NTFS on Windows), then only the written sectors will reserve space. Use qemu-img info to know the real size used by the image or ls -ls on Unix/Linux.<br />*/<br />難怪怎麼mount都沒辦法...<br />還要再努力才行啊~~~<br /><span style="font-weight:bold;">[/更新]</span>cslhttp://www.blogger.com/profile/06630784623165312568noreply@blogger.com29