2009年4月8日 星期三

Essential Linux Device Drivers



上一份的工作主要是個人踏入撰寫linux driver的起點
而Linux Device Driver的撰寫以往只有Oreilly 的 Linux Device Drivers 一書
(後簡稱LDD, 目前出到第三版)
個人在去年十月注意到2008年8月出版的Essential Linux Device Drivers(後簡稱ELDD)這本書
而這次的工作, 這兩本書也都用上了

個人的想法是:
LDD該書的內容, 比較偏向以linux kernel的角度來談linux device driver
對於了解driver 與 Linux系統內部行為以及底層的意義上相當不錯
然而在Device Model上, 對於現今Linux Kernel中眾多的Subsystem就顯得力不從心
相對地, ELDD這本書的內容比較單純的以Device Driver的角度
一開始系統的從kernel 提供 device driver的服務
接著切入 linux kernel中各個subsystem (從input, audio, video 到 PCI, PCMCIA)
對於想直接以device driver著手的人來說, 相較於LDD是值得列為優先閱讀的書籍
等上手之後再閱讀LDD以了解更深入的部分.

當然個人最推薦同時擁有這兩本切入角度不同的書

2009年4月6日 星期一

Embedded Linux Porting

Framebuffer device 驅動後的Tux logo


使用PicoTK在Framebuffer上隨機繪圖(線圓/長方形, 實心圓/長方形)
來產生類似screensaver的效果


新工作一個多月了, 上面兩張圖是這一陣子來的工作成果
工作內容的緣故需要在工作平台上建構Linux 環境
儘管port過幾個embedded os, 針對embedded linux platform寫過driver
然而從頭到尾作Linux kernel porting這倒是頭一遭
兩張圖是porting後實作framebuffer device driver, 並且在kernel與application上的結果
(picotk的畫圓的過程, 是相當著名的演算法)

出乎我意料的是, linux porting相關的資訊並不算是豐富
有機會再在blog上分享一些心得


以下是boot log (敏感部份, 經過馬賽克處理)

Uncompressing Linux.........................
.. done, booting the kernel.
Linux version 2.6.27.15 (champ@champ-laptop) (gcc version 4.3.2 (GCC)
) #423 Fri Apr 3 15:05:02 CST 2009
CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177
Machine: XXXXX XXXXX Technology XXXXXX processor
Memory policy: ECC disabled, Data cache writeback
CPU0: D VIVT write-back cache
CPU0: I cache: 16384 bytes, associativity 4, 32 byte lines, 128 sets
CPU0: D cache: 16384 bytes, associativity 4, 32 byte lines, 128 sets
Built 1 zonelists in Zone order, mobility grouping off. Total pages: 508
Kernel command line: mem=2M@0x1000000 initrd=0x1180000,161524
Trying to install interrupt handler for IRQ0
Trying to install interrupt handler for IRQ1
Trying to install interrupt handler for IRQ2
Trying to install interrupt handler for IRQ3
Trying to install interrupt handler for IRQ4
Trying to install interrupt handler for IRQ5
Trying to install interrupt handler for IRQ6
Trying to install interrupt handler for IRQ7
Trying to install interrupt handler for IRQ8
Trying to install interrupt handler for IRQ9
Trying to install interrupt handler for IRQ10
Trying to install interrupt handler for IRQ11
Trying to install interrupt handler for IRQ12
Trying to install interrupt handler for IRQ13
Trying to install interrupt handler for IRQ14
Trying to install interrupt handler for IRQ15
Trying to install interrupt handler for IRQ16
Trying to install interrupt handler for IRQ17
Trying to install interrupt handler for IRQ18
Trying to install interrupt handler for IRQ19
Trying to install interrupt handler for IRQ20
Trying to install interrupt handler for IRQ21
Trying to install interrupt handler for IRQ22
Trying to install interrupt handler for IRQ23
Trying to install interrupt handler for IRQ24
Trying to install interrupt handler for IRQ25
Trying to install interrupt handler for IRQ26
Trying to install interrupt handler for IRQ27
Trying to install interrupt handler for IRQ28
Trying to install interrupt handler for IRQ29
Trying to install interrupt handler for IRQ30
Trying to install interrupt handler for IRQ31
PID hash table entries: 16 (order: 4, 64 bytes)
console [ttyXXX0] enabled
Dentry cache hash table entries: 1024 (order: 0, 4096 bytes)
Inode-cache hash table entries: 1024 (order: 0, 4096 bytes)
Memory: 2MB = 2MB total
Memory: 1036KB available (660K code, 45K data, 60K init)
Calibrating delay loop... 47.82 BogoMIPS (lpj=239104)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
done
Freeing initrd memory: 157K
fb0: XXXXXX frame buffer alive and kicking !
Serial: XXXXXX driver
ttyXXX0 at I/O 0xe0006400 (irq = 25) is a XXXXXX
Freeing init memory: 60K
sh: can't access tty; job control turned off
#

是的, 你沒看錯, 記憶體只有2MB
經過調整, 開機後還有600KB 左右的空間

過程中使用的是buildroot 建構toolchain, 以降低application的大小
有興趣的或是工作相關者, 歡迎討論, 並交換一下訊息與意見.

2009年4月2日 星期四

Hinet radio script 20090403

昨天還可以聽的. 今日發現怎麼也連不上

是的Hinet又更動了連結方式

如有需要最新的script 請到此下載

2009年3月18日 星期三

OpenGL ES 2.0: Hello Triangle!



