레이블이 SoC-IMX6인 게시물을 표시합니다. 모든 게시물 표시
레이블이 SoC-IMX6인 게시물을 표시합니다. 모든 게시물 표시

12/18/2020

MIPI DSI(Display Serial Interface)

1. MIPI-DSI 구조 

MIPI(Mobile Industry Processor Interface)의 DSI는 LCD Interface를 고속 Serial Interface를 이용하는 예로 이번기회에 정리하고자 한다.  
세부내용들은 아래의 링크들에서 자세히 잘 설명해주고 있다. 

LCD Interface 관련내용

ST MIPI-DSI 관련내용 

MIPI(Mobile Industry Processor Interface)

MIPI-DSI(Display Serial Interface)

MIPI-PHY 관련내용 

LCD Pannel Spec


1.1 MIPI DSI 의 구조 

MIPI-DSI

  • MIPI DSI 의 기본구조
DSI Interface로 DCS로 Command로 구성이 되어져 이를 제어한다. 



  • MIPI의 D-PHY 구조 
  1. Clock Lane: One-way (단방향)
  2. Data Lane: One-way (단방향)
  3. Data Lane: Two-way (양방향)

One-way Clocl Lane/ Data Lane
Master: 
    


https://www.programmersought.com/article/42054062840/





2. NXP 사의 i.MX Series 구조 

i.MX6 과 8의  MIPI Interface를 비교하고 관련 부분을 간단히 비교해보자. 

2.1  NXP사의 MIPI-DSI (i.MX6) 

상위에서 기본적인 MIPI를 알았으니, 실제 AP인 i.MX의 경우를 보면 어떻게 세부적으로 동작하는지 알수 있을 것이다. 
두개다 D-PHY는 내부에 포함이 되어있으며, 동작구조가 유사하지만, 점점 변경되어가는 것을 볼 수 있다. 

  • i.MX6 MIPI DSI(Host Controller) 
상위 ST와 거의 유사하며, 별로 다르게 없다.  
  • i.MX6  DSI 내부구조 

i.MX6의 LVDS는 병렬 LCD제어에서 Bridge로 변경되어 제어됨 




2.2  NXP사의 MIPI-DSI (i.MX8) 

  • i.MX8의 MIPI-DSI or LVDS 
기존의 i.MX6와 다르게 MIPI-DSI 와 LVDS PHY를 합쳐서 사용하며, 외부 칩 제어를 위해 i2C 와 GPIO를 설정 (IO Expander 및 레귤레이터)  및 
Bakclight를 위한 PWM제어를 한 묶음으로 변경하여 보기쉽게 변경되었다.
 

아래의 구조는 쉽게 이해하고자 한다면, 이전에 ST 버전하고 거의 동일하다고 생각하면 될 것같다. 
DSI Controller (DSI Host) 로 LCD의 Device를 연결한다.   


10/13/2015

IMX6 CAMERA MODULE 수정 및 Yocto 로 Patch 만들기

1. IMX6 CAMERA INTERFACE

현재 Freescale 의 I.MX6 의 Linux KERNEL은 device tree를 사용하고 있어, 수정 및 관리가 쉽다.
I.MX6의 camera capture의 interfaces는 Module 형태로 제공을 하고 있어,
만약, 해당부분을 추가한다면, module를 추가해서 넣고 테스트를 진행하면 된다.


1.1 CAMERA 관련문서확인

우선 Freescale에서 제공하는 문서와 Yocto File을 다운로드 하고 관련문서를 숙지하도록하자.

Freescale의 Camera 관련문서 
  https://www.freescale.com/webapp/sps/download/license.jsp?colCode=L3.10.17_1.0.0_LINUX_DOCS&appType=file1&location=null&DOWNLOAD_ID=null


  • Download
fsl-yocto-3.10.17_1.0.0.tar.gz ( Freescale site에서 download )


  • 상위 관련문서
  1. i.MX_6_SABRE-SD_Linux_Release_Notes.pdf
  2. i.MX_6_Linux_Reference_Manual.pdf
  3. i.MX_6_BSP_Porting_Guide.pdf

각 문서의 주요사항들을 아래와 같이 정리하다. 

A.  i.MX_6_SABRE-SD_Linux_Release_Notes.pdf

