天天看點

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構

由于之前做過2440和6410,鑒于時間原因,這裡暫時跨過其他子產品的裸機驅動和uboot移植,直接進入核心移植及驅動開發方面的學習。

核心移植其實很簡單,因為核心是linus率領的linux核心開發團隊開發并維護的,我們隻需要跟我們的平台交叉編譯一下即可使用,但是,核心移植也不簡單,因為核心移植起見出現任何問題都可能會被卡住,因為核心代碼非常龐大,我們無法通讀核心代碼,下面是我移植期間遇到的各種悲催的問題和解決方案,首先是必備的開發環境:

a) Linux核心代碼,版本3.8.3

b) S5PV210開發闆(我的是TQ210)

c) HOST環境是WIN7(64位)下安裝的Ubuntu虛拟機(12.10)

一 核心編譯

從Linux核心網站(kernel.org)下載下傳核心代碼、解壓并進入核心目錄

(1)修改Makefile,将195行和196行改為:

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. ARCH = arm  
  2. CROSS_COMPILE   ?= arm-linux-  

(2)進行預設配置,進入arch/arm/configs目錄,可以發現最接近我們開發闆的配置檔案是s5pv210_defconfig,故

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. make s5pv210_defconfig  

(3)編譯核心,如果需要生成zImage則執行

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. make zImage  

如果需要生成uImage則執行

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. make uImage  

(4)用uboot下載下傳并嘗試運作,結果是悲劇的,在uboot列印”Starting kernel...“之後就看不到任何輸出了,顯然,有兩種原因:

a. 編譯的核心類型錯誤,比如您的uboot使用的是uImage,而您編譯的是zImage。

b. 移植的uboot存在問題,沒能正确的拷貝核心到正确的記憶體位址并啟動。

c. 核心存在某些配置,我們沒有配置。

經過檢視核心配置項知道,核心預設采用的UART1列印調試資訊,是以,執行:

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. make menuconfig  

在出來的對話中依次選擇System type => (1) S3C UART to use for low-level messages,在編輯框中将1改為0,然後儲存配置并再次編譯核心,直接執行make即可,無需make clean。 如果是首次執行make menuconfig會遇到錯誤,這是因為make menuconfig依賴一個庫,這裡我忘記名字了,如果是ubuntu可以直接用指令安裝的,網上搜一下就可以搞定。

編譯完核心之後再次下載下傳并嘗試運作,這時,可以看到核心列印的資訊了,如果您不幸隻看到“Uncompressing Linux... done, booting the kernel.”就沒有任何輸出了,那麼請檢查uboot傳入的機器碼跟核心機器碼是否比對,如果不比對請修正,然後重新編譯運作核心或者uboot,如果修正之後仍然看不到其他輸出,那麼請檢查uboot的bootargs參數,bootargs中必須配置console=ttySAC0,否則也看不到列印資訊。

如果沒有出現上面的錯誤,那麼您的核心已經可以列印出很多資訊,但是由于核心預設沒有提供對Nand或網卡的支援,無法挂接檔案系統,是以仍然無法正常運作。為了能使核心進入控制台,為後面的驅動開發提供環境,我們先制作檔案系統,然後來移植網卡驅動,讓核心NFS方式挂接檔案系統,然後我們就可以開發其他驅動了,如Nand、LCD、聲霸卡等等。

二 建構檔案系統

其實建構檔案系統還是比較簡單的,注意幾個地方,然後按部就班的來就可以了。

(1)建立根檔案系統目錄結構,可以使用如下腳本:

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. #!/bin/sh  
  2. echo "------Create rootfs directons start...--------"  
  3. mkdir rootfs  
  4. cd rootfs  
  5. echo "--------Create root,dev....----------"  
  6. mkdir root dev etc boot tmp var sys proc lib mnt home usr   
  7. mkdir etc/init.d etc/rc.d etc/sysconfig  
  8. mkdir usr/sbin usr/bin usr/lib usr/modules  
  9. echo "make node in dev/console dev/null"  
  10. sudo mknod -m 600 dev/console c 5 1  
  11. sudo mknod -m 600 dev/null  c 1 3  
  12. mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp  
  13. mkdir var/lib var/lock var/run var/tmp  
  14. chmod 1777 tmp  
  15. chmod 1777 var/tmp  
  16. echo "-------make direction done---------"  

