[Intel][IoT][Galileo]重新編譯Intel Quark-based Galileo Gen 2的Bootloader、kernel、file system、cross compilation toolchain
這篇文章參考由Intel提供的BSP build guide,詳細記錄在Ubuntu 14.04 LTS實驗環境上,由source code建立Intel Quark-based Galileo Gen 2開發板BSP的過程,包含Bootloader、kernel、file system、cross compilation toolchain...等,做為隨時可以重新驗證的實作筆記並從中分析與學習真槍實彈的嵌入式開發技巧。
https://downloadcenter.intel.com/download/23197
下載回來的檔案為BSP_Sources_and_Docs_for_Intel_Quark_v1.2.1.zip
解壓縮後包含一個source code包與四份文件,分別為:
Intel Quark BSP
由Intel官網下載Intel® Quark™ BSP:https://downloadcenter.intel.com/download/23197
下載回來的檔案為BSP_Sources_and_Docs_for_Intel_Quark_v1.2.1.zip
解壓縮後包含一個source code包與四份文件,分別為:
- Board_Support_Package_Intel_Quark_v1.2.1.7z:
裏頭包含EDKII Firmware(Quark_EDKII_v1.2.1.tar.gz)、 - 四份文件:
Intel® Quark™ SoC X1000的BSP_BuildGuide、Software_Developer_Manual、Software_Release_Notes與UEFI_Firmware_Writers_Guide
建置EDKII Firmware
首先由建置EDKII Firmware開始,這是一個modern、feature-rich、Open Source、跨平台的UEFI firmware,以下為它的官網與github網址連結:- 官網: http://www.tianocore.org/
- Github上的Getting-Start教學:
https://github.com/tianocore/tianocore.github.io/wiki/Getting-Started-with-EDK-II
以下記錄整個過程下的指令:
sudo apt-get install build-essential uuid-dev iasl subversion nasm tar zxvf Quark_EDKII_v1.2.1.tar.gz cd Quark_EDKII_v1.2.1 python svn_setup.py svn update wget http://www.openssl.org/source/openssl-0.9.8zb.tar.gz tar zxvf openssl-0.9.8zb.tar.gz -C CryptoPkg/Library/OpensslLib/ cd CryptoPkg/Library/OpensslLib/openssl-0.9.8zb patch -p0 -i ../EDKII_openssl-0.9.8zb.patch cd .. ./Install.sh cd ../../.. ./buildallconfigs.sh GCC48 /usr/bin/ QuarkPlatform其中在svn update後,會增加FatPkg、SecurityPkg、CryptoPkg、SourceLevelDebugPkg、ShellPkg、UefiCpuPkg、PcAtChipsetPkg、EdkShellBinPkg、IntelFrameworkModulePkg、IntelFrameworkPkg、MdeModulePkg、MdePkg、BaseTools這幾包code。
建置GRUB OS Loader
提供非Yocto Flash image或是要boot from SD card/USB stick時,選擇希望執行的作業系統。
以下記錄整個過程下的指令:
sudo apt-get install git autoconf libc6-dev-i386 git config --global user.email "thlin@pllab.cs.nthu.edu.tw" git config --global user.name "thlin" 由 https://sourceforge.net/projects/gnu-efi/files/ 下載gnu-efi-3.0.3.tar.bz2 tar jxvf gnu-efi-3.0.3.tar.bz2 cd gnu-efi-3.0.3/gnuefi make ARCH="ia32" cd - tar zxvf grub-legacy_5775f32a+v1.2.1.tar.gz cd grub-legacy_5775f32a+v1.2.1 python gitsetup.py cd work autoreconf --install export CC4GRUB='gcc -m32 -march=i586 -fno-stack-protector' export GNUEFI_LIBDIR=$(pwd)/../../gnu-efi-3.0.3/gnuefi CC="$CC4GRUB" ./configure-quark.sh make
其中libc6-dev-i386是為了在64 bit Linux上編譯32 bit binaries,所以需要安裝32 bit GNU C Library;而cd -(cd減號)是回到上一次所在目錄,是個超讚的小技巧!!
使用Yocto Project建置File System與Kernel
以下記錄整個過程下的指令:
sudo apt-get install patchutils texinfo gawk chrpath libsdl1.2-dev git tar zxvf meta-clanton_v1.2.1.tar.gz cd meta-clanton_v1.2.1 ./setup.sh source ./oe-init-build-env yocto_build bitbake image-full -c populate_sdk bitbake image-full
其中在setup.sh,基本上是取得linux source code、上patch,詳細做了以下事情:
- clone_linux_stable: 由git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git的repository clone Linux stable 3.14版到repo-ext資料夾下
- clone_linux_ltsi: 由http://git.linuxfoundation.org/ltsi-kernel.git的repository clone master branch到repo-ext資料夾下,其中LTSI是Long Term Support Initiative由industry支援的industry-wide project
- create_linux_lts_ltsi: 使用git-archive由linux_ltsi的master建立archive,再導到linux_stable去(git archive ${ltsi_branch} | tar -xC ${cur_dir}/repo-ext/linux-stable),刪除原本的ltsi branch(git branch -D ${ltsi_ws_branch}),再由linux-stable/scripts/generate_git重新產生3.14.28-ltsi branch。
- apply_linux_kernel_patch: 使用meta-clanton_v1.2.1/setup/patchset/linux-kernel/*.patch,對linux_stable裡的code以git am指令,上389個patch。
- setup/combo-layer.py: 使用yocto project中的command-line utility -- combo-layer來依照setup/combolayer-quark.conf做初始化,從好幾個git repository clone code下來,動作與這篇clone layer時相同。
- apply_combined_repo_commit: 依照setup/combolayer-quark.conf給出的version做git commit。
- apply_bsp_meta_patch: 使用meta-clanton_v1.2.1/setup/patchset/bsp-meta/*.patch,對bsp上14個patch。
- set_local_linux_yocto: 更改meta-intel-quark/recipes-kernel/linux/linux-yocto-quark_3.14.bb並git commit,其中bb file是OpenEmbedded以bitbake為基礎的meta data build system,bitbake在meta-clanton_v1.2.1/bitbake內,是以python寫成的。
bitbake image-full是建立給image-full target(共有image-full與image-spi兩種target)用的image,後面加-c populate_sdk是To build the cross-compilation tool-chain for respective image,然後bitbake就依照bb file,將i7八核心CPU操好操滿到100%,硬碟使用量大暴增,一切就這樣自動的fetch、configure、compile完成......
*toolchain instaler:
yocto_build//tmp/deploy/sdk/iot-devkit-glibc-x86_64-image-full-i586-toolchain-1.7.2.sh
給板子用的,在yocto_build/tmp/deploy/images/quark下:
*GRUB OS Loader: grub.efi
*File system:(Rename this file to image-full-quark.ext3 because the initramfs will look
for the file in that name)
image-full-quark-YYYYMMDDhhmmss.rootfs.ext3
*Minimal File system(?):(Optional: rename this file to core-image-minimal-initramfs-
quark.cpio.gz)
core-image-minimal-initramfs-quark-YYYYMMDDhhmmss.rootfs.cpio.gz
*bzImage:(Optional: rename this file to bzImage)
bzImage--3.14-r0-quark-YYYYMMDDhhmmss.bin
*給GRUB抓的boot資料夾: grub.conf在./boot/grub/內
測試時間
在Windows系統下,SD card必須先進行factory formatting,直接按Windows的格式化無法看到完整的SD card空間,可以到SD Association下載SD Card Formatter: https://www.sdcard.org/downloads/formatter_4/
看到GRUB畫面了,這種做法可以讓第三個選項Boot成功,也就是使用ram作為root filesystem方式,若要使用第二個選項使用mmcblk0p2作為root filesystem,需用wic tool製作bootable uSD card image:
../scripts/wic create -e image-full ../scripts/lib/image/canned-wks/sdimage-bootpart.wks
應該要會產生.direct檔案在/var/tmp/wic/build/,然後用Win32 Disk Imager將此image在windows上燒進sdcard,但是目前會遇到Error: No boot files defined, IMAGE_BOOT_FILES unset的錯誤QQ
留言
張貼留言