상위 문서에서 아래부분을 각각 확인하자.
Device Tree 부분은 나의 문서를 참조하고 기본개념을 파악하자. 

TI Sitara Device Tree 관련내용(반드시 숙지) 

Device Tree 부분 참조

그리고 나서 커널내부에서 제공하는 문서를 보자
  • Device Tree  
       uImage-imx6sl-evk-csi.dtb

상위문서의 아래부분들을 반드시 참고하고 확인하자
  • 4 BSP Supported Features i.MX 6 SABRE-SD
  1. Supported Features for i.MX 6 SABRE-SD
  2. IPU V3 driver Yes Provides the interfaces to access IPU V3 modules
  3. V4L2 Capture Yes Supports dual camera.
  4. CSI Camera Yes Supports OV5640 camera sensor.
  5. CSI Camera Yes Supports OV5640 camera sensor.

B. i.MX_6_Linux_Reference_Manual.pdf

기본적으로 Camera의 동작방식과 관련부분을 알고 있어야 아래 부분이 이해가 가능하다.

추후 Camera 관련내용제공 

각 부분 카메라 관련 모듈 테스트 방법 과 IPU와 동작방법알아두자.
상위 문서의 아래부분을 참고
  • Ch 6   IPU (Image Processing Unit)
        6.3 Source Code Structure
        6.3.1 Menu Configuration Options  ***
        6.4 Unit Test 확인

$ insmod ipu_prp_enc.ko
$ insmod ipu_bg_overlay_sdc.ko
$ insmod ipu_fg_overlay_sdc.ko
$ insmod ipu_csi_enc.ko
$ insmod ov5640_camera.ko
$ insmod mxc_v4l2_capture.ko


  • Chapter 20  OmniVision Camera Driver
  • Chapter 21  MIPI CSI2 Driver


C. i.MX_6_BSP_Porting_Guide.pdf

iMX의 BSP를 수정하는 전반적인 방법에대해서 설명을 해주고 있으므로, 반드시 확인


1.2 KERNEL 구조파악

기본적으로 KERNEL에 Linux Module을 추가하려면, 아래와 같이 기본구조를 파악하자.

A. KERNEL CONFIG 의 확인 

i.MX6에서 사용하는 Main Kernel Config 이며, 모든 Kernel Config 구성이 동일하다. 
아래와 같이 동일한 역할을 하는 파일이지만, 위치가 다 다를 수 있다

$ ls kernelxxx/arch/arm/configs/xxxx_defconfig     //  본래 xxx_defconfig 위치는 이곳이며, make xxx_defconfig  (bitbake(yocto)에서도 사용)
$ defconfig                              //  실제 적용되는 defconfig로 이 기반으로 .config 생성       
  imx_v7_defconfig                       //  imx_v7_defconfig defconfig 동일하며,  arch/xxx/configs/에 위치함 
$ vi .config                             //  현재 설정된 kernel config 값으로 defconfig 기반으로 생성됨   
                                         //  defconfig 와 .config는 구조는 거의 비슷하지만, 생성되는 것은 Kernel에서 변경이됨 

원래 Linux kernel의 경우 아래와 같이 동작하지만 Yocto에서도 상위와 같이 각각의 defconfig 를 이해하자 
$ make xxx_defconfig    //arch/arm/configs/xxxx_defconfig 설정  후 .config 설정됨 
$ make menuconfig       


B. KCONFIG 파일

Linux Kernel에서 직접 수정하도록 하자 

//일반적인 Linux Kernel는 알다시피 아래와 같이 하지만, 현재 Yocto를 사용하므로 아래를 참조해가며 하자 

$ make menuconfig // Linux 메뉴설정을 위해 아래의 파일들을 점검하자 (Driver추가시)

// 상위 .config에 의해 실제 소스에 적용되는 #define 설정값 
$ cat include/generated/autoconf.h 

// make menuconfig  실행시 메뉴설정 파일 
// 해당 driver에서 Kconfig파일과 makefile을 동시에 수정을 해주면된다.
$ Kconfig     // Main 설정 
$ makefile    // 관련부분 검토 (커널 Version 확인)

// Linux Kernel Version 확인 
$ vi include/linux/version.h  

