티스토리 뷰

개발

NXP i.MX6의 부팅순서

트릭맨.AI 2023. 3. 9. 12:13

i.MX6보드의 부트로더에서 부팅 순서는 다음과 같습니다.

  1. 전원 인가: 보드에 전원이 공급됩니다.
  2. ROM 코드 실행: 보드의 ROM에서 코드가 실행되어 SPL(Secondary Program Loader)을 찾습니다.
  3. SPL 실행: SPL은 DRAM을 초기화하고 부트로더 이미지를 로드합니다.
  4. 부트로더 실행: 부트로더는 운영 체제 이미지를 로드하고 실행합니다.
  5. 운영 체제 실행: 부트로더는 운영 체제 이미지를 로드하고 실행합니다.

이러한 과정을 통해 보드가 부팅됩니다. SPL은 부트로더를 실행하기 전에 DRAM을 초기화하는 역할을 합니다. SPL은 보드에 따라 필요하지 않을 수도 있습니다. 부트로더는 운영 체제 이미지를 로드하고 실행하는 역할을 합니다. 보드의 부트로더는 보통 U-Boot을 사용하며, U-Boot은 널리 사용되는 오픈 소스 부트로더입니다.

 

SPL 부트 코드는 부트로더 소스 코드에서 찾을 수 있습니다. SPL은 보통 U-Boot과 함께 사용되며, U-Boot 소스 코드에서 SPL 관련 코드를 찾을 수 있습니다.

U-Boot 소스 코드는 Git 저장소에서 다운로드할 수 있습니다. 저장소를 복제하고 로컬에서 소스 코드를 검색할 수 있습니다. SPL 부트 코드는 common/spl/ 디렉토리에 위치합니다.

다음은 U-Boot Git 저장소를 복제하고 SPL 부트 코드를 검색하는 방법의 예시입니다.

$ git clone git://git.denx.de/u-boot.git
$ cd u-boot
$ grep -r "SPL" common/spl/

위 명령어를 실행하면 common/spl/ 디렉토리에서 SPL 관련 코드를 검색할 수 있습니다. 이를 통해 SPL 부트 코드를 찾을 수 있습니다.

 

SPL에 대해 좀 더 자세히 살펴보면,

 

SPL(Secondary Program Loader)은 부트로더의 일부로, 보드의 DRAM을 초기화하고 부트로더 이미지를 로드하는 역할을 합니다. SPL 코드는 부트로더 소스 코드의 common/spl/ 디렉토리에서 찾을 수 있습니다. SPL 코드를 이해하기 위해서는 C 프로그래밍 언어와 ARM 아키텍처에 대한 이해가 필요합니다.

SPL 코드의 주요 기능은 다음과 같습니다.

  1. 보드 초기화: SPL은 보드의 DRAM과 다른 하드웨어 구성 요소를 초기화합니다. 이는 부트로더가 실행되기 전에 수행됩니다.
  2. 부트로더 이미지 로드: SPL은 보드의 플래시 메모리에서 부트로더 이미지를 로드합니다. 이 이미지는 일반적으로 U-Boot이나 다른 부트로더입니다.
  3. 부트로더 실행: SPL은 로드한 부트로더 이미지를 실행합니다. 이는 부트로더가 운영 체제 이미지를 로드하고 실행하는 것을 의미합니다.

SPL 코드는 C 프로그래밍 언어로 작성되어 있으며, ARM 아키텍처에서 실행됩니다. SPL 코드의 자세한 내용은 SPL 소스 코드를 참조해야 합니다. SPL 코드는 일반적으로 부트로더의 빌드 프로세스에서 자동으로 생성되며, 사용자는 보드의 구성에 따라 SPL 코드를 수정해야 할 수도 있습니다. SPL 코드를 이해하려면 C 언어 및 ARM 아키텍처 관련 지식을 공부하고, 부트로더 소스 코드를 자세히 분석해야 합니다.

 

SPL 코드는 주로 다음과 같은 파일로 구성됩니다.

  1. spl.h: SPL에 필요한 헤더 파일입니다. 이 파일에는 SPL에서 사용하는 함수, 매크로 및 데이터 구조체가 정의되어 있습니다.
  2. spl_boot.h: 부팅 절차를 수행하는 함수가 정의되어 있는 헤더 파일입니다.
  3. spl_boot.c: 부팅 절차를 수행하는 함수가 구현되어 있는 C 파일입니다. 이 파일에는 보드 초기화, 플래시 로딩 및 부트로더 실행과 같은 SPL의 주요 기능이 구현되어 있습니다.
  4. board/: 보드에 따라 SPL 코드를 수정할 수 있는 보드 별 파일이 포함되어 있습니다.

SPL 코드의 구성은 보드 마다 다를 수 있습니다. 따라서 SPL 코드를 분석하려면 보드 별로 SPL 코드를 분석해야 합니다. SPL 코드를 분석하면서는 ARM 아키텍처와 C 언어의 기초 개념을 이해해야 합니다. SPL 코드를 수정해야 하는 경우에는 U-Boot 빌드 시스템 및 부트로더 소스 코드의 구조를 이해하는 것이 중요합니다.

부트로더 및 SPL 코드를 분석하고 수정하는 것은 복잡한 작업이므로, 이를 수행하기 위해서는 충분한 시간과 노력이 필요합니다. 하지만 이를 통해 보드를 제어하는 데 필요한 기술과 지식을 습득할 수 있습니다.

 

 

SPL 코드를 분석하고 이를 수정하는 것은 부트로더 개발자나 임베디드 시스템 개발자에게 중요한 기술입니다.

SPL 코드를 수정하는 경우에는 보드에 따라 다양한 설정을 변경할 수 있습니다.

