天天看點

u-boot-1.3.4移植到mini2440+128M nand boot

第 1 階段 下載下傳源碼

    1) 、 U-boot 源碼下載下傳位址: ftp://ftp.denx.de/pub/u-boot/ 裡邊的 u-boot-1.3.4.tar.bz2 檔案,放到你的開發目錄裡;

    2) 、解壓檔案: tar -jxvf u-boot-1.3.4.tar.bz2 ;

    3) 、下載下傳交叉編譯工具

http://www.handhelds.org/download/projects/toolchain/ ,使用 3.3.2 ,如果使用 3.4.1 的編譯 u-boot 會産生軟體浮點的編譯錯誤,建議使用 3.3.2 編 u-boot ,用 3.4.1 編譯核心。當然你也可以使用友善之臂 http://www.arm9.net/download-arm-linux-gcc-4.3.2.asp 的 arm-linux-gcc-4.3.2.tgz ,這個 arm-linux-gcc-4.3.2 with EABI 相當不錯,可以編譯所有的程式;本人就是使用 4.3.2 。

    4) 、建立交叉編譯環境

首先: #tar xvzf arm-linux-gcc-4.3.2.tgz    – C /    

注意: C 後面有個空格,并且 C 是大寫的,它是英文單詞“ Change ”的第一個字母,

在此是改變目錄的意思。

執行該指令,将把 arm-linux-gcc 安裝到 /usr/loca/arm/4.3.2 目錄。

然後:把編譯器路徑加入系統環境變量,運作指令

#vi /root/.bashrc

編輯 /root/.bashrc 檔案,在最後一行   export PATH=$PATH:/usr/local/arm/4.3.2/bin ,儲存退出。

最後:重新登入系統 ( 不必重新開機機器,開始 ->logout 即可 ) ,使以上設定生效。   第 2 階段 測試編譯環境是否正确   1 )、在 u-boot-1.3.4/board 下找個與 2410 相似的開發闆,這裡 smdk2410 為例。

2 )、将 u-boot-1.3.4/board/smdk2410 目錄複制到目前目錄下,并改名為 mini2440 。

3 )、把 smdk2410.c 改名為 mini2440.c ,修改 Makefile 中的 COBJS := mini2440.o flash.o ,儲存。

4 )、将 u-boot-1.3.4/include/configs/smdk2410.h ,複制到目前目錄,并改名為 mini2440.h 。

6 )、在 u-boot-1.3.4/Makefile 中 , 大概 2490 多行找到

smdk2410_config : unconfig

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

在它下邊添加

mini2440_config : unconfig

 @$(MKCONFIG) $(@:_config=) arm arm920t mini2440 NULL s3c24x0

(注意 @$(MKCONFIG) 前面必須是 TAB 鍵) 7 )特别注意: 在 u-boot1.3.3 及以上版本 Makefile 有一定的變化,使得對于 24x0 處理器從 nand 啟動的遇到問題。也就是網上有人說的:無法運作過 lowlevel_init 。其實這個問題是由于編譯器将我們自己添加的用于 nandboot 的子函數 nand_read_ll 放到了 4K 之後造成的(到這不了解的話,請仔細看看 24x0 處理器 nandboot 原理)。 u-boot 根本沒有完成自我拷貝,你可以看 uboot 根目錄下的 System.map 檔案就可知道原因。

解決辦法其實很簡單:

将 278 行的 __LIBS := $(subst $(obj),,$(LIBS)) $(subst $(obj),,$(LIBBOARD))

改為 __LIBS := $(subst $(obj),,$(LIBBOARD)) $(subst $(obj),,$(LIBS)) 8 )、進入 u-boot-1.3.4 目錄,先來個 #make distclean ,

然後 # make mini2440_config

Configuring for mini2440 board...

9 )、之後就可以 # make 了,如正常編譯通過,表明環境搭建好。 第 3 階段 支援 nand boot 程式修改   1 、修改 /cpu/arm920t/start.S

   1) 删除 AT91RM9200 使用的 LED 代碼。

#include <config.h>

#include <version.h>

#if defined(CONFIG_AT91RM9200DK)

#include <status_led.h>

#endif

