부트로더 구현
부트로더
- 특정 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 명령어 수행
'컴퓨터과학 > 임베디드' 카테고리의 다른 글
임베디드 SW 엔지니어링 - 8 운영체제 이식 (0) | 2020.05.27 |
---|---|
임베디드 SW 엔지니어링 - 7 운영체제 커널 분석 (0) | 2020.05.27 |
임베디드 SW 엔지니어링 - 5 펌웨어 구현 환경 구축 (0) | 2020.05.25 |
임베디드 SW 엔지니어링 - 4 펌웨어 설계 (0) | 2020.05.25 |
임베디드 SW 엔지니어링 - 3 펌웨어 분석 (0) | 2020.05.25 |