Wednesday, March 14, 2012

command mode 和 video mode

資料來源:command mode 和 video mode

Command mode:

以命令(command)和數據(data)的形式傳遞給外設(通常是顯示模塊,或者顯示控制器display controller, 這裡,顯示控制器可能包括本地寄存器(local register)和frame buffer)。 系統可以通過command mode向本地寄存器和frame buffer memory寫或讀。這樣,處理器就可以通過向顯示控制器下達命令,參數和數據,間接地控制外設的行為了。另外,處理器可以讀取顯示模塊的狀態或者frame memory中的內容。command mode需要一個bidrectional interface。


Video mode:

以實時像素流(real-time pixel stream)的形式傳遞給外設。通常,顯示模塊需要處理器在一個足夠寬的帶寬上來傳輸圖像數據,以避免閃爍(flicker)或其他畫質問題。影響信息需要在high speed mode 上傳輸。通常,為了節省成本和降低複雜度,系統在unidirectional data path上來操作video mode。

Wednesday, March 07, 2012

Android Ice Cream Sandwich kernel 3.0 on Pandaboard

資料來源:Android Ice Cream Sandwich kernel 3.0 on Pandaboard

好核心,不胖達嗎?

繼上一篇討論如何燒錄Android framework到Pandaboard後,這篇來教學如何燒錄Android kernel for OMAP-4430,再進行這裡的步驟之前,請先照著上一篇做一次,把必要的工具和環境建立出來

1. 下載Android kernel source for Pandaboard

由於Android的kernel source repository掛掉很久了,要檢視所有的branch變得非常困難,首先我們要用git下載Android kernel for OMAP,Pandaboard採用的核心版本為最新的krenel 3.0

$ mkdir kernel_ICS
$ cd kernel_ICS
$ git clone https://android.googlesource.com/kernel/omap.git
$ cd omap
$ git branch -r
$ git checkout -b android-omap-panda-3.0 origin/android-omap-panda-3.0

由於Panda是採用OMAP4430的CPU,當然要抓這個分支囉


2. 編譯kernel

$ export PATH=android_ICS/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin:$PATH
$ export CROSS_COMPILE=arm-eabi-
$ cd kernel_ICS/omap/
$ make ARCH=arm panda_defconfig
$ make ARCH=arm -j4

要編譯kernel當然要先設定cross compiler, 從4.0原始碼裡面有提供編譯好的cross compiler binary,直接用他的就好


kernel config這邊選擇panda_defconfig,(我當初下載的是common kernel source,找半天沒有適合Panda的config)

到目前就算是初步完成囉,編譯好的kernel image會放在arch/arm/boot/zImage


3. 重建boot.img

網路上有很多人寫了方便的script,主要功能就是把原本要燒到SD卡上的boot.img拆開後,再把裡面原本的kernel image掉包成我們剛剛編譯好的zImage,這方法是比較有效率的,但是我太懶所以就請Android本身的makefile幫我們做這件事情囉

$ cd android_ICS/device/ti/panda/
$ mv kernel kernel.bak
$ cp kernel_ICS/omap/arch/arm/boot/zImage ./kernel
$ make -j4

簡單來說,Panda的kernel原本是以預先編譯好的方式存放在device資料夾裡面,我們做的事情就是單純的把他的image掉包成我們編譯的image(記得備份舊的)

重新編譯以後,會把新的kernel重新包入boot.img裡面,就算大功告成了

4. 燒錄kernel

燒錄時可以完全參考前一篇的作法,但是因為連整個system都重燒,會導致第一次開機非常久,

因此建議採用以下步驟來燒錄kernel

4.1 SD卡,USB線,UART線,HDMI線,電源線全部都接好,按住GPIO按鈕再按reset按鈕,直到u-boot進入fastboot模式

4.2 由於SD卡已經format好,而且我們只需要重燒boot.img的部分

$ sudo su
$ cd android_ICS/out/host/linux/bin
$ ./fastboot flash boot
$ ./fastboot reboot

如此一來重開機速度就會非常快了,附上一張修改kernel後顯示的kernel version

高亮 LXR 的代碼

資料來源:高亮 LXR 的代碼


