Mini2440之uboot移植之實踐單板添加(一)


一、u-boot移植概述

1.1 移植不同的硬件層次

我們要向不同的硬件平台上移植u-boot,我們必須明確不同硬件平台之間的差別。而硬件的差別體現在多個層面上。比如說我們使用的Mini2440開發板,采用的SOC芯片是三星公司的S3C2440,該SOC使用的內核(CPU)是ARM公司設計的ARM920T。ARM920T屬於ARM9系列,ARM920T系列內核基於ARMv4架構。

這里以S3C2440為例,我們從芯片手冊截取到這款芯片的內部結構圖,可以看到S3C2440主要由ARM920核+片內外設組成。

ARM920T里面的又些一下功能單元組成:

  • JTAG:一種調試或者測試芯片的接口,可以通過JTAG接口訪問CPU的內部寄存器和掛在總線上的設備,如Flash、RAM等,我們不必過多關注。
  • ARM9TMDI:它才是真正運行程序的。
  • 指令、數據MMU:包括兩個C13一起處理內存地址映射的。
  • 指令、數據Cache:包括寫回PATAG RAM、寫緩沖,一起完成高速緩存的功能。
  • CP15:這里是用於控制MMU和Cache的,還可以控制別的器件,不同的系統配置下是不同的。

從一種硬件平台向另一種硬件平台移植時,需要知道兩者之間在哪個硬件層次上開始有區別:

  • 同一種SOC,不同的開發板:那么區別可能就只存在於板載外設,需要修改或添加一些驅動;
  • 同一種內核,不同的SOC,不同的開發板:比如TI基於ARM920T做的SOC和三星基於ARM920T做的SOC,以及更下游廠商做的不同開發板,那么除了板載外設的不同,移植時還要根據不同SOC之間的差別做修改;
  • 同一種架構,不同的內核,不同的SOC,不同的開發板:比如Cortex-A53的板子和Cortex-A57的板子,那么移植的時候,板載外設、SOC、內核相關的程序都可能要修改;
  • 不同的架構,不同的內核,不同的SOC,不同的開發板:比如ARM9的板子和cortex-A8的板子(同出於ARM,架構還有一定的相似性),更有甚者ARM架構的板子和MIPS架構的板子,那么移植的工作量就非常大了,基本上,除了u-boot的硬件無關的程序,所有硬件相關的程序都要修改,修改的程度視兩者的差異大小而定;

一般越是上游的廠商面對的不同點越多,而下游的廠商在上游廠商移植的基礎上進行,比如ARM提供ARMv4架構以及ARM920T內核相關的程序:

  • 三星再此基礎上為其推出的SMDK2410做移植,就只需要提供SOC層面和開發板層面的程序;
  • 下游廠商使用S3C2440做產品,就可以在三星提供的SMDK2410的基礎上做一些修改以支持自己的板子;

1.2 u-boot流程圖繪制

我們在前面的幾篇博客中,我們以smdk2410為例,對u-boot源碼進行了分析。那么我們試着將我們前幾節介紹的內容連起來。繪制一個u-boot啟動流程圖:

 

二、u-boot移植步驟

既然我們想要移植u-boot,那么我們首先需要明白u-boot的啟動流程。u-boot移植大概可以分為以下幾個步驟:

  • 內核級配置和初始化;
  • SOC級別的配置與初始化;
  • board_init_f;
  • u-boot重定位;
  • board_init_r;
  • 啟動內核或者處理用戶命令;

2.1 內核級配置和初始化

這個主要就是在start.S文件里面那些匯編代碼,主要包括:

  • 開啟SVC模式,關閉fiq,irq中斷;
  • 關閉看門狗
  • 屏蔽所有中斷;
  • 設置系統時鍾;
  • 執行cpu_init_crit函數;
    • 關閉關閉MMU和cache;
    • lowlevel_init函數;

這部分是和內核息息相關的代碼,這部分根據內核的不同,配置略有區別。

2.2 SOC級別的配置與初始化

這部分的內容是比較多的,而且可以說貫穿整個u-boot,但基本上必要的都集中在lowlevel_init,其它的就取決於你是否要在u-boot階段使用某些硬件資源了。

2.3 board_init_f

這個階段主要是對u-boot之后重定位進行內存的規划,雖然執行的子函數多,但都不復雜。移植內容少。

2.4 u-boot重定位

這部分代碼基本不需要改。

2.5 board_init_r

