資料來源: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
Wednesday, March 07, 2012
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 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
這裡主要是針對嵌入式開發常用的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 上看嗎?
後來找一找, 去 ubuntu blog 看到這個標題 An important note about Notes , 點進去看後, 沒想到 ubuntu 居然把 web 介面的 notes 移掉了...害我現在在 iPad or iPhone 上都不能看了!
有人知道有軟體可以在 iOS 上看嗎?
Subscribe to:
Posts (Atom)