u-boot 이식 노트

u-boot 버전: u-boot-2012.04.01
pc시스템: ubuntu 12.04.5
개발 보드: TQ2440
1. 새 싱글보드 디렉토리 만들기
board/samsung/디렉토리에 들어가서cp-rf smdk2410 smdk2440을 실행합니다
include/configs 디렉터리에 들어가서cp smdk2410.h smdk2440.h
boards 수정.cfg 파일, 2440 보드 정보 추가
make smdk2440 실행config 구성
make를 실행하여 컴파일하기
2. 원본 코드 분석
시작S 파일에서 분석을 시작합니다.
1단계:
start_code -> cpu_init_crit -> call_board_init_f -> board_init_f (board init f arch/arm/lib 디렉토리)
1. 시스템 시계를 수정하고 MPLL의 설정을 start에 넣는다.S리, 취소boardinit_f -> init_sequence[] -> board_early_init_f에서 MPLL 초기화
2. 직렬 포트율 보기, boardinit_f -> init_sequence[] -> serial_init -> serial_init_dev(UART_NR) -> _serial_setbrg -> 
               get_PCLK -> get_HCLK ->에 정의된 "CONFIG S3C2440"이 없습니다.
include/configs/smdk2440.h에서 "CONFIG S3C2440"을 정의합니다.
3. 컴파일할 때 오류를 발견하고 어느 파일에서 오류가 발생했는지 찾아내고 해당 파일에 대응하는Makefile에서 대응하는 매크로를 찾아내고 smdk2440.h상응하는 매크로 주석 지우기
include/configs/smdk2440.h리, 일단 CONFIG를 잠시 제거하고CMD_낸드, 컴파일할 때 nand에 대한 오류를 피할 수 있습니다
4. nand 지원플래시 시작
start.S에 nand 추가플래시 초기화,nandinit_ll
include/configs/smdk2440.h리, 콘피그를SYS_TEXT_BASE가 0x33f80000으로 수정되어 프로그램의 링크 주소를 강제로 지정합니다
실행 copycode_to_sdram, 코드를 sdram으로 다시 지정합니다
clear 실행bss, BSS 세그먼트 정리(BSS 세그먼트는 초기 값이 0인 전역 변수의 저장 주소)
마지막으로ldrpc,=call 실행board_init_f, sdram에서 실행 코드로 바로 이동
5. boardinit_f의 재배치 함수 relocatestart에 있으므로 code(addr sp, id, addr) 주석이 표시됩니다.S 안에서 위치를 재조정했습니다.
6. board 를init_f안에 addr-=gd->monlen; addr &= ~(4096 - 1);가리다
변경: addr = CONFIGSYS_TEXT_BASE;
7. 스타트를.S 안에 원래 위치추적과 bs 세그먼트 지우기 두 부분 코드 지우기
2단계:
2단계의 시작 코드arch/arm/lib/board.c의void boardinit_r (gd t *id, ulong dest addr) 함수
여전히 start.S 파일에서
1. 바로boardinit_f(보드 레벨 초기화 함수) 아래에서 2단계로 이동
2.board_init_r 함수, 두 개의 매개 변수가 필요합니다.
id 종boardinit_f에서 획득, 바로boardinit_f 함수는 id를 되돌려주고include/common을 수정합니다.h리의boardinit_f,
원래의board 를init_f는 "unsigned int board init f(ulong)로 수정됨;
 dest_addr는 u-boot의 링크 주소로 로 직접 지정됨TEXT_BASE
3. 수정/board/samsung/smdk2440/의 Makefile, init.c 프로젝트에 추가하여 컴파일하기
COBJS를...
:= smdk2410.o 
다음으로 변경:
COBJS
:= smdk2410.o init.o
4. 링크 스크립트를 수정하고 start.S,init.c,lowlevel_init.S 등 파일, 코드의 맨 앞에 놓기
링크 스크립트는arch/arm/cpu/u-boot.lds
자루
.text :
{
    __image_copy_start = .;
    CPUDIR/start.o (.text)
    *(.text)
}
다음으로 수정:
.text :
{
    __image_copy_start = .;
    CPUDIR/start.o (.text)
    /board/samsung/smdk2440/libsmdk2440.o (.text)
    *(.text)
}