這個階段干的事主要就是准備終端,初始化需要用到的硬件資源,如果使用新的驅動模型的話,還要像kernel一樣將硬件進行抽象。這個根據自己的需求,用了什么就要改什么。

2.6 啟動內核或者處理用戶命令

u-boot最大的使命就是啟動內核,所以這部分也是核心的內容。board_init_r最后會調用run_main_loop進入一個循環,要么就是直接去啟動內核,要么就是進入終端處理用戶命令和用戶交互。也可以說不用改,差不多已經是純軟件干的事了。

三、添加單板

我們在移植u-boot到Mini2440開發板時,通常會在SMDK2410基礎上進行修改,這是三星推出的開發板,使用的是S3C2410這款SOC。其實很多芯片廠商在推出新款SOC的時候,都會推出基於此SOC的開發板,以幫助用戶使用該SOC設計產品,從而達到推廣該SOC的目的。而三星在推出SMDK2410的時候,也向u-boot官方提供了相應的移植程序,這正是我們移植的重要參照。

S3C2410和S3C2440都是基於ARM920T內核的,由於u-boot-2016.0目前只支持支持S3C2410,所以我們可以直接將S3C2410的單板相關文件都復制為S3C2440的。

3.在board中創建單板目錄(board/samsung/smdk2440)

cd board/samsung/
cp smdk2410 -r smdk2440

進入smdk2440路徑:

修改文件Kconfig:

if TARGET_SMDK2440

config SYS_BOARD
        default "smdk2440"

config SYS_VENDOR
        default "samsung"

config SYS_SOC
        default "s3c24x0"

config SYS_CONFIG_NAME
        default "smdk2440"

endif

修改MAINTAINERS文件:

SMDK2440 BOARD
M:      David Müller <d.mueller@elsoft.ch>
S:      Maintained
F:      board/samsung/smdk2440/
F:      include/configs/smdk2440.h
F:      configs/smdk2440_defconfig

從這里可以看到,后面我們還需要創建include/configs/smdk2440.h、configs/smdk2440_defconfig。

修改Makefile文件:

#
# (C) Copyright 2000-2006
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
#
# SPDX-License-Identifier:      GPL-2.0+
#

obj-y   := smdk2440.o
obj-y   += lowlevel_init.o

smdk2410.c改名為smdk2440.c

mv smdk2410.c smdk2440.c

3.2 創建單板相關頭文件(include/configs/smdk2440.h)

同樣,我們將include/configs/目錄下的smdk2410.h文件復制為smdk2440.h:

cd include/configs
cp smdk2410.h smdk2440.h

這個文件很重要,這里主要用來配置編譯u-boot時是否啟用某些功能,比如網卡,LCD等,如果定義了,那么將會編譯相關模塊的代碼。

修改smdk2440.h中字符串2410->2440:

#define CONFIG_S3C2440          /* specifically a SAMSUNG S3C2440 SoC */
#define CONFIG_SMDK2440         /* on a SAMSUNG SMDK2440 Board */
/*
 * NAND configuration
 */
#ifdef CONFIG_CMD_NAND
#define CONFIG_NAND_S3C2440
#define CONFIG_SYS_S3C2440_NAND_HWECC
#define CONFIG_SYS_MAX_NAND_DEVICE      1
#define CONFIG_SYS_NAND_BASE            0x4E000000
#endif

3.3 創建defconfig文件

在執行make smdk2440_defconfig,依賴於configs/smdk2440_defconfig文件,所以我們也將smdk2410_defconfig復制過來:

cd configs
cp smdk2410_defconfig smdk2440_defconfig

修改smdk2440_defconfig:

CONFIG_ARM=y
CONFIG_TARGET_SMDK2440=y
CONFIG_HUSH_PARSER=y
CONFIG_SYS_PROMPT="SMDK2440 # "
CONFIG_CMD_USB=y
# CONFIG_CMD_SETEXPR is not set
CONFIG_CMD_DHCP=y
CONFIG_CMD_PING=y
CONFIG_CMD_CACHE=y
CONFIG_CMD_EXT2=y
CONFIG_CMD_FAT=y

3.4 修改arch/arm/Kconfig文件

vim arch/arm/Kconfig

添加以下內容:

config TARGET_SMDK2440
    bool "Support smdk2440"
    select CPU_ARM920T

source "board/samsung/smdk2440/Kconfig"

3.5 嘗試配置並編譯

在做完上述步驟的時候,我們就完成了S3C2440單板的添加,雖然都是復制S3C2410的,但我們只要在S3C2410的配置文件基礎上進行修改即可。