2. CAMERA MODULE 수정


아래와 같이 build가 아니라 직접 source에 가서 수정하도록하자. 
대신 수정하기전에, backup을 반드시 진행하고 수정을 하도록하자.


2.1 Kernel Module 수정 및 config 수정 

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

$ cp ./drivers/media/platform/mxc/capture/ov5642.c ./drivers/media/platform/mxc/capture/fpga.c

$ vi ./drivers/media/platform/mxc/capture/Makefile
fpga_camera-objs := fpga.o
obj-$(CONFIG_MXC_CAMERA_FPGA) += fpga_camera.o

$ vi ./drivers/media/platform/mxc/capture/Kconfig 
config MXC_CAMERA_FPGA
        tristate "FPGA camera support"
        depends on !VIDEO_MXC_EMMA_CAMERA && I2C
        ---help---
          If you plan to use the ov5642 Camera with your MXC system, say Y here.

$ cd ..      
$ vi . config                    //build directory.
CONFIG_MXC_CAMERA_OV5642=m
CONFIG_MXC_CAMERA_FPGA=m
$ cd .. 
$ vi defconfig 
CONFIG_MXC_CAMERA_OV5642=m
CONFIG_MXC_CAMERA_FPGA=m

상위와 같이 Kernel Config 와 관련 Driver 추가

2.2 make menuconfig시 설정정보 

Video For Linux는 Camera기능에서 Capture기능을 담당하는 부분으로 중요하다
  - Deivce Driver -> Multimedia Support -> V4L platform devices


3. PATCH 만들어 적용 

Linux Kernel Patch를 직접 만들어서 이를 Yocto의 적용해보도록하자.
물론 bbappend를 사용할 것이다. 

3.1  KERNEL Patch 생성 


$ cd ~/IMX6/fsl-community-bsp/build/tmp/work/imx6qsabreauto-poky-linux-gnueabi/linux-fslc-mx6/3.14-1.0.x+gitAUTOINC+4bae14aef7-r0
$ mkdir jhlee  // backup 용 source 보관
$ cp -a  /home/jhlee/IMX6/fsl-community-bsp/build/tmp/work-shared/imx6qsabreauto/kernel-source/  org  // orginal source backup
$ cp -a  /home/jhlee/IMX6/fsl-community-bsp/build/tmp/work-shared/imx6qsabreauto/kernel-source/  new // after modified kernel 
$ diff -urN  org  new  > fpga.patch  

상위와 같이 만들어진 patch를 확인한 후 필요한 부분만 사용


3.2 recipes-kernel 찾기

bitbake 사용시 중요한 것은 recipes 이므로 recipes-kernel 관련된 부분을 모두 찾아보자

내 kernel를  recipes 이름을 정확히 알고 있다면 . bb file 파일로 찾자

$ cd ~/IMX6/fsl-community-bsp/   // main으로 이동 
$ find . -name recipes-kernel
./sources/meta-openembedded/meta-initramfs/recipes-kernel
./sources/meta-openembedded/meta-oe/recipes-kernel
./sources/meta-openembedded/meta-networking/recipes-kernel
./sources/meta-fsl-arm-extra/recipes-kernel
./sources/poky/meta-yocto-bsp/recipes-kernel
./sources/poky/meta/recipes-kernel
./sources/poky/meta-skeleton/recipes-kernel
./sources/poky/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel
./sources/poky/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel
./sources/poky/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel
./sources/poky/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel
./sources/poky/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel
./sources/poky/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel
./sources/poky/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel
./sources/poky/scripts/lib/bsp/substrate/target/arch/common/recipes-kernel
./sources/meta-fsl-arm/openembedded-layer/recipes-kernel
./sources/meta-fsl-arm/recipes-kernel 


3.3 Kernel recipes 의 BB file 확인  

bb file의 예를 들면, 다음과 같다. 
linux-fslc-mx6_3.14-1.0.x.bb  
상위 구조를 보면  '_' 기준으로 PN(Package Name)과 PV(Package Version)를 나누어진다.
그러므로 아래와 같이 검색하면 쉽게 찾는다

  • 나의 기본 KERNEL BB FILE 확인 
