之前能夠以核心 2.6.29-rc4 成功編譯出的 task 為 poky-image-minimal,最近這兩天開始嘗試執行 poky-image-core,兩者的差別在於 minimal 只編譯了最少量的套件,只求可以開機就行;而 core image 則包括了完整的 GNOME Mobile 環境,也因此所需的編譯時間更久,也陸陸續續地遇到一些問題,其中比較大的問題主要是在核心模組的編譯之上。
怎麼說呢?目前所使用的版本為 Pinky-3.1.1 (08年六月釋出),如果沒記錯的話,那時的核心大約是在 2.6.25 rc 階段。不過自 2.6.28 版以後,核心引頭檔的目錄架構出現了大變動:原來在 include/asm-*/ 之下的引頭檔搬移至 arch/*/include、arch/*/mach-*/include 及 arch/*/plat-*/include 之下,並取消了 symbolic link 的使用,全由 makefile 來決定要引用的目錄。因此問題就來了,用來編譯舊版核心的 bb 檔只需要複製 include/asm-*/ 下的引頭檔至 staging 目錄下即可;但到 2.6.28 版以後,引頭檔的路徑已經改變,故需要做特別的處理。因此在 Pinky-3.1.1 下,編譯完核心後,還得再手動複製必要的引頭檔至正確的路徑之下,後續的核心模組編譯才能正確執行。
不過看了一下 Poky git 中,最新的核心版本是 moblin 的 2.6.29-rc2,不確定能不能正確處理,嗯嗯…
PS.
用 uclibc 要編譯 poky-image-core 的套件還是會遇到許多問題,且都是編譯過程的錯誤;想要順利完成的話,建議還是用 glibc 比較好。
2009年2月17日 星期二
Poky porting
最近這幾天,我一邊研究 OpenEmbedded building system 的目錄結構及設定檔撰寫,一邊嘗試利用 Poky 來編譯目前最新穩定版本 (2.6.28) 的核心。原因無他,主要是 2.6.27 以後的核心才有支援我現在使用的開發板。是故整個過程可分為兩階段,一是增加新版本核心用的 bb 檔案,另一項則為增加新硬體的設定檔。
要加入新版本核心其實可以將 meta/packages/linux/ 下的 bb 檔找一個你覺得適合的複製一份來改,內容大同小異,操作如下:
cd meta/packages/linux
vi linux-<MACHINE>_2.6.28.bb
# 填入自訂的內容,或複製現有的來修改
...
要注意的是,我們還需要再新建一個目錄,名稱如下所示,並複製核心使用的組態檔到該目錄下,檔名隨意,方便記憶即可:
mkdir linux-<MACHINE>
cp ~/defconfig ./defconfig-2.6.28
接著在修改 bb 檔時,幾個重要的變數需要設定:
再來就是在 bb 檔中撰寫上 patch 以及複製核心組態檔用的 shell script,這部分可以參考其他 bb 檔的做法,在此就不贅述。
加入新硬體的設定檔可參考 meta/conf/machine/ 下的檔案來修改,由於我的開發板和 OpenMoko 所使用的硬體是同屬於 S3C2440 的晶片,是故就直接複製 fic-gta01.conf 來修改:
cd meta/conf/machine
cp fic-gta01.conf <MACHINE>.conf
修改的部分如下:
修改完成後,在 build 目錄下 (別忘了要 source poky-init-build-env),鍵入以下的指令:
bitbake linux-<MACHINE>
就會開始進行編譯程序。若發生錯誤,查看 build/tmp/work/<MACHINE>-poky-linux-gnueabi/linux-<MACHINE>.../temp/ 下的紀錄檔並修正。
目前已經加入了 2.6.28 及 2.6.29-rc4 的 recipe。其中 2.6.29-rc4 包含了開發板上 SD 控制器和 LCD 控制器的支援,相信不久應該就可以看到跑 GNOME Mobile 的樣子了。
要加入新版本核心其實可以將 meta/packages/linux/ 下的 bb 檔找一個你覺得適合的複製一份來改,內容大同小異,操作如下:
cd meta/packages/linux
vi linux-<MACHINE>_2.6.28.bb
# 填入自訂的內容,或複製現有的來修改
...
要注意的是,我們還需要再新建一個目錄,名稱如下所示,並複製核心使用的組態檔到該目錄下,檔名隨意,方便記憶即可:
mkdir linux-<MACHINE>
cp ~/defconfig ./defconfig-2.6.28
接著在修改 bb 檔時,幾個重要的變數需要設定:
PV: 套件版號,OpenEmbedded 會利用該變數來決定使用那個版本來編譯,預設是找最新的版本。 S: 套件原始碼目錄,也就是 tarball 解開後放置的路徑,在這個例子中是 ${WORKDIR}/linux-2.6.28
加入新硬體的設定檔可參考 meta/conf/machine/ 下的檔案來修改,由於我的開發板和 OpenMoko 所使用的硬體是同屬於 S3C2440 的晶片,是故就直接複製 fic-gta01.conf 來修改:
cd meta/conf/machine
cp fic-gta01.conf <MACHINE>.conf
修改的部分如下:
MACHINE_FEATURES = "kernel26 vfat ext2" MACHINE_DISPLAY_WIDTH_PIXELS = "800" - MACHINE_DISPLAY_HEIGHT_PIXELS = "480"
- PREFERRED_PROVIDER_virtual/kernel = "linux-<MACHINE>"
- 移除 MACHINE_CLASS
- 移除 MACHINE_EXTRA_RDEPENDS, MACHINE_EXTRA_RRECOMMENDS
- 移除 EXTRA_IMAGECMD_JFFS2
- 移除 SERIAL_CONSOLE
- 移除 EXTRA_IMAGEDEPENDS
修改完成後,在 build 目錄下 (別忘了要 source poky-init-build-env),鍵入以下的指令:
bitbake linux-<MACHINE>
就會開始進行編譯程序。若發生錯誤,查看 build/tmp/work/<MACHINE>-poky-linux-gnueabi/linux-<MACHINE>.../temp/ 下的紀錄檔並修正。
目前已經加入了 2.6.28 及 2.6.29-rc4 的 recipe。其中 2.6.29-rc4 包含了開發板上 SD 控制器和 LCD 控制器的支援,相信不久應該就可以看到跑 GNOME Mobile 的樣子了。
2009年2月13日 星期五
Poky Linux 建構系統使用感想
最近為了要建立一個完整可供核心掛載的檔案系統,去玩一玩了 Poky 這個嵌入式套件。無可否認的,它所根基的 OpenEmbedded 是個很有彈性的套件建構系統,在已支援的開發板上,只要改一些設定,就可從無到有建構核心及所需的檔案系統映象 (file system image),並且會幫你處理套件間相依性的問題,也可以只建構特定套件,打包成 ipkg 或 deb 檔以供其他系統使用。有過土法煉鋼、自己抓原始碼回來編譯的痛苦經驗的人,就會了解這個功能是多麼地令人叫好。
雖然功能強大,但若要加入新的開發板的支援,或是要解決某個套件不能順利編譯的問題,你就會發現,它的設定檔也是異常的複雜難懂;每個設定檔會去引用其他共享的檔案,並且預先設定一大堆變數。有些變數是在目前檔案被設定,有些則是在被引用時才設定。而被引用的檔案又會去引用其他的檔案……沒完沒了。
就在不久前,uClibc 發生編譯錯誤 (poky 3.1.1),從錯誤訊息看來,發現是硬體架構設定錯誤所致。但找了老半天,就是不知道應該要改那個設定檔,令人懊惱。花了一個下午的時間,才找到問題的關鍵,修正後,這才能順利編譯。我另外把它做成了一個 patch,但我沒有網頁空間可以放,有相同問題的朋友可以來找我要,或有朋友願意提供他的空間也成。
延伸閱讀:
Embedded Linux 系統性的教學看法
Embedded Linux 應用的痛處: OpenEmbedded
雖然功能強大,但若要加入新的開發板的支援,或是要解決某個套件不能順利編譯的問題,你就會發現,它的設定檔也是異常的複雜難懂;每個設定檔會去引用其他共享的檔案,並且預先設定一大堆變數。有些變數是在目前檔案被設定,有些則是在被引用時才設定。而被引用的檔案又會去引用其他的檔案……沒完沒了。
就在不久前,uClibc 發生編譯錯誤 (poky 3.1.1),從錯誤訊息看來,發現是硬體架構設定錯誤所致。但找了老半天,就是不知道應該要改那個設定檔,令人懊惱。花了一個下午的時間,才找到問題的關鍵,修正後,這才能順利編譯。我另外把它做成了一個 patch,但我沒有網頁空間可以放,有相同問題的朋友可以來找我要,或有朋友願意提供他的空間也成。
延伸閱讀:
Embedded Linux 系統性的教學看法
Embedded Linux 應用的痛處: OpenEmbedded
2008年12月20日 星期六
關於 touch screen driver
其實 touch screen driver 的部分,這裡和這裡的文章已經提過了,只要把 patch 抓下來 apply 至核心原始碼中,再加上些修正即可。不過沒人規定不能重新發明輪子吧?我還是想先自己寫寫看,來了解一下應該如何去設定相關的控制器,以及實際在板子上的運作情況如何。既然是自己找樂趣玩,又有何不可?
不過實際寫了之後,發現雖然使用手冊詳實敘述了各個暫存器的意義,但對於該如何設定以及設定順序為何,還是非常空洞;沒辦法,再回去參考了 patch 的原始碼,才豁然開朗。但話說回來,經過了親手下去實作的過程,有了更深一層的了解,再回來看原始程式,才能很快地抓住你所想知道的關鍵部分,並立即套用至你的程式中。這也算是一種學習驅動程式撰寫的方法之一吧…
接下來,再把程式修改修改,就可以上版子來測試了。
不過實際寫了之後,發現雖然使用手冊詳實敘述了各個暫存器的意義,但對於該如何設定以及設定順序為何,還是非常空洞;沒辦法,再回去參考了 patch 的原始碼,才豁然開朗。但話說回來,經過了親手下去實作的過程,有了更深一層的了解,再回來看原始程式,才能很快地抓住你所想知道的關鍵部分,並立即套用至你的程式中。這也算是一種學習驅動程式撰寫的方法之一吧…
接下來,再把程式修改修改,就可以上版子來測試了。
2008年11月17日 星期一
2008年10月11日 星期六
加入 Frame buffer 支援
上個月底,我上傳了另一個 patch,主要為加入開發板的 LCD 支援。由於 S3C2440 的 LCD 控制器已有完整的驅動程式支援,是故在設定上也相當容易。你需要根據面板的 datasheet 來設定如解析度、pixel clock、bpp (bits per pixel)和其他相關的 timing 參數,剩下的 LCDCON5 的內容可直接參考其他開發板的設定。
和面板有關的參數設定在 struct s3c2410fb_display 這個結構中,其宣告為
struct s3c2410fb_display {
/* LCD type */
unsigned type;
/* Screen size */
unsigned short width;
unsigned short height;
/* Screen info */
unsigned short xres;
unsigned short yres;
unsigned short bpp;
unsigned pixclock; /* pixclock in picoseconds */
unsigned short left_margin; /* value in pixels (TFT) or HCLKs (STN) */
unsigned short right_margin; /* value in pixels (TFT) or HCLKs (STN) */
unsigned short hsync_len; /* value in pixels (TFT) or HCLKs (STN) */
unsigned short upper_margin; /* value in lines (TFT) or 0 (STN) */
unsigned short lower_margin; /* value in lines (TFT) or 0 (STN) */
unsigned short vsync_len; /* value in lines (TFT) or 0 (STN) */
/* lcd configuration registers */
unsigned long lcdcon5;
};
以我的面板為例,這塊面板是 HITACHI 的七吋面板,型號為 TX18D16VM1CAA,根據手冊所記載,其可接受的 pixel clock 的最大週期為 33ns (相當於 30KHz);Hsync 訊號寬度為 128 個 pclk,螢幕左方邊界寬度為 88 個 pclk,右方為 40 pclk;Vsync 訊號寬度為 2 個 Hsync 週期,上方邊界寬度為 32 個 Hsync,下方為 11 個 Hsync。解析度為 800x480。
程式碼加入後,在 make config 中開啟 S3C24xx 之 frame buffer 支援,重新編譯後下載至開發板即可。
另外,你也可以在核心啟動參數中加上 fbcon=rotate:<n> 來設定螢幕的方向。0 為不旋轉,1 為旋轉 90 度,2 為旋轉 180 度,3 為旋轉 270 度,方向皆為逆時針方向。
和面板有關的參數設定在 struct s3c2410fb_display 這個結構中,其宣告為
struct s3c2410fb_display {
/* LCD type */
unsigned type;
/* Screen size */
unsigned short width;
unsigned short height;
/* Screen info */
unsigned short xres;
unsigned short yres;
unsigned short bpp;
unsigned pixclock; /* pixclock in picoseconds */
unsigned short left_margin; /* value in pixels (TFT) or HCLKs (STN) */
unsigned short right_margin; /* value in pixels (TFT) or HCLKs (STN) */
unsigned short hsync_len; /* value in pixels (TFT) or HCLKs (STN) */
unsigned short upper_margin; /* value in lines (TFT) or 0 (STN) */
unsigned short lower_margin; /* value in lines (TFT) or 0 (STN) */
unsigned short vsync_len; /* value in lines (TFT) or 0 (STN) */
/* lcd configuration registers */
unsigned long lcdcon5;
};
以我的面板為例,這塊面板是 HITACHI 的七吋面板,型號為 TX18D16VM1CAA,根據手冊所記載,其可接受的 pixel clock 的最大週期為 33ns (相當於 30KHz);Hsync 訊號寬度為 128 個 pclk,螢幕左方邊界寬度為 88 個 pclk,右方為 40 pclk;Vsync 訊號寬度為 2 個 Hsync 週期,上方邊界寬度為 32 個 Hsync,下方為 11 個 Hsync。解析度為 800x480。
程式碼加入後,在 make config 中開啟 S3C24xx 之 frame buffer 支援,重新編譯後下載至開發板即可。
另外,你也可以在核心啟動參數中加上 fbcon=rotate:<n>
2008年9月12日 星期五
[好文] 如何加入 Linux 開發社群
How to participate in the Linux Community
http://ldn.linuxfoundation.org/book/how-participate-linux-community
就在幾個月前,動心起念想要貢獻一些程式碼時,還真是不知該如何入門;深怕一個不小心,也許是程式的錯誤,或是英文不好引起誤會,或不了解某些規矩,而被 list 上的開發者給打槍,並回以鄙夷的指責。不過在 post 了幾個 patch 之後,事實證明了我是多慮了。當然還是有些規矩要遵守,只是犯了錯也沒那麼嚴重,通常開發者會好心提醒你該作什麼事,改回來就好,社群仍然會歡迎你的加入。
當然如果可以有一些文件教導我們這些新人,豈不更好?幸好有這本小書的出現,替我們指點迷津。24 頁的內容包含新進開發者該有的心態,以及該如何和社群互動、修改程式、準備及上傳 patch、撰寫信件的注意事項、開發者常犯的錯誤等等,足夠菜鳥們在正式踏入前有個心理準備,而我也從中受惠許多,發現了一些自己不曾注意到的小細節,或許可以再做得更好。
總之,強烈推薦新進開發者一定要讀讀這本書。
http://ldn.linuxfoundation.org/book/how-participate-linux-community
就在幾個月前,動心起念想要貢獻一些程式碼時,還真是不知該如何入門;深怕一個不小心,也許是程式的錯誤,或是英文不好引起誤會,或不了解某些規矩,而被 list 上的開發者給打槍,並回以鄙夷的指責。不過在 post 了幾個 patch 之後,事實證明了我是多慮了。當然還是有些規矩要遵守,只是犯了錯也沒那麼嚴重,通常開發者會好心提醒你該作什麼事,改回來就好,社群仍然會歡迎你的加入。
當然如果可以有一些文件教導我們這些新人,豈不更好?幸好有這本小書的出現,替我們指點迷津。24 頁的內容包含新進開發者該有的心態,以及該如何和社群互動、修改程式、準備及上傳 patch、撰寫信件的注意事項、開發者常犯的錯誤等等,足夠菜鳥們在正式踏入前有個心理準備,而我也從中受惠許多,發現了一些自己不曾注意到的小細節,或許可以再做得更好。
總之,強烈推薦新進開發者一定要讀讀這本書。
訂閱:
意見 (Atom)