make smdk2440_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux- V=1

第一步可以編譯成功,第二步會編譯失敗,主要是因為我們在include/configs/smdk2440.h中配置了NAND,但是我們沒有移植相關代碼。

四、 內核級配置和初始化(arch/arm/cpu/arm920t/start.S)

我們首先來分析arch/arm/cpu/arm920t/start.S文件,看看有沒有需要修改的地方。

我們需要修改的第一處就是時鍾系統設置。初始化系統時鍾 FCLK = 400MHz,HCLK = 100MHz, PCLK = 50MHz, UPLL=48MHz 。

#ifdef CONFIG_S3C24X0
        /* turn off the watchdog */

# if defined(CONFIG_S3C2400)
#  define pWTCON        0x15300000
#  define INTMSK        0x14400008      /* Interrupt-Controller base addresses */
#  define CLKDIVN       0x14800014      /* clock divisor register */
#else
#  define pWTCON        0x53000000
#  define INTMSK        0x4A000008      /* Interrupt-Controller base addresses */
#  define INTSUBMSK     0x4A00001C
/*  初始化系統時鍾 FCLK = 400MHz,HCLK = 100MHz, PCLK = 50MHz, UPLL=48MHz  */
#  define LOCKTIME      0x4c000000
#  define MPLLCON       0x4c000004
#  define UPLLCON       0x4c000008
#  define CLKDIVN       0x4c000014
#  define M_MDIV        92       /* Fin=12M  UPLL=400M  */
#  define M_PDIV        1
#  define M_SDIV        1
#  define U_MDIV        56        /* Fin=12M  UPLL=48M  */
#  define U_PDIV        2
#  define U_SDIV        2
#  define DIVN_UPLL     0         /* FCLK:HCLK:PCLK=1:4:8 */
#  define HDIVN         2
#  define PDIVN         1
# endif

        ldr     r0, =pWTCON
        mov     r1, #0x0
        str     r1, [r0]

        /*
         * mask all IRQs by setting all bits in the INTMR - default
         */
        mov     r1, #0xffffffff
        ldr     r0, =INTMSK
        str     r1, [r0]
# if defined(CONFIG_S3C2410)
        ldr     r1, =0x3ff
        ldr     r0, =INTSUBMSK
        str     r1, [r0]
# endif

        /* 設置Lock Time  */
        ldr     r0, =LOCKTIME
        ldr     r1, =0xffffffff
        str     r1, [r0]

        /* 設置分頻系數 */
        ldr     r0, =CLKDIVN
        ldr     r1, =((DIVN_UPLL<<3) | HDIVN <<1 | PDIVN)
        str     r1, [r0]

        /* CPU改為異步總線模式 */
        mrc      p15,0,r1,c1,c0,0
        orr      r1, r1,#0xC0000000
        mcr      p15,0,r1,c1,c0,0

        /* 設置UPLL */
        ldr      r0, =UPLLCON
        ldr      r1, =((U_MDIV<<12) | (U_PDIV<<4) | U_SDIV)
        str      r1, [r0]

        nop
        nop
        nop
        nop
        nop
        nop
        nop

        /* 設置MPLL */
        ldr     r0, =MPLLCON
        ldr     r1, =((M_MDIV << 12) | (M_PDIV << 4) | M_SDIV)
        str     r1, [r0]

#endif  /* CONFIG_S3C24X0 */

五、SOC級別的配置與初始化(board/samsung/smdk2440/lowlevel_init.S)

在lowlevel_init.S文件中主要包含初始化SDRAM的代碼。SDRAM的初始化取決於我們外接的SDRAM芯片

以Mini2440開發板為例:將兩片32MB,16位寬SDRAM內存(型號HY57V561620FTP)焊接在Bank6,並聯形成64M,32位內存。因此這里我們主要關注Bandk6相關的配置。

我們將源代碼中的配置和Mini2440裸機開發之存儲器控制器中的代碼做個對比,我們需要修改以下幾處:

#define REFCNT            1269     /* period=7.8125us, HCLK=60Mhz, (2048+1-7.8125*100) */

更改BANKSIZE為0xB1:

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 0xB1
    .word 0x30
    .word 0x30

 六、 board_init_f

既然在start.S中已經進行時鍾頻率設置了,那在board_init_f中就沒必要進行時鍾頻率設置了。

其中board_early_init_f這個函數定義在board/samsung/smdk2440/smdk2440.c,在里面進行時鍾頻率設置,所以我們需要修改這個函數中的內容,去掉時鍾頻率設置。