......

start_code:

    mrs r0,cpsr

    bic r0,r0,#0x1f

    orr r0,r0,#0xd3

    msr cpsr,r0

#if defined(CONFIG_AT91RM9200DK)

    bl coloured_LED_init

    bl red_LED_on

#endif    2) 修改寄存器位址定義

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)|| defined(CONFIG_S3C2440)

    #if defined(CONFIG_S3C2400)

#define pWTCON 0x15300000

#define INTMSK 0x14400008

#define CLKDIVN 0x14800014

#else

#define pWTCON 0x53000000

#define INTMSK 0x4A000008

#define INTSUBMSK 0x4A00001C

#define CLKDIVN 0x4C000014

#endif

#define CLK_CTL_BASE 0x4C000000

#define MDIV_405 0x7f << 12

#define PSDIV_405 0x21

#define MDIV_200 0xa1 << 12

#define PSDIV_200 0x31    3) 修改中斷禁止部分

#if defined(CONFIG_S3C2410)

    ldr r1, =0x7ff

    ldr r0, =INTSUBMSK

    str r1, [r0]

#endif

#if defined(CONFIG_S3C2440)

    ldr r1, =0x7fff

    ldr r0, =INTSUBMSK

    str r1, [r0]

#endif     4) 修改時鐘設定( 2440 的主頻為 405MHz 。)

