在bootstrap及uboot階段將大部分的硬體初始化之後,uboot就會試著帶起kernel,要帶起kernel需要三個主要的檔案,分別是Device Tree Blob(dtb)、Linux kernel、File System,此篇僅簡單介紹dtb以及如何build code燒到sama5d3-xp上,File system將在之後的文章作較詳細的介紹,會使用embedded system蠻常使用的busy box
Device Tree Blob
DTB類似一份資料庫,紀錄了板子的硬體組成元件,為bootloader傳送低階硬體資訊給核心的機制,若是沒有dtb,要讓kernel知道uboot裡所設定的硬體資訊,則必須擁有一份和uboot一樣的header file,但要同時維護兩份資料的同步是非常困難的,因此需要一種機制讓kernel得知硬體細節
前置作業
要build在開發版上跑的程式必須先有cross compiler,而sama5d3是ARM Cortex-A5的CPU,因此用的gcc如下
sudo apt-get install gcc-arm-linux-gnueabi
接著必須下載Linux kernel,網址為http://www.kernel.org/,這邊下載的版本為linux-4.6
註1: 也可建立完整的toolchain來得到cross-compile gcc
建置程式
我們不需要從頭開始建出configuration file,一般都可以找到建立好的檔案,使用下列指令
make help ARCH=arm
可過濾出使用arm的開發版,可以找到sama5_defconfig即是我們要使用的defconfig
要建置kernel則是輸入以下指令
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
若是主機為多核心則可使用下列指令增加建置的速度,其中n指的是核心數目
make -j<n> RCH=arm CROSS_COMPILE=arm-linux-gnueabi-
經過一段時間之後即可成功建置kernel,我們需要燒錄到目標板上的檔案有兩個,第一個是zImage,也就是kernel本身,可在arch/arm/boot找到,第二個則是at91-sama5d3_xplained.dtb,即為前面提到的device tree,可在arch/arm/boot/dts找到
燒錄到nandflash
最簡單燒錄的方式一樣是用sam-ba,燒錄方式可參考簡介U-boot,不一樣的是U-boot將Address = 0x40000,而我們需將dtb file燒到Address = 0x180000,kernel燒到Address = 0x200000