본문 바로가기
Embedded System/uboot

U-Boot Porting Guide

by lifeseed 2010. 11. 19.
1. u-boot Base Code 준비하기.
1) u-boot 다운로드 : cf)  http://lifeseed.tistory.com/1 
    CVS 및 GIT를 이용하여 다운이 가능하다.
    여기서는 GIT를 이용하여 다운받는 방법을 소개한다.
$ git clone git://git.denx.de/u-boot my-u-boot/

// 해당명령을 수행하면 현재 폴더에 my-u-boot라는 폴더의 이름으로 최신 u-boot코드를 다운받게 된다.


2) 사용버전 결정하기
    다운 받은 코드에서 작업을 수행하기 원하는 Tag로 sync 한다. (v1.3.4 를 사용할 것이다.)
// u-boot Tag 확인
$ git tag
. . .
U-BOOT-1_1_6
...
v1.3.4
...

// 해당 Tag로 코드를 Branch하기
$ git checkout -b mybranch v1.3.4

    다운 받은 코드 해당 Tag로 변환하기 : git checkout -b mybranch v1.3.4

2. 개발보드용 BSP 파일 추가
Step1) Makefile에 Target Board Configuration 추가
- default로 선언되어 있는 부분으로 가서 해당 configuration을 추가한다.
>> ARCH=arm, CPU=arm926ejs, BOARD=<target_name>, VENDOR = NULL. SOC=<soc_name>

#========================================================================
# <TARGET_BOARD>
#========================================================================
<target_name>_config : unconfig
 @$(MKCONFIG) $(@:_config=) arm arm926ejs <target_name> NULL <soc_name>

cf) SOC의 경우 일반적인 CPU에 추가적으로 구현이 필요한 사항이 있을경우 선언하여 사용.

Step2) Header File 추가
- SoC 및 Target Board 관련 Header File을 각각 include 및 include/configs 에 추가한다.
- default로 정의된 파일중 가장 비슷한 성격의 파일들을 카피하여 수정하여 사용한다.

- SoC 관련 Header File :: soc_name.h => include 디렉토리에 추가
- Target Board 관련 Header File :: <target_name>.h => include/configs 디렉토리에 추가
   cf) Target Board 관련 Header File Name은 Makefile에 추가된 <target_name>_config 의 <target_name>과 동일하여야 한다.

Step3) CPU 코드 수정 및 추가
- cpu/arm926ejs 에 있는 초기화코드를 수정한다. (startup.S 등..)
- <soc_name>이 NULL이 아닐경우 해당폴더에 <soc_name>이름으로 디렉토리를 생성하여 SoC에 특화된 코드들을 추가한다.
- 이때 <soc_name>에 해당하는 CPU_TYPE이 선언되어 있지 않으면, include/asm_<ARCH> 디렉토리에 있는 mach-types.h 에 해당 값을 새롭게 정의한다.

--<mach-types.h>--------------------------
#define MACH_TYPE_SOCNAME               <NEW_ID>

Step4) Target Board 파일 생성
- 가장 유사한 board 디렉토리를 복사하여 이름을 <target_name>으로 변경하여, 필요한 사항들을 수정하여 사용한다.

Step5) Compile
- 새로운 컴파일 조건(ENDIAN Type정의 등)을 추가하고 싶으면 해당폴더의 config.mk를 수정한다.
- Compiler 를 미리 설정해두면 컴파일 시 명령을 단순하게 사용할 수 있다. (Makefile의 해당 ARCH에 CROSS_COMPILE= 로 정의된 부분을 수정하면 된다.)

ex) Compiler : /usr/share/arm-linux-gcc/bin/arm-linux- 이라고 가정하면
1. Build Tool을 Make File에 미리 등록하지 않았을 경우 아래와 같이 컴파일 하여야 한다.
$ make CROSS_COMPILE=/usr/share/arm-linux-gcc/bin/arm-linux-
2. Makefile에 아래와 같이 정의 하였다면
ifeq ($(ARCH),arm)
CROSS_COMPILE = /usr/share/arm-linux-gcc/bin/arm-linux-
endif
아래와 같이 컴파일이 가능하다.
$ make

- 초기 컴파일 과정
 
$ make clobber
$ make <target_name>_config
$ make

이상이 기본적인 u-Boot 포팅과정이다.

u-boot.bin을 Target Board에 올려서 실행하면, Serial Terminal에서 프롬프트를 볼 수 있다. 그러나 env 관련 파일을 저장및 읽기가 불가능하다.
왜?? 당근 flash driver가 틀려서 그렇지. 그럼 다음 작업은 flash driver 작업이다.


3. flash driver (NOR) 구현
- board/<target_name>에 flash.c driver를 추가한다.
- erase, write 만 구현 하면 된다. read야 어차피 direct access니 그냥 읽으면 되고, 추가적으로 chip id 확인 루틴을 추가하자.

env read/write 및 flash erase, write가 가능하다.
다음 작업은 Ethernet 을 살려서 tftp로 바이너리를 전송하는 기능을 추가한다.


4. ethernet 설정 하여 tftp로 코드 다운 받기
1) Static Memory Controller 추가 및 해당 Network Chip Driver 추가
2) board_init에서 EINT 및 GPIO 관련 I/O port 설정 확인
3) smdk2440.h 에서 CS8900 base address 변경
#define CS8900_BASE  0x08000300     // NOR Boot 의 경우 BANK1 Address : 0x80000000, CS8900 BASE Address Offset : 0x300

이상의 동작으로 TFTP를 이용한 바이너리 전송이 가능하다.

CF) 우분투에서 TFTP 서버 설정 하는 방법
1) TFTP 서버 설치
- sudo apt-get install xinetd tftp tftpd

2) 설치완료후 /etc/xinetd.d/tftp 파일 작성

service tftp
{
    disable=no
    user = root
    soket_type = dgram
    protocol = udp
    wait = yes
    server = /usr/sbin/in.tftpd
    server_args = -s /tftpboot
    per_source = 11
    cps = 100 2
    flags = IPv4
}


3) 파일 저장후 xinetd 서버 다시 시작
- sudo /etc/init.d/xinetd restart