# if defined(CONFIG_S3C2440)

    ldr r0, =CLKDIVN

    mov r1, #5

    str r1, [r0]

    mrc p15, 0, r1, c1, c0, 0

    orr r1, r1, #0xc0000000

    mcr p15, 0, r1, c1, c0, 0    

    mov r1, #CLK_CTL_BASE

    mov r2, #MDIV_405

    add r2, r2, #PSDIV_405

    str r2, [r1, #0x04] #else

    ldr r0, =CLKDIVN

    mov r1, #3

    str r1, [r0]     mrc p15, 0, r1, c1, c0, 0

    orr r1, r1, #0xc0000000

    mcr p15, 0, r1, c1, c0, 0    

    mov r1, #CLK_CTL_BASE

    mov r2, #MDIV_200

    add r2, r2, #PSDIV_200

    str r2, [r1, #0x04] # endif

#endif    5) 将從 Nor Flash 啟動改成從 NAND Flash 啟動。

在以下 U - Boot 的重定向語句段 ( 作用是将 u-boot 的源代碼從 nor flash 到 sdram 中 ) : (你完全可以把下面的 nor flash 重定向語句全部幹掉)

#ifndef CONFIG_AT91RM9200 #ifndef CONFIG_SKIP_RELOCATE_UBOOT

relocate:

    adr r0, _start

    ldr r1, _TEXT_BASE

    cmp r0, r1

    beq stack_setup     ldr r2, _armboot_start

    ldr r3, _bss_start

    sub r2, r3, r2

    add r2, r0, r2 copy_loop:

    ldmia {r3-r10}

    stmia {r3-r10}

    cmp r0, r2

    ble copy_loop

#endif

#endif 的前面添加上以下的 nand boot 代碼: #ifdef CONFIG_S3C2440_NAND_BOOT #define NAND_CTL_BASE 0x4E000000

#define oNFCONF 0x00

#define oNFCONT 0x04

#define oNFCMD 0x08

#define oNFSTAT 0x20

#define LENGTH_UBOOT 0x40000     @ reset NAND

    mov    r1, #NAND_CTL_BASE

    ldr    r2, =( (7<<12)|(7<<8)|(7<<4)|(0<<0) )

    str    r2, [r1, #oNFCONF]

    ldr    r2, [r1, #oNFCONF]

    ldr    r2, =( (1<<4)|(0<<1)|(1<<0) )    @ Active low CE Control

    str    r2, [r1, #oNFCONT]

    ldr    r2, [r1, #oNFCONT]

    ldr    r2, =(0x6)    @ RnB Clear

    str    r2, [r1, #oNFSTAT]

    ldr    r2, [r1, #oNFSTAT]

    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, #0x4

    beq    nand2

    ldr    r2, [r1, #oNFCONT]

    orr    r2, r2, #0x2    @ Flash Memory Chip Disable

    str    r2, [r1, #oNFCONT]

    @ 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, #LENGTH_UBOOT

    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 #ifdef    CONFIG_S3C2410_NAND_BOOT #define NAND_CTL_BASE 0x4E000000

#define oNFCONF 0x00

#define oNFCMD 0x04

#define oNFSTAT 0x10

#define LENGTH_UBOOT 0x40000     @ 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, #LENGTH_UBOOT

    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 在 “   _start_armboot:    .word start_armboot  ” 後加入:

 #define STACK_BASE 0x33f00000

 #define STACK_SIZE 0x10000

    .align    2

DW_STACK_START:    .word    STACK_BASE+STACK_SIZE-4     2 、 在 board/mini2440 加入 NAND Flash 讀取函數( start.S 中需要的 nand_read_ll 函數)檔案 nand_read.c

==================================================================

#include <config.h>

#include <linux/mtd/nand.h> #define __REGb(x) (*(volatile unsigned char *)(x))

#define __REGw(x) (*(volatile unsigned short *)(x))

#define __REGi(x) (*(volatile unsigned int *)(x))

#define NF_BASE  0x4e000000

#if defined(CONFIG_S3C2410)

#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 NFSTAT_BUSY 1

#define nand_select() (NFCONF &= ~0x800)

#define nand_deselect() (NFCONF |= 0x800)

#define nand_clear_RnB() do {} while (0)

#elif defined(CONFIG_S3C2440)

#define NFCONF  __REGi(NF_BASE + 0x0)

#define NFCONT  __REGi(NF_BASE + 0x4)

#define NFCMD  __REGb(NF_BASE + 0x8)

#define NFADDR  __REGb(NF_BASE + 0xc)

#define NFDATA  __REGb(NF_BASE + 0x10)

#define NFDATA16 __REGw(NF_BASE + 0x10)

#define NFSTAT  __REGb(NF_BASE + 0x20)

#define NFSTAT_BUSY (1 << 2)

#define nand_select() (NFCONT &= ~(1 << 1))

#define nand_deselect() (NFCONT |= (1 << 1))

#define nand_clear_RnB() (NFSTAT |= NFSTAT_BUSY)

#endif

static inline void nand_wait(void)

{

  int i;

 while (!(NFSTAT & NFSTAT_BUSY))

  for (i=0; i<10; i++);

}

#if defined(CONFIG_S3C2410)

#define NAND_PAGE_SIZE  512

#define BAD_BLOCK_OFFSET 517

#define NAND_BLOCK_MASK  (NAND_PAGE_SIZE - 1)

#define NAND_BLOCK_SIZE  0x4000

#else

#define NAND_5_ADDR_CYCLE

#define NAND_PAGE_SIZE  2048

#define BAD_BLOCK_OFFSET NAND_PAGE_SIZE

#define NAND_BLOCK_MASK  (NAND_PAGE_SIZE - 1)

#define NAND_BLOCK_SIZE  (NAND_PAGE_SIZE * 64)

#endif

#if defined(CONFIG_S3C2410) && (NAND_PAGE_SIZE != 512)

#error "S3C2410 does not support nand page size != 512"

#endif

static int is_bad_block(unsigned long i)

{

 unsigned char data;

 unsigned long page_num;

 nand_clear_RnB();

#if (NAND_PAGE_SIZE == 512)

 NFCMD = NAND_CMD_READOOB;

 NFADDR = BAD_BLOCK_OFFSET & 0xf;

 NFADDR = (i >> 9) & 0xff;

 NFADDR = (i >> 17) & 0xff;

 NFADDR = (i >> 25) & 0xff;

#elif (NAND_PAGE_SIZE == 2048)

 page_num = i >> 11;

 NFCMD = NAND_CMD_READ0;

 NFADDR = BAD_BLOCK_OFFSET & 0xff;

 NFADDR = (BAD_BLOCK_OFFSET >> 8) & 0xff;

 NFADDR = page_num & 0xff;

 NFADDR = (page_num >> 8) & 0xff;

 NFADDR = (page_num >> 16) & 0xff;

 NFCMD = NAND_CMD_READSTART;

#endif

 nand_wait();

 data = (NFDATA & 0xff);

 if (data != 0xff)

  return 1;

 return 0;

}

static int nand_read_page_ll(unsigned char *buf, unsigned long addr)

{

 unsigned short *ptr16 = (unsigned short *)buf;

 unsigned int i, page_num;

 nand_clear_RnB();

 NFCMD = NAND_CMD_READ0;

#if (NAND_PAGE_SIZE == 512)

 NFADDR = addr & 0xff;

 NFADDR = (addr >> 9) & 0xff;

 NFADDR = (addr >> 17) & 0xff;

 NFADDR = (addr >> 25) & 0xff;

#elif (NAND_PAGE_SIZE == 2048)

 page_num = addr >> 11;

 NFADDR = 0;

 NFADDR = 0;

 NFADDR = page_num & 0xff;

 NFADDR = (page_num >> 8) & 0xff;

 NFADDR = (page_num >> 16) & 0xff;

 NFCMD = NAND_CMD_READSTART;

#else

#error "unsupported nand page size"

#endif

 nand_wait();

 for (i = 0; i < NAND_PAGE_SIZE; i++)

 {

  *buf = (NFDATA & 0xff);

  buf++;

 }

 return NAND_PAGE_SIZE;

}  

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;   

    }

 nand_select();

 nand_clear_RnB();

 for (i=0; i<10; i++);

 for (i=start_addr; i < (start_addr + size);)

 {

  j = nand_read_page_ll(buf, i);

  i += j;

  buf += j;

 }

 nand_deselect();

  return 0;

}

============================================================== 記得修改 board/mini2440/Makefile 檔案 , 将 nand_read.c 編譯進 u-boot 。

OBJS := mini2440.o nand_read.o flash.o

   3 、修改 board/mini2440/lowlevel_init.S 檔案

#define REFEN            0x1   

#define TREFMD            0x0   

#define Trc            0x3   

#define Tchr            0x2    #if defined(CONFIG_S3C2440)

#define Trp            0x2   

#define REFCNT            1012

#else

#define Trp            0x0   

#define REFCNT            0x0459

#endif

   4 、 修改 /board/mini2440/mini2440.c

修改其對 GPIO 和 PLL 的配置 ( 請參閱開發闆的硬體說明和晶片手冊 ) ;并針對 LCD 顯示部分和 nand flash 驅動添加相應的代碼: ......

#include <common.h>

#include <s3c2410.h>

#include <video_fb.h> #if defined(CONFIG_CMD_NAND)

#include <linux/mtd/nand.h>

#endif DECLARE_GLOBAL_DATA_PTR; #define FCLK_SPEED 1 #if FCLK_SPEED==0       

#define M_MDIV    0xC3

#define M_PDIV    0x4

#define M_SDIV    0x1

#elif FCLK_SPEED==1        #if defined(CONFIG_S3C2410)

#define M_MDIV    0xA1

#define M_PDIV    0x3

#define M_SDIV    0x1

#endif #if defined(CONFIG_S3C2440)

#define M_MDIV 0x7f   

#define M_PDIV 0x2

#define M_SDIV 0x1

#endif

#endif #define USB_CLOCK 1 #if USB_CLOCK==0

#define U_M_MDIV    0xA1

#define U_M_PDIV    0x3

#define U_M_SDIV    0x1

#elif USB_CLOCK==1 #if defined(CONFIG_S3C2410)

#define U_M_MDIV    0x48

#define U_M_PDIV    0x3

#endif #if defined(CONFIG_S3C2440)

#define U_M_MDIV 0x38

#define U_M_PDIV 0x2

#endif #define U_M_SDIV    0x2

#endif

...... 為連接配接 LED 和蜂鳴器的 GPIO 修改配置寄存器: int board_init (void): ...... #if defined(CONFIG_MINI2440)

    gpio->GPBCON = 0x00295551;

#else

    gpio->GPBCON = 0x00044556;

#endif

...... 為引導 linux 核心,修改開發闆的類型代碼: int board_init (void): ...... #if defined(CONFIG_S3C2410)

    gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;

#endif #if defined(CONFIG_S3C2440)

    gd->bd->bi_arch_number = MACH_TYPE_S3C2440 ;

#endif

...... 為使 int board_init (void) 設定完成後, LED1 和 LED2 同時亮起,蜂鳴器繼續鳴叫,在 int board_init (void) 的最後添加: ......     icache_enable();

    dcache_enable();

#if    defined(CONFIG_MINI2440_LED)

    gpio->GPBDAT = 0x00000181;

#endif

    return 0;

} 5、最後,修改 board/mini2440/u-boot.lds 檔案,在

        cpu/arm920t/start.o (.text)

        後加上

        board/2440/lowlevel_init.o (.text)

        board/2440/nand_read.o (.text)

第 4 階段 修改适合 S3C2440 的程式   1) 、修改 include/configs/2440.h

#define CONFIG_S3C2410  1

改為:

#define CONFIG_S3C2440

2 )、将 /include/common.h 中的

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_LH7A40X)

改為:

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_LH7A40X) || defined(CONFIG_S3C2440)

3 )、修改 /include/s3c24x0.h ,将檔案中所有的

#ifdef CONFIG_S3C2410

改為:

#if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440) 還有nand 的處理:

typedef struct {

 S3C24X0_REG32 NFCONF;

#if defined(CONFIG_S3C2440) //modified for 2440

 S3C24X0_REG32 NFCONT;

#endif

 S3C24X0_REG32 NFCMD;

 S3C24X0_REG32 NFADDR;

 S3C24X0_REG32 NFDATA;

 S3C24X0_REG32 NFSTAT;

 S3C24X0_REG32 NFECC;

} S3C2410_NAND;

4 )、将 /cpu/arm920t/s3c24x0/interrupts.c 中的

#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB)

修改為:

#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB) || defined (CONFIG_S3C2440)

#elif defined(CONFIG_S3C2410)

改為:

#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)

5 )、将 /cpu/arm920t/s3c24x0/serial.c 檔案中的

