u boot 移植 廢材日記, 不要看了, 浪費時間, 上面有篇uboot 1.1.4移植纔是正題

轉自 http://blog.chinaunix.net/u2/78837/showart_1212612.html

真是經典.

我閱讀後做了修剪,作爲自己的筆記.大家可以看原文.

 

0 在工作目錄下解壓U-Boot。
$tar zxvf u-boot.git.tar.gz


1 進入U-Boot目錄,修改Makefile
$cd u-boot.git/
$vi Makefile

#爲tekkaman2410建立編譯項

smdk2410_config :       unconfig
        @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0

tekkaman2410_config    :    unconfig

        @$(MKCONFIG) $(@:_config=) arm arm920t tekkaman2410 tekkaman s3c24x0
各項的意思如下:
arm: CPU的架構(ARCH)
arm920t: CPU的類型(CPU),其對應於cpu/arm920t子目錄。
tekkaman2410: 開發板的型號(BOARD),對應於board/tekkaman/tekkaman2410目錄。
tekkaman: 開發者/或經銷商(vender)。
s3c24x0: 片上系統(SOC)。

同時在
“ifndef CROSS_COMPILE ”之前  加上自己交叉編譯器的路徑,比如我使用crosstool-0.43製作的基於2.6.22.2內核和gcc-4.1.0-glibc-2.3.2的ARM9TDMI交叉編譯器,則:


CROSS_COMPILE=/home/tekkaman/working/crosstool-gcc410-k26222/gcc-4.1.0-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-




2 在/board子目錄中建立自己的開發板tekkaman2410目錄

由於我在上一步板子的

開發者/或經銷商(vender)中填了 tekkaman ,所以開發板tekkaman2410目錄一定要建在/board子目錄中的tekkaman目錄下 ,否則編譯會出錯。

$cd board
$mkdir tekkaman tekkaman/tekkaman2410
$cp -arf smdk2410/*   tekkaman/tekkaman2410/
$cd tekkaman/tekkaman2410
$mv smdk2410.c tekkaman2410.c


   還要記得修改自己的開發板tekkaman2410目錄下的Makefile文件,不然編譯時會出錯:
COBJS    :=
tekkaman2410.o flash.o
$vi Makefile


3 在include/configs/中建立配置頭文件
$cd ../../..
$cp include/configs/smdk2410.h include/configs/tekkaman2410.h


4 測試編譯能否成功
$make tekkaman2410_config
Configuring for tekkaman2410 board...
(如果出現:
$ make tekkaman2410_config

Makefile:1927: *** 遺漏分隔符 。 停止。
請在U-boot的根目錄下的Makefile的

        @$(MKCONFIG) $(@:_config=) arm arm920t tekkaman2410 tekkaman)
前加上“Tab”鍵)
$make


   
我到這一步測試交叉編譯成功!!

 

第二步

  CPU/ARM920T/START.S

  要移植nandflash 的 驅動以及從nandflash啓動.

(3)將從Flash啓動改成從NAND Flash啓動。
將以下U-Boot的重定向語句段:

#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate:                /* relocate U-Boot to RAM        */
    adr    r0, _start        /* r0 <- current position of code   */
    ldr    r1, _TEXT_BASE        /* test if we run from flash or RAM */
    cmp     r0, r1                 /* don't reloc during debug         */
    beq     stack_setup

    ldr    r2, _armboot_start
    ldr    r3, _bss_start
    sub    r2, r3, r2        /* r2 <- size of armboot            */
    add    r2, r0, r2        /* r2 <- source end address         */

copy_loop:
    ldmia    r0!, {r3-r10}        /* copy from source address [r0]    */
    stmia    r1!, {r3-r10}        /* copy to   target address [r1]    */
    cmp    r0, r2            /* until source end addreee [r2]    */
    ble    copy_loop
#endif    /* CONFIG_SKIP_RELOCATE_UBOOT */



替換成:

