1. 程式人生 > >移植最新的linux4.9.9核心(適配fs4412平臺)

移植最新的linux4.9.9核心(適配fs4412平臺)

移植最新的linux4.9核心適配fs4412(samsung exynos4412平臺驗證通過)

1.原始碼下載
官網下載最新的linux4.9.9核心:
http://www.kernel.org/pub/linux/kernel/

這裡寫圖片描述
第三個數字是修訂版本號

2.解壓

tar xvf linux-4.9.9.tar.xz

解壓也需要時間,需要耐心等待,注意不要打斷解壓過程。
3.配置
進入核心原始碼目錄:cd linux-4.9.9
3.1 修改編譯工具鏈
開啟頂層的Makefile:

vi Makefile

修改:

ARCH  ?= $(SUBARCH)
CROSS_COMPILE ?= $(
CONFIG_CROSS_COMPILE:"%"=%)

為:


ARCH  ?= arm
CROSS_COMPILE ?= arm-none-linux-gnueabi-

注:如果不修改編譯工具鏈,預設使用編譯x86的gcc編譯器,如果不想修改Makefile也可以執行make時新增 如:
make uImage ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-

3.2 匯入預設的配置

 make exynos_defconfig

實際上是執行了:cp arch/arm/configs/exynos_defconfig .config
這裡寫圖片描述


3.3 配置核心
執行

make menuconfig

這裡寫圖片描述
修改指定核心的除錯串列埠:

進入:Kernel hacking
                ->Kernel low-level debugging functions (read help!)  選擇
                        ---> Kernel low-level debugging port (Use Samsung S3C UART 2 for low-level debug)  開啟選擇uart2

選擇這個除錯串列埠很重要,否則打印不出核心啟動的相關資訊(這個地方配置找了半天才找到,exynos預設沒有開啟此功能,沒有開啟此處會發現核心列印資訊停止在Starting kernel …處)
4.編譯
4.1 編譯uImage映象

make uImage -j2 LOADADDR=0X40008000

-j2表示雙執行緒編譯
LOADADDR=0X40008000 表示指定核心的載入地址(注:沒有此選項編譯生成uImage會報錯)
最後提示以下錯誤。

 Kernel: arch/arm/boot/Image is ready
  Kernel: arch/arm/boot/zImage is ready
multiple (or no) load addresses: 
This is incompatible with uImages
Specify LOADADDR on the commandline to build an uImage
make[1]: *** [arch/arm/boot/uImage] 錯誤 1
make: *** [uImage] 錯誤 2

經過漫長的等待,結果顯示如下:
這裡寫圖片描述
表示編譯成功。
如果編譯過程中提示缺少 mkimage 工具,需將編譯的 uboot 原始碼中的tools/mkimage 拷貝到 ubuntu 的/bin 目錄下。

 cp u-boot-xxx/tools/mkimage /usr/bin

4.2 編譯裝置樹
在編譯裝置樹之前需要對裝置樹進行配置,在這裡使用參考板 origen 的裝置樹檔案:

$ cp arch/arm/boot/dts/exynos4412-origen.dts  arch/arm/boot/dts/exynos4412-liebao.dts

修改arch/arm/boot/dts/下的Makefile檔案

$vi arch/arm/boot/dts/Makefile

在exynos4412-origen.dtb下新增exynos4412-liebao.dtb:
這裡寫圖片描述
編譯裝置樹:

$ make dtbs

這裡寫圖片描述
如上圖編譯好了裝置樹檔案:arch/arm/boot/dts/exynos4412-liebao.dtb
4.3 拷貝核心映象和裝置樹檔案到/tftp目錄下

cp arch/arm/boot/uImage /tftpboot/
cp arch/arm/boot/dts/exynos4412-liebao.dtb /tftpboot/

5.下載映象
5.1 修改uboot的啟動引數
啟動板子在系統倒計時是按任意鍵結束啟動,輸入如下內容修改 uboot 環境變數


#setenv serverip 192.168.1.104
#setenv ipaddr 192.168.1.160
#setenv bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-liebao.dtb\;bootm
4100000042000000
#setenv  bootargs  root=/dev/nfs  nfsroot=192.168.1.104:/source/rootfs  rw
console=ttySAC2,115200 init=/linuxrc ip=192.168.1.160
# saveenv

注:serverip 為ubuntu的伺服器ip
ipaddr 為開發版的ip
輸入boot命令,讓uboot執行bootcmd命令:

#boot

啟動的列印如下:

dm9000 i/o: 0x5000000, id: 0x90000a46 
DM9000: running in 16 bit mode
MAC: 11:22:33:44:55:66
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 192.168.1.104; our IP address is 192.168.1.60
Filename 'uImage'.
Load address: 0x41000000
Loading: *T T T #################################################################
     #################################################################
     #################################################################
     #################################################################
     ####################################################
     205.1 KiB/s