상위구조를 이해했으며, 아래와 같이 쉽게 찾도록하자 
$ find ./ -name linux-fslc-mx6*bb* // manual을 보고 이미 kernel recipe 파악 or show-recipe로 추측하자 
.....
$ cd ~/IMX6/fsl-community-bsp/   // main으로 이동 
$ vi ./sources/meta-fsl-arm/recipes-kernel/linux/linux-fslc-mx6_3.14-1.0.x.bb 
# Copyright (C) 2015 O.S. Systems Software LTDA.
# Released under the MIT license (see COPYING.MIT for the terms)

SUMMARY = "FSL Community BSP i.MX6 Linux kernel with backported features and fixes"
DESCRIPTION = "Linux kernel based on Freescale 3.14.28 GA release, used by FSL Community BSP in order to \
provide support for i.MX6 based platforms and include official Linux kernel stable updates, backported \
features and fixes coming from the vendors, kernel community or FSL Community itself."

include linux-fslc.inc

PV .= "+git${SRCPV}"

SRCBRANCH = "3.14-1.0.x-mx6"
SRCREV = "4bae14aef7b8f340f30598d2b076e9ed7b7cba56"

COMPATIBLE_MACHINE = "(mx6)"

상위 bb file 의 내부에 include가 있으므로, linux-fslc.inc 파일을 찾아 세부적으로 보자

  • Source 와 Build된 부분의 defconfig
현재 Kernel config 와 동일한지 우선 확인하자.  
source 의 defconfig 값과 build의 defconfig를 비교를 해보고, 
만약 defconfig를 설정을 변경하고자 하면 source에서 이를 맞춰서 변경해주면된다.
$ cd ~/IMX6/fsl-community-bsp/ 
$ diff  ./sources/meta-fsl-arm/recipes-kernel/linux/linux-fslc-mx6/defconfig   ~/IMX6/fsl-community-bsp/build/tmp/work/imx6qsabreauto-poky-linux-gnueabi/linux-fslc-mx6/3.14-1.0.x+gitAUTOINC+4bae14aef7-r0/defconfig   // 동일 


3.4  Patch를 Yocoto *.bbappend 추가 

상위에서 만들어진, 나의 Linux Patch를 Kernel Recipe에 bbappend로 아래와 같이 추가하자.
보통 bbappend 형식으로 많이 Patch관리를 한다. 

$ cd ~/IMX6/fsl-community-bsp/   // main으로 이동 
$ cd ./sources/meta-fsl-arm/recipes-kernel/linux/  
$ cp ~/IMX6/fsl-community-bsp/build/tmp/work/imx6qsabreauto-poky-linux-gnueabi/linux-fslc-mx6/3.14-1.0.x+gitAUTOINC+4bae14aef7-r0/jhlee/fpga.patch . 
$ mkdir files             //  아래의 bbappend에 따라 subdirectory 생성하지만, files은 기본으로 찾음
$ mv fpga.patch files   // files에 copy 
$ ls
linux-fslc-mx6_3.14-1.0.x.bb        linux-imx                     linux-imx-rt-3.14.28     linux-ls1          linux-timesys-3.0.15
fpga.patch      linux-fslc-mx6_3.14-1.0.x.bbappend  linux-imx-3.14.38             linux-imx-rt_3.14.28.bb  linux-ls1.inc      linux-timesys_3.0.15.bb
linux-fslc      linux-fslc.inc                      linux-imx-mfgtool-3.14.28     linux-imx.inc            linux-ls1_3.12.bb
linux-fslc-mx6  linux-fslc_4.1.bb                   linux-imx-mfgtool_3.14.38.bb  linux-imx_3.14.38.bb     linux-mfgtool.inc


  • bbappend를 적용하여 patch진행 
기본으로 recipe(*.bb)파일 위치기준으로 사용되어지는 files는 FILEPATH에 의해 local file들을 찾을 수 있다.
하지만, 아래와 같이 FILEPEXTRAATHS에 추가적으로 위치를 확장가능
SRC_URI 을 "file://" 사용할 경우 Local File을 사용하는 것이며, 
THISDIR의 위치는 bbappend 파일의 위치이며, 아래와 같이 patch파일을 본인이 원하는 sub directory에 추가

