由于之前做過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

- ARCH = arm
- CROSS_COMPILE ?= arm-linux-
(2)進行預設配置,進入arch/arm/configs目錄,可以發現最接近我們開發闆的配置檔案是s5pv210_defconfig,故
[html] view plain copy

- make s5pv210_defconfig
(3)編譯核心,如果需要生成zImage則執行
[html] view plain copy

- make zImage
如果需要生成uImage則執行
[html] view plain copy

- make uImage
(4)用uboot下載下傳并嘗試運作,結果是悲劇的,在uboot列印”Starting kernel...“之後就看不到任何輸出了,顯然,有兩種原因:
a. 編譯的核心類型錯誤,比如您的uboot使用的是uImage,而您編譯的是zImage。
b. 移植的uboot存在問題,沒能正确的拷貝核心到正确的記憶體位址并啟動。
c. 核心存在某些配置,我們沒有配置。
經過檢視核心配置項知道,核心預設采用的UART1列印調試資訊,是以,執行:
[html] view plain copy

- 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

- #!/bin/sh
- echo "------Create rootfs directons start...--------"
- mkdir rootfs
- cd rootfs
- echo "--------Create root,dev....----------"
- mkdir root dev etc boot tmp var sys proc lib mnt home usr
- mkdir etc/init.d etc/rc.d etc/sysconfig
- mkdir usr/sbin usr/bin usr/lib usr/modules
- echo "make node in dev/console dev/null"
- sudo mknod -m 600 dev/console c 5 1
- sudo mknod -m 600 dev/null c 1 3
- mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp
- mkdir var/lib var/lock var/run var/tmp
- chmod 1777 tmp
- chmod 1777 var/tmp
- 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

- 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

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

- 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

- cp *so* /nfsroot/rootfs/lib -d
同樣拷貝arm-none-linux-gnueabi/sys-root/usr/lib下的所有動态庫到/nfsroot/rootfs/usr/lib下,執行
[html] view plain copy

- cp *so* /nfsroot/rootfs/usr/lib -d
(4)建構etc目錄
在etc目錄下建立Inittab檔案,内容如下
[html] view plain copy

- ::sysinit:/etc/init.d/rcS
- console::askfirst:-/bin/sh
- ::restart:/sbin/init
- ::ctrlaltdel:/sbin/reboot
- ::shutdown:/bin/umount -a -r
- ::shutdown:/sbin/swapoff -a
在etc/init.d/目錄下建立rcS檔案,内容如下
[html] view plain copy

- echo "----------mount all.........."
- mount -a
- echo "----------Starting mdev......"
- echo /sbin/mdev > /proc/sys/kernel/hotplug
- mdev -s
- /bin/hostname -F /etc/sysconfig/HOSTNAME
為inittab和rcS檔案添加可執行權限
[html] view plain copy

- chmod a+x inittab
- chmod a+x rcS
在etc目錄下建立fstab檔案,内容如下
[html] view plain copy

- #evice mount-point type option dump fsck order
- proc /proc proc defaults 0 0
- none /tmp ramfs defaults 0 0
- mdev /dev ramfs defaults 0 0
- sysfs /sys sysfs defaults 0 0
在etc目錄下建立profile檔案,内容如下
[html] view plain copy

- PATH=/bin:/sbin:/usr/bin:/usr/sbin
- export PATH
- #set hostname
- HOSTNAME='/bin/hostname'
- export HOSTNAME
- # Set PS1
- PS1='[\u@\h \W]\$'
- export PS1
拷貝主機/etc目錄下的passwd和group檔案到etc目錄下。
(5) 設定HOSTNAME檔案
在etc/sysconfig目錄下建立HOSTNAME檔案,在檔案中寫入主機名,我這裡寫的是bruce。
(6) 安裝核心modules
進入核心源碼目錄,執行
[html] view plain copy

- make modules
待編譯完成後安裝modules,執行指令
[html] view plain copy

- make modules_install INSTALL_MOD_PATH=/nfsroot/rootfs
到這,根檔案系統就建構完成了.
三 設定uboot啟動參數
我的nfs根目錄為/nfsroot,我的根檔案系統目錄是在該目錄之下的,即/nfsroot/rootfs目錄,故uboot啟動參數設定如下
[html] view plain copy

- 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

