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가 들어가면 다 검색)
$ 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를 이용한 커널 설정 및 빌드
현재
나의 커널 recipes 는
linux-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