10/08/2015

IMX6 Kernel 빌드 및 적용 (Yocto)

1. iMX6의 KERNEL 수정

기본 YOCTO 커널은 세부적으로 나누어져 소스관리를 하는 것 같은데, 내가 사용하는 YOCTO는 조금 다른것 같다.
일단 개념을 파악하기 위해서 아래의 메뉴얼을 자세히 읽자.

Yocto의 BSP 부분의 이해
  http://www.yoctoproject.org/docs/2.0/dev-manual/dev-manual.html#developing-a-board-support-package-bsp

커널수정부분
  http://www.yoctoproject.org/docs/2.0/dev-manual/dev-manual.html#modifying-the-kernel


2. IMX6 관련 유용한 정보

아래의 정보는 나에게 상당한 도움이 되었다. 하지만, 똑같이 적용이 되지 않기에,
기본메뉴얼을 이해를 한 다음에 봐야 이해가 빠를것 같다.

IMX6 관련 F&A
  https://community.freescale.com/docs/DOC-94023  ** F/A
  https://community.freescale.com/docs/DOC-95264 ** 직접 커널 빌드하는 방법.
  https://community.freescale.com/docs/DOC-95003 **** 가장 빨리 커널 수정방법
  https://community.freescale.com/docs/DOC-95252  *** 커널 패치하기


3. UBOOT와 KERNEL 소스 

일단 가장 급한 것의 정확한 Uboot 소스 위치와 Kernel 소스 위치이며, 이를 찾는 것이 중요한 것 같다.

3.1 Uboot와 Kernel 소스 위치 파악하기 

Yocto로  bitbake를 이용하여 기본빌드를 진행을 하면 Uboot와 Kernel 소스의 위치를 알기가 힘들다
그래서 내가 생각한 방법은 .config 기준으로 find로 uboot와 kernel의 실제위치를 찾는것이다
Yocto를 보면 Uboot 마다 다른 Version이 존재하여 .config를 사용하지만, 이전버전은 같이 존재 한다면 주의해야 겠다.

Kernel의 경우에는  *dts / *.dtb 이름으로 검색을 해도 될 것 같다


$ find . -name .config
./build/tmp/work/imx6qsabreauto-poky-linux-gnueabi/u-boot-fslc/v2015.07+gitAUTOINC+3f0c5353f9-r0/git/mx6qsabreauto_config/.config
./build/tmp/work/imx6qsabreauto-poky-linux-gnueabi/linux-fslc-mx6/3.14-1.0.x+gitAUTOINC+4bae14aef7-r0/jhlee/orgbuild/.config
./build/tmp/work/imx6qsabreauto-poky-linux-gnueabi/linux-fslc-mx6/3.14-1.0.x+gitAUTOINC+4bae14aef7-r0/build/.config
./build/tmp/work/i686-linux/perl-native/5.22.0-r0/perl-5.22.0/.config
./build/tmp/work/i686-nativesdk-pokysdk-linux/nativesdk-linux-libc-headers/4.1-r0/linux-4.1/.config
./build/tmp/work/cortexa9hf-vfp-neon-poky-linux-gnueabi/wpa-supplicant/2.4-r0/wpa_supplicant-2.4/wpa_supplicant/.config
./build/tmp/work/cortexa9hf-vfp-neon-poky-linux-gnueabi/linux-libc-headers/4.1-r0/linux-4.1/.config
./build/tmp/work/cortexa9hf-vfp-neon-poky-linux-gnueabi/busybox/1.23.2-r0/sysroot-destdir/usr/lib/busybox/ptest/.config
./build/tmp/work/cortexa9hf-vfp-neon-poky-linux-gnueabi/busybox/1.23.2-r0/image/usr/lib/busybox/ptest/.config
./build/tmp/work/cortexa9hf-vfp-neon-poky-linux-gnueabi/busybox/1.23.2-r0/busybox-1.23.2/.config
./build/tmp/work/cortexa9hf-vfp-neon-poky-linux-gnueabi/busybox/1.23.2-r0/package/usr/lib/busybox/ptest/.config
./build/tmp/work/cortexa9hf-vfp-neon-poky-linux-gnueabi/busybox/1.23.2-r0/packages-split/busybox-ptest/usr/lib/busybox/ptest/.config
./build/tmp/sysroots/imx6qsabreauto/usr/lib/busybox/ptest/.config