- static struct resource smdkv210_dm9000_resources[] = {
- [0] = {
- .start = 0x88000000,
- .end = 0x88000000 + 3,
- .flags = IORESOURCE_MEM,
- },
- [1] = {
- .start = 0x88000000 + 4,
- .end = 0x88000000 + 4 + 3,
- .flags = IORESOURCE_MEM,
- },
- [2] = {
- .start = IRQ_EINT(10),
- .end = IRQ_EINT(10),
- .flags = IORESOURCE_IRQ|IORESOURCE_IRQ_HIGHLEVEL,
- }
- };
(2) 修改smdkv210_dm9000_init函數如下
[cpp] view plain copy

- static void __init smdkv210_dm9000_init(void)
- {
- unsigned long* srom_bw = ioremap(0xE8000000, 4);
- unsigned long* srom_bc1 = ioremap(0xE8000004, 4);
- *srom_bc1 = ((0<<28)|(0<<24)|(5<<16)|(0<<12)|(0<<8)|(0<<4)|(0<<0));
- *srom_bw &= ~(0xf << 4);
- *srom_bw |= (1<<4)|(1<<5);
- gpio_request(S5PV210_MP01(1), "nCS1");
- s3c_gpio_cfgpin(S5PV210_MP01(1), S3C_GPIO_SFN(2));
- gpio_free(S5PV210_MP01(1));
- iounmap(srom_bw);
- iounmap(srom_bc1);
- }
這樣,就完成了DM9000網卡驅動的移植,其實這樣修改是有邏輯的,根據TQ210的原理圖可知DM9000連接配接的片選時nCS1,也就是網卡是接在來ROM控制器的BANK1上。
根據S5PV210的記憶體映射表可以看出,SROMC的BANK1位址空間為0x88000000~0x8FFFFFFF,故當CPU尋址該範圍内的位址空間時才會使能片選nCS1。是以,我們采用的是0x88000000位址。
另外,從TQ210原理圖的DM9000部分還可以看到,DM9000使用的是外部中斷10,故将中斷号修改為10号。
最後需要說明的是smdkv210_dm9000_init函數的修改,這是因為DM9000的資料通路、指令發送等是按照一定時序工作的,而DM9000接再SROMC上,是以需要配置SROMC時序,使其可以正确驅動DM9000,關于時序的詳細配置我還沒研究,不過韋東山老師的第二期視訊中講述了DM9000的驅動移植,也講了時序配置,需要的話可以參考。
五 挂接檔案系統
我們現在配置好了網卡驅動,還需要對核心稍作配置才能使核心支援網絡檔案系統挂載,具體的可以參考以下配置。
(1) 配置網絡支援
[html] view plain copy

- [*] Networking support --->
- Networking options --->
- <*> Packet socket
- <*> Unix domain sockets
- [*] TCP/IP networking
- [*] IP: multicasting
- [*] IP: kernel level autoconfiguration
- [*] IP: DHCP support
- [*] IP: BOOTP support
- [*] IP: RARP support
- [*] IP: multicast routing
(2) 配置網卡裝置支援
[html] view plain copy

- Device Drivers --->
- [*] Network device support --->
- [*] Ethernet driver support --->
- <*> DM9000 support
(3) 配置網絡檔案系統支援
[html] view plain copy

- File systems --->
- [*] Network File Systems --->
- <*> NFS client support
- <*> NFS client support for NFS version 2
- <*> NFS client support for NFS version 3
- [*] NFS client support for the NFSv3 ACL protocol extension
- <*> NFS client support for NFS version 4
- [*] Root file system on NFS
配置完以上三項後儲存配置,然後再次編譯核心,直接執行make指令即可。
這時,重新下載下傳核心測試運作,沒有意外的話現在核心已經可以正常工作了,如果不幸的遇到了問題,那麼問題應該是NFS伺服器配置的問題,ubuntu下配置NFS伺服器很簡單
[html] view plain copy

- sudo apt-get install nfs-kernel-server
然後以根權限打開/etc/exports檔案,我的NFS根目錄為/nfsroot,故,我設定export為
[html] view plain copy

- /nfsroot/ *(rw,sync,no_root_squash)
設定完成之後需要重新開機NFS服務,ubuntu下執行
[html] view plain copy