在這裡我将腳本命名為mkrootfs.sh,接下來給腳本加可執行權限(即chmod a+x mkrootfs)并運作腳本。我的腳本是在/nfsroot目錄下運作的,是以我的根檔案系統的根目錄為/nfsroot/rootfs,後面均以該目錄為例闡述。

(2)編譯Busybox

到Busybox下載下傳最新版的Busybox源碼,我是用的是1.21.0版本,下載下傳完後解壓并進入busybox目錄,首先是配置busybox

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. make menuconfig  

配置菜單跟配置核心時的差不多,依次進入Busybox Settings => Build Options => Cross Compiler prefix (NEW),設定為編譯器的字首,我的是arm-linux-。網上有些朋友還推薦選擇Busybox Settings => Build Options => Build BusyBox as a static binary (no shared libs),但是如果我們正确拷貝編譯器了運作庫的話,不設定也可以。現在可以編譯Busybox了,執行

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. make  

編譯過程很順利,我這裡沒有遇到任何錯誤,接下來将編譯好的Busybox安裝到/nfsroot/rootfs就可以了,執行

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. make CONFIG_PREFIX=/nfsroot/rootfs install  

(3)拷貝編譯器運作庫

我的編譯器是4.5.1版本的,拷貝arm-none-linux-gnueabi/sys-root/lib的所有動态庫到/nfsroot/rootfs/lib下,為了不拷貝連接配接,應該加上”-d"選項,執行

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. cp *so* /nfsroot/rootfs/lib -d  

同樣拷貝arm-none-linux-gnueabi/sys-root/usr/lib下的所有動态庫到/nfsroot/rootfs/usr/lib下,執行

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. cp *so* /nfsroot/rootfs/usr/lib -d  

(4)建構etc目錄

在etc目錄下建立Inittab檔案,内容如下

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. ::sysinit:/etc/init.d/rcS  
  2. console::askfirst:-/bin/sh  
  3. ::restart:/sbin/init  
  4. ::ctrlaltdel:/sbin/reboot  
  5. ::shutdown:/bin/umount -a -r  
  6. ::shutdown:/sbin/swapoff -a  

在etc/init.d/目錄下建立rcS檔案,内容如下

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. echo "----------mount all.........."  
  2. mount -a  
  3. echo "----------Starting mdev......"  
  4. echo /sbin/mdev > /proc/sys/kernel/hotplug  
  5. mdev -s  
  6. /bin/hostname -F /etc/sysconfig/HOSTNAME  

為inittab和rcS檔案添加可執行權限

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. chmod a+x inittab  
  2. chmod a+x rcS  

在etc目錄下建立fstab檔案,内容如下

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. #evice mount-point type       option       dump   fsck   order  
  2. proc /proc proc defaults 0 0  
  3. none /tmp ramfs defaults 0 0  
  4. mdev /dev ramfs defaults 0 0  
  5. sysfs /sys sysfs defaults 0 0  

在etc目錄下建立profile檔案,内容如下

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. PATH=/bin:/sbin:/usr/bin:/usr/sbin    
  2. export PATH    
  3. #set hostname    
  4. HOSTNAME='/bin/hostname'    
  5. export HOSTNAME    
  6. # Set PS1    
  7. PS1='[\u@\h \W]\$'  
  8. export PS1  

拷貝主機/etc目錄下的passwd和group檔案到etc目錄下。

(5) 設定HOSTNAME檔案

在etc/sysconfig目錄下建立HOSTNAME檔案,在檔案中寫入主機名,我這裡寫的是bruce。

(6) 安裝核心modules

進入核心源碼目錄,執行

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. make modules  

待編譯完成後安裝modules,執行指令

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. make modules_install INSTALL_MOD_PATH=/nfsroot/rootfs  

到這,根檔案系統就建構完成了.

三 設定uboot啟動參數

我的nfs根目錄為/nfsroot,我的根檔案系統目錄是在該目錄之下的,即/nfsroot/rootfs目錄,故uboot啟動參數設定如下

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. noinitrd console=ttySAC0 root=<主機IP>:/nfsroot/rootfs rw ip=<開發闆IP>:<主機IP>:<網關>:<子網路遮罩>::eth0:off init=/linuxrc  

需要注意的是,所有的冒号":"都不可省略。