libsmdk2440.o 는/board/samsung/smdk2440/디렉터리에 있는 파일을 컴파일한 라이브러리입니다
5.arch/arm/config 수정.mk 파일, "-pie"옵션을 제거하고LDFLAGSu-boot+=-pie 차단pie 옵션은 프로그램이 링크를 컴파일할 때 일부 주소 정보(예를 들어 "*(rel*), *(dynsym*)")를 u-boot에 컴파일하는 것을 말한다.bin, 이렇게 하면 u-boot에서 컴파일한 파일이 4k/* * * * * * * 지원nandflash * * * * * * * * * * * * * */6.include/configs/smdk2440 수정h,CONFIG 를CMD_nandflash가 drivers/mtd/nand/s3c2410 을 지원하도록 NAND 재정의nand.c drivers/mtd/nand/s3c2440 로 복사nand.c drivers/mtd/nand/Makefile을 s3c2440 컴파일하도록 수정nand.c, Makefile에 COBJS-$(CONFIG NAND S3C2440) + = s3c2440 추가nand.o smdk2440.h에서 nandflash 구성에 대한 추가: #define CONFIGNAND_S3C2440 #define CONFIG_SYS_S3C2440_NAND_HWECC 분석 board.c 파일의 nandinit() 함수, 분석nandinit_chip(i) 함수 분석boardnand_init(nand) 함수, 분석nandscan(mtd,maxchips) 함수 boardnand_init(nand) 함수는 밑바닥 조작 함수의 초기화nandscan(mtd,maxchips) 함수는board 에 사용됩니다.nand_init(nand) 함수에 등록된 기본 조작 함수nandscan_ident nand_set_defaults nand_command ()//이 함수를 분석하면 이 함수는 최종적으로chip->cmd 를 호출합니다ctrl(mtd, readcmd, ctrl) chip->cmd_ctrl(mtd,readcmd,ctrl)이함수는boardnand_init에서 s3c2440 로 등록됨hwcontrol은 s3c2440hwcontrol() 함수로 데이터/명령 읽기/쓰기 완료/*************DM9000 NIC************************/smdk2440.h 파일에서 cs8900의 관련 부분을 차단하고 다음과 같이 변경합니다.
#if 0
#define CONFIG_CS8900		/* we have a CS8900 on-board */
#define CONFIG_CS8900_BASE	0x19000300
#define CONFIG_CS8900_BUS16	/* the Linux driver does accesses as shorts */
#else
#define CONFIG_DRIVER_DM9000
#define CONFIG_DM9000_BASE              0x20000000
#define DM9000_IO                       CONFIG_DM9000_BASE
#define DM9000_DATA                     (CONFIG_DM9000_BASE + 4)
#endif

DM9000_DATA는 DM9000 NIC의 CMD 도입을 가리키며, 원리도는 LADDR2를 연결하여 DM9000에 보내는 명령인지 데이터인지 DM9000 을 구별한다.입출력(I/O)은 DM9000에 보낼 데이터 값입니다.
board에서.c 파일에서 함수 분석
board_init_r
eth_initialize
board_eth_init//이 함수에서 DM9000 초기화
smdk2440.h 파일에서 IP 주소와 NIC에 대한 구성을 다음과 같이 추가합니다.
#define CONFIG_NETMASK   255.255.255.0
#define CONFIG_IPADDR    192.168.1.59
#define CONFIG_SERVERIP  192.168.1.61
#define CONFIG_ETHADDR      00:0c:29:4d:e4:f4

/********자르기 u-boot*********************/
common/envcommon.c리,default환경 변수
smdk2440 수정h 파일, usb, fs, rtc,date 등 불필요한 설정 항목 제거
save 명령 저장 환경 변수를 지원하도록 u-boot 설정
u-boot에서 save 명령을 실행하여 환경 변수를 nandflash에 저장할 때common/envnand.c 안에 있는saveenv 함수,
common 디렉토리를 보면 COBJS-$(CONFIG ENV IS IN NAND) + = env 가 표시됩니다.nand.o
컴파일할 envnand.c, smdk2440이 필요합니다.h 파일에서 CONFIG 정의ENV_IS_IN_NAND
smdk2440.h 파일에 다음을 추가합니다.
#define CONFIG_ENV_OFFSET       0x40000   /*      nandflash       */
#define CONFIG_ENV_SIZE         0x20000   /*         */
#define CONFIG_ENV_RANGE        CONFIG_ENV_SIZE   /*            */