- sudo service nfs-kernel-server restart
重新開機的時候會看到一些警告,如下圖
但是上述警告不影響使用。反之,如果設定為no_subtree_check,雖然系統可以正常挂載,但是無法進行建立檔案等寫操作,也就是說,挂載的檔案系統是隻讀的。最後還要修改下/nfsroot的權限,為了以後使用友善。
[html] view plain copy

- 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

- make uImage
(4)用uboot下載下傳并嘗試運作,結果是悲劇的,在uboot列印”Starting kernel...“之後就看不到任何輸出了,顯然,有兩種原因:
a. 編譯的核心類型錯誤,比如您的uboot使用的是uImage,而您編譯的是zImage。
b. 移植的uboot存在問題,沒能正确的拷貝核心到正确的記憶體位址并啟動。
c. 核心存在某些配置,我們沒有配置。
經過檢視核心配置項知道,核心預設采用的UART1列印調試資訊,是以,執行:
[html] view plain copy

- 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

- #!/bin/sh
- echo "------Create rootfs directons start...--------"
- mkdir rootfs
- cd rootfs
- echo "--------Create root,dev....----------"
- mkdir root dev etc boot tmp var sys proc lib mnt home usr
- mkdir etc/init.d etc/rc.d etc/sysconfig
- mkdir usr/sbin usr/bin usr/lib usr/modules
- echo "make node in dev/console dev/null"
- sudo mknod -m 600 dev/console c 5 1
- sudo mknod -m 600 dev/null c 1 3
- mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp
- mkdir var/lib var/lock var/run var/tmp
- chmod 1777 tmp
- chmod 1777 var/tmp
- 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

- 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

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

- 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

- cp *so* /nfsroot/rootfs/lib -d
同樣拷貝arm-none-linux-gnueabi/sys-root/usr/lib下的所有動态庫到/nfsroot/rootfs/usr/lib下,執行
[html] view plain copy

- cp *so* /nfsroot/rootfs/usr/lib -d
(4)建構etc目錄
在etc目錄下建立Inittab檔案,内容如下
[html] view plain copy

- ::sysinit:/etc/init.d/rcS
- console::askfirst:-/bin/sh
- ::restart:/sbin/init
- ::ctrlaltdel:/sbin/reboot
- ::shutdown:/bin/umount -a -r
- ::shutdown:/sbin/swapoff -a
在etc/init.d/目錄下建立rcS檔案,内容如下
[html] view plain copy

- echo "----------mount all.........."
- mount -a
- echo "----------Starting mdev......"
- echo /sbin/mdev > /proc/sys/kernel/hotplug
- mdev -s
- /bin/hostname -F /etc/sysconfig/HOSTNAME
為inittab和rcS檔案添加可執行權限
[html] view plain copy

- chmod a+x inittab
- chmod a+x rcS
在etc目錄下建立fstab檔案,内容如下
[html] view plain copy

- #evice mount-point type option dump fsck order
- proc /proc proc defaults 0 0
- none /tmp ramfs defaults 0 0
- mdev /dev ramfs defaults 0 0
- sysfs /sys sysfs defaults 0 0
在etc目錄下建立profile檔案,内容如下
[html] view plain copy

- PATH=/bin:/sbin:/usr/bin:/usr/sbin
- export PATH
- #set hostname
- HOSTNAME='/bin/hostname'
- export HOSTNAME
- # Set PS1
- PS1='[\u@\h \W]\$'
- export PS1
拷貝主機/etc目錄下的passwd和group檔案到etc目錄下。
(5) 設定HOSTNAME檔案
在etc/sysconfig目錄下建立HOSTNAME檔案,在檔案中寫入主機名,我這裡寫的是bruce。
(6) 安裝核心modules
進入核心源碼目錄,執行
[html] view plain copy

- make modules
待編譯完成後安裝modules,執行指令
[html] view plain copy

- make modules_install INSTALL_MOD_PATH=/nfsroot/rootfs
到這,根檔案系統就建構完成了.
三 設定uboot啟動參數
我的nfs根目錄為/nfsroot,我的根檔案系統目錄是在該目錄之下的,即/nfsroot/rootfs目錄,故uboot啟動參數設定如下
[html] view plain copy

- 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

