분류

2018년 4월 13일 금요일

MYC-JA5D44 보드 linux 빌드하기

MYC-JA5D44라는 보드에 kernel을 변경해야 하는데 만만치 가 않습니다. 제조사에서 이미지나 SDK는 물론 설치 프로그램조차 제공하지 않으면서 설명서라고 PDF파일만 제공하고 있으니, 일이 쉽게 풀리지 않을 것 같습니다.

보드를 부팅하고 보니 제일 먼저 눈에 들어오는 게
Poky (Yocto Project Reference Distro) 1.7.1 sama5d4ek /dev/ttyS0

Yocto를 이용해 build 하면 된다는 것 정도는 알려줍니다. 아래는 사이트 링크 입니다.
https://www.at91.com/linux4sam/bin/view/Linux4SAM/SoftwareTools#Yocto_Project_SDK
간략하게 JA5D44 보드에 적용할 수 있는 녀석들만 보자면 branch 별로 하나씩 있습니다. branch의 이름이 yocto project version별로 나뉘어 있다고 생각됩니다.
Yocto 2.2.2 - MORTH,           Yocto 2.1.1 - KROGOTH
Yocto 2.0.1 - JETHRO            Yocto 1.7.1 - DIZZY
일단 현재 버전이 Yocto 1.7.2 버전이고, kernel 이3.0.2가 아닌 3.18.0 버전인데 kernel 버전별로 지원해주는 부분은 없는 것 같습니다. github의 배포 정보를 봐도 kernel과 관련된 공지는 없습니다. 사용자가 다 알아서 하라는 것 같습니다.

그리고 여태 지나왔던 보드와 다르게 Yocto를 통한 통합된 형태의 지원 체계가 아닌 개별 작업을 해야 하는 형태를 갖고 있습니다. Yocto는 사용하지만 다른 보드들과 달리 소스코드가 통합이 아닌 분리 제공 되고 있습니다.

본 문서는 OpenEmbedded /Yocto Project / Poky:build from source 문서를 한글화 한 것입니다.

빌드 절차 

지원 기기

- SAMA5D2 product family / sama5d2-xplained, sama5d27-som1-ek-sd
- SAMA5D4 product family / sama5d4ek, sama5d4-xplained
- SAMA5D3 product family / sama5d3xek, sama5d3-xplained
- AT91SAM9x5 product family (AT91SAM9G15, AT91SAM9G25, AT91SAM9X25, AT91SAM9G35 and AT91SAM9X35) / at91sam9x5ek
- AT91SAM9RL / at91sam9rlek
- AT91SAM9G45 / at91sam9m10g45ek

소스

URI: git://github.com/linux4sam/meta-atmel.git
URI: https://github.com/linux4sam/meta-atmel.git
Branch: morty

종속성

This Layer depends on :
- meta-openembedded
URI: git://git.openembedded.org/meta-openembedded
URI: http://cgit.openembedded.org/meta-openembedded/
Branch: morty

선택사양

- meta-qt5
URI: git://code.qt.io/yocto/meta-qt5.git
URI: http://code.qt.io/cgit/yocto/meta-qt5.git/
Tag: v5.9.1

빌드 절차 

1. morth 분기의Yocto / poky 레포지토리를 복제합니다. (kernel 버전이 가장 낮아서 선택)
$ git clone git://git.yoctoproject.org/poky -b morty

2. morth 분기의 meta-openembedded git을 복제합니다.
$ git clone git://git.openembedded.org/meta-openembedded -b morty

3. meta-qt5 git을 복제합니다.
$ git clone git://code.qt.io/yocto/meta-qt5.git
$ cd meta-qt5
$ git checkout v5.9.1
$ cd ..

4. morth 분기의 메타 레이어를 복제합니다.
$ git clone git://github.com/linux4sam/meta-atmel.git -b morty 


※ 일부 환경에서는 Python 3.4 버전이 설치되어 있지 않을 수 있습니다. 
$ sudo add-apt-repository ppa:deadsnakes/ppa

$ sudo apt-get update; sudo apt-get install python3.4 
python3.4 --version
$ alias python3=python3.4
$ alias python=python3.4
설치를 해도 동일 오류가 발생할 경우 
<poky설치위치>/scripts/oe-buildenv-internal 파일을 확인하세요 

5. poky 디렉토리에 들어가 빌드 시스템을 구성하고 빌드 프로세스를 시작하세요

5-1. 빌드 디렉토리 초기화
$ source oe-init-build-env build-atmel 

5-2 빌드 환경 설정 (BB-PLAYER설정)
vim conf/bblayers.conf

# POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
POKY_BBLAYERS_CONF_VERSION = "2"

BBPATH = "${TOPDIR}"
BBFILES ?= ""

BSPDIR := "${@os.path.abspath(os.path.dirname(d.getVar('FILE', True)) + '/../../..')}"

BBLAYERS ?= " \
${BSPDIR}/poky/meta \
${BSPDIR}/poky/meta-poky \
${BSPDIR}/poky/meta-yocto-bsp \
${BSPDIR}/meta-atmel \
${BSPDIR}/meta-openembedded/meta-oe \
${BSPDIR}/meta-openembedded/meta-networking \
${BSPDIR}/meta-openembedded/meta-python \
${BSPDIR}/meta-openembedded/meta-ruby \
${BSPDIR}/meta-openembedded/meta-multimedia \
${BSPDIR}/meta-qt5 \
"

BBLAYERS_NON_REMOVABLE ?= " \
${BSPDIR}/poky/meta \
${BSPDIR}/poky/meta-poky \ ,
"

5-3 local.conf 편집
local.conf 파일을 열어보면 각 보드의 이름이나 환경설정이 주석처리 되어 있습니다. 그중 자신의 환경에 맞는 환경설정의 주석을 해제 해주어야 합니다. 대체적인 설명은 local.conf 파일 내에 있습니다.