四  網卡驅動移植(DM9000)

選擇網卡移植是因為網卡驅動相對較為簡單,對于DM9000就更加簡單了,因為核心本身提供了DM9000的驅動程式,但是沒有針對開發闆進行管教配置,是以,我們配置下開發闆相關的東西即可完成網卡驅動的移植。打開arch/arm/mach-s5pv210/mach-smdkv210.c檔案,并作以下修改:

(1) 修改smdkv210_dm9000_resources定義如下

[cpp]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. static struct resource smdkv210_dm9000_resources[] = {   
  2.     [0] = {   
  3.         .start = 0x88000000,  
  4.         .end = 0x88000000 + 3,  
  5.         .flags = IORESOURCE_MEM,  
  6.     },    
  7.     [1] = {   
  8.         .start = 0x88000000 + 4,  
  9.         .end = 0x88000000 + 4 + 3,  
  10.         .flags = IORESOURCE_MEM,  
  11.     },    
  12.     [2] = {   
  13.         .start = IRQ_EINT(10),  
  14.         .end = IRQ_EINT(10),  
  15.         .flags = IORESOURCE_IRQ|IORESOURCE_IRQ_HIGHLEVEL,  
  16.     }     
  17. };  

(2) 修改smdkv210_dm9000_init函數如下

[cpp]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. static void __init smdkv210_dm9000_init(void)  
  2. {  
  3.     unsigned long* srom_bw = ioremap(0xE8000000, 4);   
  4.     unsigned long* srom_bc1 = ioremap(0xE8000004, 4);   
  5.     *srom_bc1 = ((0<<28)|(0<<24)|(5<<16)|(0<<12)|(0<<8)|(0<<4)|(0<<0));  
  6.     *srom_bw &= ~(0xf << 4);   
  7.     *srom_bw |= (1<<4)|(1<<5);  
  8.     gpio_request(S5PV210_MP01(1), "nCS1");  
  9.     s3c_gpio_cfgpin(S5PV210_MP01(1), S3C_GPIO_SFN(2));  
  10.     gpio_free(S5PV210_MP01(1));  
  11.     iounmap(srom_bw);  
  12.     iounmap(srom_bc1);  
  13. }  

這樣,就完成了DM9000網卡驅動的移植,其實這樣修改是有邏輯的,根據TQ210的原理圖可知DM9000連接配接的片選時nCS1,也就是網卡是接在來ROM控制器的BANK1上。

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構

根據S5PV210的記憶體映射表可以看出,SROMC的BANK1位址空間為0x88000000~0x8FFFFFFF,故當CPU尋址該範圍内的位址空間時才會使能片選nCS1。是以,我們采用的是0x88000000位址。

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構

另外,從TQ210原理圖的DM9000部分還可以看到,DM9000使用的是外部中斷10,故将中斷号修改為10号。

最後需要說明的是smdkv210_dm9000_init函數的修改,這是因為DM9000的資料通路、指令發送等是按照一定時序工作的,而DM9000接再SROMC上,是以需要配置SROMC時序,使其可以正确驅動DM9000,關于時序的詳細配置我還沒研究,不過韋東山老師的第二期視訊中講述了DM9000的驅動移植,也講了時序配置,需要的話可以參考。

五 挂接檔案系統

我們現在配置好了網卡驅動,還需要對核心稍作配置才能使核心支援網絡檔案系統挂載,具體的可以參考以下配置。

(1) 配置網絡支援

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. [*] Networking support  --->  
  2.     Networking options  --->  
  3.         <*> Packet socket   
  4.         <*> Unix domain sockets  
  5.         [*] TCP/IP networking  
  6.         [*]   IP: multicasting  
  7.         [*]   IP: kernel level autoconfiguration   
  8.         [*]     IP: DHCP support  
  9.         [*]     IP: BOOTP support  
  10.         [*]     IP: RARP support  
  11.         [*]   IP: multicast routing  

(2) 配置網卡裝置支援

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. Device Drivers  --->  
  2.     [*] Network device support  --->   
  3.         [*]   Ethernet driver support  --->  
  4.             <*>   DM9000 support  