#ifdef CONFIG_S3C2410_NAND_BOOT   @tekkaman@@@@@@@@@@@@@@@@SSSSSSSSSSSSS
@ reset NAND
  mov r1, #NAND_CTL_BASE
  ldr   r2, =0xf830           @ initial value
  str   r2, [r1, #oNFCONF]
  ldr   r2, [r1, #oNFCONF]
  bic  r2, r2, #0x800              @ enable chip
  str   r2, [r1, #oNFCONF]
  mov r2, #0xff         @ RESET command
  strb r2, [r1, #oNFCMD]


  mov r3, #0                   @ wait
nand1: 
  add  r3, r3, #0x1
  cmp r3, #0xa
  blt   nand1

nand2:
  ldr   r2, [r1, #oNFSTAT]      @ wait ready
  tst    r2, #0x1
  beq  nand2

  ldr   r2, [r1, #oNFCONF]
  orr  r2, r2, #0x800              @ disable chip
  str   r2, [r1, #oNFCONF]

@ get read to call C functions (for nand_read())
  ldr   sp, DW_STACK_START       @ setup stack pointer
  mov fp, #0                    @ no previous frame, so fp=0

@ copy U-Boot to RAM
  ldr   r0, =TEXT_BASE
  mov     r1, #0x0
  mov r2, #0x20000
  bl    nand_read_ll
  tst    r0, #0x0
  beq  ok_nand_read

bad_nand_read:
loop2:    b     loop2          @ infinite loop


ok_nand_read:
@ verify
  mov r0, #0
  ldr   r1, =TEXT_BASE
  mov r2, #0x400     @ 4 bytes * 1024 = 4K-bytes
go_next:
  ldr   r3, [r0], #4
  ldr   r4, [r1], #4
  teq   r3, r4
  bne  notmatch
  subs r2, r2, #4
  beq  stack_setup
  bne  go_next

notmatch:
loop3:     b     loop3         @ infinite loop

#endif @ CONFIG_S3C2410_NAND_BOOT  @tekkaman@@@@@@@@@@@@@@@@@@EEEEEEEEE

“  _start_armboot:    .word start_armboot  ” 後加入:
   .align     2
DW_STACK_START:  .word  STACK_BASE+STACK_SIZE-4



附:順便提一下,在
start.S文件的註釋部分有個小錯誤(紅色部分:原來是2)
cpu_init_crit:
    ......
    /*
     * disable MMU stuff and caches
     */
    mrc    p15, 0, r0, c1, c0, 0
    bic    r0, r0, #0x00002300    @ clear bits 13, 9:8 (--V- --RS)
    bic    r0, r0, #0x00000087    @ clear bits 7, 2:0 (B--- -CAM)
    orr    r0, r0, #0x00000002    @ set bit 1 (A) Align
    ......



在board/tekkaman/tekkaman2410加入NAND Flash讀函數,建立nand_read.c文件,加入如下內容(copy from vivi):

#include <config.h>

#define __REGb(x) (*(volatile unsigned char *)(x))
#define __REGi(x) (*(volatile unsigned int *)(x))
#define NF_BASE  0x4e000000
#define NFCONF  __REGi(NF_BASE + 0x0)
#define NFCMD  __REGb(NF_BASE + 0x4)
#define NFADDR  __REGb(NF_BASE + 0x8)
#define NFDATA  __REGb(NF_BASE + 0xc)
#define NFSTAT  __REGb(NF_BASE + 0x10)

#define BUSY 1


inline void wait_idle(void) {
    int i;

    while(!(NFSTAT & BUSY))
      for(i=0; i<10; i++);
}

/* low level nand read function */
int
nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)
{
    int i, j;

    if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) {
        return -1; /* invalid alignment */
    }

    /* chip Enable */
    NFCONF &= ~0x800;
    for(i=0; i<10; i++);

    for(i=start_addr; i < (start_addr + size);) {
      /* READ0 */
      NFCMD = 0;

      /* Write Address */
      NFADDR = i & 0xff;
      NFADDR = (i >> 9) & 0xff;
      NFADDR = (i >> 17) & 0xff;
      NFADDR = (i >> 25) & 0xff;

      wait_idle();

      for(j=0; j < NAND_SECTOR_SIZE; j++, i++) {
 *buf = (NFDATA & 0xff);
 buf++;
      }
    }

    /* chip Disable */
    NFCONF |= 0x800; /* chip disable */

    return 0;
}



3 修改board/tekkaman/tekkaman2410/Makefile文件
......
OBJS := tekkaman2410.o  nand_read.o

......


4 修改include/configs/tekkaman2410.h文件,添加如下內容:
......
/*
 * Nandflash Boot
 */
#define CONFIG_S3C2410_NAND_BOOT 1
#define STACK_BASE    0x33f00000
#define STACK_SIZE    0x8000
//#define UBOOT_RAM_BASE    0x33f80000
/* NAND Flash Controller */
#define NAND_CTL_BASE            0x4E000000
#define bINT_CTL(Nb)        __REG(INT_CTL_BASE + (Nb))
/* Offset */
#define oNFCONF               0x00
#define oNFCMD                0x04
#define oNFADDR               0x08
#define oNFDATA               0x0c
#define oNFSTAT               0x10
#define oNFECC                0x14
#endif    /* __CONFIG_H */

 

nandflash啓動 移植完成.

 

第三步:

修改lowlevel_init.S文件 低版本的是memsetup.S

依照開發板的內存區的配置情況, 修改board/crane2410/lowlevel_init.S文件,我的更改如下:
#include <config.h>
#include <version.h>
#define BWSCON 0x48000000
/* BWSCON */
#define DW8   (0x0)
#define DW16   (0x1)
#define DW32   (0x2)
#define WAIT   (0x1<<2)
#define UBLB   (0x1<<3)
#define B1_BWSCON    (DW16)
#define B2_BWSCON    (DW16)
#define B3_BWSCON    (DW16 + WAIT + UBLB)
#define B4_BWSCON    (DW16)
#define B5_BWSCON    (DW16)
#define B6_BWSCON    (DW32)
#define B7_BWSCON    (DW32)
/* BANK0CON */
#define B0_Tacs 0x3 /*  0clk */
#define B0_Tcos 0x3 /*  0clk */
#define B0_Tacc 0x7 /* 14clk */
#define B0_Tcoh 0x3 /*  0clk */
#define B0_Tah   0x3 /*  0clk */
#define B0_Tacp 0x3
#define B0_PMC   0x3 /* normal */
/* BANK1CON */
#define B1_Tacs 0x3 /*  0clk */
#define B1_Tcos 0x3 /*  0clk */
#define B1_Tacc 0x7 /* 14clk */
#define B1_Tcoh 0x3 /*  0clk */
#define B1_Tah   0x3 /*  0clk */
#define B1_Tacp 0x3
#define B1_PMC   0x0
#define B2_Tacs 0x0
#define B2_Tcos 0x0
#define B2_Tacc 0x7
#define B2_Tcoh 0x0
#define B2_Tah   0x0

#define B2_Tacp 0x0
#define B2_PMC   0x0
#define B3_Tacs 0x0 /*  0clk */
#define B3_Tcos 0x3 /*  4clk */
#define B3_Tacc 0x7 /* 14clk */
#define B3_Tcoh 0x1 /*  1clk */
#define B3_Tah   0x0 /*  0clk */
#define B3_Tacp 0x3    /*  6clk */
#define B3_PMC   0x0 /* normal */
#define B4_Tacs 0x0 /*  0clk */
#define B4_Tcos 0x0 /*  0clk */
#define B4_Tacc 0x7 /* 14clk */
#define B4_Tcoh 0x0 /*  0clk */
#define B4_Tah   0x0 /*  0clk */
#define B4_Tacp 0x0
#define B4_PMC   0x0 /* normal */
#define B5_Tacs 0x0 /*  0clk */
#define B5_Tcos 0x0 /*  0clk */
#define B5_Tacc 0x7 /* 14clk */
#define B5_Tcoh 0x0 /*  0clk */
#define B5_Tah   0x0 /*  0clk */
#define B5_Tacp 0x0
#define B5_PMC   0x0 /* normal */
#define B6_MT   0x3 /* SDRAM */
#define B6_Trcd   0x1
#define B6_SCAN 0x1 /* 9bit */
#define B7_MT   0x3 /* SDRAM */
#define B7_Trcd 0x1 /* 3clk */
#define B7_SCAN 0x1 /* 9bit */
/* REFRESH parameter */
#define REFEN   0x1 /* Refresh enable */
#define TREFMD 0x0 /* CBR(CAS before RAS)/Auto refresh */
#define Trp   0x0 /* 2clk */
#define Trc   0x3 /* 7clk */
#define Tchr   0x2 /* 3clk */
#define REFCNT   1113 /* period=15.6us, HCLK=60Mhz, (2048+1-15 .6*60) */
/**************************************/
_TEXT_BASE:
.word TEXT_BASE
.globl lowlevel_init
lowlevel_init:
/* memory control configuration */
/* make r0 relat ive the current location so that it */
/* reads SMRDATA out of FLASH rather than memory ! */
ldr     r0, =S MRDATA
ldr r1, _TEXT_BASE
sub r0, r0, r1

ldr r1, =BWSCON /* Bus Width Status Controller */
add     r2, r0, #13*4
0:
ldr     r3, [r0], #4
str     r3, [r1], #4
cmp     r2, r0
bne     0b
/* everything is fine now */
mov pc, lr
.ltorg
/* the literal pools origin */
SMRDATA:
    .word
(0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(
B7_BWSCON<<28))
    .word
((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))
    .word
((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))
    .word
((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))
    .word
((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))
    .word
((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))
    .word
((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))
    .word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))
    .word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))
    .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)
    .word 0x31
    .word 0x30
    .word 0x30
 參考呵呵,來自95頁的一個pdf,  linux系統移植

 

第四步

 

發佈了35 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章