將board_early_init_f函數修改如下:

int board_early_init_f(void)
{
        struct s3c24x0_clock_power * const clk_power =
                                        s3c24x0_get_base_clock_power();
        struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio();

        /* to reduce PLL lock time, adjust the LOCKTIME register */
//      writel(0xFFFFFF, &clk_power->locktime);

        /* configure MPLL */
//      writel((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV,
//             &clk_power->mpllcon);

        /* some delay between MPLL and UPLL */
//      pll_delay(4000);

        /* configure UPLL */
//      writel((U_M_MDIV << 12) + (U_M_PDIV << 4) + U_M_SDIV,
//             &clk_power->upllcon);

        /* some delay between MPLL and UPLL */
//      pll_delay(8000);

        /* set up the I/O ports */
        writel(0x007FFFFF, &gpio->gpacon);
        writel(0x00044555, &gpio->gpbcon);
        writel(0x000007FF, &gpio->gpbup);
        writel(0xAAAAAAAA, &gpio->gpccon);
        writel(0x0000FFFF, &gpio->gpcup);
        writel(0xAAAAAAAA, &gpio->gpdcon);
        writel(0x0000FFFF, &gpio->gpdup);
        writel(0xAAAAAAAA, &gpio->gpecon);
        writel(0x0000FFFF, &gpio->gpeup);
        writel(0x000055AA, &gpio->gpfcon);
        writel(0x000000FF, &gpio->gpfup);
        writel(0xFF95FFBA, &gpio->gpgcon);
        writel(0x0000FFFF, &gpio->gpgup);
        writel(0x002AFAAA, &gpio->gphcon);
        writel(0x000007FF, &gpio->gphup);

        return 0;
}

串口初始化函數serial_init在初始化串口0的時候,會利用get_PCLK方法(位於arch/arm/cpu/arm920t/s3c24x0/speed.c)獲取PCLK時鍾頻率,然后計算波特率,根據實際情況判斷是否需要修改該方法。

/* return HCLK frequency */
ulong get_HCLK(void)
{
        struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();
#ifdef CONFIG_S3C2440
        switch (readl(&clk_power->clkdivn) & 0x6) {
        default:
        case 0:
                return get_FCLK();
        case 2:
                return get_FCLK() / 2;
        case 4:
                return (readl(&clk_power->camdivn) & (1 << 9)) ?
                        get_FCLK() / 8 : get_FCLK() / 4;
        case 6:
                return (readl(&clk_power->camdivn) & (1 << 8)) ?
                        get_FCLK() / 6 : get_FCLK() / 3;
        }
#else
        return (readl(&clk_power->clkdivn) & 2) ? get_FCLK() / 2 : get_FCLK();
#endif
}

/* return PCLK frequency */
ulong get_PCLK(void)
{
        struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();

        return (readl(&clk_power->clkdivn) & 1) ? get_HCLK() / 2 : get_HCLK();
}

七、u-boot重定位

 這一塊代碼我們不做修改。

八、 board_init_r

因為我們在smdk2440.h中配置了CONFIG_CMD_NAND,因此我們需要修改nand初始化相關的代碼。

復制drivers/mtd/nand/s3c2410_nand.c->drivers/mtd/nand/s3c2440_nand.c。

cd  drivers/mtd/nand
cp  s3c2410_nand.c s3c2440_nand.c

修改s3c2440_nand.c,將代碼中的2410->2440。

修改drivers/mtd/nand/Makefile,添加如下代碼:

obj-$(CONFIG_NAND_S3C2440) += s3c2440_nand.o

九、啟動內核或者處理用戶命令

 這一塊代碼我們不做修改。

十、編譯、下載到NOR FALSH

10.1 編譯

make distclean
make smdk2440_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux- V=1

10.2 下載

(1) 打開J-Flash ARM,並進入菜單:Options–>Project settings.

(2)  主要設置CPU選項和Flash選項:

CPU :
Core --> ARM9, Little endian

Use target RAM(faster)–>Addr:0x40000000 4KB(不選很慢;從Nor flash啟動時內部SRAM的地址和大小,參考S3C2440A的芯片手冊)。

初始化序列(Init sequence)按下面的填,簡單做了下注釋。

##-------Action-----Value0------Value1