(3) 配置網絡檔案系統支援

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. File systems  --->   
  2.     [*] Network File Systems  --->   
  3.         <*>   NFS client support   
  4.         <*>     NFS client support for NFS version 2  
  5.         <*>     NFS client support for NFS version 3   
  6.         [*]       NFS client support for the NFSv3 ACL protocol extension  
  7.         <*>     NFS client support for NFS version 4  
  8.         [*]   Root file system on NFS  

配置完以上三項後儲存配置,然後再次編譯核心,直接執行make指令即可。

這時,重新下載下傳核心測試運作,沒有意外的話現在核心已經可以正常工作了,如果不幸的遇到了問題,那麼問題應該是NFS伺服器配置的問題,ubuntu下配置NFS伺服器很簡單

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. sudo apt-get install nfs-kernel-server  

然後以根權限打開/etc/exports檔案,我的NFS根目錄為/nfsroot,故,我設定export為

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. /nfsroot/ *(rw,sync,no_root_squash)  

設定完成之後需要重新開機NFS服務,ubuntu下執行

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. sudo service nfs-kernel-server restart  

重新開機的時候會看到一些警告,如下圖

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構

但是上述警告不影響使用。反之,如果設定為no_subtree_check,雖然系統可以正常挂載,但是無法進行建立檔案等寫操作,也就是說,挂載的檔案系統是隻讀的。最後還要修改下/nfsroot的權限,為了以後使用友善。

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. chmod a+x /nfsroot -R  

到這裡,基于TQ210的核心移植已經初步完成了,接下來我們就可以進行驅動開發了。

六 問題總結

我在配置過程中遇到了很多問題,現在稍作總結

(1) 序列槽中斷列印完Starting kernel...之後就沒有任何輸出了

配置核心,指定調試資訊輸出端口為UART0,文中講到了詳細配置。

(2) 解壓完核心之後沒有任何輸出了

a.檢查bootargs環境變量設定是否正确,必須設定console=ttySAC0

b.檢查uboot傳遞的機器碼根核心是否對應

c.檢查uboot傳給核心的taglist是否正确

(3) 核心無法挂接到NFS檔案系統

a. 正确移植DM9000網卡驅動

b. 配置核心的網絡部分、網卡裝置和檔案系統中的網絡檔案系統

c. 确認NFS伺服器的配置是否正确,用另外其他linux或已經移植好系統的linux進行測試(mount -o nolock xx.xx.xx.xx:/nfsroot/rootfs)。

(4) 檔案系統挂接成功,無法執行/linuxrc

a. 檢查NFS配置檔案,最好以NFSv2方式配置,核心不支援的話會出現問題。

b. 最好以文中推薦的方式進行NFS伺服器配置。

c. 配置完成之後需要重新開機NFS服務或者是重新開機系統。

七 其它問題

如果您在移植過程中出現了其他問題歡迎留言讨論。

本文連結:http://blog.csdn.net/girlkoo/article/details/8719828

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. make uImage  

(4)用uboot下載下傳并嘗試運作,結果是悲劇的,在uboot列印”Starting kernel...“之後就看不到任何輸出了,顯然,有兩種原因:

a. 編譯的核心類型錯誤,比如您的uboot使用的是uImage,而您編譯的是zImage。

b. 移植的uboot存在問題,沒能正确的拷貝核心到正确的記憶體位址并啟動。

c. 核心存在某些配置,我們沒有配置。

經過檢視核心配置項知道,核心預設采用的UART1列印調試資訊,是以,執行:

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. make menuconfig  

在出來的對話中依次選擇System type => (1) S3C UART to use for low-level messages,在編輯框中将1改為0,然後儲存配置并再次編譯核心,直接執行make即可,無需make clean。 如果是首次執行make menuconfig會遇到錯誤,這是因為make menuconfig依賴一個庫,這裡我忘記名字了,如果是ubuntu可以直接用指令安裝的,網上搜一下就可以搞定。

編譯完核心之後再次下載下傳并嘗試運作,這時,可以看到核心列印的資訊了,如果您不幸隻看到“Uncompressing Linux... done, booting the kernel.”就沒有任何輸出了,那麼請檢查uboot傳入的機器碼跟核心機器碼是否比對,如果不比對請修正,然後重新編譯運作核心或者uboot,如果修正之後仍然看不到其他輸出,那麼請檢查uboot的bootargs參數,bootargs中必須配置console=ttySAC0,否則也看不到列印資訊。