#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB)

改為:

#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB) || defined (CONFIG_S3C2440)

#elif defined(CONFIG_S3C2410)

改為:

#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)

将函數 static int serial_init_dev(const int dev_index) 中的

 uart->UFCON = 0x07;

改為:

 uart->UFCON = 0x00;

6 )、将 /cpu/arm920t/s3c24x0/speed.c 中的

#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB)

改為:

#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB) || defined (CONFIG_S3C2440)

#elif defined(CONFIG_S3C2410)

改為:

#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)

在 static ulong get_PLLCLK(int pllreg) 中的

    m = ((r & 0xFF000) >> 12) + 8;

    p = ((r & 0x003F0) >> 4) + 2;

    s = r & 0x3;

後面加上:

#if defined(CONFIG_S3C2440)

   if (pllreg == MPLL)

    return((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s));

    else if (pllreg == UPLL)

#endif

ulong get_HCLK(void)

{

    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();     return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/2 : get_FCLK());

}

改為:

ulong get_HCLK(void)

{

    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();     if (clk_power->CLKDIVN & 0x6)  

    {

       if ((clk_power->CLKDIVN & 0x6)==2)        return(get_FCLK()/2);

       if ((clk_power->CLKDIVN & 0x6)==6)        return((clk_power->CAMDIVN & 0x100) ? get_FCLK()/6 : get_FCLK()/3);       

       if ((clk_power->CLKDIVN & 0x6)==4)        return((clk_power->CAMDIVN & 0x200) ? get_FCLK()/8 : get_FCLK()/4);       

       return(get_FCLK());

    }

    else

        return(get_FCLK()); }