3.2 Uboot 와 Kernel 의  Recipes 검색 

이제 상위에서 각 위치를 파악을 했지만, 이 Bitbake를 이용하여 Recipes 이를을 정확히 알아야 겠다.
위에서 나온 정보와 아래의 명령으로 비교하여 각각 recipes 이름을 찾아보자
그리고 정확한 정보를 알아 낸뒤에 아래와 같이 상위 위치와 비교해보자.

  • Uboot 와 Kernel Recipes 검색 
$ bitbake-layers show-recipes       // 전부보기 (Uboot 와 Kernel 및 다른 recipe 파악) 

$ bitbake-layers show-recipes "*-image-*"  // Uboot를 찾기 위해서 했으나, 실패 

$ bitbake-layers show-recipes "*linux*"    // linux kernel 찾기위해 검색 (linux가 들어가면 다 검색)


  • 각  recipes 의 Layer 정보확인 
$ bitbake-layers show-recipes u-boot-fslc  // 검색을 통해 u-boot의 recipe를 찾음 
u-boot-fslc:
  meta-fsl-arm         v2015.07+gitAUTOINC+3f0c5353f9     // 각 recipe의 layer 정보확인 (가끔 두개의 Layer 가진것도 있음)

$ bitbake-layers show-recipes linux-fslc-mx6  // 검색을 통해 Kernel의 recipe 확인 (recipe의 Layer 확인)
linux-fslc-mx6:                                            
  meta-fsl-arm         3.14-1.0.x+gitAUTOINC+4bae14aef7   // 각 recipe의 layer 정보확인 


  • 각 recipes의 File 검색 및 설정확인 

$ bitbake-layers show-layers  // 상위 정의된 recipe는의 모든 layer 확인 가능하며 PATH 확인가능  

$ find ./source  -name  linux-fslc-mx6*bb*   // linux kernel *.bb 와 *.bbappend (각 recipe확인)

$ find ./source  -name  u-boot-fslc*bb*   // uboot *.bb 와 *.bbappend (각 recipe확인)


각각의 Kernel 과 Uboot Recipe들을 다 확인을 해보자.

4. Yocto 설정 (build 설정)

bitbake를 사용하려면, 아래와 같이 설정을 해주어야 동작가능하다
만약 설정 후 bitbake가 동작이 안한다면 다시 한번 설정해주자

$ source setup-environment build 

설정시 상위에 정의 된 build direcotyr가 생성되면 conf/local.conf / bblayers.conf 를 확인


4.1 BITBAKE를 이용한 커널 설정 및 빌드

현재 나의 커널 recipeslinux-fslc-mx6 이며, 이를 이용하여, menuconfig 및 빌드 , 이미지, 생성도 가능하다.
이 때 사용하는 옵션 -c 이며 이에 연결되는 *.bb에서 Task라고 하며 do_xxxx 라는 함수들을 호출한다.
-f 옵션은 강제로 실행을 시키는 명령
  • bitbake를 이용한 kernel 설정/빌드/배포 
$ bitbake linux-fslc-mx6 -c menuconfig                                     // kernel 의 menuconfig 설정, Terminal에서 해야함.
// 커널의 설정을 확인하고 관련부분을 검토하자 , 저장을 해봐야 .config에 저장된다.

$ bitbake linux-fslc-mx6 -c compile -f                                     // kernel build  (device tree도 )