如果沒有出現上面的錯誤,那麼您的核心已經可以列印出很多資訊,但是由于核心預設沒有提供對Nand或網卡的支援,無法挂接檔案系統,是以仍然無法正常運作。為了能使核心進入控制台,為後面的驅動開發提供環境,我們先制作檔案系統,然後來移植網卡驅動,讓核心NFS方式挂接檔案系統,然後我們就可以開發其他驅動了,如Nand、LCD、聲霸卡等等。

二 建構檔案系統

其實建構檔案系統還是比較簡單的,注意幾個地方,然後按部就班的來就可以了。

(1)建立根檔案系統目錄結構,可以使用如下腳本:

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. #!/bin/sh  
  2. echo "------Create rootfs directons start...--------"  
  3. mkdir rootfs  
  4. cd rootfs  
  5. echo "--------Create root,dev....----------"  
  6. mkdir root dev etc boot tmp var sys proc lib mnt home usr   
  7. mkdir etc/init.d etc/rc.d etc/sysconfig  
  8. mkdir usr/sbin usr/bin usr/lib usr/modules  
  9. echo "make node in dev/console dev/null"  
  10. sudo mknod -m 600 dev/console c 5 1  
  11. sudo mknod -m 600 dev/null  c 1 3  
  12. mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp  
  13. mkdir var/lib var/lock var/run var/tmp  
  14. chmod 1777 tmp  
  15. chmod 1777 var/tmp  
  16. echo "-------make direction done---------"  

在這裡我将腳本命名為mkrootfs.sh,接下來給腳本加可執行權限(即chmod a+x mkrootfs)并運作腳本。我的腳本是在/nfsroot目錄下運作的,是以我的根檔案系統的根目錄為/nfsroot/rootfs,後面均以該目錄為例闡述。

(2)編譯Busybox

到Busybox下載下傳最新版的Busybox源碼,我是用的是1.21.0版本,下載下傳完後解壓并進入busybox目錄,首先是配置busybox

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. make menuconfig  

配置菜單跟配置核心時的差不多,依次進入Busybox Settings => Build Options => Cross Compiler prefix (NEW),設定為編譯器的字首,我的是arm-linux-。網上有些朋友還推薦選擇Busybox Settings => Build Options => Build BusyBox as a static binary (no shared libs),但是如果我們正确拷貝編譯器了運作庫的話,不設定也可以。現在可以編譯Busybox了,執行

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. make  

編譯過程很順利,我這裡沒有遇到任何錯誤,接下來将編譯好的Busybox安裝到/nfsroot/rootfs就可以了,執行

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. make CONFIG_PREFIX=/nfsroot/rootfs install  

(3)拷貝編譯器運作庫

我的編譯器是4.5.1版本的,拷貝arm-none-linux-gnueabi/sys-root/lib的所有動态庫到/nfsroot/rootfs/lib下,為了不拷貝連接配接,應該加上”-d"選項,執行

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. cp *so* /nfsroot/rootfs/lib -d  

同樣拷貝arm-none-linux-gnueabi/sys-root/usr/lib下的所有動态庫到/nfsroot/rootfs/usr/lib下,執行

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. cp *so* /nfsroot/rootfs/usr/lib -d  

(4)建構etc目錄

在etc目錄下建立Inittab檔案,内容如下

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. ::sysinit:/etc/init.d/rcS  
  2. console::askfirst:-/bin/sh  
  3. ::restart:/sbin/init  
  4. ::ctrlaltdel:/sbin/reboot  
  5. ::shutdown:/bin/umount -a -r  
  6. ::shutdown:/sbin/swapoff -a  

在etc/init.d/目錄下建立rcS檔案,内容如下

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. echo "----------mount all.........."  
  2. mount -a  
  3. echo "----------Starting mdev......"  
  4. echo /sbin/mdev > /proc/sys/kernel/hotplug  
  5. mdev -s  
  6. /bin/hostname -F /etc/sysconfig/HOSTNAME  

為inittab和rcS檔案添加可執行權限

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. chmod a+x inittab  
  2. chmod a+x rcS  

在etc目錄下建立fstab檔案,内容如下

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. #evice mount-point type       option       dump   fsck   order  
  2. proc /proc proc defaults 0 0  
  3. none /tmp ramfs defaults 0 0  
  4. mdev /dev ramfs defaults 0 0  
  5. sysfs /sys sysfs defaults 0 0  