주석처리 했지만, 다양하게 구성해서 해보자 
$ vi linux-fslc-mx6_3.14-1.0.x.bbappend 
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
#FILESEXTRAPATHS_prepend := "${THISDIR}/v${PV}:"
#FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
#FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}-${PV}:"
SRC_URI += "file://fpga.patch"
#PRINC := "${@int(PRINC) + 1}" 

* prepend는 맨앞에 할당
* append 는 맨뒤에 할당
* SRC_URI += append 의미이며, file:// 은 local file 의미

  • Patch 문제발생시 확인사항 
상위를 추가하면 quilt 라는 것이 patch를 실행을 하는데, quilt에서 에러가 발생하면 path 내부에러문제인지 자세히 살펴보자.


3.4.1  상위 관련설정 세부사항 설명 


  • FILEPATH
Local FILES들을 기본으로 찾는 PATH로 보통 *bb 파일의 위치로 설정 ({THISDIR}/files:)
  https://www.yoctoproject.org/docs/1.8/ref-manual/ref-manual.html#var-FILESPATH

  • FILESEXTRAPATHS
Local FILE들을 찾는위치를 추가로 확장하는 PATH로 본인이 원하는대로 확장
  https://www.yoctoproject.org/docs/1.8/ref-manual/ref-manual.html#var-FILESEXTRAPATHS

  • SRC_URI
prefix 와 suffix 값에 의해 동작이 결정된다고 생각하면된다. ";" 를 넣어  patchdir를 이용하여 patch dir로 변경가능
  https://www.yoctoproject.org/docs/1.8/ref-manual/ref-manual.html#var-SRC_URI
  http://www.embeddedlinux.org.cn/OEManual/src_uri_variable.html

  • Kernel 관련수정방법
Kernel의 설정인 defconfig 부터 관련 driver 수정에 관련된 부분을 설명
  https://www.yoctoproject.org/docs/1.8/kernel-dev/kernel-dev.html
  https://www.yoctoproject.org/docs/1.8/kernel-dev/kernel-dev.html#changing-the-configuration
  https://www.yoctoproject.org/docs/1.8/kernel-dev/kernel-dev.html#creating-the-append-file


  • cfg 파일 만드는 방법
재미있는 것은  아래와 같이 diffconfig를 이용하면 .config 와 차이점을 *.cfg에 저장을 해준다.

$ bitbake linux-fslc-mx6 -c diffconfig


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


10/02/2015

IMX6 YOCTO 기본개발환경 설정

1. iMX6  개발환경 

  • OS: ubuntu-14.04.3 LTS version  (ubuntu-14.04.3-desktop-i386)
  • 개발환경: yocto project 사용 

1.1 Ubuntu 관련설정

  • Ubuntu Package 필요 설치 
Ubuntu 기반으로 기본으로 설치되어져야 하는 Package들로 관련 Manaul 참조
$ sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib \
build-essential chrpath socat libsdl1.2-dev xterm

  • 추가적으로 필요한 Package (옵션)
내가 사용하기 위해서 아래 Package들 설치 
$ sudo apt-get install curl
$ sudo sudo apt-get install tree 


  • 커널설정시 문제가 발생
아래와 같이 Kernel 설정을 하려고 하는데, 문제가 발생을 할 경우 ncurse library 설치 
$ make menuconfig
 *** Unable to find the ncurses libraries or the
 *** required header files.
 *** 'make menuconfig' requires the ncurses libraries.
 *** 
 *** Install ncurses (ncurses-devel) and try again.

보통기본으로 설치되어있는데, 흐음 
$ sudo apt-get install libncurses5-dev 


Yocto 의 Quick Gude
만약 다른 OS라면, 아래 사이트 혹은 iMX6의 문서를 참고해서  환경설정하자
    http://www.yoctoproject.org/docs/1.8/yocto-project-qs/yocto-project-qs.html


1.2 git 와 repo 설정 

Yocto는 Git 과 repo 기반으로 동작하기 때문에 GIT과 Repo 기반으로 Download 및 관련설정을 해주자.

  • git 설정 
$ git config --global user.name "JeonghunLee" 
$ git config --global user.email "xxx@xxxxx" 
$ git config --list 

  • repo 설정(Git Control)