- static struct resource smdkv210_dm9000_resources[] = {
- [0] = {
- .start = 0x88000000,
- .end = 0x88000000 + 3,
- .flags = IORESOURCE_MEM,
- },
- [1] = {
- .start = 0x88000000 + 4,
- .end = 0x88000000 + 4 + 3,
- .flags = IORESOURCE_MEM,
- },
- [2] = {
- .start = IRQ_EINT(10),
- .end = IRQ_EINT(10),
- .flags = IORESOURCE_IRQ|IORESOURCE_IRQ_HIGHLEVEL,
- }
- };
(2) 修改smdkv210_dm9000_init函數如下
[cpp] view plain copy

- static void __init smdkv210_dm9000_init(void)
- {
- unsigned long* srom_bw = ioremap(0xE8000000, 4);
- unsigned long* srom_bc1 = ioremap(0xE8000004, 4);
- *srom_bc1 = ((0<<28)|(0<<24)|(5<<16)|(0<<12)|(0<<8)|(0<<4)|(0<<0));
- *srom_bw &= ~(0xf << 4);
- *srom_bw |= (1<<4)|(1<<5);
- gpio_request(S5PV210_MP01(1), "nCS1");
- s3c_gpio_cfgpin(S5PV210_MP01(1), S3C_GPIO_SFN(2));
- gpio_free(S5PV210_MP01(1));
- iounmap(srom_bw);
- iounmap(srom_bc1);
- }
這樣,就完成了DM9000網卡驅動的移植,其實這樣修改是有邏輯的,根據TQ210的原理圖可知DM9000連接配接的片選時nCS1,也就是網卡是接在來ROM控制器的BANK1上。
根據S5PV210的記憶體映射表可以看出,SROMC的BANK1位址空間為0x88000000~0x8FFFFFFF,故當CPU尋址該範圍内的位址空間時才會使能片選nCS1。是以,我們采用的是0x88000000位址。
另外,從TQ210原理圖的DM9000部分還可以看到,DM9000使用的是外部中斷10,故将中斷号修改為10号。
最後需要說明的是smdkv210_dm9000_init函數的修改,這是因為DM9000的資料通路、指令發送等是按照一定時序工作的,而DM9000接再SROMC上,是以需要配置SROMC時序,使其可以正确驅動DM9000,關于時序的詳細配置我還沒研究,不過韋東山老師的第二期視訊中講述了DM9000的驅動移植,也講了時序配置,需要的話可以參考。
五 挂接檔案系統
我們現在配置好了網卡驅動,還需要對核心稍作配置才能使核心支援網絡檔案系統挂載,具體的可以參考以下配置。
(1) 配置網絡支援
[html] view plain copy

- [*] Networking support --->
- Networking options --->
- <*> Packet socket
- <*> Unix domain sockets
- [*] TCP/IP networking
- [*] IP: multicasting
- [*] IP: kernel level autoconfiguration
- [*] IP: DHCP support
- [*] IP: BOOTP support
- [*] IP: RARP support
- [*] IP: multicast routing
(2) 配置網卡裝置支援
[html] view plain copy

- Device Drivers --->
- [*] Network device support --->
- [*] Ethernet driver support --->
- <*> DM9000 support
(3) 配置網絡檔案系統支援
[html] view plain copy

- File systems --->
- [*] Network File Systems --->
- <*> NFS client support
- <*> NFS client support for NFS version 2
- <*> NFS client support for NFS version 3
- [*] NFS client support for the NFSv3 ACL protocol extension
- <*> NFS client support for NFS version 4
- [*] Root file system on NFS
配置完以上三項後儲存配置,然後再次編譯核心,直接執行make指令即可。
這時,重新下載下傳核心測試運作,沒有意外的話現在核心已經可以正常工作了,如果不幸的遇到了問題,那麼問題應該是NFS伺服器配置的問題,ubuntu下配置NFS伺服器很簡單
[html] view plain copy

- sudo apt-get install nfs-kernel-server
然後以根權限打開/etc/exports檔案,我的NFS根目錄為/nfsroot,故,我設定export為
[html] view plain copy

- /nfsroot/ *(rw,sync,no_root_squash)
設定完成之後需要重新開機NFS服務,ubuntu下執行
[html] view plain copy

- sudo service nfs-kernel-server restart
重新開機的時候會看到一些警告,如下圖
但是上述警告不影響使用。反之,如果設定為no_subtree_check,雖然系統可以正常挂載,但是無法進行建立檔案等寫操作,也就是說,挂載的檔案系統是隻讀的。最後還要修改下/nfsroot的權限,為了以後使用友善。
[html] view plain copy

- 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