在etc目錄下建立profile檔案,内容如下

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. PATH=/bin:/sbin:/usr/bin:/usr/sbin    
  2. export PATH    
  3. #set hostname    
  4. HOSTNAME='/bin/hostname'    
  5. export HOSTNAME    
  6. # Set PS1    
  7. PS1='[\u@\h \W]\$'  
  8. export PS1  

拷貝主機/etc目錄下的passwd和group檔案到etc目錄下。

(5) 設定HOSTNAME檔案

在etc/sysconfig目錄下建立HOSTNAME檔案,在檔案中寫入主機名,我這裡寫的是bruce。

(6) 安裝核心modules

進入核心源碼目錄,執行

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. make modules  

待編譯完成後安裝modules,執行指令

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. make modules_install INSTALL_MOD_PATH=/nfsroot/rootfs  

到這,根檔案系統就建構完成了.

三 設定uboot啟動參數

我的nfs根目錄為/nfsroot,我的根檔案系統目錄是在該目錄之下的,即/nfsroot/rootfs目錄,故uboot啟動參數設定如下

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. noinitrd console=ttySAC0 root=<主機IP>:/nfsroot/rootfs rw ip=<開發闆IP>:<主機IP>:<網關>:<子網路遮罩>::eth0:off init=/linuxrc  

需要注意的是,所有的冒号":"都不可省略。

四  網卡驅動移植(DM9000)

選擇網卡移植是因為網卡驅動相對較為簡單,對于DM9000就更加簡單了,因為核心本身提供了DM9000的驅動程式,但是沒有針對開發闆進行管教配置,是以,我們配置下開發闆相關的東西即可完成網卡驅動的移植。打開arch/arm/mach-s5pv210/mach-smdkv210.c檔案,并作以下修改:

(1) 修改smdkv210_dm9000_resources定義如下

[cpp]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. static struct resource smdkv210_dm9000_resources[] = {   
  2.     [0] = {   
  3.         .start = 0x88000000,  
  4.         .end = 0x88000000 + 3,  
  5.         .flags = IORESOURCE_MEM,  
  6.     },    
  7.     [1] = {   
  8.         .start = 0x88000000 + 4,  
  9.         .end = 0x88000000 + 4 + 3,  
  10.         .flags = IORESOURCE_MEM,  
  11.     },    
  12.     [2] = {   
  13.         .start = IRQ_EINT(10),  
  14.         .end = IRQ_EINT(10),  
  15.         .flags = IORESOURCE_IRQ|IORESOURCE_IRQ_HIGHLEVEL,  
  16.     }     
  17. };  

(2) 修改smdkv210_dm9000_init函數如下

[cpp]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. static void __init smdkv210_dm9000_init(void)  
  2. {  
  3.     unsigned long* srom_bw = ioremap(0xE8000000, 4);   
  4.     unsigned long* srom_bc1 = ioremap(0xE8000004, 4);   
  5.     *srom_bc1 = ((0<<28)|(0<<24)|(5<<16)|(0<<12)|(0<<8)|(0<<4)|(0<<0));  
  6.     *srom_bw &= ~(0xf << 4);   
  7.     *srom_bw |= (1<<4)|(1<<5);  
  8.     gpio_request(S5PV210_MP01(1), "nCS1");  
  9.     s3c_gpio_cfgpin(S5PV210_MP01(1), S3C_GPIO_SFN(2));  
  10.     gpio_free(S5PV210_MP01(1));  
  11.     iounmap(srom_bw);  
  12.     iounmap(srom_bc1);  
  13. }  

這樣,就完成了DM9000網卡驅動的移植,其實這樣修改是有邏輯的,根據TQ210的原理圖可知DM9000連接配接的片選時nCS1,也就是網卡是接在來ROM控制器的BANK1上。

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構

根據S5PV210的記憶體映射表可以看出,SROMC的BANK1位址空間為0x88000000~0x8FFFFFFF,故當CPU尋址該範圍内的位址空間時才會使能片選nCS1。是以,我們采用的是0x88000000位址。

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構

另外,從TQ210原理圖的DM9000部分還可以看到,DM9000使用的是外部中斷10,故将中斷号修改為10号。