LXR ── Linux Cross Refercence。Linux內核源碼閱讀和查詢的利器之一,不用多介紹了。LXR安裝後看到的源碼是沒有顏色的,用慣了語法高亮的編輯器,一下子看到滿屏的黑白代碼不免有點枯燥。於是給它裝了個可以顯示語法顏色的工具。
1、安裝google-code-prettify
項目地址是:http://code.google.com/p/google-code-prettify/
$ wget http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css
$ wget http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js
我把它們放到lxr的安裝目錄下面,lxr我放在web服務器的根目錄,所以就
2、修改lxr/http/template-head
這是lxr默認的html頭,在<head></head>標籤之間加上
1<link href="/lxr/prettify.css" type="text/css" rel="stylesheet" />
2<script type="text/javascript" src="/lxr/prettify.js"></script>
注意文件路徑,不在乎需要從遠方服務器讀取的話,也可以
1<link href='http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css' rel='stylesheet' type='text/css'/>
2<script src='http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js' type='text/javascript'></script>
這樣也可以讓google-code-prettify的維護者來自行維護這些腳本。
然後找到<body>標籤:
1<body bgcolor=white>
改為
1<body bgcolor=white onload='prettyPrint()'>
3、修改lxr/http/source
這是個perl腳本,查找字符串"<pre>",這有好幾處,都在printfile這個子函數裡面,改為
1<pre class=/"prettyprint/">
已經好了,這樣再看LXR裡面的代碼就可以看到漂亮的語法顏色了。效果圖:
2009-05-01 Update:
上面的效果圖有一個問題,就是代碼的行號也被渲染高亮了。這個可以通過給行號標識加上"nocode"這個prettifier提供的class來解決。對lxr/http/lib/LXR/Common.pm進行如下修改即可:
diff --git a/Common.pm b/Common.pm
index 9e23088..529d5a2 100755
--- a/Common.pm
+++ b/Common.pm
@@ -151,7 +151,7 @@ sub linetag {
$tag .= ' ' if $_[1] < 10;
$tag .= ' ' if $_[1] < 100;
$tag .= &fileref($_[1], $_[0], $_[1]).' ';
- $tag =~ s/<a/<a name=L$_[1]/;
+ $tag =~ s/<a/<a class="nocode" name=L$_[1]/;
# $_[1]++;
return($tag);
}
還可以在自己的css文件裡面重寫nocode這個class,例如加個方框啥的。

Ubuntu 環境下安裝 LXR

資料來源:Ubuntu 環境下安裝 LXR

由於項目需求,需要搭建一套代碼索引環境,經過網上查找,瞭解可以使用LXR (the Linux Cross Referencer)來做,同時網上有很多搭建方法,我嘗試學習,一步一步搭建環境,在這個過程中,遇到一些問題,記錄下來,分享給大家,方便大家順利完成LXR 搭建。 

環境:Ubuntu 10.10,新安裝的系統,具體搭建步驟如下(整個過程中基本都需要root權限): 

1.安裝apache2 
sudo apt-get install apache2 

2.安裝Glimplse 
. Glimplse 
# wget http://webglimpse.net/trial/glimpse-latest.tar.gz 
# tar xvzf glimpse-latest.tar.gz 
# cd glimpse-4.18.6 
# ./configure 
# make 

我在make 的時候報下面的錯

make[1]: flex: Command not found

make[1]: *** [lex.yy.c] Error 127