$ mkdir ~/bin
$ curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ vi ~/.bashrc    // add following setting 
          PATH=$PATH:~/bin
$ chmod a+x ~/bin/repo



2. IMX6 Yocto 개발관련 문서 

아래의 사이트에서 Yocto 기반으로 BSP를 설치하는 문서가 존재하며, 각각의 BSP Porting 및 관련사항의 문서를 볼 수 있다.
Yocto의 경우 가장먼저 Chip vendor사의 Manual 부터 반드시 확인하고, 관련사항을 점검하도록하자. 
현재 Freescale의 i.MX6는 Yocto 기반으로 Release Version 과 Community Version을 제공하고 있으며 관련부분을 설치하고 진행하자
두 Version의 차이는 일단 공식 Release version 과 Community Version의 차이는 공식 버전과 개발버전의 차이 인것 같다.


Yocto를  Download 위치 와 setup 설정방법 차이가 존재하지만 사용방법은 거의 동일하다
각 두가지 버전을 설치진행을 해보도록하자 


2.1 Yocto release version 설치  

i.MX6의 Release Version으로 설치진행 및 확인 

  • i.MX6 개발문서 
  1. fsl-yocto-3.10.17_1.0.0.tar.gz
  2. fsl-yocto-3.14.28-1.0.0.tar.gz

상위 파일안에, Freescale_Yocto_Project_User's_Guide 문서에  사용방법이 잘 서술이 되어있으며,
아래와 같이 QT를 이용한 빌드방법도 소개하고 있으나, 현재 이방법으로 하지 않는다.

문서의 예제 5.6.2 FB image on i.MX 6Quad SABRE-AI
  • Release  sources download 
$ mkdir fsl-release-bsp   //release version 이 아님 

$ repo init -u git://git.freescale.com/imx/fsl-arm-yocto-bsp.git -b imx-3.10.53-1.1.0_ga

$ repo sync 


  • Yocto 개발설정 (release 용)
bitbake가 동작되지 않을 경우 재 설정을 해주자
MACHINE에 본인의 Reference Board의 를 설정하고 아래와 같이 build directory를 생성

$ MACHINE=imx6qsabreauto source fsl-setup-release.sh –b build-fb –e fb  
// build-fb directory 생성되며 conf/local.conf 생성 후 자동으로 이 위치로 이동  


  • 본인이 원하는 배포버전으로 빌드진행  
$ bitbake fsl-image-qt5  // QT5지원가능 
// build 가 진행되면서 각각의 소스를 download를 하며 build를 진행
or 
$ bitbake core-image-base
// 기존으로 QT5가 포함 빼고자 하면 fsl-image-gui로 진행 (This builds QT5 on a frame buffer backend) To build without QT5, use image recipe fsl-image-gui.


  • bitbake로 빌드 후 이미지 확인 (uboot/kernel/rootfs)
최종 Image가 상위 MACHINE과 이름이 동일하게 생성 
./build/tmp/deploy/images/machine/imx6qsabreauto


2.2 Yocto community version 설치 

Release Version과 거의 동일하며, 어려움이 없이 쉽게 가능하다. 

  • Community sources download 
$ mkdir fsl-community-bsp   //release version 이 아님 

$ cd fsl-community-bsp

$ repo init -u https://github.com/Freescale/fsl-community-bsp-platform -b master  //(master can be fido or master-next for newer one)

$ repo sync


  • Yocto 개발설정  (community) 
bitbake 관련 명령어가 동작되지 않을 경우 아래와 같이 재설정
$ source setup-environment build  //build directory 생성이 되며 기본 설정인 conf/local.conf 설정 

  • build/conf/local.conf 설정  
$ pwd  
/home/jhlee/IMX6/fsl-community-bsp/build 

$ vi conf/local.conf
MACHINE ??= 'imx6qsabreauto'
DISTRO ?= 'poky'
PACKAGE_CLASSES ?= "package_rpm"

#### modified ################################
EXTRA_IMAGE_FEATURES = "debug-tweaks ssh-server-openssh tools-sdk"

IMAGE_INSTALL_append += " icu directfb"
DISTRO_FEATURES_remove = "x11 wayland"
DISTRO_FEATURES_append = " directfb"
#### end of modified ##########################