맞는 보드가 없을경우 qemux86
<build 위치>$ find ../../* -name *보드명*.conf
예 : $ find ../../* -name *sama5d4*.conf
../../meta-atmel/conf/machine/sama5d4-xplained-sd.conf
../../meta-atmel/conf/machine/sama5d4-xplained.conf

../../meta-atmel/conf/machine/sama5d4ek.conf

설정 예제 
vim conf/local.conf
[...]
MACHINE ??= "sama5d4-xplained"  ※ 현재 왜인지 sama5d4-xplainted는 빌드 오류 발생
[...]
DL_DIR ?= "your_download_directory_path" 
[...]
PACKAGE_CLASSES ?= "package_ipk"
[...]
USER_CLASSES ?= "buildstats image-mklibs"


성능 향상이 필요할경우 "poky-atmel" 배포본을 사용하세요 
DISTRO ?= "poky-atmel"
하위 설정에 대해 잘 알지 못 하는 경우 머신 네임만 넣으면 기본값 실행 됩니다. 

local.conf 내용을 한글화 해 보았습니다.
#이 파일은 로컬 설정 파일이며 모든 로컬 사용자 설정이 잇는 곳입니다. 이 파일의 주석은 사용자가 변경할 수 있는 옵션에 대한 기본 지침을 제공하지만 거의 모든 구성 옵션을 이 파일에서 변경할 수 있습니다. 좀 더 확장적인 사용자 환경을 위해선 local.conf.extended를 확인하세요.

#이 파일에 배치할 수 있는 구성의 다른 예가 들어있지만 처음에는 필요하지 않을 가능성이 높습니다.



#'#' 으로 시작되는 행은 주석으로 처리되며 경우에 따라 기본값이 사람들 예제 구문을 표시하는 주석으로 제공됩니다. 이 옵션을 활성화 하려면 # 문자를 제거 하고 필요에 따라 변수를 변경해야 합니다. 

###대상 보드 선택 ###
# 빌드 대상으로 지정할 특정 시스템을 선택해야 합니다. QEMU  에뮬레이터에서 부팅 및 실행할 수 있는 에뮬레이트 된 머신을 선택할 수 있습니다. 
#MACHINE ?= "qemuarm"
[...]
# 데모 용으로 포함 된 하드웨어 보드 대상 시스템은 다음과 같습니다. 
#MACHINE ?= "beaglebone"
[...]
# 다른 보드가 선택되지 않은 경우 기본 보드를 qemux86으로 설정합니다. 
MACHINE ??= "qemux86"

###다운로드 위치###
처음 빌드하는 동안 시스템은 다양한 업스트림 프로젝트에서 많은 다른 소스 코드 타르볼(압축파일)을 다운로드 합니다. 네트워크 연결이 느린 경우 특히 시간이 걸릴 수 있습니다. 이들은 모두 DL_DIR에 저장됩니다. 다시 빌드 할 때 이 디렉토리를 보존하여 이 후속 빌드의 속도를 높일 수 있습니다. 이 디렉토리는 동일한 시스템의 여러 빌드 간 안전하게 공유할 수 있습니다. 
#기본 설정은 빌드 디렉토리 인 TOPDIR 아래의 다운로드 디렉토리 입니다. 
#

#DL_DIR ?= "${TOPDIR}/downloads"

###공유 상태 파일을 저장할 위치###
# BitBake에는 이 전에 빌드 된 출력을 기반으로 빌드를 가속화 하는 기능이 있습니다. 이는 캐시 오브잭트로 간주될 수 있는 "공유 상태"파일을 사용하여 수행되며 옵션은 파일이 저장되는 위치를 결정합니다. 
#이 디렉토리를 손상되지 않도록 TMPDIR을 삭제할 수 있으며, 설정을 변경하지 않으면 빌드가 이 파일에서 재생성됩니다. 구성이 변경되면 상태가 여전히 유효한 공유 상태 파일 만 사용됩니다. (체크섬을 사용하여 완료됨)
기본 값은 TOPDIR 아래에 있는 sstate-cache 디렉토리 입니다. 
#SSTATE_DIR ?= "${TOPDIR}/sstate-cache"

###빌드 출력을 배치 할 위치###
#이 옵션은 빌드 작업의 대부분을 수행해야 하는 위치와 BitBake가 임시 파일을 저장하고 출력해야 하는 위치를 지정합니다. 여기에는 수 기가바이트의 하드 디스크 공간을 사용 할 수 있는 많은 응용 프로그램과 툴체인의 추출과 컴파일이 포함 됩니다. 
#기본 값은 TOPDIR 아래 TMP디렉토리 입니다. 
#TMPDIR = "${TOPDIR}/tmp"

###기본 정책 구성###
# 배포 설정은 어떤 정책 설정이 기본값으로 사용되는지 제어합니다. 기본 값은 일반 Yocto 프로젝트 사용에 적합합니다. 적어도 초기에는 기본 값 입니다. 궁극적으로 사용자 정의 정책을 작성할 때 사람들은 이러한 기본값을 '서브 클래스'화 하려는 경향이 있습니다. 
DISTRO ?= "poky"
#하위 클래스의 예로서 "bleeding" 경계 정책 구성이 있습니다. 많은 버전이 업스트림 소스 제어 시스템의 순수한 최종 코드로 설정 됩니다. 여기서는 예제로 언급했지만 대부분의 사용자에게는 유용하지 않습니다. 
# DISTRO ?= "poky-bleeding"

###패키지 관리 구성###
이 변수는 사용할 패키징 형식을 나열합니다. 여러 패키지 백앤드를 동시에 활성화 할 수 있으며 변수에 나열된 첫 번 째 항목은 루트 파일 시스템을 생성하는 데 사용됩니다. 옵션은 다음과 같습니다. 
- 'package_deb'    데비안 스타일 deb파일 패키지
- 'package_ipk'     ipk사용자 패키지 (데비안 스타일 임베디드 패키지 관리자)
- 'package_rpm'    rpm 스타일 패키지 
#예: PACKAGE_CLASSES ?= "package_rpm package_deb package_ipk"
#우리는 RPM패키지를 기본으로 합니다. 
PACKAGE_CLASSES ?= "package_rpm"

###SDK 타겟 아키텍처###
#이 변수는 SDK 항목을 빌드하기위한 아키텍처를 지정합니다. 즉, 빌드를 실행중인 시스템 이외의 아키텍처(x86_64 호스트에 i686패키지 빌드) 용 SDK패키지를 빌드 할 수 있음을 의미합니다. 지원되는 값은 i686및 x86_64 입니다. 
#SDKMACHINE ?= "i686"

###추가 패키지 구성 기본 값###
#EXTRA_IMAGE_FEATURES 변수는 생성 된 이미지에 추가 패키지를 설치할 수 있게 합니다. 일부 옵션은 특정 이미지 유형에 자동으로 추가 됩니다. 변수에는 다음 옵션이 포함될 수 있습니다.
#  "dbg-pkgs"  : 설치된 모든 패키지에 대해 -dbg 패키지를 추가 
                      (디버깅/프로파일링을 위한 심볼 정보 추가) 
#  "dev-pkgs"  : 설치된 모든 패키지에 -dev패키지 추가 
                      (이미지의 libs에 대해 개발하고 싶을 때 유용합니다. )
#  "ptest-pkgs" : 모든 ptest 기능 패키지에 대해 -ptest 패키지 추가 
                      (패키지 테스트 스위트를 실행하려는 경우 유용함) 
#  "tools-sdk"   : 개발 도구 (gcc, make, pkgconfig 등) 추가 
# "tools-debug": 디버깅 도구 (gdb, strace) 추가 
# "eclipse-debug": Eclipse 원격 디버깅 지원 추가 
# "tools-profile": 프로파일 링 도구 (oprofile, lttng, valgrind) 추가 
# "tools-testapps": 유용한 테스트 도구 (ts_print, aplay, arecord 등) 추가 
# "debug-tweaks": 개발에 적합한 이미지 만들기 
# ssh 루트 액세스에는 빈 암호가 있습니다. 
# 여기에서도 사용할 수있는 다른 응용 프로그램 타겟이 있습니다. 자세한 내용은 
# meta / classes / image.bbclass 및 meta / classes / core-image.bbclass를 참조하십시오. # 기본적으로 디버깅을 조정할 수 있습니다.
EXTRA_IMAGE_FEATURES ?= "debug-tweaks"


###추가 이미지 기능###
# 다음은 이미지를 빌드 할 때 사용할 추가 클래스 목록입니다.
# 추가 기능을 사용합니다. 이 변수에 포함될 수있는 몇 가지 옵션이 있습니다.
# are :
# - 'buildstats'빌드 통계 수집
# - 이미지의 공유 라이브러리 파일 크기를 줄이기위한 'image-mklibs'
# - 파일 시스템 이미지를 미리 링크하기 위해 'image-prelink'
# - 호스트 시스템 침입 탐지를 수행하기위한 'image-swab'
# 참고 : mklibs와 prelink 둘 다 나열한다면, mklibs가 prelink 전에 있는지 확인하십시오.
# 참고 : 주어진 이미지에 mklibs를 명시 적으로 활성화해야합니다 (local.conf.extended 참조).
USER_CLASSES? = "buildstats image-mklibs image-prelink"


###이미지 런타임 테스트###
#빌드 시스템은 루트 파일 시스템이 생성 된 후 qemu (에뮬레이터)에서 부팅 가상 머신 이미지를 테스트하고 해당 이미지에 대해 테스트를 실행할 수 있습니다. 이 행의 주석 처리를 해제하려면이 행을 주석 처리하십시오. for class / testimage (-auto) .bbclass를 참조하십시오. 

# 세부 사항. 
#TEST_IMAGE = "1"

###대화 형 쉘 구성###  
# 특정 상황에서 시스템이 사용자로부터 입력을 요구할 수 있으며이를 위해 대화 형 쉘을 시작할 수 있습니다. 빌드가 완료되었으므로이 작업을 수행해야합니다. 
# multithreaded이고 하나 이상의 병렬 프로세스가 사용자의주의를 요할 수도있는 경우를 처리 할 수 ​​있어야합니다. 기본값은 작동하는 터미널 유형을 찾기 위해 사용 가능한 터미널 유형을 반복하는 것입니다. 
#이 경우가 발생할 수있는 경우는 devshell이나 kernel menuconfig를 사용하여 적용 할 수없는 패치를 해결할 때입니다 
# 지원되는 값은 auto, gnome, xfce, rxvt, screen, konsole (KDE 3.x 만 해당), none 
# 참고 : 현재 Konsole 지원은 새로운 Konsole 버전의 작동 방식으로 KDE 3.x에서만 작동합니다. 
# OE_TERMINAL = "auto" 
# 기본적으로 대화 형 패치 확인을 비활성화합니다 (대신 작업이 실패합니다). PATCHRESOLVE = "noop"


###빌드 중 디스크 공간 모니터링###

# 빌드하는 동안 디스크 공간을 모니터하십시오. 키 빌드 위치 (TMPDIR, DL_DIR, SSTATE_DIR)에 1GB 미만의 공간 또는 100,000 개 미만의 inode가 있으면 빌드를 정상적으로 종료하십시오. 100MB 또는 1K inode가 적 으면 빌드를 강제 중단하십시오. 그 이유는 완전히 공간 밖으로 실행하면 파일을 손상시킬 수 있고 쉽게 복구 할 수없는 방법으로 빌드를 손상시킬 수 있기 때문입니다. / tmp를 모니터링 할 필요가 있습니다. 공간이 남아 있지 않으면 빌드가 실패하여 매우 복잡한 오류가 발생합니다.

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 "


###다른 위치의 공유 상태 파일###

# 위에서 언급했듯이 공유 상태 파일은 빌드 시간을 단축하는 데 사용할 수있는 미리 작성된 캐시 데이터 객체입니다. 이 변수는 데이터 자체를 작성하기 전에 이러한 오브젝트에 대한 다른 미러 위치를 검색하도록 시스템을 구성하는 데 사용될 수 있습니다.
#
# 이것은 파일 시스템 디렉토리 나 http 나 ftp와 같은 원격 URL이 될 수 있습니다. 이들은 이전 빌드의 결과를 sstate-cache로 (아마도 다른 머신에서) 포함 할 것이다. 이 변수는 fetcher MIRRORS / PREMIRRORS처럼 작동하며 캐시 위치를 가리켜 공유 객체를 확인합니다.
# 참고 : 미러가 SSTATE_DIR과 동일한 구조를 사용하는 경우 아래 예와 같이 PATH를 끝에 추가해야합니다. 이것은 디렉토리 구조 내에서 올바른 경로로 대체됩니다.
#SSTATE_MIRRORS ?= "\
#file://.* http://someserver.tld/share/sstate/PATH;downloadfilename=PATH \n \
#file://.* file:///some/local/dir/sstate/PATH" 


###Qmenu 구성###
# 기본적으로 qemu는 그래픽 출력을 볼 수있는 내장 된 VNC 서버로 빌드합니다. 아래 두 줄은 SDL 백엔드도 활성화합니다. libsdl-native가 만든 최소 libsdl 대신 호스트의 libSDL을 사용하려면 아래의 ASSUME_PROVIDED 행의 주석 처리를 제거하십시오. PACKAGECONFIG_append_pn-qemu-native = "sdl" PACKAGECONFIG_append_pn-nativesdk-qemu = "sdl" #ASSUME_PROVIDED + = "libsdl-native" 

 # CONF_VERSION은 build / conf / changes가 호환되지 않을 때마다 증가하고 생성 될 때이 파일의 버전을 추적하는 데 사용됩니다. 이것이 당신에게 아무 의미도 없다면 이것은 무시해도 좋습니다. CONF_VERSION = "1"


이미지 빌드 및 결과

bitbake core-image-minimal
빌드 시간은 약 2시간 가량 소요됩니다. 

빌드 결과 
$ ls tmp/deploy/images/sama5d4-xplained/
at91bootstrap.bin
at91bootstrap-sama5d4_xplained.bin
BOOT.BIN
core-image-minimal-sama5d4-xplained-20180410090749.rootfs.manifest
core-image-minimal-sama5d4-xplained-20180410090749.rootfs.tar.gz
core-image-minimal-sama5d4-xplained-20180410090749.rootfs.ubi
core-image-minimal-sama5d4-xplained-20180410090749.rootfs.ubifs
core-image-minimal-sama5d4-xplained.manifest
core-image-minimal-sama5d4-xplained.tar.gz
core-image-minimal-sama5d4-xplained.ubi
modules--4.9+git0+973820d8c6-r0-sama5d4-xplained-20180410090749.tgz
modules-sama5d4-xplained.tgz
sama5d4_xplained-nandflashboot-uboot-3.8.9.bin
ubinize-core-image-minimal-sama5d4-xplained-20180410090749.cfg
u-boot.bin
u-boot-sama5d4-xplained.bin
u-boot-sama5d4-xplained-v2017.03-at91+gitAUTOINC+5642d172b9-r0.bin
zImage
zImage--4.9+git0+973820d8c6-r0-at91-sama5d4_xplained-20180410090749.dtb
zImage--4.9+git0+973820d8c6-r0-at91-sama5d4_xplained_hdmi-20180410090749.dtb
zImage--4.9+git0+973820d8c6-r0-at91-sama5d4_xplained_pda4-20180410090749.dtb
zImage--4.9+git0+973820d8c6-r0-at91-sama5d4_xplained_pda7-20180410090749.dtb
zImage--4.9+git0+973820d8c6-r0-at91-sama5d4_xplained_pda7b-20180410090749.dtb
zImage--4.9+git0+973820d8c6-r0-sama5d4-xplained-20180410090749.bin
zImage-at91-sama5d4_xplained.dtb
zImage-at91-sama5d4_xplained_hdmi.dtb
zImage-at91-sama5d4_xplained_pda4.dtb
zImage-at91-sama5d4_xplained_pda7b.dtb
zImage-at91-sama5d4_xplained_pda7.dtb
zImage-sama5d4-xplained.bin

KERNEL 빌드하기 (커널 소스 관련 원문은 여기를 클릭하세요)

커널 빌드를 위한 소스코드 다운로드 
$ git clone  git://github.com/linux4sam/linux-at91.git
브랜치 체크아웃 
$ git checkout origin/linux-3.10-at91

리눅스 커널 환경설정 
make ARCH=arm sama5_defconfig

HOSTCC scripts/basic/fixdep
HOSTCC scripts/kconfig/conf.o
SHIPPED scripts/kconfig/zconf.tab.c
SHIPPED scripts/kconfig/zconf.lex.c
SHIPPED scripts/kconfig/zconf.hash.c
HOSTCC scripts/kconfig/zconf.tab.o
HOSTLD scripts/kconfig/conf
#
# configuration written to .config
#


커널 환경설정 
$ make ARCH=arm menuconfig 

크로스 컴파일
$ make -j3 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-


[..] 
Kernel: arch/arm/boot/Image is ready
Kernel: arch/arm/boot/zImage is ready 


uImage 가 필요한 경우 추가 단계 

$ make -j3 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImage LOADADDR=0x20008000

dtb 파일 만들기 
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs

U-Boot 사용

U-Boot 기본 명령
setenv 이 명령은 변수를 설정하는 데 사용됩니다.
saveenv 이 명령은 설정한 변수를 영구 저장 공간에 저장합니다.
printenv 이 명령은 현재 변수를 출력합니다.
현제 제 보드의 설정 값을 출력해 보았습니다. 
U-Boot> printenv
baudrate=115200
bootcmd=run nandargs; nand read 0x21000000 0x00180000 0x00008EEB; nand read 0x22000000 0x00200000 0x00364780; bootz 0x22000000 - 0x21000000
bootdelay=1
default_bootargs=setenv bootargs console=ttyS0,115200 mtdparts=atmel_nand:256k(bootstrap)ro,512k(uboot)ro,256k(env),256k(env_redundant),256k(spare),512k(dtb),6M(kernel)ro,-(rootfs) rootfstype=ubifs ubi.mtd=7 root=ubi0:rootfs rw
ethact=gmac0
nandargs=$default_bootargs $optargs
optargs=video=LVDS-1:800x480-32 touch.mode=res
stderr=serial

stdin=serial

help 명령을 사용하면 설치된 U-boot 커맨드를 볼 수 있습니다.

? - '도움말'의 별칭
base - 주소 오프셋을 인쇄하거나 설정합니다.
bdinfo - 보드 정보 구조를 인쇄합니다.
boot - 부팅 기본값, 즉 'bootcmd'실행
bootd - boot default, 즉 'bootcmd'를 실행합니다.
bootm - 메모리에서 응용 프로그램 이미지 부팅
bootp - BOOTP / TFTP 프로토콜을 사용하여 네트워크를 통해 이미지 부팅
bootz - 메모리에서 Linux zImage 이미지 부팅
cls - 화면 지우기
cmp - 메모리 비교
coninfo - 콘솔 장치와 정보를 출력한다.
cp - 메모리 복사
crc32 - 체크섬 계산
dhcp - DHCP / TFTP 프로토콜을 사용하여 네트워크를 통해 이미지 부팅
echo - 콘솔에 arg를 표시합니다.
editenv - 환경 변수 편집
env - 환경 처리 명령
exit - 이탈 스크립트
false - 아무 일도하지 않고, 실패했습니다.
fatinfo - 파일 시스템에 관한 정보를 출력한다.
fatload - dos 파일 시스템에서 이진 파일로드
fatls - 디렉토리의 파일 나열 (기본값 /)
fatsize - 파일 크기 결정
fdt - 병합 된 장치 트리 유틸리티 명령
go - 응용 프로그램을 시작할 주소 'addr' 
help - 인쇄 명령 설명 / 사용
i2c - I2C 서브 시스템
imxtract - 다중 이미지의 일부를 추출합니다.
itest - 정수 비교시 true / false를 반환합니다.
loadb - 직렬 라인을 통해 바이너리 파일로드 (kermit 모드)
loadx - 직렬 라인을 통해 바이너리 파일로드 (xmodem 모드)
loady - 시리얼 라인을 통해 바이너리 파일로드 (ymodem 모드)
loop - 주소 범위의 무한 루프
md - 메모리 표시
mm - 메모리 수정 (자동 증가 주소)
mmc - MMC 서브 시스템
mmcinfo - MMC 정보 표시
mw - 메모리 쓰기 (채우기)
nand - NAND 서브 시스템
nboot - NAND 장치에서 부팅
nfs - NFS 프로토콜을 사용하여 네트워크를 통해 이미지 부팅
nm - 메모리 수정 (상수 주소)
ping - 네트워크 호스트에 ICMP ECHO_REQUEST를 보냅니다.
printenv- 인쇄 환경 변수
reset - CPU의 RESET을 수행합니다.
run - 환경 변수에서 명령을 실행합니다.
saveenv - 환경 변수를 영구 저장소에 저장합니다.
setenv - 환경 변수 설정
setexpr - eval 표현식의 결과로 환경 변수 설정
sf - SPI 플래시 하위 시스템
showvar - 로컬 hushshell 변수를 출력합니다.
sleep - 잠시 동안 실행 지연
source - 메모리에서 스크립트 실행
test - / bin / sh와 같은 최소 테스트
tftpboot- TFTP 프로토콜을 사용하는 네트워크를 통한 이미지 부팅 
true - 아무것도하지 않고, 성공적으로 수행한다.
usb - USB 서브 시스템
usbboot - USB 장치에서 부팅
version - 인쇄 모니터, 컴파일러 및 링커 버전

U-Boot 스크립트 기능

복잡한 스크립트 나 변수를 만들면 명령을 입력 할 수 없게됩니다.
다음은 리눅스의 네트워크 로딩을보다 쉽게하기위한 몇 가지 변수들에 대한 요약입니다
U-Boot> setenv boot_addr 0x21400000
U-Boot> setenv linux 'tftp ${boot_addr} linux-2.6.x.img'
U-Boot> setenv ramdisk_addr 0x21100000
U-Boot> setenv ramdisk 'tftp ${ramdisk_addr} sam9-ramdisk.gz'
U-Boot> setenv go 'run linux; run ramdisk; bootm ${boot_addr}'

U-Boot> saveenv
setenv linux 'tftp $ {boot_addr} linux-2.6.x.img' 라인은
tftp 0x21400000 linux-2.6.x.img를 타이핑하는 것과 동일하지만 다른 것들과 결합되어 플래시에 저장되기 때문에 시간을 절약하고 자동화 할 수 있습니다. 리눅스 커널 부팅을 사용하려면 간단하게 run go 를 입력하면 됩니다.

사전에 정의된 변수 및 명령 부팅 

bootcmd가 설정되면 변수 내용은 부팅 지연 후 자동으로 실행됩니다. bootcmd는 U_Boot 자동 부팅모드를 활성화 합니다.

다음은 at91 보드의 bootcmd 예제입니다.
bootcmd=nand read 0x21000000 0x00180000 0x00080000; nand read 0x22000000 0x00200000 0x00600000;bootz 0x22000000 - 0x21000000

bootargs 변수는 U-Boot에 의해 시작된 메인 어플리케이션에 정보를 전달하기위한 교환 영역으로 사용됩니다. (예를 들어 리눅스 커널)
bootargs의 예는 다음과 같습니다.


bootargs_nand=console=ttyS0,115200 mtdparts=atmel_nand:256k(bootstrap)ro,512k(uboot)ro,256K(env),256k(env_redundent),256k(spare),512k(dtb),6M(kernel)ro,-(rootfs) rootfstype=ubifs ubi.mtd=7 root=ubi0:rootfs bootargs_nfs=console=ttyS0,115200 mtdparts=atmel_nand:8M(kernel)ro,220M(rootfs),20M(test),-(protect) rw root=/dev/nfs rw nfsroot=10.217.12.45:/nfsroot/rootfs/yocto ip=dhcp

AT91 보드에서 U-Boot를 사용하여 Linux로드 

이 절에서는 Linux 커널 및 해당 루트 파일 시스템의 로드에 대해 설명합니다.  U-Boot 동작을 설정하려면 유용한 U-Boot명령을 기억하십시오.

Linux 이미지 준비 (선택 사항) 

U-Boot에서 uImage 파일을 사용하려면 헤더 정보, CRC32 체크섬 등으로 커널 이미지를 캡슐화하는 mkimage 도구를 사용할 수 있습니다.

mkimage는 U-Boot 배포가 포함 된 소스 코드로 제공되며 U-Boot 컴파일 중에 빌드됩니다 (u-boot-source-dir / tools / mkimage). 자세한 정보는 U-Boot README 파일을 참조하십시오.

압축되지 않은 uImage 파일을 생성하는 명령 (1) :
mkimage -A arm -O linux -C none -T kernel -a 20008000 -e 20008000 -n linux-2.6 -d arch/arm/boot/Image uImage 
압축되지 않은 uImage 파일을 생성하는 명령 (2) :
mkimage -A arm -O linux -C none -T kernel -a 20008000 -e 20008000 -n linux-2.6 -d arch/arm/boot/zImage uImage 

커널 DTB 이미지 준비하기 

최신 Linux 커널의 경우 바이너리 파일의 하드웨어를 설명하는 Device Tree Binary를 지원합니다. U-Boot는 DTB와 커널을 모두 로드 할 수 있습니다. 유일한 변화는 bootm 또는 bootz를 두 개의 인수로 실행하는 것입니다.

bootm 0x22000000 - 0x21000000 or bootz 0x22000000 - 0x21000000

첫 번째 인수는 Linux 커널의 메모리에있는 주소이고, 두 번째 인수는 DTB 바이너리의 주소입니다.

네트워크를 통해 로드 

개발 시스템에서는 네트워크를 통해 커널 및 루트 파일 시스템을 얻는 것이 유용합니다. U-Boot는 TFTP 프로토콜을 사용하여 네트워크의 원격 호스트에서 바이너리를 로드 할 수 있도록 지원합니다.

U-Boot로 TFTP를 사용하려면 호스트 시스템에 TFTP 서버를 구성 해야 합니다. 배포 매뉴얼이나 인터넷 리소스를 확인하여 호스트에 Linux 또는 Windows TFTP 서버를 구성하십시오.

Linux 호스트의 U-Boot 설명서
다른 TFTP 구성 참조

U-Boot 쪽에서 네트워킹 매개 변수를 설정해야합니다.

1. 이더넷 주소 (MAC 주소) 설정
적절한 MAC 주소를 선택 하려면 이 U-Boot 네트워크 BuildRootFAQ항목을 확인하십시오.
setenv ethaddr 3e : 36 : 65 : ba : 6f : be

2. IP 매개 변수 설정
ㆍTFTP 서버가 실행 중인 서버 IP 주소 설정
   setenv serverip 10.159.245.186
ㆍ고정 IP 주소가있는 설치 보드
   보드의 IP 주소
   setenv ipaddr 10.159.245.180
ㆍDHCP가 있는 설치 보드
  네트워크에 DHCP 서버가 이미있는 경우 dhcp 명령을 사용하십시오.
   setenv get_ip 'setenv old_serverip $ {serverip}; setenv autoload no; dhcp; setenv serverip $ {old_serverip}'
   run get_ip

3. 플래시 환경 보존
   saveenv

4. 만약 부팅 시 이더넷 물리 주소가 감지되지 않으면, 보드를 리셋 하여 U-Boot를 다시 로드 하십시오 : 이더넷 주소와 물리 주소 설정이 정상적으로 될 것 입니다.

5. U-Boot tftp 명령을 사용하여 Linux uImage와 루트 파일 시스템을 램 위치에 다운로드하십시오.(U-Boot 스크립트 기능 장)

6. bootm 또는 boot 명령을 실행하는 Linux를 시작합니다.

보드에 emac과 gmac가 모두있는 경우 다음 중 하나를 사용하여 사용할 수 있습니다.
setenv ethact macb0,gmac0
setenv ethprime gmac0

AT91용 U-Boot 소스 코드 

이름 지원보드 설명 배포 태그
github sources:
u-boot-2015.01-at91
모든 Atmel 보드 지원
데모가 가능한 보드 : SAMA5D4 Xplained, SAMA5D4-EK, 5AMA5D3 Xplained, SAMA5D3-EK SAMA5D2 Xplained,
관리됨,
안정적
linux4sam_4.7,
linux4sam_5.0-alpha7
github sources:
u-boot-2014.07-at91
모든 Atmel 보드 지원
데모가 가능한 보드: SAMA5D4 Xplained, SAMA5D4-EK, SAMA5D3 Xplained, SAMA5D3-EK, AT91SAM9X5-EK, AT91SAM9N12, Legacy
관리됨 linux4sam_4.6,
linux4sam_4.5
u-boot-2013.07-at91 오래된 분기
새로운 개발에 사용금지
u-boot-2012.10-at91 레거시 분기
새로운 개발에 사용금지

u-boot-2015.01-at91 변경사항
-U-Boot v2015.01 기반
-SAMA5D4EK, SAMA5D4Xplained 및 SAMA5D2Xplained 보드 지원
-SAMA5D3X-EK 보드 용 FIT 이미지 지원
-SAMA5D4 및 SAMA5D3 시리즈 보드에 대해 SPL 지원을 활성화하십시오.
-지원 소프트웨어 I2C.
-지원 AT24MAC 맥 주소
-기타 수정.

u-boot-2014.07-at91의 변경 사항
-SAMA5D4EK 및 SAMA5D4 Xplained 보드 지원
-SAMA5D3X-EK 보드 용 FIT 이미지 지원

태그 
linux4sam_5.0-alpha7 태그
-SAMA5D2 Xplained 보드 지원
-지원 AT24MAC 맥 주소
-linux4sam_4.7의 모든 기능을 포함하십시오.

linux4sam_4.7 태그
-U-Boot v2015.01 기반
-SAMA5D4EK 및 SAMA5D4 Xplained 보드 지원
-SAMA5D3X-EK 보드 용 FIT 이미지 지원
-SAMA5D4 및 SAMA5D3 시리즈 보드에 대해 SPL 지원을 활성화하십시오.
-지원 소프트웨어 I2C.
-기타 수정.

linux4sam_4.6 태그
-SAMA5D4 Xplained 보드에 대한 지원 추가
-linux4sam_4.5의 모든 기능을 포함

linux4sam_4.5 태그
-U-Boot v2014.07 기반
-SAMA5D4EK 보드 지원 추가
-SAMA5D3X-EK 보드 용 FIT 이미지 지원

소스에서 U-Boot 빌드 

위에서 찾은 바이너리를 빌드하려면 다음 단계를 수행해야 합니다.

U-Boot 소스 얻기

U-Boot 위키 전용 페이지 : http://www.denx.de/wiki/U-Boot/SourceCode
Linux4SAM GitHub U-Boot 저장소에서 U-Boot 소스 코드를 쉽게 다운로드 할 수 있습니다.

ㆍLinux4sam GitHub U-Boot 저장소 복제
$ git clone git://github.com/linux4sam/u-boot-at91.git 
 Cloning into 'u-boot-at91'... 
 remote: Counting objects: 219350, done. 
 remote: Compressing objects: 100% (40142/40142), done. 
 remote: Total 219350 (delta 175755), reused 219350 (delta 175755) 
 Receiving objects: 100% (219350/219350), 56.01 MiB | 1.24 MiB/s, done. 
 Resolving deltas: 100% (175755/175755), done. $ cd u-boot-at91

ㆍ소스 코드는 우리가 사용하는 최신 분기를 가리키는 마스터 분기에서 가져 왔습니다. 다른 분기를 사용하려면 분기를 나열하고 다음 중 하나를 사용하십시오.
$ git branch -r
origin/HEAD -> origin/master
origin/master
origin/u-boot-2012.10-at91
origin/u-boot-2013.07-at91
origin/u-boot-2014.07-at91
origin/u-boot-2015.01-at91
origin/u-boot-2016.03-at91
origin/u-boot-2017.03-at91
origin/uboot_5series_1.x
$ git checkout origin/u-boot-2017.03-at91 -b u-boot-2017.03-at91
Branch u-boot-2017.03-at91 set up to track remote branch u-boot-2017.03-at91 from origin.
Switched to a new branch 'u-boot-2017.03-at91'

ARM 크로스 컴파일러 설치
ㆍUbuntu : ubuntu 에서는 아래 명령을 사용하세요
sudo apt-get install gcc-arm-linux-gnueabi
export CROSS_COMPILE=arm-linux-gnueabi-

ㆍ기타 os : Linaro 크로스 컴파일러를 다운로드하고 다음을 수행하여 환경을 설정할 수 있습니다.
$ wget -c https://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-linux-gnueabi/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi.tar.xz
$ tar xf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi.tar.xz
$ export CROSS_COMPILE=`pwd`/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-

U-Boot 크로스 컴파일링

U-Boot 환경

U-Boot 환경은 부트 로더가 자신을 올바르게 구성하고 환경 (네트워크 구성, 부트 인수, 저장 위치 등)에 적응하는 데 필요한 변수를 저장하는 읽기 / 쓰기 영구 공간입니다. 부팅 한 동일한 미디어에 있습니다.

U-Boot 바이너리 빌드

이 절에서는 SAMA5D3X-EK 보드를 예로 들어 설명합니다. U-Boot를 컴파일하기 전에, 섹션에서 교차 컴파일 툴체인을 설정해야합니다.

AT91 U-Boot 소스를 사용할 수있게되면 U-Boot는 구성 및 컴파일의 두 단계로 이루어집니다. U-Boot 참조 설명서의 구성 장을 확인하십시오.

포인팅 핸드 make를 호출 할 때 정확한 타겟을 찾으려면 configs /로 이동하십시오.

U-Boot 환경 변수는 다른 미디어에 저장할 수 있으며, 위의 설정 파일은 U-Boot 환경을 저장할 위치를 지정할 수 있습니다.
# 환경 변수를 직렬 플래시에 넣으려면 :
sama5d3xek_spiflash_defconfig
# 환경 변수를 nandflash에 넣으려면 (기본값) :
sama5d3xek_nandflash_defconfig
# SD / MMC 카드에 환경 변수를 저장하려면 :
sama5d3xek_mmc_defconfig

SAMA5D3x-EK 보드의 구축 단계는 다음과 같습니다.
필요에 따라 설정을 변경할 수 있습니다.
make sama5d3xek_nandflash_defconfig
make

이 작업의 결과는 바이너리 ELF 파일 u-boot에 해당하는 u-boot.bin이라는 새로운 U-Boot 바이너리입니다.
ㆍu-boot.bin은 보드에 저장해야하는 파일입니다.
ㆍu-boot는 JTag 링크를 통해 U-Boot를 디버깅하는 데 사용할 수있는 ELF 형식의 이진 파일입니다.

nandflash에 U-Boot 바이너리 프로그램 넣기

SAM-BA를 사용하여 보드의 U-Boot 적재

SAM-BA 도구 다운로드 3.2.x버전을 사용해야 합니다. 

SAM-BA 도구 실행

ㆍ이 섹션에 따르면 칩에서 SAM-BA 모니터를 실행할 수 있는지 확인합니다.

데모를 flasing하는 데 사용되는 스크립팅 용 Qt5 QML 언어 외에도 가장 일반적인 SAM-BA 작업은 SAM-BA 명령 줄을 사용하여 수행 할 수 있습니다.

SAM-BA 명령 줄 사용법에 대한 정보를 보려면 SAM-BA 설치 디렉토리 (doc / index.html 또는 doc / cmdline.html)에서 사용할 수있는 명령 줄 설명서를 참조하십시오.
SAM-BA에는 가장 일반적인 작업을 지원하는 명령 줄 인터페이스가 포함되어 있습니다.

임의의 메모리 주소 및 / 또는 주변 장치에 대한 읽기 / 쓰기
애플릿을 업로드하고이를 사용하여 외부 메모리를 지우거나 읽기 / 쓰기
명령 행 인터페이스는 자체적으로 문서화되도록 설계되었습니다.

기본 명령은 "sam-ba --help"명령을 사용하여 확인 할 수 있습니다.
Usage: ./sam-ba [options]
SAM-BA Command Line Tool

Options:
  -v, --version                          Displays version information.
  -h, --help                             Displays this help.
  -x, --execute <script .qml="">             Execute script <script-file>.
  -p, --port <port[:options:...]>        Communicate with device using <port>.
  -d, --device <device>                  Connected device is <device>.
  -b, --board <board>                    Connected board is <board>.
  -m, --monitor <command[:options:...]>  Run monitor command <command>.
  -a, --applet <applet[:options:...]>    Load and initialize applet <applet>.


사용법을 표시하는 "도움말"매개 변수를 제공하여 대부분의 명령에 대한 추가 도움말을 얻을 수 있습니다.

예를 들어 "sam-ba --port help"가 표시됩니다.
Known ports: j-link, serial

옵션 (포트, 모니터, 애플릿)을 사용하여 인수를 취하는 명령은 옵션 값으로 "도움말"과 함께 호출 될 때 더 많은 문서를 표시합니다.
예를 들어 "sam-ba --port serial : help"가 표시됩니다.
Syntax:
    serial:[<port>]:[<baudrate>]
Examples:
    serial                serial port (will use first AT91 USB if found otherwise first serial port)
    serial:COM80          serial port on COM80
    serial:ttyUSB0:57600  serial port on /dev/ttyUSB0, baudrate 57600

시리얼 포트 연결 확인 

시리얼 연결을 위한 드라이버 파일은 /proc/tty/driver 아래에 있습니다.
등록된 드라이버 파일 확인 
$ sudo ls /proc/tty/driver 
  serial usbserial

usbserial 드라이버 파일 내용 확인 

$ sudo cat /proc/tty/driver/usbserial
usbserinfo:1.0 driver:2.0

0: module:ftdi_sio name:"FTDI USB Serial Device" vendor:0403 product:6001 num_ports:1 port:0 path:usb-0000:02:00.0-2.1

serial 드라이버 파일 내용 확인 
$ sudo cat /proc/tty/driver/serial
serinfo:1.0 driver revision:
0: uart:16550A port:000003F8 irq:4 tx:0 rx:0 CTS|DSR|CD
1: uart:unknown port:000002F8 irq:3
2: uart:unknown port:000003E8 irq:4
3: uart:unknown port:000002E8 irq:3
4: uart:unknown port:00000000 irq:0

사용할 수 있는 시리얼 포트 확인 
$ dmesg | grep tty
[    0.000000] console [tty0] enabled
[    1.014500] 00:05: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A

[79344.440805] usb 2-2.1: FTDI USB Serial Device converter now attached to ttyUSB0

NAND ECC 구성 

기본 PMECC 매개 변수 사용하기 

SAM-BA의 -b 매개 변수로 보드 변형을 선택할 때 보드에 채워진 NAND에 대한 기본 PMECC 구성이 유효합니다. 더미 파일 (다음 명령에서 test.bin)에서 1 바이트를 읽는 명령을 실행하여 그 값을 확인할 수 있습니다.
$ sam-ba -p serial -b sama5d4-xplained -a nandflash -c read:test.bin:0:1
Opening serial port 'ttyACM0'
Connection opened.
Detected memory size is 536870912 bytes.
Page size is 4096 bytes.
Buffer is 20480 bytes (5 pages) at address 0x0020a240.
NAND header value is 0xc1e04e07.
Supported erase block sizes: 256KB
Executing command 'read:test.bin:0:1'
Read 1 bytes at address 0x00000000 (100.00%)
Connection closed. 

댓글 없음:

댓글 쓰기