// yocto의 build 내부에서 강제로 build를 진행 이유는 build 내의 kernel source를 직접 수정하여 바로 build를 하기 위해서 사용.  
// 문서에는 권고하지는 않으며, 빠른 개발을 위해서만 사용한다. 
// 추후 Yocto에 적용하고자 한다면 별도의 Patch file을 만들어 *.bb 혹은 *.bbappend 에 patch 파일을 추가관리 

$ bitbake linux-fslc-mx6 -c deploy                                         // deploy 적용 (build/tmp/deploy/image/xxx 확인 
//

$ bitbake linux-fslc-mx6 -c diffconfig                                      
// 상위  bitbake linux-fslc-mx6 -c menuconfig 에서 본인이 변경한 것을 간단하게 알려주며 이를 이용하여 간단하게 defconfig도 patch도 가능 
// 상위 결과물: fragment.cfg 
//
// 아래와 같이 PATCH와 거의 비슷하게 아래와 같이 본인의 추가하여 defconfig and .config를 수정하도록 하자 
// FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
// SRC_URI += "file://fragment.cfg"
// do_configure_prepend  : config 하기전에 앞에 하는행동 
// do_configure_append   : config 한 후에 추가하는 행동 


  • Kernel Source에서 menuconfig  (Uboot 도 동일)
만약 상위의 menuconfig 가 문제가 있다면 소스에서 직접하자.
다만 ARCH 반드시 설정 해줘야 한다.

$ cd ~/IMX6/fsl-community-bsp/build/tmp/work/imx6qsabreauto-poky-linux-gnueabi/linux-fslc-mx6/3.14-1.0.x+gitAUTOINC+4bae14aef7-r0
$ ARCH=arm CROSS_COMPILE=arm-poky-linux-gnueabi- make menuconfig



4.2 Yocto의 Build의 커널 소스구조 

Yocto의 Build 부분에 Kernel의 Source와 Build되는 부분을 보여주며 이 부분을 이해하도록하자.
이 부분은 Kernel의 *.bb에 의해 설정이 되며 git으로 kernel source를 fetch를 진행 한 후 defconfig를 설정을 진행한다.
그리고, 아래의 build 에 .config 가 설정이 되면서 build가 되고 image가 생성이 되면 이를 image로 복사한다.

$ cd ~/IMX6/fsl-community-bsp/build/tmp/work/imx6qsabreauto-poky-linux-gnueabi/linux-fslc-mx6/3.14-1.0.x+gitAUTOINC+4bae14aef7-r0 

// Yocto build 내부의 kernel 관련구조 
// git fetch를 하며 아래와 같이 kernel source는 link로 연결 

$ tree -d -L 1 
├── build   // kernel build 되는 곳 (.config 저장)
├── deploy-linux-fslc-mx6
├── deploy-rpms
├── git -> /home/jhlee/IMX6/fsl-community-bsp/build/tmp/work-shared/imx6qsabreauto/kernel-source   // linux kernel source
├── image
├── jhlee           // test 용 
├── license-destdir
├── package
├── packages-split
├── pkgdata
├── pseudo
├── sysroot-destdir
└── temp

$ ll
drwxr-xr-x 20 jhlee jhlee   4096 10월 13 11:12 build/        // kernel source 와 build되는 것으로 .config가 저장    
-rw-r--r--  1 jhlee jhlee   9704 10월  6 15:16 defconfig         // kernel의 defconfig로 kernel source에 있다면, arch/arm/configs 참조 
drwxr-xr-x  2 jhlee jhlee   4096 10월  6 20:31 deploy-linux-fslc-mx6/   // output 
drwxr-xr-x  3 jhlee jhlee   4096 10월  6 20:32 deploy-rpms/
lrwxrwxrwx  1 jhlee jhlee     85 10월  6 15:16 git -> /home/jhlee/IMX6/fsl-community-bsp/build/tmp/work-shared/imx6qsabreauto/kernel-source/
drwxr-xr-x  5 jhlee jhlee   4096 10월  6 18:57 image/         // kerenl의  image들 
drwxrwxr-x  3 jhlee jhlee   4096 10월  6 16:06 license-destdir/
-rw-r--r--  1 jhlee jhlee 121789 10월  6 20:32 linux-fslc-mx6.spec
drwxr-xr-x  4 jhlee jhlee   4096 10월  6 18:57 package/
drwxr-xr-x 90 jhlee jhlee   4096 10월  6 18:57 packages-split/
drwxr-xr-x  7 jhlee jhlee   4096 10월  6 18:57 pkgdata/
drwxrwxr-x  2 jhlee jhlee   4096 10월  6 20:50 pseudo/
drwxr-xr-x  3 jhlee jhlee   4096 10월  6 18:57 sysroot-destdir/
drwxrwxr-x  2 jhlee jhlee  12288 10월 13 11:12 temp/