u-boot 설정, mtdparts 명령을 지원하도록 구역 추가
u-boot 코드에서 mtdparts를 검색하면 cmd 를 컴파일해야 합니다mtdparts.c, common 디렉토리의 Makefile 보기
smdk2440 필요h에서 CONFIG 정의CMD_MTDPARTS 
다음을 추가합니다.
#define CONFIG_CMD_MTDPARTS     /*   mtdparts   */
#define CONFIG_MTD_DEVICE
#define MTDIDS_DEFAULT   "nand0=tq2440-0"  /*      */
#define MTDPARTS_DEFAULT   "mtdparts=tq2440-0:256k(u-boot),"\
      "128k(params),"\
      "2m(kernel),"\
      "-(rootfs)"\
      
      
cmdmtdparts.c 파일에는 mtdparts 가 있습니다init 함수, 구역 초기화에 사용
board에서.c 파일에서 초기화가 끝난 후main 에 들어갑니다loop 전에 mtdparts default 명령을 실행해서 구역을 적용해야 합니다
u-boot를 다시 컴파일하고, 태우고, u-boot 명령줄에서 mtdparts를 실행하면 구역 정보를 볼 수 있습니다
nand erase를 실행합니다.part kernel, kernel 파티션 지우기
nand write 30000000kernel을 실행하고 sdram 30000000 위치의 내용을kernel 구역에 쓰기
/********yaffs2 소문자 및 패치 제작 지원*****************/
smdk2440 수정h, 추가
#define CONFIG_CMD_NAND_YAFFS/* wenjs modify 지원 yaffs 파일 시스템 쓰기 */
nand write를 실행합니다.yaffs 파일 시스템을 스크랩할 때 스크랩이 빠른 것을 발견하고 코드를 찾으면 다음과 같습니다.
common 디렉토리에서 cmdnand.c 파일donand 함수, 정보.yaffs2의 소사,
nand_write_skip_bad(nand, off, &rwsize,(u_char *)addr, WITH_YAFFS_OOB);
이 함수에는 yaffs 파일 시스템 소문자에 대한 코드가 있습니다.
if (flags & WITH_YAFFS_OOB) {
    int page, pages;
    size_t pagesize = nand->writesize;
    size_t pagesize_oob = pagesize + nand->oobsize;
    struct mtd_oob_ops ops;

    ops.len = pagesize;
    ops.ooblen = nand->oobsize;
    ops.mode = MTD_OOB_AUTO;
    ops.ooboffs = 0;

    pages = write_size / pagesize_oob;
    for (page = 0; page < pages; page++) {
        WATCHDOG_RESET();

        ops.datbuf = p_buffer;
        ops.oobbuf = ops.datbuf + pagesize;

        rval = nand->write_oob(nand, offset, &ops);
        if (!rval)
          break;

        offset += pagesize;
        p_buffer += pagesize_oob;
    }
}

다음으로 변경:
if (flags & WITH_YAFFS_OOB) {
    int page, pages;
    size_t pagesize = nand->writesize;
    size_t pagesize_oob = pagesize + nand->oobsize;
    struct mtd_oob_ops ops;

    ops.len = pagesize;
    ops.ooblen = nand->oobsize;
    ops.mode = MTD_OOB_RAW;    //     OOB          
    ops.ooboffs = 0;

    pages = write_size / pagesize_oob;
    for (page = 0; page < pages; page++) {
        WATCHDOG_RESET();
        ops.datbuf = p_buffer;
        ops.oobbuf = ops.datbuf + pagesize;
        rval = nand->write_oob(nand, offset, &ops);
        if (rval)  //  ,    !   ,   0      
           break;

        offset += pagesize;
        p_buffer += pagesize_oob;
    }
}

패치 생성:
먼저 make distclean을 실행하고 컴파일된 파일을 삭제합니다
실행 mv u-boot-2012.04.01 u-boot-2012.04.01ok u-boot 이름 바꾸기
그리고 tar xvfj u-boot-2012.04.01을 실행합니다.tar.bz2 -C ./원래의 u-boot을 풀다
실행 diff-urN u-boot-2012.04.01 u-boot-2012.04.01ok > u-boot-2012.04.01_ok.patch
매개변수 u - 출력 형식 지정
r -- 반복적으로 파일 생성
N - 파일이 비어 있으면 비어 있음
수정되지 않은 u-boot에 패치 적용:
원래 u-boot에 들어가고 cd u-boot-2012.04.01 실행
패치 패치 - p1 <./u-boot-2012.04.01_ok.patch
매개 변수 -p1은 첫 번째 디렉터리를 무시합니다
/*****u-boot 마이그레이션 완료*****/

좋은 웹페이지 즐겨찾기