달공이와 임베디드

라즈베리파이 3B 를 U-boot 를 통해 실행하기 본문

라즈베리파이

라즈베리파이 3B 를 U-boot 를 통해 실행하기

하일리99 2016. 8. 17. 01:06

라즈베리파이 3B 를 U-boot 를 통해 실행하기


라즈베리 파이의 부팅 순서는 다음과 같다.


첫번째 부트로더가 SD카드에 있는 두번째 부트로더(bootcode.bin)을 호출한다. 두번째 부트로더가 SD카드에 있는 


config.txt를 읽고 실행한다. 두번째 부트로더가 세번째 부트로더(start.elf)를 호출 및 실행하여, ARM Core를 활성화한다. 


ARM Core가 활성화되면 네번째 부트로더(kernel.img)를 호출, 실행한다.

 

라즈베리파이 3이 라즈비안(OS)로 실행되기 위한 최소 파일은 다음과 같다.



bootcode.bin, start.elf, kernel7.img, bcm2710-rpi-3-b.dtb, overlays (폴더)


 


라즈베리파이 3이 u-boot 을 통해 라즈비안으로 실행되기 위한 최소 파일은 다음과 같다.


bootcode.bin, start.elf, kernel7.img, bcm2710-rpi-3-b.dtb, overlays (폴더)


config.txt, u-boot.bin



여기서 config.txt 는 위에서 설명한 네번째 부트로더를 호출할 때 커널이 아닌 u-boot 를 호출하도록 설정할 수 있고, 


이 때 호출하는 파일이 바로 u-boot.bin 인 것이다.


따라서 우리는 config.txt 를 수정하는 것과 u-boot.bin 을 만드는 것이 필요하다.

 

 


u-boot.bin 컴파일 및 config.txt 파일 수정

 

1-1. u-boot 다운

(1) u-boot git down : git clone git://git.denx.de/u-boot.git


 GIT으로부터 해당 uboot 을 받아온다. 이때 가장 기본이 되는 denx u-boot 을 받아온다.



(2) cd u-boot


 GIT이라는 명령어를 통해 받아오기 위해서는 다음과 같은 과정이 전에 수행되어야 한다.


 1. apt-get update / apt-get upgrade 


 2. apt-get install git


 

1-2. uboot.bin 만들기( 다운 받은 u-boot 파일을 보드에 맞게 컴파일 )


(3) export ARCH=arm


 export CROSS_COMPILE=arm-linux-gnueabihf-



 다음은 받아온 u-boot 파일을 이용하여 u-boot.bin 바이너리 파일로 컴파일 하기 위해 컴파일 정보를 설정해 


주는 단계이다. 여기서는 gnueabihf- 버전을 사용하고 있다. 이것은 gnueabi- 버전에서 좀더 상향된 버전이다. 


위 명령어를 수행하기 위해서는 다음과 같은 과정이 전에 수행되어야 한다.


     apt-get install gcc-arm-linux-gnueabihf


     또는 apt-get install gcc-arm-linux-gnueabi



위의 경우에는 32bit 에 맞게 컴파일 해주는 것이고, 만약 64bit 을 컴파일 하려한다면


     apt-get install gcc-aarch64-linux-gnu


     export ARCH=arm64


     export CROSS_COMPILE=aarch64-linux-gnu-


(4) make rpi_2_defconfig (라즈베리파이 3이지만 라즈베리파이2 도 호환이 됨)


(5) make all



 

2.  config.txt 파일 설정


 config.txt 파일에 다음을 입력


     dtoverlay=pi3-miniuart-bt


     kernel=u-boot.bin  ( 커널을 동작시키는 부분에 유부트를 실행하도록 설정 )

 

라즈비안 이미지를 SD카드에 설치할 때 만든 파일 중 필요한 파일과 위 과정을 통해 만들거나 설정해준 파일을 모으면 


위와 같다. 이제 u-boot 을 통해 라즈비안 커널을 부트해 보자.



 


u-boot 을 통한 커널 부트



위와 같은 파일을 가지고 라즈베리파이 3B을 실행시키면 다음과 같은 명령어 창이 뜬다. "uboot>" 이것은 uboot 가 


제공하는 부팅 설정을 위해 제공하는 터미널 창이라 할 수 있겠다. 이 터미널에도 다양한 명령어가 존재한다. 간단하게 


기본적인 부팅을 위해 필요한 명령어는 다음과 같다.  ( u-boot 는 기본적으로 개발환경에서 부팅을 편리하게 하기 위한 


개발 툴이다.  ip 설정과 serverip 설정이 변수로 지정되는 것은 당연하다고 할 수 있다. )



 setenv bootargs ( 부팅시 환경변수 설정 )


 setenv ipaddr 211.188.17.38     setenv serverip 211.188.17.39 ( ip & server address 설정 )


 saveenv ( 저장된 변수들은 uboot.env 파일에 저장된다. saveenv 명령어를 사용하면 생성됨 )


 printenv / printenv ipaddr ( 설정된 변수들을 보여줌. 기본적으로 설정된 것도 많음 )


 fatload mmc 0:1 ${kernel_addr_r} kernel7.img ( 여기서 kernel_addr_r 은 기본적으로 설정 )

 



기본적인 u-boot의 명령어 구조를 알아보았으니, 이제 u-boot 를 통해 커널을 부트시켜보자. 


다음과 같이 명령어를 통해 각 주소( kernel_addr_r 또는 fdt_addr_r )에 


커널이미지와 DT(Device tree)를 올리고 부팅을 수행하면 된다.



fatload mmc 0:1 ${kernel_addr_r} kernel7.img


fatload mmc 0:1 ${fdt_addr_r} bcm2710-rpi-3-b.dtb


bootz ${kernel_addr_r} - ${fdt_addr_r}

 


※ 이때, 불러오는 커널의 이미지가 uimage 인 경우 bootm 을 사용하면 된다. 

Comments