7 )、 /cpu/arm920t/s3c24x0/usb_ohci.c 中的

#elif defined(CONFIG_S3C2410)

改為:

#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)

8 )、将 drivers/rtc/s3c24x0_rtc.c 中的

#elif defined(CONFIG_S3C2410)

改為:

#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440) 9 )、需要在 /include/s3c24x0.h 檔案中添加 CAMDIVN 定義,将

typedef struct {

 S3C24X0_REG32 LOCKTIME;

 S3C24X0_REG32 MPLLCON;

 S3C24X0_REG32 UPLLCON;

 S3C24X0_REG32 CLKCON;

 S3C24X0_REG32 CLKSLOW;

 S3C24X0_REG32 CLKDIVN;

} S3C24X0_CLOCK_POWER;

改為:

typedef struct {

 S3C24X0_REG32 LOCKTIME;

 S3C24X0_REG32 MPLLCON;

 S3C24X0_REG32 UPLLCON;

 S3C24X0_REG32 CLKCON;

 S3C24X0_REG32 CLKSLOW;

 S3C24X0_REG32 CLKDIVN;

#if defined (CONFIG_S3C2440)

         S3C24X0_REG32 CAMDIVN;

#endif

} S3C24X0_CLOCK_POWER;     到這裡, make 一下,把 u-boot.bin 燒到 nand flash ,重新啟動,在序列槽工具上應該可以看到熟悉的 U-Boot 1.3.4 (Oct  9 2009 - 07:34:33)

