728x90

부트로더 구현

부트로더

- 특정 cpu에서 운영체제나 프로그램 돌릴수있게 cpu 동작에 필요한 기초적인 부분이나 rom, ram, uart 등 기본적인 디바이스들이 동작할수있도록 만들어지는 프로그램

 

u-boot universal bootloader

- arm 기반 소프트웨어 개발시 가장 많이 사용하는 부트로더

 

 

u-boot 로 부트로더 구현시 필요한것

- 하드웨어 초기화로 cpu 클록, 인터럽트, uart, serial, gpio 등 초기화 코드가 있음

-> lolevel_init, board_init_f, board_init_r 등 세가지 루틴으로 할 수 있음

 

 

라즈베리파이 부트로더 구현 과정

- make 파일로 만들어서 제공

- 필요한 환경 설정 -> defconfig

1. 부트로더 소스 다운

 - 호스트에 깃 설치

 - 부트로더 클론

 - 클론한 폴더 확인

2. 부트로더 이미지 생성

 - 크로스 컴파일러 설치

 - 크로스 컴파일러 버전 확인

 - 크로스 컴파일러 환경변수 지정 - export CROSS_COMPILE=크로스 컴파일러 이름

 - 라즈베리파이 환경 설정 - configs 폴더의 rpi_3_defconfig 파일에 환경 설정 존재. 여기서 필요한 장치, 필요없는 파일 지정

 - 부트로더 컴파일

 - u-boot.bin 파일 생성 확인

 - 이미지로 변환

3. 생성된 이미지를 sd카드에 복사

4. sd카드를 라즈베리 파이에 삽입

 - 전원 공급 후 3초이내 스페이스바 클릭 -> uboot 프롬프트로 진입

 

 

펌웨어 구현 과정 실습

 

u-boot 소스코드 분석하여 라즈베리파이 부트로더 구현  - gpio에 연결된 led 기능 제어 실습

1. uboot 소스코드 다운

git clone git://git.denx.de/u-boot.git

2. cross compiler 설치 및 등록

- aarch64-linux-gnu

sudo apt-get install gcc-aarch64-linux-gnu

export 명령어로 교차 컴파일러 등록

- export CROSS_COMPILE=aarch64-linux-gnu-

 

3. uboot 소스코드 분석

find 명령어로 파이 소스 찾기 : find ./ -name *bcm*

find ./ -name *rpi*

rpi_3_defconfig 파일

- 부트로더명을 u-boot에서 ncs-em으로 변경

 

 

 

rpi.h 확인

 

 

rpi.c 확인

- 메모리맵을 확인해보면 물리적 주소가 0x3f00 0000

 

 

4. uboot 소스에 명령어 추가 - gpio 물리적 주소를 통한 led 제어

gpio를 통해 led 제어하는 hello.c 파일 작성

 

gpio 사용하는 방법

1. bootloader 함수 사용하는 방법

2. gpio의 물리적 주소를 사용하는 방법 -> 사용

* 주변장치 물리적 시작 주소 : 0x3f00 0000(데이터시트)

* gpio offset : 20 0000

=> gpio 물리적 시작 주소 : 0x3f20 0000(주변장치 물리적 시작 주소 + gpio offset)

 

 

물리적 주소로 gpio 제어 프로그램 작성 hello.c

- gpset0 : 전압을 가함

- gpclr0 : 전압을 가하지 않음

- 18번 핀 사용하므로 18번 시프트

 

kconfig 수정

- 메뉴컨피그 사용시 항목이 출력되도록 설정

 

 

makefile 수정

- menuconfig 설정시 같이 빌드되도록 hello.o 추가

 

u-boot 환경 설정

- defconfig파일 사용 -> 타겟명이 rpi3이므로 rpi_3_defconfig

make rpi_3_defconfig

menuconfig 설정

- hello 명령어 추가

 

5. uboot 소스에서 부트로더 이미지 생성

크로스 컴파일러 확인

컴파일

u-boot.bin 생성 완료

 

uboot.bin을 sd카드로 옮겨 raspberry pi 부팅

- 이름을  kernel8.img로 변경

 

부팅 후 3초 이내 키보드 입력하여 uboot 명령어 모드 진입

- config_sys_prompt 를 u-boot에서 ncs_em으로 바꿔 다음과 같이 출력

 

led 명령어 수행

 

 

 

 

 

300x250

+ Recent posts