跳到主要內容

[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...等,做為隨時可以重新驗證的實作筆記並從中分析與學習真槍實彈的嵌入式開發技巧。

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網址連結:
以下記錄整個過程下的指令:
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,詳細做了以下事情:

  1. clone_linux_stable: 由git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git的repository clone Linux stable 3.14版到repo-ext資料夾下
  2. clone_linux_ltsi: http://git.linuxfoundation.org/ltsi-kernel.git的repository clone master branch到repo-ext資料夾下,其中LTSILong Term Support Initiative由industry支援的industry-wide project
  3. 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。
  4. apply_linux_kernel_patch: 使用meta-clanton_v1.2.1/setup/patchset/linux-kernel/*.patch,對linux_stable裡的code以git am指令,上389個patch。
  5. setup/combo-layer.py: 使用yocto project中的command-line utility -- combo-layer來依照setup/combolayer-quark.conf做初始化,從好幾個git repository clone code下來,動作與這篇clone layer時相同。
  6. apply_combined_repo_commit: 依照setup/combolayer-quark.conf給出的version做git commit。
  7. apply_bsp_meta_patch: 使用meta-clanton_v1.2.1/setup/patchset/bsp-meta/*.patch,對bsp上14個patch。
  8. 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/
接下來將上面提到的檔案用Windows複製貼上進sdcard就完成了,要注意的是grub.conf與檔名要相同:
看到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

留言

這個網誌中的熱門文章

Run Android VTS with Android R emulator through WSL

Background Android VTS The Android Vendor Test Suite (VTS) provides extensive new functionality for Android testing and promotes a test-driven development process. Android R emulator Run the latest Android R image from Google CI build artifacts WSL WSL is a collection of components that enables native Linux ELF64 binaries to run on Windows . It contains both user mode and kernel mode components. It is primarily comprised of: User mode session manager service that handles the Linux instance life cycle Pico provider drivers (lxss.sys, lxcore.sys) that emulate a Linux kernel by translating Linux syscalls Pico processes that host the unmodified user mode Linux (e.g. /bin/bash) It is the space between the user mode Linux binaries and the Windows kernel components where the magic happens. By placing unmodified Linux binaries in Pico processes we enable Linux system calls to be directed into the Windows kernel. The lxss.sys and lxcore.sys drivers translate the Linux s...

[Qt][Embedded][PXA270]
Porting Qt 4.8.6 for Creator XScale PXA270

這篇文章介紹這學期我在嵌入式作業系統課程,使用Creator XScale PXA270板子的一些學習筆記與製作final project的一些過程,歡迎各位多多指教~ 背景介紹 Creator XScale PXA270開發版是一塊由 新華電腦(microtime) 公司出品的 模組化XScale/ARM/SoC/FPGA/DSP嵌入式行動通訊發展平台 ,在此課程與final project主要使用的是"Create XScale‐PXA270 子板"與"MTLCD‐0708048 LCD Module",在Create XScale‐PXA270子板上的為Intel(現在已出售給Marvell)的 Xscale系列 PXA270 處理器,基於ARMv5TE架構指令集,在旁附有SDRAM Memory 64MB、Flash Memory 32MB、SD Card Connectors、RJ45 10/100 Base‐T Ethernet Interface、USB 1.1 Device/Host Port各一、AC97 Audio Codec(Line_in、Mic_in、Headphone)、ADC Interface*4、PWM Interface、CMOS Camera Interface、TFT-LCD Interface、GPIO Interface...等;在軟體功能部分,由新華科技提供了GNU GCC cross compiler toolchain(arm-unknown-linux-gnu-gcc 4.0.2)、Uboot 1.1.5、Linux Kernel 2.6.15.3與patch(提供支援子板上的Ethernet、USB Host、TFT‐LCD(Frame buffer、Touch Screen)、AC97‐Codec...等與母板LED、7‐Seg LED、Key Pad...等的device driver)、rootfs,相關的實驗環境設定可以參考 User Guide 。 看到以上這麼多的軟硬體介面,別以為這板子有多強,其實這是 2006 年 ASUS P535 手機使用的規格了,不禁讓人感嘆科技進步之快阿~ 在此附上開發版本尊 Qt 是自由且開放原始碼的跨平台C...

[Android][AOSP][ddmlib][Intelij IDEA][Gradle]搭建Android ddmlib編譯環境

Android ddmlib在AOSP的platform/tools/base的repo內 可以使用以下指令將整個repo的master branch抓回: git clone https://android.googlesource.com/platform/tools/base 取其中的annotations、common、ddmlib 建立Intelij IDEA專案 使用Intelij IDEA開一新的Java Project,GroupId、ArtifictedId、Version隨便,並使用graddle wrapper方式建立專案: GroupId 'com.android.tools.ddms' ArtifictedId = 'ddmlib' Version '1.0-SNAPSHOT' 刪除IDE建立的src資料夾,建立base資料夾,將annotations、common、ddmlib複製進來 參考Android Studio建立的專案,修改build.gradle為: // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { mavenCentral() } } allprojects { repositories { mavenCentral() } } task clean(type: Delete) { delete rootProject.buildDir } 修改settings.gradle,加入annotations、common、ddmlib為include rootProject.name = 'ddmlib' include ':base:annotations' include ':base:common' include ':base:ddmlib' 修改annotations、common、ddmlib內的b...