DRAM:  64 MB NAND:   第 5 階段 修改 nand和支援網口晶片DM9000 等的驅動   1)對cpu/arm920t/s3c24x0裡的nand.c進行如下修改: #include <common.h> #if 0

#define DEBUGN printf

#else

#define DEBUGN(x, args ...) {}

#endif #if defined(CONFIG_CMD_NAND)

#if !defined(CFG_NAND_LEGACY) #include <nand.h>

#include <s3c2410.h> #define __REGb(x) (*(volatile unsigned char *)(x))

#define __REGi(x) (*(volatile unsigned int *)(x)) #define NF_BASE  0x4e000000

#if defined(CONFIG_S3C2410)

#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 NFECC0  __REGb(NF_BASE + 0x14)

#define NFECC1  __REGb(NF_BASE + 0x15)

#define NFECC2  __REGb(NF_BASE + 0x16) #define S3C2410_NFCONF_EN          (1<<15)

#define S3C2410_NFCONF_512BYTE     (1<<14)

#define S3C2410_NFCONF_4STEP       (1<<13)

#define S3C2410_NFCONF_INITECC     (1<<12)

#define S3C2410_NFCONF_nFCE        (1<<11)

#define S3C2410_NFCONF_TACLS(x)    ((x)<<8)

#define S3C2410_NFCONF_TWRPH0(x)   ((x)<<4)

#define S3C2410_NFCONF_TWRPH1(x)   ((x)<<0) #elif defined(CONFIG_S3C2440) #define NFCONF  __REGi(NF_BASE + 0x0)

#define NFCONT  __REGi(NF_BASE + 0x4)

#define NFCMD  __REGb(NF_BASE + 0x8)

#define NFADDR  __REGb(NF_BASE + 0xc)

#define NFDATA  __REGb(NF_BASE + 0x10)

#define NFMECCD0 __REGi(NF_BASE + 0x14)

#define NFMECCD1 __REGi(NF_BASE + 0x18)

#define NFSECCD  __REGi(NF_BASE + 0x1C)

#define NFSTAT  __REGb(NF_BASE + 0x20)

#define NFSTAT0  __REGi(NF_BASE + 0x24)

#define NFSTAT1  __REGi(NF_BASE + 0x28)

#define NFMECC0  __REGi(NF_BASE + 0x2C)

#define NFMECC1  __REGi(NF_BASE + 0x30)

#define NFSECC  __REGi(NF_BASE + 0x34)

#define NFSBLK  __REGi(NF_BASE + 0x38)

#define NFEBLK  __REGi(NF_BASE + 0x3c) #define S3C2440_NFCONT_nCE (1<<1)

#define S3C2440_ADDR_NALE 0x0c

#define S3C2440_ADDR_NCLE 0x08

#endif

static void s3c2410_hwcontrol(struct mtd_info *mtd, int cmd)