Halt
Disable MMU
Write 32bit 0x53000000 0x00000000 ; pWTCON , 看門狗定時器控制寄存器
Write 32bit 0x4A000008 0xFFFFFFFF ; INTMSK , 中斷屏蔽寄存器
Write 32bit 0x4A00001C 0x000007FF ; INTSUBMSK , 針對INTMAK具體化的一個中斷請求屏蔽寄存器
Write 32bit 0x53000000 0x00000000 ; pWTCON , 看門狗定時器控制寄存器 
Write 32bit 0x56000050 0x000055AA ; rGPFCON , Port F control
Write 32bit 0x4C000014 0x00000007 ; CLKDIVN , CPU時鍾分頻控制寄存器
Write 32bit 0x4C000000 0x00FFFFFF ; LOCKTIME , 鎖時計數寄存器
Write 32bit 0x4C000004 0x00061012 ; MPLLCON , MPLL寄存器
Write 32bit 0x4C000008 0x00040042 ; UPLLCON , UPLL寄存器 
Write 32bit 0x48000000 0x22111120 ; Bus width & wait status
Write 32bit 0x48000004 0x00002F50 ; Boot ROM control
Write 32bit 0x48000008 0x00000700 ; BANK1 control
Write 32bit 0x4800000C 0x00000700 ; BANK2 control
Write 32bit 0x48000010 0x00000700 ; BANK3 control
Write 32bit 0x48000014 0x00000700 ; BANK4 control
Write 32bit 0x48000018 0x0007FFFC ; BANK5 control
Write 32bit 0x4800001C 0x00018005 ; BANK6 control
Write 32bit 0x48000020 0x00018005 ; BANK7 control
Write 32bit 0x48000024 0x008E0459 ; DRAM/SDRAM refresh
Write 32bit 0x48000028 0x00000032 ; Flexible Bank Size
Write 32bit 0x4800002C 0x00000030 ; Mode register set for SDRAM
Write 32bit 0x48000030 0x00000030 ; Mode register set for SDRAM

(3) Target->Connect,必須設為norflash啟動才能檢測到flash。

(4) 擊File菜單的Open data File,打開想要下載的bin文件(比如uboot/supervivi/superboot等),在彈出的起始地址中輸入0即可。

然后點擊Target菜單中的Auto,或者直接按F7鍵,啟動下載流程。大約幾秒鍾就下載完畢了。

(5) 燒寫完成后,關電,取下JLINK,以NOR方式重新啟動即可進入u-boot界面:

如果我們想打印更加詳細的信息,可以在include/configs/smdk2440.h中加入如下宏,重新編譯,下載運行,則可以打印更多調試相關信息:

#define DEBUG

這里信息比較多,我就不截圖了:

initcall: 0005d4f4


U-Boot 2016.05 (Nov 28 2021 - 11:58:20 +0800)

initcall: 0000f1b8
U-Boot code: 00000000 -> 0007E90C  BSS: -> 000CDF70
initcall: 000003f8
CPUID: 32440001
FCLK:      400 MHz
HCLK:      100 MHz
PCLK:       50 MHz
initcall: 0000f40c
DRAM:  initcall: 000011f0
initcall: 0000f35c
Monitor len: 000CDF70
Ram size: 04000000
Ram top: 34000000
initcall: 0000ef94
initcall: 0000f160
TLB table from 33ff0000 to 33ff4000
initcall: 0000efac
initcall: 0000f114
Reserving 823k for U-Boot at: 33f22000
initcall: 0000f0e8
Reserving 4160k for malloc() at: 33b12000
initcall: 0000f310
Reserving 80 Bytes for Board Info at: 33b11fb0
initcall: 0000efb4
initcall: 0000f0b4
Reserving 168 Bytes for Global Data at: 33b11f08
initcall: 0000f03c
initcall: 0000efe8
initcall: 0000efbc
initcall: 0000f3fc
initcall: 0000f288

RAM Configuration:
Bank #0: 30000000 64 MiB