// 상위 build 로 들어가면 kernel의 build된 값과 소스 System.map 확인 
// Kernel source는 아래와 같이 link로 연결 

$cd build  
$ ll
-rw-r--r--  1 jhlee jhlee    98120 10월 16 13:11 .config
-rw-r--r--  1 jhlee jhlee     9760 10월 16 13:11 .config.old
-rw-r--r--  1 jhlee jhlee     1054 10월 16 13:11 .missing-syscalls.d
-rw-r--r--  1 jhlee jhlee        0 10월 16 13:11 .scmversion
-rw-r--r--  1 jhlee jhlee  2264837 10월 16 13:22 .tmp_System.map
-rw-r--r--  1 jhlee jhlee  1655860 10월 16 13:22 .tmp_kallsyms1.o
-rw-r--r--  1 jhlee jhlee  1655860 10월 16 13:22 .tmp_kallsyms2.o
drwxr-xr-x  2 jhlee jhlee     4096 10월 16 13:11 .tmp_versions/
-rwxr-xr-x  1 jhlee jhlee 17118260 10월 16 13:22 .tmp_vmlinux1*
-rwxr-xr-x  1 jhlee jhlee 18224228 10월 16 13:22 .tmp_vmlinux2*
-rw-r--r--  1 jhlee jhlee        2 10월 16 13:22 .version
-rw-r--r--  1 jhlee jhlee      200 10월 16 13:22 .vmlinux.cmd
-rw-r--r--  1 jhlee jhlee      742 10월 16 13:11 Makefile
-rw-r--r--  1 jhlee jhlee   410666 10월 16 13:22 Module.symvers
-rw-r--r--  1 jhlee jhlee  2264837 10월 16 13:22 System.map
drwxr-xr-x  3 jhlee jhlee     4096 10월 16 13:11 arch/
drwxr-xr-x  3 jhlee jhlee     4096 10월 16 13:13 block/
drwxr-xr-x  2 jhlee jhlee     4096 10월 16 13:14 crypto/
drwxr-xr-x 59 jhlee jhlee     4096 10월 16 13:22 drivers/
drwxr-xr-x  3 jhlee jhlee     4096 10월 16 13:13 firmware/
drwxr-xr-x 28 jhlee jhlee     4096 10월 16 13:17 fs/
drwxr-xr-x  5 jhlee jhlee     4096 10월 16 13:11 include/
drwxr-xr-x  2 jhlee jhlee     4096 10월 16 13:22 init/
drwxr-xr-x  2 jhlee jhlee     4096 10월 16 13:11 ipc/
drwxr-xr-x 11 jhlee jhlee     4096 10월 16 13:16 kernel/
drwxr-xr-x  6 jhlee jhlee    12288 10월 16 13:15 lib/
drwxr-xr-x  2 jhlee jhlee     4096 10월 16 13:14 mm/
drwxr-xr-x 22 jhlee jhlee     4096 10월 16 13:22 net/
drwxr-xr-x  7 jhlee jhlee     4096 10월 16 13:11 scripts/
drwxr-xr-x  3 jhlee jhlee     4096 10월 16 13:11 security/
drwxr-xr-x 20 jhlee jhlee     4096 10월 16 13:14 sound/
lrwxrwxrwx  1 jhlee jhlee       85 10월 16 13:11 source -> /home/jhlee/IMX6/fsl-community-bsp/build/tmp/work-shared/imx6qsabreauto/kernel-source/
drwxr-xr-x  2 jhlee jhlee     4096 10월 16 13:11 usr/
-rwxr-xr-x  1 jhlee jhlee 18224228 10월 16 13:22 vmlinux*
-rw-r--r--  1 jhlee jhlee 22305936 10월 16 13:22 vmlinux.o