이러한 설정은 다음과 같습니다.

  1. DDR 초기화:
    SPL 코드를 수정하여 DDR 초기화를 구성할 수 있습니다. 이는 보드에 맞는 DRAM 주파수, 타이밍, 밴크 및 랭크 수 등을 설정할 수 있습니다.
  2. 플래시 로딩:
    SPL 코드를 수정하여 플래시 로딩을 구성할 수 있습니다. 이는 플래시 메모리에서 부트로더 이미지를 로드할 때 필요한 설정입니다.
  3. 시리얼 콘솔:
    SPL 코드를 수정하여 시리얼 콘솔을 구성할 수 있습니다. 이는 부팅 중에 디버그 정보를 출력하는 데 사용됩니다.
  4. 부트로더 이미지:
    SPL 코드를 수정하여 로드할 부트로더 이미지를 선택할 수 있습니다. 이는 다양한 부트로더 중에서 적합한 부트로더를 선택할 수 있는 기능입니다.

SPL 코드를 수정할 때는 부트로더 빌드 시스템과 부트로더 소스 코드의 구조를 이해하는 것이 중요합니다. 이를 통해 보드의 구성에 따라 SPL 코드를 수정할 수 있습니다. SPL 코드 수정에 익숙하지 않은 경우에는 SPL 소스 코드를 자세히 분석하고, 관련 문서와 자료를 참고하면서 연습해보는 것이 좋습니다. 이를 통해 SPL 코드를 이해하고, 보드를 더 잘 제어할 수 있는 기술과 지식을 습득할 수 있습니다.

 

i.MX6 CPU를 사용하는 wandboard에서 실습을 해보면,

 

jskwak@elfdev:/work/wandboard$ git clone -b v2019.04 https://github.com/u-boot/u-boot --depth=1
Cloning into 'u-boot'...
remote: Enumerating objects: 16285, done.
remote: Counting objects: 100% (16285/16285), done.
remote: Compressing objects: 100% (14334/14334), done.
Receiving objects: 100% (16285/16285), 19.93 MiB | 9.69 MiB/s, done.
remote: Total 16285 (delta 2798), reused 5914 (delta 1627), pack-reused 0
Resolving deltas: 100% (2798/2798), done.
Note: switching to '3c99166441bf3ea325af2da83cfe65430b49c066'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false


jskwak@elfdev:/work/wandboard/u-boot$ wget -c https://github.com/eewiki/u-boot-patches/raw/master/v2019.04/0001-wandboard-uEnv.txt-bootz-n-fixes.patch
--2023-03-09 12:03:06--  https://github.com/eewiki/u-boot-patches/raw/master/v2019.04/0001-wandboard-uEnv.txt-bootz-n-fixes.patch
Resolving github.com (github.com)... 20.200.245.247
Connecting to github.com (github.com)|20.200.245.247|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://raw.githubusercontent.com/eewiki/u-boot-patches/master/v2019.04/0001-wandboard-uEnv.txt-bootz-n-fixes.patch [following]
--2023-03-09 12:03:06--  https://raw.githubusercontent.com/eewiki/u-boot-patches/master/v2019.04/0001-wandboard-uEnv.txt-bootz-n-fixes.patch
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.111.133, 185.199.109.133, 185.199.108.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.111.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7521 (7.3K) [text/plain]
Saving to: ‘0001-wandboard-uEnv.txt-bootz-n-fixes.patch’

0001-wandboard-uEnv.txt-bootz-n- 100%[=======================================================>]   7.34K  --.-KB/s    in 0s

2023-03-09 12:03:07 (34.7 MB/s) - ‘0001-wandboard-uEnv.txt-bootz-n-fixes.patch’ saved [7521/7521]

jskwak@elfdev:/work/wandboard/u-boot$
jskwak@elfdev:/work/wandboard/u-boot$ patch -p1 < 0001-wandboard-uEnv.txt-bootz-n-fixes.patch
patching file configs/wandboard_defconfig
patching file include/configs/wandboard.h

jskwak@elfdev:/work/wandboard/u-boot$ env |grep CC
CC=/work/wandboard/u-boot/gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
jskwak@elfdev:/work/wandboard/u-boot$
jskwak@elfdev:/work/wandboard/u-boot$
jskwak@elfdev:/work/wandboard/u-boot$
jskwak@elfdev:/work/wandboard/u-boot$ make ARCH=arm CROSS_COMPILE=${CC} distclean
jskwak@elfdev:/work/wandboard/u-boot$
jskwak@elfdev:/work/wandboard/u-boot$ make ARCH=arm CROSS_COMPILE=${CC} wandboard_defconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  YACC    scripts/kconfig/zconf.tab.c
  LEX     scripts/kconfig/zconf.lex.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
#
# configuration written to .config
#
jskwak@elfdev:/work/wandboard/u-boot$
jskwak@elfdev:/work/wandboard/u-boot$
jskwak@elfdev:/work/wandboard/u-boot$ make ARCH=arm CROSS_COMPILE=${CC}
scripts/kconfig/conf  --syncconfig Kconfig
  CHK     include/config.h
  UPD     include/config.h
  ....
  
  
  
  jskwak@elfdev:/work/wandboard/u-boot$ ls -la *.bin spl/*.bin
-rwxr-xr-x 1 jskwak dev  41780 Mar  9 12:08 spl/u-boot-spl-nodtb.bin
-rwxr-xr-x 1 jskwak dev  41780 Mar  9 12:08 spl/u-boot-spl.bin
-rwxr-xr-x 1 jskwak dev 395656 Mar  9 12:08 u-boot-nodtb.bin
-rwxr-xr-x 1 jskwak dev 395656 Mar  9 12:08 u-boot.bin
공지사항
최근에 올라온 글
Total
Today
Yesterday
최근에 달린 댓글
글 보관함