娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

uboot在s3c2440上的移植(3)

發布者:Serendipitous33最新更新時間:2024-08-29 來源: cnblogs關鍵字:uboot  s3c2440  移植 手機看文章 掃描二維碼
隨時隨地手機看文章

一、移植環境

  • 主  機:VMWare--Fedora 9

  • 開發板:Mini2440--64MB Nand,Kernel:2.6.30.4

  • 編譯器:arm-linux-gcc-4.3.2.tgz

  • u-boot:u-boot-2009.08.tar.bz2

二、移植步驟

5)準備進入u-boot的第二階段(在u-boot中添加對我們開發板上Nand Flash的支持)。
目前u-boot中還沒有對2440上Nand Flash的支持,也就是說要想u-boot從Nand Flash上啟動得自己去實現了。

首先,在include/configs/my2440.h頭文件中定義Nand要用到的宏和寄存器,如下:

#gedit include/configs/my2440.h  //在文件末尾加入以下Nand Flash相關定義

/*
 * Nand flash register and envionment variables 
 */
#define CONFIG_S3C2440_NAND_BOOT  1

#define NAND_CTL_BASE  0x4E000000  //Nand Flash配置寄存器基地址,查2440手冊可得知

#define STACK_BASE  0x33F00000     //定義堆棧的地址
#define STACK_SIZE  0x8000         //堆棧的長度大小

#define oNFCONF  0x00 //相對Nand配置寄存器基地址的偏移量,還是配置寄存器的基地址
#define oNFCONT  0x04 //相對Nand配置寄存器基地址的偏移量,可得到控制寄存器的基地址(0x4E000004)

#define oNFADDR  0x0c //相對Nand配置寄存器基地址的偏移量,可得到地址寄存器的基地址(0x4E00000c)
#define oNFDATA  0x10 //相對Nand配置寄存器基地址的偏移量,可得到數據寄存器的基地址(0x4E000010)
#define oNFCMD   0x08 //相對Nand配置寄存器基地址的偏移量,可得到指令寄存器的基地址(0x4E000008)
#define oNFSTAT  0x20 //相對Nand配置寄存器基地址的偏移量,可得到狀態寄存器的基地址(0x4E000020)

#define oNFECC   0x2c //相對Nand配置寄存器基地址的偏移量,可得到ECC寄存器的基地址(0x4E00002c)

 

其次,修改cpu/arm920t/start.S這個文件,使u-boot從Nand Flash啟動,在上一節中提過,u-boot默認是從Nor Flash啟動的。修改部分如下:

#gedit cpu/arm920t/start.S

//注意:在上一篇Nor Flash啟動中,我們為了把u-boot用supervivi下載到內存中運行而屏蔽掉這段有關CPU初始化的代碼。而現在我們要把u-boot下載到Nand Flash中,從Nand Flash啟動,所以現在要恢復這段代碼。

#ifndef CONFIG_SKIP_LOWLEVEL_INIT 
    bl cpu_init_crit
#endif

 

#if 0 //屏蔽掉u-boot中的從Nor Flash啟動部分
#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 */
#endif

 

//下面添加2440中u-boot從Nand Flash啟動