{

 struct nand_chip *chip = mtd->priv;  DEBUGN("hwcontrol(): 0x%02x: ", cmd); #if defined(CONFIG_S3C2410)

 switch (cmd) {

 case NAND_CTL_SETNCE:

  NFCONF &= ~S3C2410_NFCONF_nFCE;

  DEBUGN("NFCONF=0x%08x/n", NFCONF);

  break;

 case NAND_CTL_CLRNCE:

  NFCONF |= S3C2410_NFCONF_nFCE;

  DEBUGN("NFCONF=0x%08x/n", NFCONF);

  break;

 case NAND_CTL_SETALE:

  chip->IO_ADDR_W = NF_BASE + 0x8;

  DEBUGN("SETALE/n");

  break;

 case NAND_CTL_SETCLE:

  chip->IO_ADDR_W = NF_BASE + 0x4;

  DEBUGN("SETCLE/n");

  break;

 default:

  chip->IO_ADDR_W = NF_BASE + 0xc;

  break;

 }

#elif defined(CONFIG_S3C2440)

 switch (cmd) {

 case NAND_CTL_SETNCE:

  NFCONF &= ~S3C2440_NFCONT_nCE;

  DEBUGN("NFCONF=0x%08x/n", NFCONF);

  break;

 case NAND_CTL_CLRNCE:

  NFCONF |= S3C2440_NFCONT_nCE;

  DEBUGN("NFCONF=0x%08x/n", NFCONF);

  break;

 case NAND_CTL_SETALE:

  chip->IO_ADDR_W = NF_BASE + S3C2440_ADDR_NALE;

  DEBUGN("SETALE/n");

  break;

 case NAND_CTL_SETCLE:

  chip->IO_ADDR_W = NF_BASE + S3C2440_ADDR_NCLE;

  DEBUGN("SETCLE/n");

  break;

 default:

  chip->IO_ADDR_W = NF_BASE + 0x10; //注意是0x10

  break;

 }

#endif

 return;

} static int s3c2410_dev_ready(struct mtd_info *mtd)

{

 DEBUGN("dev_ready/n");

 return (NFSTAT & 0x01);

} #ifdef CONFIG_S3C2410_NAND_HWECC

void s3c2410_nand_enable_hwecc(struct mtd_info *mtd, int mode)

{

 DEBUGN("s3c2410_nand_enable_hwecc(%p, %d)/n", mtd ,mode);

 NFCONF |= S3C2410_NFCONF_INITECC;

} static int s3c2410_nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat,

          u_char *ecc_code)

{

 ecc_code[0] = NFECC0;

 ecc_code[1] = NFECC1;

 ecc_code[2] = NFECC2;

 DEBUGN("s3c2410_nand_calculate_hwecc(%p,): 0x%02x 0x%02x 0x%02x/n",

  mtd , ecc_code[0], ecc_code[1], ecc_code[2]);  return 0;

} static int s3c2410_nand_correct_data(struct mtd_info *mtd, u_char *dat,

         u_char *read_ecc, u_char *calc_ecc)

{

 if (read_ecc[0] == calc_ecc[0] &&

     read_ecc[1] == calc_ecc[1] &&

     read_ecc[2] == calc_ecc[2])

  return 0;  printf("s3c2410_nand_correct_data: not implemented/n");

 return -1;

}

#endif int board_nand_init(struct nand_chip *nand)