make[1]: Leaving directory `/usr/local/src/glimpse-4.18.6/dynfilters'

make: *** [build-sub] Error 2

在編譯之前,首先看看你的機器上是否已經安裝了flex,因為編譯glimpse的時候需要這個軟件。如果沒有的話,那麼進行安裝:
sudo apt-get install flex
 

執行 

# make 
# sudo make install 

3.安裝lxr 
sudo apt-get install lxr 

4. 對文件做映射 
在/etc/apache2/httpd.conf 在裡面添加以下內容: 
Alias /lxr /usr/share/lxr 
<Directory /usr/share/lxr> 
Options All 
AllowOverride All 
</Directory> 
這樣可以達到http://localhost/lxr/ =>/usr/share/lxr 

5. 在/usr/share/lxr/http下創建文件 .htaccess, 並寫入一下內容
<Files ~ (search|source|ident|diff|find)$> 
SetHandler cgi-script 
</Files> 

6.啟動apache2 
sudo /etc/init.d/apache2 restart 

7. 下載linux 源代碼 
linux內核源碼下載地址http://www.kernel.org/,我下載了2.6.39.4版本的linux 源碼,默認下載到/home/beaver(beaver是我的用戶名,根據大家的機器而定)/Downloads,解壓後為linux-2.6.39.4 

創建/usr/share/lxr/source/XX  目錄 (XX為版本號) 
mkdir /usr/share/lxr/source/2.6.39.4 
然後在/usr/share/lxr/source/2.6.39.4下創建linux符號連接 
ln -s /home/beaver/Downloads/linux-2.6.39.4 /usr/share/lxr/source/2.6.39.4/linux 
                  (源碼地址) 

8. 創建/usr/share/lxr/source/versions 文件,這裡記錄所有要看的版本,內容是 
2.6.39.4 
2.6.22(可有可無) 
要保證2.6.39.4 =>/usr/share/lxr/source/2.6.39.4 
創建/usr/share/lxr/source/defversion 文件,這裡記錄缺省要看的版本,內容是 
2.6.39.4 
之所以是這兩個文件,見/usr/share/lxr/http/lxr.conf裡的相關設置 

9. 建立索引 
cd /usr/share/lxr/source/2.6.39.4/ 
生成關鍵字交叉索引數據庫 
sudo genxref linux 
接下來要等待一段比較長的時間,因為它要掃瞄文件。這樣會在當前目錄生成fileidx和xref 
接下來,生成freetext交叉索引數據庫: 
sudo glimpseindex -H /usr/share/lxr/source/2.6.39.4/ /usr/share/lxr/source/2.6.39.4/linux 
(需要等待一段時間) 
之所以是這個目錄(/usr/share/lxr/source/2.6.39.4/),見/usr/share/lxr/http/lxr.conf裡的相關設置(database項) 

10.修改屬性,使任何人都可以讀取改文件 
sudo chmod +r -R /usr/share/lxr/source/2.6.39.4/* 
sudo chmod +r /usr/share/lxr/source/2.6.39.4/.glimpse*  (注意:這句命令必須執行,否則在 file search 的時候會出現警告:Warning: Could not open .glimpse_filenames) 

11.啟動apache,查看源碼 
sudo /etc/init.d/apache2 restart 
http://localhost/lxr/http/blurb.html //成功查看源碼 
閱讀的時候可以看到頁面頂部有 
~ [ source navigation ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~ 
source navigation是用戶查看頁面的界面 
identifier search是查找某個變量名、結構名、函數名的界面 
freetext search是查找任何字符串的界面 
file search查找某個文件 


參考文件: 
http://blog.sina.com.cn/s/blog_6c6d405f0100oq6l.html 
http://www.linuxsir.org/bbs/showthread.php?t=246594 
http://linux.chinaunix.net/techdoc/system/2006/12/21/946450.shtml 
http://yp.oss.org.cn/software/show_resource.php?resource_id=1044 
http://wenku.baidu.com/view/7d3c0471f242336c1eb95e13.html 
收藏: 
http://blog.csdn.net/fengyanhui/article/details/6320117 

Tuesday, March 06, 2012

Lcd Controller Timing parameters

資料來源:Lcd Controller Timing parameters


Lcd panel 的Timing 最小單位是clock,datasheet中標示為 Clock cycle。
這是panel 的特性,每個panel 有他工作的極限。

像 XXX 的 480x272 type,他的 clock cycle 就標示:
  Typ : 9, Max 15, Unit MHz
所以我們就要適當調整(除頻) host controller 的lcd vclk 頻率,讓他落在這個範圍內。

這個 Clock 信號,配合 R.G.B Data line,每個clock 會write一個pixel 的data到Lcd。

-------------------------------------------------------------------------------------------------------------------



Lcd 掃描是橫式的,以這個例子來看,就是一條 480 的線。 這是一條 horizontal 掃描線。

Lcd 需要另一個信號 HSYNC,用來標示Horizontal 掃描線的開始。
HSYNC信號必須要維持一段時間,讓Lcd controller能夠正確收到。在datasheet中,稱作 Horizontal Sync Pulse Width。
480x272 這個type,標示:
  Min 2, Typ 41 Unit CLK
基於每個 Lcd controller 內部控制器的能力,一旦收到 HSYNC 後,需要一段內部處理時間,才能開始收取horizontal line 的pixel 資料。
這一段時間叫做 Horizontal Back Porch。是以 lcd clock 為單位來計算的。
這也標示在lcd 的data sheet中。
像 480x272這個 type,就標示 Horizontal back porch:
 Min 2, Typ 2, Unit CLK
另外,由於Lcd Controller 實在太糟了,在處理完一條horizontal line的所有pixel後,ㄒ需要休息一段時間,才能再處理下一條。這段時間叫做 Horizontal front porch。
datasheet標示
 Min 2, Typ - Unit CLK
這樣,一條掃描線所需要的參數都定義出來了 (都是以 lcd clock 為單位):

|<--HSPW-->|<--HBP-->|<---HORIZONTAL_LINE_DATA--->|<--HFP-->|

-------------------------------------------------------------------------------------------------------------------


掃描線做完後,接著要靠一條一條的掃描線形成一個畫面(frame)。所以這部份的參數內容,都是以一條掃描線的時間為單位的..

和水平掃描線一樣,每個畫面的開頭,都需要一個信號,告知Lcd "這一條線是frame的開頭",這個信號叫做 Vertical Synch : VSYNC。
在datasheet標示 VSYNC 的信號,必須要維持至少 2 條掃描線的時間: Vertical Pulse Width
 Min 2, Typ 10, Unit H
其中"H"代表一個掃描線所需要的時間。
完全和Horizontal line一樣,Lcd收到VSYNC後,需要一段準備的時間,叫做 vertical back porch。datasheet上寫
 Min 2, Typ 2, Unit H
接下來還是一樣,一個畫面的所有掃描線資料都收完後,Lcd需要休息一段時間,才能再處理下一個Vertical Synch 信號,這段時間叫 Vertical Front Porch。Datasheet上寫:
 Min 2, Typ 2, Unit H
所以Vertical 部份看起來Horizontal 一樣,只是他的reference clock 單位變成"Horizontal Line Time (Period)"

|<--VSPW-->|<--VBP-->|<---EVERY_LINES_IN_FRAME--->|<--VFP-->|

-------------------------------------------------------------------------------------------------------------------


所以 決定 Lcd Clock 頻率後,在決定一條horizontal line 需要的clock 數後,就可以得到 horizontal line 的頻率:
Lcd Clock = 9MHz
HSPW(41)+HBP(2)+H_PIXEL_NUMBER(480)+HFP(2) = 525.
Horizontal Freq = 10MHz/525 = 17.14kHz
然後由vertical 參數算出一個畫面(frame)需要的horizontal line 後,就可以知道frame rate (frame freq:
Horizontal Freq = 17.14kHz
VSPW(10)+VBP(2)+V_LINE_NUMBER(272)+VFP(2) = 286
Frame Rate = 17.14kHz/286 = 59.9 Hz


lcd時序解疑

資料來源:lcd時序解疑


這裡主要是針對嵌入式開發常用的TFT-LCD系統作一些淺顯的分析,討論了大家在學習LCD時最容易混淆的一個地方,若有講的不對的地方那個,還請指正。
1. TFT-LCD系統的構成主要由三部分構成:TFT-LCD控制器、TFT-LCD驅動器和TFT-LCD屏。TFT-LCD控制器一般是集成在MCU中的,比如S3C2410的LCD控制器;而TFT-LCD驅動器和TFT-LCD屏一般就構成了我們常說的TFT液晶模塊,注意液晶和液晶模塊的區別,記得大學的嵌入式老師經常說:「你們一定要說買液晶模塊,而不要說買液晶,免得別人說你外行」。TFT液晶模塊除了這兩個部分外,還有背光電路和FPC接口等。如下圖。 TFT-LCD驅動器一般是由專用芯片構成的。常見的有ILI9325、NT39115等。這些芯片的主要是接收MCU的LCD控制器傳過來的RGB數據,根據這些RGB值,然後控制液晶點陣顯示相應的內容。那有人會問了,直接把RGB送給液晶不行嗎,為什麼要LCD驅動芯片呢?這是因為,要顯示一個像素單元,需要三個液晶點,分別來代表RGB三原色,而這三個液晶點,需要接三根source driver線和一根gate driver線,才能完成對這個像素單元的顯示控制,所以,對於一塊240*320像素的液晶,需要720根source driver線和320根gate driver線,而一般的MCU的所有接口加起來也超不過500個,所以,必須用專用LCD驅動芯片。


2. 從CRT掃瞄說起電視在顯示圖像的時候,把一幀分成了兩場來顯示,一個場由幀中的奇數行組成,叫做奇場;另一個場由幀中的偶數行組成,叫做偶場。之所以要這樣做,主要是因為在CRT顯像管上每秒鐘顯示25幀圖像時,人眼感覺到連續性還是不太好,而且還有明顯的閃爍,一幀分成兩場後,場頻為50Hz,圖像更加連續一些。當然還有一些別的原因,與電路設計方面有關。而掃完一場後,回到開始處從新掃瞄的過程叫做回掃,也即場消隱(field blanking)。同樣的也有行消隱(line blanking)。見下圖。這方面的詳細資料可以參考Video Electronics Standards Association發佈的Monitor Timing Standard標準文檔。圖中顯示是:Blanking = Front Porch + Sync + Back Porch。即,消隱時間 = 同步前沿 + 同步時間 + 同步後沿,而現在的LCD顯示器為了兼容這種場掃瞄模式,也採用消隱的做法。不同的是以前的CRT顯示一幀畫面,分兩場掃瞄,而現在的LCD顯示一幀只需要掃瞄一次。所以,以前的說法是行場(line、field),現在的說法是線幀(Horizontal、vertical)。也就是說以前是場消隱,現在是幀消隱。上面講的時序仍然是LCD驅動器對LCD屏的控制時序,還不是LCD控制器的時序。


3.LCD控制器時序我們都知道,一般的TFT-LCD的顯示刷新頻率是60Hz,也就是每秒鐘顯示60幀畫面。而我們視頻播放幀率是23~30fps,我們大概不會利用LCD控制器每秒送60幀圖像的RGB信息給LCD吧,一般是每秒鐘送20~30幀的RGB信息給LCD,讓其顯示。其實,我們是通過LCD控制器把RGB數據送給LCD驅動器,LCD驅動器就把它放到緩存中,然後以60fps的速度送給LCD屏顯示。可能有人會問,視頻幀率有多大,LCD就顯示多快,不行嗎?不行,由於液晶分子有一種特性,就是不能夠一直固定在某一個電壓不變,不然時間久了,液晶分子就遭到了破壞。所以要以一定的頻率(通常是60Hz)不停的刷新LCD屏,然後在幀消隱的時間裡,變換顯示電壓極性,達到保護液晶的目的。對於PAL制式的CRT顯示器,幀頻是25Hz,場頻是50Hz,這時,視頻幀率和顯示器刷新率是相同的。而我們在嵌入式當中使用TFT-LCD顯示器,視頻幀率一般是不等於顯示器幀率的。所以,LCD控制器時序和LCD驅動器時序(LCD顯示掃瞄時序)雖然表示方法大體相同,但有實質上的區別,LCD控制器時序控制著視頻幀率;LCD驅動器時序控制著顯示器刷新率。這是大家在學習LCD的時候最容易混淆的地方。下面以S3C2410的TFT-LCD控制器說明一下。見下圖。其中VSYNC是幀同步信號,VSYNC每發出1個脈衝,都意味著新的1屏視頻資料開始發送。而HSYNC為線同步信號,每個HSYNC脈衝都表明新的1掃瞄線視頻資料開始發送。而VDEN則用來標明視頻資料的有效,VCLK是用來鎖存視頻資料的像數時鐘。並且在幀同步以及線同步的頭尾都必須留有消隱時間,例如對於VSYNC來說消隱時間是(VSPW+1)+(VBPD+1)+ (VFPD+1);HSYNC亦類同。其中: VSPW:Vertical sync pulse width,也就是VSYNC處於高電平時的線的數目 VFPD:Vertical front porch delay VBPD:Vertical back porch delay HSPW:Hertical sync pulse width,也就是HSYNC處於高電平時的VCLK的數目 HFPD:Hertical front porch delay HBPD:Hertical back porch delay

gpio_direction_output vs gpio_set_value之間的使用關係



在linux驅動中常常會碰到gpio_set_value(port_num,0/1)或gpio_direction_output (port_num,0/1)
  這兩者有什麼關係呢
gpio_set_value(port_num,0/1) 一般只是在這個GPIO口的寄存器上寫上某個值,至於這個端口是否設置為輸出,它就管不了!
而gpio_direction_output (port_num,0/1),在某個GPIO口寫上某個值之後,還會把這個端口設置為輸出模式。
 因此,有人也許就會建議,把gpio_set_value這個函數直接去掉不用,是否可以,顯然是可以的。
 但是為什麼系統還要用呢,
 我個人分析是,
    系統開發人員在要結合這兩者來使用,以便提高效率。
   一般某個端口設置好了輸入與輸出模式後,最好不要經常變動。
   首先要調用gpio_direction_output(),以後要設置高低電平時,直接使用gpio_set_value()就可以了,這樣可以省卻再次調用設置輸出模式的操作,從而提高運行效率!

Thursday, March 01, 2012

An important note about Notes

平常就有在使用 ubuntu notes 的習慣, 今天想說到 web 介面去看一些 note, 不料, 怎麼沒有 notes 的介面呢?
後來找一找, 去 ubuntu blog 看到這個標題 An important note about Notes , 點進去看後, 沒想到 ubuntu 居然把 web 介面的 notes 移掉了...害我現在在 iPad or iPhone 上都不能看了!
有人知道有軟體可以在 iOS 上看嗎?