上圖是OpenGL ES 2.0 Programming Guide第二章的範例
書中的範例是使用AMD OpenGL ES Emulator
很可惜的是AMD的OpenGL ES SDK僅只提供Windows平台版本
個人是使用PowerVR OpenGL ES SDK

除了書中的範例外也參考了PowerVR提供的example寫成
將書中使用而無Linux版的esUtil部份補上, 完成整個example
提供在Linux上學OpenGL ES 2.0的另一途徑
Linux版的範例請在此下載
懶得寫Makefile 可以覆蓋PowerVR SDK的example編譯

未來希望能夠將整個esUtil 在Linux上實做
(有部份是OS independent ex:Transform)

shader的方式是比以往透過function來得到效果, 顯得彈性且自由多了...:)

2009年3月10日 星期二

OpenGL ES 2.0 Programming Guide




上次個人寫OpenGL程式, 已是碩士班時期的事情了
那時還停留在OpenGL 1.x, 因此對於2.x可說是知悉甚微....

由於beagleboard所用的OMAP3530的緣故
(OMAP 3530 使用 PowerVR 的3D Accelerator)
個人開始注意到OpenGL ES 2.0
與OpenGL ES 1.x 源自OpenGL 1.5不同
OpenGL ES 2.0 源自於OpenGL 2.0
而上圖的OpenGL ES 2.0 Programming Guide,
可以說是目前唯一的參考書目了


而稍微看了一下簡介
OpenGL (ES) 2.x相對1.x強調programmable pipeline以及shading language
一些範例也相當有趣, 而OpenGL 與 OpenGL ES間的相容性是相當不錯的
以OpenGL ES 2.0作為另一個起點, 似乎是不錯的選擇

苦無OpenGL ES 2.0的硬體練習嗎?
沒關係PowerVR貼心地提供了PC Emulation SDK(Linux/Windows Platform)
let's OpenGL~

Choice of Programming Editor

最近又得長時間在Windows下寫程式, 所以又做了editor的survey
吃寫程式這行飯的人, 因為必須長使間使用code editor
對於用來編寫程式的環境, 多多少少有自己的偏好和選擇

個人很羨慕我相當好的朋友, 在碩士期間習得vim大法, 搭配tag, cscope
在windows上有gvim, 回泛Unix環境也如魚得水, 各種環境應該對他都不是問題

很可惜, 個人沒有這麼勤勞去學習, 只會用用簡單的GUI Editor
很多人都習慣使用Source Insight 或是微軟的 Visual Studio環境
個人盡量不去使用非法軟體, 而又不想被綁在M$的牢籠中
因此多半是靠著Makefile + Scite作為主要開發環境
想學已久的cmake也還沒開始啃 ^^;

而對於初學者以及一些Programmer而言
整合開發環境(IDE:Integrated Development Environment)是不可或缺的
長久以來, 我一直都停留在Eclipse/Anjuta/KDevelope的印象
也或許因為疏於注意, 這類工具我從來沒有好好學習和使用過
近日看了看Wiki的IDE比較表, CodeLite/CodeBlock倒是相當吸引我的興趣

看來是該找時間把 cmake/eclipse/(codelite or codeblock) 好好地學一學

對了, 還有QT近日最新力作QT Creator, 看來也是不錯的工具

buildroot: 三個願望一次滿足

由於新工作開始了, Prex的部份以後會慢慢推進
(目前mp3 decoder ok了, 還要弄audio driver/daemon)
而buildroot就是因為新工作的內容而開始接觸 (以前就聽過, 只是一直沒機會去玩.)

在開發embedded system中, crossplatform toolchain的選擇是相當重要的一環
在數年前, 產生對應平台的 gcc cross toolchain是相當麻煩的一件事情
glibc/gcc/binutils..版本的排列組合有可能會造成不同的問題
(ex: compiler編不過, compiler編完了不能編kernel)
因此需要花時間嘗試組合, 找到較佳的組合, 過程冗長繁複
而這幾年來令個人印象深刻的是Dan Kegel當時所撰寫的build script
方便的設定, 大大地簡化了如此測試的程序

現今cross toolchain可以說垂手可得了, 相當方便
稍微google一下就可以得到不少訊息和編譯好的工具
像是移植prex的過程中, 個人選擇CodeSourcery的Toolchain
主要的目標硬體平台(x86, ARM, MIPS, ColdFire, PowerPC)都有
也貼心地提供Linux/Windows兩種版本,
而CodeSourcery也隨著時間不斷地提供新版本和新平台的支援
不想親自動手準備相關環境情況下, 算是相當高品質的選擇

對於Embedded Linux而言, 除了toolchain, kernel外
除了Toolchain還得張羅root file system
buildroot提供相當方面的介面(類似編譯linux kernel的menuconfig), 滿足這三種需求
buildroot是uClibc的相關project, 提供uClibc-based的gcc toolchain
相對glibc/gcc所建構的環境, 在所需空間上節省不少
而且也編譯好busybox, 方便迅速地建構適用的環境
套句廣告詞: 三個願望一次滿足!

另外, 除了CodeSourcery toolchain, buildroot 外, Scratchbox也是不錯的選擇
而較龐大且全面的Embedded Linux專案可以考慮OpenMoko所採用的OpenEmbedded

在 ARM 平台上使用 Function Multi-Versioning (FMV) - 以使用 Android NDK 為例

Function Multi-Versioning (FMV) 過往的 CPU 發展歷程中, x86 平台由於因應各種應用需求的提出, 而陸陸續續加入了不同的指令集, 此外也可能因為針對市場做等級區隔, 支援的數量與種類也不等. 在 Linux 平台上這些 CPU 資訊可以透過...