u-boot README

6095 단어
ReadMe 파일 분석
 
1. 디렉터리 구조
- board 보드의 독립된 파일
- common 하드웨어 아키텍처와 무관한 공통 기능
- cpu cpu 관련 파일
- disk 디스크 파티션 드라이브 관련
- doc 문서
- drivers 공통 장치 구동
- examples 루틴
- fs filesystem 관련 코드
- include 헤더 파일
- lib_xx 구체적인 하드웨어 구조와 관련된 라이브러리 파일
- net 네트워크 섹션 코드
- post 자동 감지
- rtc 실시간 클록 드라이브
- tools s-record 및 이미지 생성 도구
 
2. 구성 방법
판자와 관련된 구성 옵션은 "include/configs/.h"에 있습니다.make config를 사용하여 구성합니다.
구체적인 구성 옵션은 나중에 자세히 살펴보겠습니다.
 
3. u-boot 컴파일 방법
1) 교차 컴파일링. 만약에arm과 관련된 판을 설정하면, 컴파일링할 때PATH의arm-linux-컴파일러를 자동으로 사용합니다.물론 맨 윗부분 Makefile에서 크로스를 통과할 수도 있고...COMPILE는 크로스오버 컴파일러(예: CROSS)를 지정합니다.COMPILE = arm-linux-
 
2) 구성, 위에서 설명한 대로 make nameconfig
 
3) 컴파일, make all
 
세 개의 파일이 생성됩니다.
u-boot.bin 순수 바이너리 파일
u-boot ELF 형식의 바이너리 파일
u-boot.srec Motorola S-Record 형식
 
기본 컴파일은 현재 디렉터리에서 다음 두 가지 방법으로build dir를 지정할 수 있습니다
make O=/tmp/builddir/distclean
make O=/tmp/build/      NAME_config
make O=/tmp/build/        all
 
또는 BUILD 직접 지정DIR 변수
export BUILD_DIR=/tmp/build
make distclean
make NAME_config
make all
 
4. 만약 u-boot가 당신의 보드를 지원하지 않는다면 u-boot에 추가해서 컴파일해야 합니다.단계는 다음과 같습니다.
1). top Makefile 및 MAKEALL 스크립트에 새 구성 옵션을 추가합니다.
 
2). board 디렉터리에서 최소한Makefile board가 포함된 자신의 보드의 디렉터리를 만듭니다.c flash.c u-boot.lds 파일
 
3). 새 include/configs/ 을 만듭니다.h를 사용하여 구성
 
4). 만약 당신의 판의 cpu가 u-boot에 지원되지 않는다면, 당신도 cpu 디렉터리에 새 cpu를 만들어야 합니다
 
5). 정상적인 컴파일 과정
 
 
5. 일반적인 u-boot 명령
이 부분은 제가 u-boot 버전을 이식한 후에 u-boot의 자주 사용하는 명령과 환경 파라미터 등을 자세히 보려고 합니다.이쪽은 건너가세요.
 
6. u-boot 형식에 대한 질문입니다.
위에서 u-boot을 컴파일할 때 3개의 u-boot 이미지 파일을 생성했습니다.
u-boot ELF 형식의 바이너리 파일
u-boot.bin 순수 바이너리 파일
u-boot.srec Motorola S-Record 형식
 
앞의 두 가지는 이해하기 쉽다.u-boot.srec는 Standalone Programs: 즉 u-boot 환경에서 실행할 수 있는 실행 프로그램입니다.프로그램이 실행된 후에 u-boot로 돌아갑니다.u-boot는 "standalone"프로그램을 동적으로 불러오고 실행하는 것을 지원합니다.이 프로그램들은 u-boot에서 제공하는 입출력 작업을 사용하거나 서비스를 중단할 수 있습니다.소스 코드의 examples/helloworld.c에서 u-boot을 컴파일할 때 자동으로 Hello 로 컴파일됩니다world.srec, 이런 standalone 프로그램.
 
 
7.linux 이미지 생성
 
u-boot는 전통적인 linux 핵 형식, 예를 들어zImage,bzImage를 지원하지 않습니다.uImage라는 형식을 사용합니다.생성 방법은 다음과 같습니다.
 
1) 표준 ELF 형식의 linux 커널, vmlinux 생성
2) vmlinux를 순수한 이진 형식인 linux로 바꿉니다.bin
3) 압축 바이너리 gzip -9 linux.bin
4) mkimage를 사용하여 linux.bin.gz uImage로 포장
Mkimage –A ppc –O linux –T   kernel –C gzip –a 0 –e 0 –n “Linux kernel image” –d linux.bin.gz uImage
 
8. 학습 과정
README 파일에서 나온 이 코드는 u-boot을 사용하는 과정을 논술하였는데, 그래도 매우 재미있다.
int main(int argc, char *argv[])
{
    sighandler_t no_more_time;

    signal(SIGALRM, no_more_time);
        alarm(PROJECT_DEADLINE - toSec (3 * WEEK));

        if (available_money > available_manpower) {
            Pay consultant to port U-Boot;
            return 0;
        }

        Download latest U-Boot source;

        Subscribe to u-boot mailing list;

        if (clueless)
            email("Hi, I am new to U-Boot, how do I get started?");

        while (learning) {
            Read the README file in the top level directory;
            Read http://www.denx.de/twiki/bin/view/DULG/Manual;
            Read applicable doc/*.README;
            Read the source, Luke;
            /* find . -name "*.[chS]" | xargs grep -i <keyword> */
        }

        if (available_money > toLocalCurrency ($2500))
            Buy a BDI3000;
        else
            Add a lot of aggravation and time;

        if (a similar board exists) {   /* hopefully... */
            cp -a board/<similar> board/<myboard>
            cp include/configs/<similar>.h include/configs/<myboard>.h
        } else {
            Create your own board support subdirectory;
            Create your own board include/configs/<myboard>.h file;
        }
        Edit new board/<myboard> files
        Edit new include/configs/<myboard>.h

        while (!accepted) {
            while (!running) {
                do {
                    Add / modify source code;
                } until (compiles);
                Debug;
                if (clueless)
                    email("Hi, I am having problems...");
            }
            Send patch file to the U-Boot email list;
            if (reasonable critiques)
                Incorporate improvements from email list code review;
            else
                Defend code as written;
    }
    return 0;
}

void no_more_time (int sig)
{
      hire_a_guru();
}

좋은 웹페이지 즐겨찾기