{

 u_int32_t cfg;

 u_int8_t tacls, twrph0, twrph1;

 S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();  DEBUGN("board_nand_init()/n");  clk_power->CLKCON |= (1 << 4); #if defined(CONFIG_S3C2410)

 twrph0 = 3; twrph1 = 0; tacls = 0;  cfg = S3C2410_NFCONF_EN;

 cfg |= S3C2410_NFCONF_TACLS(tacls - 1);

 cfg |= S3C2410_NFCONF_TWRPH0(twrph0 - 1);

 cfg |= S3C2410_NFCONF_TWRPH1(twrph1 - 1);  NFCONF = cfg;  

 nand->IO_ADDR_R = nand->IO_ADDR_W = 0x4e00000c;  

 nand->hwcontrol = s3c2410_hwcontrol;  nand->dev_ready = s3c2410_dev_ready; #ifdef CONFIG_S3C2410_NAND_HWECC

 nand->enable_hwecc = s3c2410_nand_enable_hwecc;

 nand->calculate_ecc = s3c2410_nand_calculate_ecc;

 nand->correct_data = s3c2410_nand_correct_data;

 nand->eccmode = NAND_ECC_HW3_512;

#else

 //nand->eccmode = NAND_ECC_SOFT; nand->eccmode = NAND_ECC_NONE; 

#endif #ifdef CONFIG_S3C2410_NAND_BBT

 nand->options = NAND_USE_FLASH_BBT;

#else

 nand->options = 0;

#endif #elif defined(CONFIG_S3C2440)

    twrph0 = 6; twrph1 = 2; tacls = 0;

 cfg = (tacls<<12)|(twrph0<<8)|(twrph1<<4);

 NFCONF = cfg;

 cfg = (1<<6)|(1<<4)|(0<<1)|(1<<0);

 NFCONT = cfg;

 nand->IO_ADDR_R = nand->IO_ADDR_W = (void *)0x4e000010;  

 nand->hwcontrol = s3c2410_hwcontrol;

 nand->dev_ready = s3c2410_dev_ready;

#ifdef CONFIG_S3C2440_NAND_HWECC

 nand->enable_hwecc = s3c2410_nand_enable_hwecc;

 nand->calculate_ecc = s3c2410_nand_calculate_ecc;

 nand->correct_data = s3c2410_nand_correct_data;

 nand->eccmode = NAND_ECC_HW3_512;

#else

// nand->eccmode = NAND_ECC_SOFT; nand->eccmode = NAND_ECC_NONE; 

#endif #ifdef CONFIG_S3C2440_NAND_BBT

 nand->options = NAND_USE_FLASH_BBT;

#else

 nand->options = 0;

#endif #endif  DEBUGN("end of nand_init/n");  return 0;

} #else

 #error "U-Boot legacy NAND support not available for S3C2410"

#endif

#endif   2)對include/configs、mini2440.h進行如下修改: 增加 #define CONFIG_CMD_NAND   #define CFG_ENV_IS_IN_NAND  1   

#define CFG_ENV_OFFSET   0X40000   

#define CFG_ENV_SIZE  0x10000 

//#define CONFIG_SETUP_MEMORY_TAGS 1

//#define CONFIG_CMDLINE_TAG 1

#if defined(CONFIG_CMD_NAND)

#define CFG_MAX_NAND_DEVICE 1           //just one nand flash chip on board

#define CFG_NAND_BASE      0x4e000000   //nand flash base address #define SECTORSIZE 2048

#define NAND_SECTOR_SIZE SECTORSIZE

#define NAND_BLOCK_MASK (SECTORSIZE - 1)

#define CONFIG_S3C2440_NAND_BOOT 1

#endif 3)增加對網口晶片的支援:   同在mini2440.h裡,修改Hardware drivers的定義:

//#define CONFIG_DRIVER_CS8900 1 

//#define CS8900_BASE  0x19000300

//#define CS8900_BUS16  1

#define CONFIG_DRIVER_DM9000 1

#define CONFIG_DM9000_BASE 0x20000300

#define DM9000_IO CONFIG_DM9000_BASE

#define DM9000_DATA (CONFIG_DM9000_BASE+4)

#define CONFIG_DM9000_USE_16BIT   并確定#define CONFIG_CMD_NET  打開,設定相關TFTP操作的定義,如下:   #define CONFIG_BOOTDELAY 3

#define CONFIG_BOOTARGS "root=ramfs devfs=mount console=ttySA0,115200n81"

#define CONFIG_ETHADDR 08:00:3e:26:0a:5b

#define CONFIG_NETMASK          255.255.255.0

#define CONFIG_IPADDR  192.168.1.250

#define CONFIG_SERVERIP  192.168.1.100

#define CONFIG_BOOTFILE "zImage.img"

#define CONFIG_BOOTCOMMAND "tftp 0x30008000 zImage.img/; bootm 30008000"   到這裡,make一下,你可以把zImage通過TFTP給BOOT 起來了。 注意zImage必須使用u-boot-1.3.4/toolsl裡的mkimage加上檔案頭才能被u-boot boot起來,本人寫了一個sh檔案: #!/bin/sh mkimage -n 'linux-2.6.31' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage zImage.img

#=================================================   (未完,待續)

u-boot-1.3.4移植到mini2440+128M nand boot