USER_CLASSES ?= "buildstats image-mklibs image-prelink"
PATCHRESOLVE = "noop"
BB_DISKMON_DIRS = "\
    STOPTASKS,${TMPDIR},1G,100K \
    STOPTASKS,${DL_DIR},1G,100K \
    STOPTASKS,${SSTATE_DIR},1G,100K \
    STOPTASKS,/tmp,100M,100K \
    ABORT,${TMPDIR},100M,1K \
    ABORT,${DL_DIR},100M,1K \
    ABORT,${SSTATE_DIR},100M,1K \
    ABORT,/tmp,10M,1K"
PACKAGECONFIG_append_pn-qemu-native = " sdl"
PACKAGECONFIG_append_pn-nativesdk-qemu = " sdl"
ASSUME_PROVIDED += "libsdl-native"
CONF_VERSION = "1"

BB_NUMBER_THREADS = '4'        // BITBAKE THREAD 수 
PARALLEL_MAKE = '-j 4'              // Make 동작시 패러럴 옵션      4x4 = 16 

DL_DIR ?= "${BSPDIR}/downloads/"
ACCEPT_FSL_EULA = "1"

#OE_TERMINAL = "screen"           // ssh창에서 menuconfig위해 추가했으나 별효과가 없음 


  • 본인이 원하는 배포버전으로 빌드진행 
각 빌드시간마다 상당한 시간이 걸리며, 내 PC에서 5시간 이상걸리는 것 같다.
한번 확인하기가 너무 오래걸리며, 인내하고 참자.

$ bitbake qt4e-demo-image (or core-image-base)    
$ bitbake meta-toolchain-qte (for toolchain sdk)

  • bitbake로 빌드 후 이미지 확인 (uboot/kernel/rootfs)
./build/tmp/deploy/images/machine/imx6qsabreauto


  • 각 디렉토리 를  트리구조 확인하여 분석 
상위에서 설치한 tree package로 각 구조를 File 구조 및 관련사항을 파악
$ tree -d -L 2 -A


3. bitbake 이외 명령어들 확인 

yocto setup을 진행한 후 bitbake는 사용가능하며, 이외에도 아래와 같은 bitbake 관련명령어들이 존재하므로 각각 실행해보자

$ bitbake-layers show-layers  // Layer 구성을 보여준다 

layer                 path                                      priority
==========================================================================
meta                  /home/jhlee/IMX6/fsl-community-bsp/sources/poky/meta  5
meta-yocto            /home/jhlee/IMX6/fsl-community-bsp/sources/poky/meta-yocto  5
meta-oe               /home/jhlee/IMX6/fsl-community-bsp/sources/meta-openembedded/meta-oe  6
meta-multimedia       /home/jhlee/IMX6/fsl-community-bsp/sources/meta-openembedded/meta-multimedia  6
meta-fsl-arm          /home/jhlee/IMX6/fsl-community-bsp/sources/meta-fsl-arm  5
meta-fsl-arm-extra    /home/jhlee/IMX6/fsl-community-bsp/sources/meta-fsl-arm-extra  4
meta-fsl-demos        /home/jhlee/IMX6/fsl-community-bsp/sources/meta-fsl-demos  4

$ bitbake-layers show-recipes  // bitbake의 recipes들을 보여준다. 

// release or community version으로 setup을 하면 build directory 생성과 함께 build/conf/local.conf 와 build/conf/bblayers.conf 생성됨  
// 다만 release 와 comminity 가 setup하는 방법은 다름 

$ vi conf/bblayers.conf   // 상위의 show-layers 부분을 확인 
BBLAYERS = " \
  ${BSPDIR}/sources/poky/meta \
  ${BSPDIR}/sources/poky/meta-yocto \
  \
  ${BSPDIR}/sources/meta-openembedded/meta-oe \
  ${BSPDIR}/sources/meta-openembedded/meta-multimedia \
  \
  ${BSPDIR}/sources/meta-fsl-arm \
  ${BSPDIR}/sources/meta-fsl-arm-extra \
  ${BSPDIR}/sources/meta-fsl-demos \

Freescale의 p1020rdb 예제로 참고만하자
  http://forum.falinux.com/zbxe/index.php?document_srl=828316&mid=lecture_tip