#ifdef CONFIG_S3C2440_NAND_BOOT
    mov r1, #NAND_CTL_BASE   //復位Nand Flash
    ldr r2, =( (7<<12)|(7<<8)|(7<<4)|(0<<0) )
    str r2, [r1, #oNFCONF]   //設置配置寄存器的初始值,參考s3c2440手冊
    ldr r2, [r1, #oNFCONF]

    ldr r2, =( (1<<4)|(0<<1)|(1<<0) )
    str r2, [r1, #oNFCONT]   //設置控制寄存器
    ldr r2, [r1, #oNFCONT]

    ldr r2, =(0x6)           //RnB Clear
    str r2, [r1, #oNFSTAT]
    ldr r2, [r1, #oNFSTAT]
    mov r2, #0xff            //復位command
    strb r2, [r1, #oNFCMD]

    mov r3, #0               //等待
nand1: 
    add r3, r3, #0x1
    cmp r3, #0xa
    blt nand1

nand2:
    ldr r2, [r1, #oNFSTAT]   //等待就緒
    tst r2, #0x4
    beq nand2

    ldr r2, [r1, #oNFCONT]
    orr r2, r2, #0x2         //取消片選
    str r2, [r1, #oNFCONT]

    //get read to call C functions (for nand_read())
    ldr sp, DW_STACK_START   //為C代碼準備堆棧,DW_STACK_START定義在下面 
    mov fp, #0               

    //copy U-Boot to RAM
    ldr r0, =TEXT_BASE//傳遞給C代碼的第一個參數:u-boot在RAM中的起始地址
    mov r1, #0x0      //傳遞給C代碼的第二個參數:Nand Flash的起始地址
    mov r2, #0x30000  //傳遞給C代碼的第三個參數:u-boot的長度大小(128k)
    bl nand_read_ll   //此處調用C代碼中讀Nand的函數,現在還沒有要自己編寫實現
    tst r0, #0x0
    beq ok_nand_read

bad_nand_read:
    loop2: b loop2    //infinite loop

ok_nand_read:
    //檢查搬移后的數據,如果前4k完全相同,表示搬移成功
    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_S3C2440_NAND_BOOT

 

_start_armboot: .word start_armboot //在這一句的下面加上DW_STACK_START的定義

.align 2
DW_STACK_START: .word STACK_BASE+STACK_SIZE-4

 

再次,在board/samsung/my2440/目錄下新建一個nand_read.c文件,在該文件中來實現上面匯編中要調用的nand_read_ll函數,代碼如下:

然后,在board/samsung/my2440/Makefile中添加nand_read.c的編譯選項,使他編譯到u-boot中,如下:

COBJS    := my2440.o flash.o nand_read.o

 

還有一個重要的地方要修改,在cpu/arm920t/u-boot.lds中,這個u-boot啟動連接腳本文件決定了u-boot運行的入口地址,以及各個段的存儲位置,這也是鏈接定位的作用。添加下面兩行代碼的主要目的是防止編譯器把我們自己添加的用于nandboot的子函數放到4K之后,否則是無法啟動的。如下:

.text :
{
    cpu/arm920t/start.o    (.text)
    board/samsung/my2440/lowlevel_init.o (.text)
    board/samsung/my2440/nand_read.o (.text)
    *(.text)
}

 

最后編譯u-boot,生成u-boot.bin文件。然后先將mini2440開發板調到Nor啟動檔,利用supervivi的a命令將u-boot.bin下載到開發板的Nand Flash中,再把開發板調到Nand啟動檔,打開電源就從Nand Flash啟動了,啟動結果圖如下:

從上面的運行圖看,顯然現在的Nand還不能做任何事情,而且也沒有顯示有關Nand的任何信息,所以只能說明上面的這些步驟只是完成了Nand移植的Stage1部分。下面我們來添加我們開發板上的Nand Flash(K9F1208U0C)的Stage2部分的有關操作支持。

6)現在進入u-boot的第二階段(添加Nand Flash(K9F1208U0C)的有關操作支持)。
在上一節中我們說過,通常在嵌入式bootloader中,有兩種方式來引導啟動內核:從Nor Flash啟動和從Nand Flash啟動,但不管是從Nor啟動或者從Nand啟動,進入第二階段以后,兩者的執行流程是相同的。

當u-boot的start.S運行到“_start_armboot: .word start_armboot”時,就會調用lib_arm/board.c中的start_armboot函數,至此u-boot正式進入第二階段。此時注意:以前較早的u-boot版本進入第二階段后,對Nand Flash的支持有新舊兩套代碼,新代碼在drivers/nand目錄下,舊代碼在drivers/nand_legacy目錄下,CFG_NAND_LEGACY宏決定了使用哪套代碼,如果定義了該宏就使用舊代碼,否則使用新代碼。但是現在的u-boot-2009.08版本對Nand的初始化、讀寫實現是基于最近的Linux內核的MTD架構,刪除了以前傳統的執行方法,使移植沒有以前那樣復雜了,實現Nand的操作和基本命令都直接在drivers/mtd/nand目錄下(在doc/README.nand中講得很清楚)。下面我們結合代碼來分析一下u-boot在第二階段的執行流程: 

 

因為2440和2410對nand控制器的操作有很大的不同,所以s3c2410_nand.c下對nand操作的函數就是我們做移植需要實現的部分了,他與具體的Nand Flash硬件密切相關。為了區別與2410,這里我們就重新建立一個s3c2440_nand.c文件,在這里面來實現對nand的操作,代碼如下:


最后,重新編譯u-boot并使用supervivi的a命令下載到Nand Flash中,把開發板調到Nand檔從Nand啟動,啟動結果圖如下:

從上圖可以看出,現在u-boot已經對我們開發板上64M的Nand Flash完全支持了。Nand相關的基本命令也都可以正常使用了。

補充內容:

從以上的啟動信息看,有一個警告信息“*** Warning - bad CRC or NAND, using default environment”,我們知道,這是因為我們還沒有將u-boot的環境變量保存nand中的緣故,那現在我們就用u-boot的saveenv命令來保存環境變量,如下:

從上圖可以看到保存環境變量并沒有成功,而且從信息看他將把環境變量保存到Flash中,顯然這不正確,我們是要保存到Nand中。原來,u-boot在默認的情況下把環境變量都是保存到Nor Flash中的,所以我們要修改代碼,讓他保存到Nand中,如下:

#gedit include/configs/my2440.h

//注釋掉環境變量保存到Flash的宏(注意:如果你要使用上一篇中的從Nor啟動的saveenv命令,則要恢復這些Flash宏定義)

//#define CONFIG_ENV_IS_IN_FLASH 1
//#define CONFIG_ENV_SIZE      0x10000 /* Total Size of Environment Sector */

 

//添加環境變量保存到Nand的宏(注意:如果你要使用上一篇中的從Nor啟動的saveenv命令,則不要這些Nand宏定義)

#define CONFIG_ENV_IS_IN_NAND  1
#define CONFIG_ENV_OFFSET      0x30000 //將環境變量保存到nand中的0x30000位置
#define CONFIG_ENV_SIZE        0x10000 /* Total Size of Environment Sector */

 

重新編譯u-boot,下載到nand中,啟動開發板再來保存環境變量,如下:

可以看到,現在成功保存到Nand中了,為了驗證,我們重新啟動開發板,那條警告信息現在沒有了,如下:

 

 

#gedit drivers/mtd/nand/s3c2440_nand.c   //新建s3c2440_nand.c文件

#include

#if 0
#define DEBUGN    printf
#else
#define DEBUGN(x, args ...) {}
#endif

#include
#include
#include

 

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

 

#define NF_BASE  0x4e000000             //Nand配置寄存器基地址
#define NFCONF   __REGi(NF_BASE + 0x0)  //偏移后還是得到配置寄存器基地址
#define NFCONT   __REGi(NF_BASE + 0x4)  //偏移后得到Nand控制寄存器基地址
#define NFCMD    __REGb(NF_BASE + 0x8)  //偏移后得到Nand指令寄存器基地址
#define NFADDR   __REGb(NF_BASE + 0xc)  //偏移后得到Nand地址寄存器基地址
#define NFDATA   __REGb(NF_BASE + 0x10) //偏移后得到Nand數據寄存器基地址
#define NFMECCD0 __REGi(NF_BASE + 0x14) //偏移后得到Nand主數據區域ECC0寄存器基地址
#define NFMECCD1 __REGi(NF_BASE + 0x18) //偏移后得到Nand主數據區域ECC1寄存器基地址
#define NFSECCD  __REGi(NF_BASE + 0x1C) //偏移后得到Nand空閑區域ECC寄存器基地址
#define NFSTAT   __REGb(NF_BASE + 0x20) //偏移后得到Nand狀態寄存器基地址
#define NFSTAT0  __REGi(NF_BASE + 0x24) //偏移后得到Nand ECC0狀態寄存器基地址
#define NFSTAT1  __REGi(NF_BASE + 0x28) //偏移后得到Nand ECC1狀態寄存器基地址
#define NFMECC0  __REGi(NF_BASE + 0x2C) //偏移后得到Nand主數據區域ECC0狀態寄存器基地址
#define NFMECC1  __REGi(NF_BASE + 0x30) //偏移后得到Nand主數據區域ECC1狀態寄存器基地址
#define NFSECC   __REGi(NF_BASE + 0x34) //偏移后得到Nand空閑區域ECC狀態寄存器基地址
#define NFSBLK   __REGi(NF_BASE + 0x38) //偏移后得到Nand塊開始地址
#define NFEBLK   __REGi(NF_BASE + 0x3c) //偏移后得到Nand塊結束地址

[1] [2]
關鍵字:uboot  s3c2440  移植 引用地址:uboot在s3c2440上的移植(3)

上一篇:u-boot分析與移植——基于u-boot-2011.3和FL2440
下一篇:uboot在s3c2440上的移植(1)

推薦閱讀最新更新時間:2025-04-16 06:07

u-boot-2016.09移植(2)-uboot啟動簡易分析
注:此文與下面關于uboot的移植都參考了《嵌入式linux學習筆記(基于s5pv210、tq210)》 不管什么版本的uboot都是在arch/arm/cpu/u-boot-spl.lds和arch/arm/cpu/u-boot.lds中制定了入口函數ENTRY(_start),u-boot-2016.09也不例外,搜索發現_start在arch/arm/lib/vectors.S中實現: _start首先執行reset,然后定義異常向量表,reset在arch/arm/cpu/armv7/start.S中實現 在reset中只執行了一條跳轉指令,save_boot_params的功能是跳轉到save_boot_pa
[單片機]
u-boot-2016.09<font color='red'>移植</font>(2)-<font color='red'>uboot</font>啟動簡易分析
詳細講解 移植Uboot到ARMer9開發系統上
首先了解ARMer9開發系統硬件設計上和三星原裝SMDK2410之間的區別。讓uboot在ARMer9開發系統上跑起來,目前只需要關注如下的硬件區別,解決了下面這個問題,uboot就可以在ARMer9開發系統上正常地從串口輸出,進入提示符。很多命令都可以使用,當然有些命令需要做修改。 SMDK2410 : nor flash 是AMD的1M的; ARMer9: 是Intel E28F128J3A, 兩片并聯,一共32M Bytes. 下載一個uboot-1.1.1.tar.bz2.; tar jxvf uboot-1.1.1.tar.bz2; 在uboot 目錄board/smdk2410 下的flash.
[單片機]
S3C2440之NAND FLASH移植到S3C2410的驅動分析
S3C2440A的NAND FLASH驅動移植到S3C2410還是有些不一樣的,最主要的這兩個IC的NAND FLASH的寄存器有些不一樣,請看下面的兩者之間不同: // // Copyright (c) Microsoft Corporation. All rights reserved. // // // Use of this source code is subject to the terms of the Microsoft end-user // license agreement (EULA) under which you licensed this SOFTWARE PRODUC
[單片機]
uboot總結:uboot配置和啟動過程3(config.mk分析)
說明:文件位置:在uboot的目錄下,文件名為:config.mk。是一個makefile文件,以后會被主Makefile調用。 它的主要作用的是: (1)具體的設置交叉編譯工具鏈接(主Makefile中也有設置交叉編譯工具鏈) (2)加載include/autoconfig.mk文件(這個文件是在主Makefile中生成的) (3)指定-Ttext鏈接地址 (4)makefile的推導規則 下面來具體的分析代碼: 1、設置交叉編譯工具鏈 2、加載autoconfig.mk文件,這個文件是在主Makefile中生成 3、設置鏈接地址,這個TEXT_BASE是在主Makefile中的x210_sd_config部分配
[單片機]
uboot(基于IMX6ull)
一、U-Boot初次編譯 1、首先在 Ubuntu 中安裝 ncurses 庫,否則編譯會報錯,安裝命令如下:sudo apt-get install libncurses5-dev 2、解壓官方Uboot:tar -vxjf uboot-imx-2016.03-2.1.0-g8b546e4.tar.bz2 3、編寫編譯腳本文件:xxx.sh #!/bin/bash make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- (加空格) mx6ull_14x14_ddr51
[單片機]
<font color='red'>uboot</font>(基于IMX6ull)
使用jlink直接燒norflash或者nandflash不借助uboot的猜想
由于喜歡折騰,我是在linux下使用jlink的,既然JLinkExe可以進行內存讀寫操作,loadbin等操作,并且通過指定命令文件支持批量指令輸入,那么首先jlink是可以直接訪問內部存儲器的,包括它的RAM和各種Soc上外設如存儲控制器,串口配置寄存器等,但是不能直接訪問外部存儲器,如Norflash。這樣一來,先關狗,設好時鐘,然后通過wmem32一系列命令,操作存儲控制器,這樣就可以訪問SRAM,然后loadbin到內存,再寫回到norflash,或者nandflash,其中nandflash應該略復雜,需要設置好flash控制器,然后還要額外寫一個操作nandflash的bin,并將它也loadbin至內存,setpc
[單片機]
編譯at91sam9x5ek的dataflash專用uboot
昨天將MYS_SAM9X5的板子從nandflash啟動改為dataflash啟動,重新編譯了bootstrap。但是uboot還是使用于nandflash的原始版本。導致開啟時候會檢測nand devices,若此時jp3處于斷開(即禁用nand)狀態,則會跳出。 于是我想出了如何編譯出適用于dataflash的新uboot的方法: 首先打開配置文件 cd uboot/configs/ vim at91sam0x5ek.h 找到(大概在182行) #ifdef CONFIG_SYS_USE_DATAFLASH 這個意思是說如果打開CONFIG_SYS_USE_DATAFLASH 則下面的定義全部生效,比如
[單片機]
編譯at91sam9x5ek的dataflash專用<font color='red'>uboot</font>
uboot啟動過程簡要分析筆記
uboot啟動類似于pc機中bios的啟動過程,簡要說明如下; 第一階段 1:cup內硬件初始化(屏蔽所有中斷,設置cup的時鐘,存儲控制器初始化,指示燈初始化狀態為滅,關閉CPU內存指令/緩存); 2:拷貝第二階段代碼到RAM中以備第二階段代碼的執行; 3:設置好堆棧指針存放第二階段代碼的入口地址; 進入第二階段 當用戶按下任意鍵時進入下載模式(此過程只為開發人員所用得到),如果一段時間內用戶沒有任何操作,自動進入的啟動加載模式如下(此過程是為了加載操作系統內核鏡像和文件系統鏡像): 4:對arm開發板上硬件資源初始化(至少包含一個串口初始化,因為加載操作系當中通常需要通過彩屏接受串口發來的Linux內核版本信息,以及
[單片機]
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 济宁市| 上虞市| 瑞安市| 黄大仙区| 开江县| 盐津县| 外汇| 吉首市| 鄂托克前旗| 定陶县| 乃东县| 德保县| 青冈县| 米易县| 青神县| 香港 | 仁布县| 海盐县| 驻马店市| 十堰市| 家居| 平泉县| 宜城市| 广南县| 马边| 龙岩市| 凤凰县| 临城县| 白城市| 海兴县| 鹿邑县| 阳曲县| 黔西县| 蚌埠市| 阜宁县| 商都县| 安仁县| 衡东县| 大关县| 普兰店市| 巴中市|
    • <blockquote id="5oe8m"><i id="5oe8m"><video id="5oe8m"></video></i></blockquote>

        <p id="5oe8m"><li id="5oe8m"><pre id="5oe8m"></pre></li></p><style id="5oe8m"></style>