最後需要說明的是smdkv210_dm9000_init函數的修改,這是因為DM9000的資料通路、指令發送等是按照一定時序工作的,而DM9000接再SROMC上,是以需要配置SROMC時序,使其可以正确驅動DM9000,關于時序的詳細配置我還沒研究,不過韋東山老師的第二期視訊中講述了DM9000的驅動移植,也講了時序配置,需要的話可以參考。

五 挂接檔案系統

我們現在配置好了網卡驅動,還需要對核心稍作配置才能使核心支援網絡檔案系統挂載,具體的可以參考以下配置。

(1) 配置網絡支援

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. [*] Networking support  --->  
  2.     Networking options  --->  
  3.         <*> Packet socket   
  4.         <*> Unix domain sockets  
  5.         [*] TCP/IP networking  
  6.         [*]   IP: multicasting  
  7.         [*]   IP: kernel level autoconfiguration   
  8.         [*]     IP: DHCP support  
  9.         [*]     IP: BOOTP support  
  10.         [*]     IP: RARP support  
  11.         [*]   IP: multicast routing  

(2) 配置網卡裝置支援

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. Device Drivers  --->  
  2.     [*] Network device support  --->   
  3.         [*]   Ethernet driver support  --->  
  4.             <*>   DM9000 support  

(3) 配置網絡檔案系統支援

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. File systems  --->   
  2.     [*] Network File Systems  --->   
  3.         <*>   NFS client support   
  4.         <*>     NFS client support for NFS version 2  
  5.         <*>     NFS client support for NFS version 3   
  6.         [*]       NFS client support for the NFSv3 ACL protocol extension  
  7.         <*>     NFS client support for NFS version 4  
  8.         [*]   Root file system on NFS  

配置完以上三項後儲存配置,然後再次編譯核心,直接執行make指令即可。

這時,重新下載下傳核心測試運作,沒有意外的話現在核心已經可以正常工作了,如果不幸的遇到了問題,那麼問題應該是NFS伺服器配置的問題,ubuntu下配置NFS伺服器很簡單

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. sudo apt-get install nfs-kernel-server  

然後以根權限打開/etc/exports檔案,我的NFS根目錄為/nfsroot,故,我設定export為

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. /nfsroot/ *(rw,sync,no_root_squash)  

設定完成之後需要重新開機NFS服務,ubuntu下執行

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. sudo service nfs-kernel-server restart  

重新開機的時候會看到一些警告,如下圖

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構

但是上述警告不影響使用。反之,如果設定為no_subtree_check,雖然系統可以正常挂載,但是無法進行建立檔案等寫操作,也就是說,挂載的檔案系統是隻讀的。最後還要修改下/nfsroot的權限,為了以後使用友善。

[html]  view plain copy

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
S5PV210(TQ210)學習筆記——核心移植與檔案系統建構
  1. chmod a+x /nfsroot -R  

到這裡,基于TQ210的核心移植已經初步完成了,接下來我們就可以進行驅動開發了。

六 問題總結

我在配置過程中遇到了很多問題,現在稍作總結

(1) 序列槽中斷列印完Starting kernel...之後就沒有任何輸出了

配置核心,指定調試資訊輸出端口為UART0,文中講到了詳細配置。

(2) 解壓完核心之後沒有任何輸出了

a.檢查bootargs環境變量設定是否正确,必須設定console=ttySAC0

b.檢查uboot傳遞的機器碼根核心是否對應

c.檢查uboot傳給核心的taglist是否正确

(3) 核心無法挂接到NFS檔案系統

a. 正确移植DM9000網卡驅動

b. 配置核心的網絡部分、網卡裝置和檔案系統中的網絡檔案系統

c. 确認NFS伺服器的配置是否正确,用另外其他linux或已經移植好系統的linux進行測試(mount -o nolock xx.xx.xx.xx:/nfsroot/rootfs)。

(4) 檔案系統挂接成功,無法執行/linuxrc

a. 檢查NFS配置檔案,最好以NFSv2方式配置,核心不支援的話會出現問題。

b. 最好以文中推薦的方式進行NFS伺服器配置。

c. 配置完成之後需要重新開機NFS服務或者是重新開機系統。

七 其它問題

如果您在移植過程中出現了其他問題歡迎留言讨論。

本文連結:http://blog.csdn.net/girlkoo/article/details/8719828

繼續閱讀