done
Bytes transferred = 4573088 (45c7a0 hex)
dm9000 i/o: 0x5000000, id: 0x90000a46 
DM9000: running in 16 bit mode
MAC: 11:22:33:44:55:66
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 192.168.1.104; our IP address is 192.168.1.60
Filename 'exynos4412-liebao.dtb'.
Load address: 0x42000000
Loading: *####
     476.6 KiB/s
done
Bytes transferred = 52784 (ce30 hex)
## Booting kernel from Legacy Image at 41000000 ...
   Image Name:   Linux-4.9.9
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    4573024 Bytes = 4.4 MiB
   Load Address: 40008000
   Entry Point:  40008000
   Verifying Checksum ... OK
## Flattened Device Tree blob at 42000000
   Booting using the fdt blob at 0x42000000
   Loading Kernel Image ... OK
OK
   Loading Device Tree to 4fff0000, end 4ffffe2f ... OK

Starting kernel ...

Uncompressing Linux... done, booting the kernel.
[    0.000000] Booting Linux on physical CPU 0xa00
[    0.000000] Linux version 4.9.9 (linux@ubuntu) (gcc version 4.6.4 (crosstool-NG hg+default-2685dfa9de14 - tc0002) ) #1 SMP PREEMPT Sat Mar 3 20:41:48 PST 2018
[    0.000000] CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=10c5387d
......
  111.033366] CPU: 1 PID: 0 Comm: swapper/1 Not tainted 4.9.9 #1
[  111.103933] 5fc0: c0108404 c0108408 60000053 ffffffff
[  111.108971] [<c010b0cc>] (__irq_svc) from [<c0108408>] (arch_cpu_idle+0x30/0x3c)
[  111.116352] [<c0108408>] (arch_cpu_idle) from [<c01520e8>] (cpu_startup_entry+0x1a8/0x264)
[  111.124594] [<c01520e8>] (cpu_startup_entry) from [<4010156c>] (0x4010156c)
[  111.131543] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)

出現了上面的錯誤:
看最後一行是核心奔潰了,不能夠掛載在未知塊裝置上的根檔案系統。
實際上是我們的網絡卡的驅動沒有移植導致的(因為命令列引數:bootargs root=/dev/nfs nfsroot=192.168.1.104:/source/rootfs rw ip=192.168.1.60 init=/linuxrc console=ttySAC2,115200已經指定了nfs的根檔案系統)
6.移植網絡卡
6.1 增加DM9000網絡卡的裝置樹節點資訊

vi arch/arm/boot/dts/exynos4412-liebao.dts

新增如下內容:

srom-cs1@5000000 {
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <1>;
reg = <0x5000000 0x1000000>;
ranges;
[email protected]5000000 {
compatible = "davicom,dm9000";
reg = <0x5000000 0x2 0x5000004 0x2>;
interrupt-parent = <&gpx0>;
interrupts = <6 4>;
davicom,no-eeprom;
mac-address = [00 0a 2d a6 55 a2];
};
};

注:一定要在跟節點中增加節點,否則裝置樹編譯會報錯。
這裡寫圖片描述
在這裡我們選擇chosen後面增加網絡卡節點。
6.2 修改時鐘
修改檔案 driver/clk/clk.c
修改

static bool clk_ignore_unused;

static bool clk_ignore_unused = true;

不配置時鐘編譯報錯。
6.3 配置核心
具體配置如下:
網路協議的配置:

[*] Networking support --->
Networking options --->
<*> Packet socket
<*> Unix domain sockets
[*] TCP/IP networking
[*] IP: kernel level autoconfiguration

這裡寫圖片描述

網絡卡驅動的配置:

Device Drivers --->
[*] Network device support --->
[*] Ethernet driver support (NEW) --->
<*> DM9000 support

這裡寫圖片描述

Nfs服務和根檔案系統配置:

File systems --->
[*] Network File Systems (NEW) --->
<*> NFS client support
[*] NFS client support for NFS version 3
[*] NFS client support for the NFSv3 ACL protocol extension
[*] Root file system on NFS

這裡寫圖片描述
6.4 編譯核心

 make uImage -j2 LOADADDR=0X40008000

6.5 編譯裝置樹

  make dtbs

6.6 拷貝檔案到/tftp

 cp arch/arm/boot/uImage /tftpboot/
 cp arch/arm/boot/dts/exynos4412-liebao.dtb /tftpboot/

啟動開發板,通過 NFS 方式掛載根檔案系統
最後如下顯示錶示移植成功:
這裡寫圖片描述

mount檢視掛載情況:
這裡寫圖片描述
可以發現已經掛載上了nfs根檔案系統。