DRAM:  64 MiB
initcall: 0000f020
New Stack Pointer is: 33b11ee0
initcall: 0000f24c
initcall: 0000f1e4
Relocation Offset is: 33f22000
Relocating to 33f22000, new gd at 33b11f08, sp at 33b11ee0
initcall: 33f31488
initcall: 33f31490
initcall: 0000f674 (relocated to 33f31674)
WARNING: Caches not enabled
initcall: 0000f4a8 (relocated to 33f314a8)
initcall: 0000f4d0 (relocated to 33f314d0)
initcall: 0000f658 (relocated to 33f31658)
using memory 0x33b12000-0x33f22000 for malloc()
initcall: 0000f4d8 (relocated to 33f314d8)
initcall: 0000f464 (relocated to 33f31464)
initcall: 0000f644 (relocated to 33f31644)
initcall: 00001228 (relocated to 33f23228)
dram_bank_mmu_setup: bank: 0
initcall: 000182a0 (relocated to 33f3a2a0)
initcall: 0000f634 (relocated to 33f31634)
initcall: 0000f59c (relocated to 33f3159c)
Now running in RAM - U-Boot at: 33f22000
initcall: 0000f4e0 (relocated to 33f314e0)
initcall: 0000f5b8 (relocated to 33f315b8)
Flash: fwc addr 00000000 cmd f0 00f0 16bit x 16 bit
fwc addr 0000aaaa cmd aa 00aa 16bit x 16 bit
fwc addr 00005554 cmd 55 0055 16bit x 16 bit
fwc addr 0000aaaa cmd 90 0090 16bit x 16 bit
fwc addr 00000000 cmd f0 00f0 16bit x 16 bit
JEDEC PROBE: ID 1 2249 0
fwc addr 00000000 cmd ff 00ff 16bit x 16 bit
fwc addr 00000000 cmd 90 0090 16bit x 16 bit
fwc addr 00000000 cmd ff 00ff 16bit x 16 bit
JEDEC PROBE: ID be ea00 0
0 Bytes
initcall: 0000f580 (relocated to 33f31580)
NAND:  board_nand_init()
end of nand_init
hwcontrol(): 0xff 0x83
hwcontrol(): 0xffffffff 0x81
dev_ready
hwcontrol(): 0x90 0x83
hwcontrol(): 0x00 0x85
hwcontrol(): 0xffffffff 0x81
dev_ready
hwcontrol(): 0x90 0x83
hwcontrol(): 0x00 0x85
hwcontrol(): 0xffffffff 0x81
dev_ready
hwcontrol(): 0x90 0x83
hwcontrol(): 0x40 0x85
hwcontrol(): 0xffffffff 0x81
dev_ready
hwcontrol(): 0xffffffff 0x80
0 MiB
initcall: 0000f550 (relocated to 33f31550)
*** Warning - bad CRC, using default environment

Destroy Hash Table: 33f9b120 table = 00000000
Create Hash Table: N=75
INSERT: table 33f9b120, filled 1/79 rv 33b12238 ==> name="bootdelay" value="5"
INSERT: table 33f9b120, filled 2/79 rv 33b120f8 ==> name="baudrate" value="115200"
INSERT: table 33f9b120, filled 3/79 rv 33b120a8 ==> name="ipaddr" value="10.0.0.110"
INSERT: table 33f9b120, filled 4/79 rv 33b12260 ==> name="serverip" value="10.0.0.1"
INSERT: table 33f9b120, filled 5/79 rv 33b124f4 ==> name="netmask" value="255.255.255.0"
INSERT: free(data = 33b12008)
INSERT: done
initcall: 0000f478 (relocated to 33f31478)
initcall: 00018360 (relocated to 33f3a360)
initcall: 0000f540 (relocated to 33f31540)
initcall: 00015fb4 (relocated to 33f37fb4)
In:    serial
Out:   serial
Err:   serial
Initial value for argc=3
Final value for argc=3
Initial value for argc=3
Final value for argc=3
Initial value for argc=3
Final value for argc=3
initcall: 00000c1c (relocated to 33f22c1c)
initcall: 0000f530 (relocated to 33f31530)
initcall: 0000f510 (relocated to 33f31510)
initcall: 0000f4f4 (relocated to 33f314f4)
Net:   Initial value for argc=3
Final value for argc=3
CS8900-0
Error: CS8900-0 address not set.

initcall: 0000f4e8 (relocated to 33f314e8)
### main_loop entered: bootdelay=5

### main_loop: bootcmd="<UNDEFINED>"
SMDK2440 # 

(6) 保存flash項目,File->Save project方便下次使用。

參考文章

[1]1.移植uboot-分析uboot啟動流程(詳解)

[2]u-boot2020.04移植(總結)

[3]U-BOOT-2016.07移植 (第二篇) 添加單板

[4]U-BOOT-2016.07移植 (第四篇) 修改代碼,從NOR啟動

[5]S3C2440移植uboot之支持NORFLASH

[6]S3C2440移植uboot之支持NAND啟動

[7]S3C2440移植uboot之新建單板_時鍾_SDRAM_串口

[8]移植u-boot-2019.10到jz2440(推薦)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM