현재 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
각 문서의 주요사항들을 아래와 같이 정리하다.
A. i.MX_6_SABRE-SD_Linux_Release_Notes.pdf
상위 문서에서 아래부분을 각각 확인하자.
Device Tree 부분은 나의 문서를 참조하고 기본개념을 파악하자.
만약, 해당부분을 추가한다면, 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
- 상위 관련문서
- i.MX_6_SABRE-SD_Linux_Release_Notes.pdf
- i.MX_6_Linux_Reference_Manual.pdf
- 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 부분 참조
그리고 나서 커널내부에서 제공하는 문서를 보자
상위문서의 아래부분들을 반드시 참고하고 확인하자
B. i.MX_6_Linux_Reference_Manual.pdf
기본적으로 Camera의 동작방식과 관련부분을 알고 있어야 아래 부분이 이해가 가능하다.
- Device Tree
상위문서의 아래부분들을 반드시 참고하고 확인하자
- 4 BSP Supported Features i.MX 6 SABRE-SD
- Supported Features for i.MX 6 SABRE-SD
- IPU V3 driver Yes Provides the interfaces to access IPU V3 modules
- V4L2 Capture Yes Supports dual camera.
- CSI Camera Yes Supports OV5640 camera sensor.
- 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.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 구성이 동일하다.
아래와 같이 동일한 역할을 하는 파일이지만, 위치가 다 다를 수 있다
B. KCONFIG 파일
Linux Kernel에서 직접 수정하도록 하자
2. CAMERA MODULE 수정
아래와 같이 build가 아니라 직접 source에 가서 수정하도록하자.
$ 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 수정
상위와 같이 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의 적용해보도록하자.
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 생성
상위와 같이 만들어진 patch를 확인한 후 필요한 부분만 사용
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
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)를 나누어진다.
그러므로 아래와 같이 검색하면 쉽게 찾는다
상위 bb file 의 내부에 include가 있으므로, linux-fslc.inc 파일을 찾아 세부적으로 보자
- 나의 기본 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에서 이를 맞춰서 변경해주면된다.
3.4 Patch를 Yocoto *.bbappend 추가
상위에서 만들어진, 나의 Linux Patch를 Kernel Recipe에 bbappend로 아래와 같이 추가하자.
$ 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진행
하지만, 아래와 같이 FILEPEXTRAATHS에 추가적으로 위치를 확장가능
SRC_URI 을 "file://" 사용할 경우 Local File을 사용하는 것이며,
THISDIR의 위치는 bbappend 파일의 위치이며, 아래와 같이 patch파일을 본인이 원하는 sub directory에 추가
주석처리 했지만, 다양하게 구성해서 해보자
* prepend는 맨앞에 할당
* append 는 맨뒤에 할당
* SRC_URI += append 의미이며, file:// 은 local file 의미
3.4.1 상위 관련설정 세부사항 설명
https://www.yoctoproject.org/docs/1.8/ref-manual/ref-manual.html#var-FILESPATH
https://www.yoctoproject.org/docs/1.8/ref-manual/ref-manual.html#var-FILESEXTRAPATHS
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
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
주석처리 했지만, 다양하게 구성해서 해보자
$ 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 문제발생시 확인사항
3.4.1 상위 관련설정 세부사항 설명
- FILEPATH
https://www.yoctoproject.org/docs/1.8/ref-manual/ref-manual.html#var-FILESPATH
- FILESEXTRAPATHS
https://www.yoctoproject.org/docs/1.8/ref-manual/ref-manual.html#var-FILESEXTRAPATHS
- SRC_URI
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 관련수정방법
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 파일 만드는 방법
$ bitbake linux-fslc-mx6 -c diffconfig