source에서 실제 소스를 수정해야한다.


4.3 Yocto Build의 deploy의 image 확인

build 디렉토리에서 각각의 Kernel 및 Uboot와 Device Tree 이미지를 확인가능하다.
Device Tree의 설정만 변경이 되면, 매번 Kernel 의 세부설정을 변경할 필요가 없을 것 같다.

$ ls tmp/deploy/images/imx6qsabreauto/  // build 기준으로 tmp/deploy/images 찾음 
README_-_DO_NOT_DELETE_FILES_IN_THIS_DIRECTORY.txt                                  zImage--3.14-1.0.x+git0+4bae14aef7-r0-imx6q-sabreauto-20151006054445.dtb
modules--3.14-1.0.x+git0+4bae14aef7-r0-imx6qsabreauto-20151006054445.tgz            zImage--3.14-1.0.x+git0+4bae14aef7-r0-imx6q-sabreauto-20151014014133.dtb
modules--3.14-1.0.x+git0+4bae14aef7-r0-imx6qsabreauto-20151014014133.tgz            zImage--3.14-1.0.x+git0+4bae14aef7-r0-imx6q-sabreauto-ecspi-20151006054445.dtb
modules-imx6qsabreauto.tgz                                                          zImage--3.14-1.0.x+git0+4bae14aef7-r0-imx6q-sabreauto-ecspi-20151014014133.dtb
qt4e-demo-image-imx6qsabreauto-20151006054445.rootfs.ext4                           zImage--3.14-1.0.x+git0+4bae14aef7-r0-imx6q-sabreauto-flexcan1-20151006054445.dtb
qt4e-demo-image-imx6qsabreauto-20151006054445.rootfs.manifest                       zImage--3.14-1.0.x+git0+4bae14aef7-r0-imx6q-sabreauto-flexcan1-20151014014133.dtb
qt4e-demo-image-imx6qsabreauto-20151006054445.rootfs.sdcard.gz                      zImage--3.14-1.0.x+git0+4bae14aef7-r0-imx6q-sabreauto-gpmi-weim-20151006054445.dtb
qt4e-demo-image-imx6qsabreauto.ext4                                                 zImage--3.14-1.0.x+git0+4bae14aef7-r0-imx6q-sabreauto-gpmi-weim-20151014014133.dtb
qt4e-demo-image-imx6qsabreauto.manifest                                             zImage--3.14-1.0.x+git0+4bae14aef7-r0-imx6qsabreauto-20151006054445.bin
qt4e-demo-image-imx6qsabreauto.sdcard.gz                                            zImage--3.14-1.0.x+git0+4bae14aef7-r0-imx6qsabreauto-20151014014133.bin
u-boot-imx6qsabreauto.imx                                                           zImage-imx6q-sabreauto-ecspi.dtb
u-boot-imx6qsabreauto.imx-sd                                                        zImage-imx6q-sabreauto-flexcan1.dtb
u-boot-sd-v2015.07+gitAUTOINC+3f0c5353f9-r0.imx                                     zImage-imx6q-sabreauto-gpmi-weim.dtb
u-boot.imx                                                                          zImage-imx6q-sabreauto.dtb
u-boot.imx-sd                                                                       zImage-imx6qsabreauto.bin