U-boot v2015.01에서 Kernel처럼 Kconfig방식으로 menuconfig가 가능하게 변경되었다.

이전 게시글을 참고하면 어떻게 빌드하는지 알수 있다.

http://forum.falinux.com/zbxe/index.php?document_srl=828720&mid=lecture_tip


오늘은 2015.01릴리즈에서 i.MX6관련 코드들을 분석해보자.
만약 새로운 보드를 만든다면 이와 비슷하게 정의해서 사용할 수 있을 것이다.
u-boot의 소스 디렉토리 구조를 살펴보자.
uboot$ tree -d -L 1  <--- -d는 디렉토리만 -L 깊이 레벨 1까지만 
.
├── api
├── arch     <---CPU 아키텍쳐 관련 소스가 있다. Kconfig/Makefile 정도만 수정한다.
├── board     <---플랫폼 보드에 대한 정보
├── common
├── configs   <---defconfig들이 위치한 곳
├── disk
├── doc
├── drivers
├── dts
├── examples
├── fs
├── include   <---- config와 해더파일들이 위치.
├── lib
├── Licenses
├── net
├── post
├── scripts
├── test
└── tools
포팅을 한다면 거의 위의 네가지 디렉토리만 건드리게 된다.
 
그 예로 Boundary의 Nitrogen6x 보드의 경우를 보면 아래와 같다. 
참고로 2014.04 릴리즈부터 i.mx6의 레퍼런스 보드에 대한 소스가 nitrogen으로 통합되어 있다. 
따라서 Sabre 시리즈 보드도 nitrogen6x.c와 nitrogen6x.h소스를 살펴보면 된다.
uboot$ tree board/boundary/
board/boundary/
└── nitrogen6x
    ├── 1066mhz_4x128mx16.cfg
    ├── 1066mhz_4x256mx16.cfg
    ├── 1066mhz_8x256mx16.cfg
    ├── 6x_bootscript_android_recovery.txt
    ├── 6x_bootscript_android.txt
    ├── 6x_bootscript.txt
    ├── 6x_upgrade.txt
    ├── 800mhz_2x128mx16.cfg
    ├── 800mhz_2x256mx16.cfg
    ├── 800mhz_4x128mx16.cfg
    ├── 800mhz_4x256mx16.cfg
    ├── clocks.cfg
    ├── ddr-setup.cfg
    ├── Kconfig   <--------------- Nitrogen6x에 대한 Kconfig
    ├── MAINTAINERS
    ├── Makefile  <-------------- Makefile
    ├── nitrogen6dl2g.cfg
    ├── nitrogen6dl.cfg
    ├── nitrogen6q2g.cfg
    ├── nitrogen6q.cfg
    ├── nitrogen6s1g.cfg
    ├── nitrogen6s.cfg
    ├── nitrogen6x.c   <---여기에 i.MX6관련 코드가 들어있다.
    ├── README
    └── README.mx6qsabrelite


cfg파일들은 ddr 메모리에 대한 레지스터 세팅값들이다.
새로운 보드에 대한 BSP 작업을 한다면 이런 구조로 디렉토리를 만들어야한다.
그리고 nitrogen6x.h 파일은 아래 경로에 위치해 있다.

uboot$ tree include/configs/
include/configs/
├── a320evb.h
├── a3m071.h
├── a4m072.h
...
├── nitrogen6x.h   <---여기 nitrogen6x 해더파일 위치한다.

이런 식으로 플랫폼 관련 소스들이 들어있다.

그리고 nitrogen6x에 대해서 빌드를 한번 했다면 auto generated 된 config.h가 생성되어 있다.
(반드시 빌드를 한번 해야 생성됨)
$ vi include/config.h

  1 /* Automatically generated - do not edit */
  2 #define CONFIG_IMX_CONFIG   board/boundary/nitrogen6x/nitrogen6q2g.cfg
  3 #define CONFIG_MX6Q 1
  4 #define CONFIG_DDR_MB   2048
  5 #define CONFIG_BOARDDIR board/boundary/nitrogen6x
  6 #include <config_defaults.h>
  7 #include <configs/nitrogen6x.h>
  8 #include <asm/config.h>
  9 #include <config_fallbacks.h>
 10 #include <config_uncmd_spl.h>

arch/arm/Kconfig를 열어 보면 nitrogen6x에 대해서 아래와 같이 정의 되어 있다.

604 config TARGET_NITROGEN6X
605     bool "Support nitrogen6x"
606     select CPU_V7

그리고 맨 아래에 nitrogen6x보드의 Kconfig경로가 위치해 있다.
새로 보드를 만든다면 이와 동일하게 맞춰주면 된다.
878 source "board/bluewater/snapper9260/Kconfig"
879 source "board/boundary/nitrogen6x/Kconfig"   <------nitrogen6x 보드의 Kconfig 위치.
880 source "board/broadcom/bcm28155_ap/Kconfig"

 board/boundary/nitrogen6x/Kconfig를 열어보자
  1 if TARGET_NITROGEN6X
  2 
  3 config SYS_BOARD
  4     default "nitrogen6x"
  5 
  6 config SYS_VENDOR
  7     default "boundary"
  8 
  9 config SYS_SOC
 10     default "mx6"
 11 
 12 config SYS_CONFIG_NAME
 13     default "nitrogen6x"
 14 
 15 endif

이런식으로 보드에 대한 심볼이 정의 되어 있다.
그리고 같은 디렉토리의 Makefile을 보자.
$ vi board/boundary/nitrogen6x/Makefile

nitrogen6x.c가 컴파일되도록 Makefile이 만들어져 있다.
...
   obj-y  := nitrogen6x.o

이런 방식으로 해당 보드에 대한 Kconfig/Makefile을 만들어 주면
새로운 보드에 대한 빌드도 문제 없이 진행될 것이다.