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

u-boot2010.03 移植篇(二)-----修改start.S,支持nand啟動

發布者:SerendipityDawn最新更新時間:2024-11-07 來源: cnblogs關鍵字:u-boot  移植  start 手機看文章 掃描二維碼
隨時隨地手機看文章

----------------------------------------------------------

使用環境

PC:     Centos5.4


kernel: 3.0.1


corss:  arm-linux-gcc 4.4.1


arm:    s3c6410

uboot:  uboot-2010-03

----------------------------------------------------------




uboot的第一階段,其實做的事情也是比較多的,,但是一般來說,重點就是配置各種硬件環境,來保證第二階段能正常啟動.

而該部分根據不同的硬件也是不同的..像我的,s3c6410有2片dram,和一片nand..所以我為了保證我的代碼能正常執行,

我必須得把代碼搬移到內存里面去.不然代碼在nand中也沒法執行...但是為什么代碼在nand中不能執行呢?其中一個比較

重要的原因就是nand并不是掛在CPU總線上面的,而是采用專門的硬件處理單元來控制的...nand控制器.

在你不添加任何代碼的情況下,是不能控制外圍的nand芯片的...但是怎么辦.cpu內根本沒有代碼,怎么才能讀取nand中的

代碼到內存中去呢?沒錯-----s3c6410在啟動的時候會幫我們以nand的最基本的時序.搬移nand中的前8K代碼,到stepping

這樣就可以執行了.而uboot的代碼遠比這個大..以至于我們得緊靠這部分代碼,來完成剩下的代碼部分的搬移....


今天的重點就是這個了.主要是來完成nand中剩余部分的uboot搬移到ram中,以便uboot能正常啟動起來....好了.直接開始..


首先,你得有smdk6410_config 編譯目標,不然怎么開始.....此處省略N字...請看我的移植篇第一篇...


下面開始.打開start.S (cpu/arm1176/start.S)和smdk6410.h (include/configs/smdk6410.h)

我們得一邊參看頭文件中的配置,一邊修改代碼,來達到我們的目的..

在start.S 中,最開始就是一段啥?異常向量表,此處忽略,請參考分析篇中對start.S的分析


前面一部分是MMU啥的...直接招待after_copy:這個標簽

什么?之前沒有任何copy的東西???怎么有after_copy一說呢?

沒錯..所以我們得把copy代碼添加在這里..從nand中把數據搬移出來,放到這之前完成,這樣才對得起這個after_copy的標簽

說干就干,這里我是調用的C代碼,你也可以用匯編來完成的,只要功能一樣就行了



圖片轉文字:


 ldr r0, =0xff000fff

 bic r1, pc, r0

 ldr r2, _TEXT_BASE

 bic r2, r2, r0

 cmp r1, r2

 beq     after_copy

#ifdef CONFIG_NAND_BOOT

 mov r0, #0x1000

 bl copy_from_nand

#endif



這里我們得向我們的配置頭文件內添加一個宏,就是 #define CONFIG_NAND_BOOT

接著,我們要去添加我們要調用的copy_from_nand

這個文件比較大,分析篇我會重點分析,究竟nand是如何搬移數據的. 在cpu/arm1176/下創建個文件nand_cp.c,這里我們只要復制下好了,

[cpp] view plaincopyprint?

#include    

#ifdef CONFIG_S3C64XX   

#include    

#include    

#include   

  

static int nandll_read_page(uchar * buf, ulong addr, int large_block)  

{  

    int i;  

    int page_size = 512;  

  

    if (large_block == 1)  

        page_size = 2048;  

    if (large_block == 2)  

        page_size = 4096;  

  

    NAND_ENABLE_CE();  

  

    NFCMD_REG = NAND_CMD_READ0;  

  

    /* Write Address */  

    NFADDR_REG = 0;  

  

    if (large_block)  

        NFADDR_REG = 0;  

  

    NFADDR_REG = (addr) & 0xff;  

    NFADDR_REG = (addr >> 8) & 0xff;  

    NFADDR_REG = (addr >> 16) & 0xff;  

  

    if (large_block)  

        NFCMD_REG = NAND_CMD_READSTART;  

  

    NF_TRANSRnB();  

  

    /* for compatibility(2460). u32 cannot be used. by scsuh */  

    for (i = 0; i < page_size; i++) {  

        *buf++ = NFDATA8_REG;  

    }  

  

    NAND_DISABLE_CE();  

    return 0;  

}  

  

static int nandll_read_blocks(ulong dst_addr, ulong size, int large_block)  

{  

    uchar *buf = (uchar *) dst_addr;  

    int i;  

    uint page_shift = 9;  

  

    if (large_block == 1)  

        page_shift = 11;  

  

    /* Read pages */  

    if (large_block == 2)  

        page_shift = 12;  

  

    if (large_block == 2) {  

        /* Read pages */  

        for (i = 0; i < 4; i++, buf += (1 << (page_shift - 1))) {  

            nandll_read_page(buf, i, large_block);  

        }  

        /* Read pages */  

        for (i = 4; i < (0x60000 >> page_shift);i++, buf += (1 << page_shift)) {  

            nandll_read_page(buf, i, large_block);  

        }  

    } else {  

        for (i = 0; i < (0x60000 >> page_shift);i++, buf += (1 << page_shift)) {  

            nandll_read_page(buf, i, large_block);  

        }  

    }  

  

    return 0;  

}  

  

int copy_uboot_to_ram(void)  

{  

    int large_block = 0;  

    int i;  

    vu_char id;  

  

    NAND_ENABLE_CE();  

    NFCMD_REG = NAND_CMD_READID;  

    NFADDR_REG = 0x00;  

  

    /* wait for a while */  

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

        id = NFDATA8_REG;  

    id = NFDATA8_REG;  

  

    if (id > 0x80)  

        large_block = 1;  

    if (id == 0xd5)  

        large_block = 2;  

  

    /* read NAND Block. 

     * 128KB ->240KB because of U-Boot size increase. by scsuh 

     * So, read 0x3c000 bytes not 0x20000(128KB). 

     */  

    return nandll_read_blocks(CONFIG_SYS_PHY_UBOOT_BASE, 0x60000,large_block);  

}  

  

#endif  

然后修改Makefile 把我們的nand_cp.c添加到uboot中去編譯


最后make下.你會發現.編譯好了....編譯器記得重新make smdk6410_config下.因為我們修改了頭文件,需要重新生成.mk文件


今天的任務基本完成了,今天比較輕松,接著我們稍微修改下smdk6410.h中的配置.

主要是改幾個名字,把什么6400的改成6410就好了..

沒錯,你只要查找替換就行了...因為我們現在編譯的已經是6410了.不是6400了...


修改完之后,有一個地方得稍微改下.



cpu/arm1176/s3c64xx/Makefile




把6400改成64XX因為,我們的配置文件里面已經沒有6400了....

這個請查看頭文件中的配置定義...


關鍵字:u-boot  移植  start 引用地址:u-boot2010.03 移植篇(二)-----修改start.S,支持nand啟動

上一篇:ok6410的mplayer移植
下一篇:u-boot2010.03 移植篇(三)-----進一步修改start.S,smdk6410.h,支持nand啟動及配置DM9000網卡

推薦閱讀最新更新時間:2025-05-22 01:24

基于S3C2410A的嵌入式系統的U-Boot移植
0 引 言 ??? ARM嵌入式處理器已被廣泛應用于消費電子產品、無線通信、網絡通信和工業控制等領域。其中,ARM9的芯片更是以其低價格、低功耗、高性能在手持設備中占據著重要市場。在嵌入式操作系統中,Linux,Vxworks,WinCE三足鼎立,其中Linux由于其開源性、穩定性、安全性、可裁減性更是一支獨放。在嵌入式系統中,如何實現在ARM9平臺下Linux操作系統的引導工作是嵌入式技術開發的重要環節。 1 嵌入式系統的軟件組成 1.1 系統的軟件組成 ??? 嵌入式的軟件系統主要由Bootloader、操作系統、文件系統、應用程序等組成。其中,Bootloader是介于硬件和操作系統之間的一層,其作用就好像P
[嵌入式]
U-boot-2014.04移植到MINI2440(4) 第一啟動階段start.S等詳細分析
u-boot的啟動階段分為兩個,第一部分主要為start.S文件,帖子盡可能的分析了每一行代碼的意思,查看了很多手冊,分析的目的也是為了學習吧,寫博客也是想給自己的學習留下點東西,這些東西網上其實很多,但是感覺看別人寫的和字自己分析寫一遍,差別好大。轉載請注明出處,下面進入正題。 第11行: #include asm-offsets.h //由kbuild自動生成,且不管 #include common.h //include下包含其他通用頭文件的頭文件 #include config.h //很多體系架構下都有這個各自體系的配置頭文件 一.start_code及CPSR分析 第24行: .glo
[單片機]
U-boot-2014.04<font color='red'>移植</font>到MINI2440(4) 第一<font color='red'>啟動</font>階段<font color='red'>start</font>.<font color='red'>S</font>等詳細分析
U-Boot移植(1)新建一個開發板的相應目錄和文件
今天很高興,終于把U-Boot移植成功,在做的同時,我把一些步驟以截圖記下。。現在我來慢慢回顧下過程。。 1、從官網上下了個U-Boot-1.1.6,網址:http://sourceforge.net/projects/u-boot/。然后放到Ubuntu的/work/下,解壓。 2、進入board目錄,將smdk2410復制為100ask24x0,并將board/100ask24x0/smdk2410.c改名為100ask24x0.c。 3、將include/configs/smdk2410.h直接復制為100ask24x0.h 4、修改以下兩個Makefile,先看頂層的Makefile,增加底部
[單片機]
<font color='red'>U-Boot</font><font color='red'>移植</font>(1)新建一個開發板的相應目錄和文件
u-boot移植之一 uboot-2015.04 Makefile分析
本文以smdk2410為例子說明uboot的生成過程 一 uboot生成 uboot生成步驟如下: make smdk2410_defconfig make all 二 uboot生成分析之make smdk2410_defconfig 主Makefile有如下定義: %config: scripts_basic outputmakefile FORCE $(Q)$(MAKE) $(build)=scripts/kconfig $@ 注:u-boot-2015.04的配置與編譯仿照linux重新設計,很多宏展開與linux相同,不再重新說明。 (1)目標 %config,即smdk2410_defconfig (2)依賴 (2
[單片機]
at91sam9260 OpenWRT u-boot移植
1. 直接在make menuconfig中選擇編譯at91sam9260ek平臺的u-boot,燒寫到開發板后效果 **U-Boot 2010.06-dirty (Jun 28 2017 - 09:14:34) DRAM: 64 MiB NAND: 1024 MiB *** Warning - bad CRC, using default environment In: serial Out: serial Err: serial Net: macb0 macb0: Starting autonegotiation...** ==警告,u-boot環境變量校驗失敗,并且一段時間后啟動重啟(懷疑看門狗打開,但沒
[單片機]
s5pv210移植Minigui3.0.12
移植平臺: ubuntu:14.04 開發板:s5pv210(A8) Minigui版本:3.0.12 ----------------------------------------------------- 以下軟件是開發板正常運行的必須安裝包,在MiniGui官網可以下載 http://www.minigui.org/zhcn/【已放在嵌入式軟件組資料共享文件夾】 ----------------------------------------------------- ├── freetype-2.3.9-fm20100818.tar.gz ├── jpegsrc.v7.tar.gz ├── libmgplus-1.2.4
[單片機]
Linux 3.3.0移植S3C6410開發板上之一
這里僅僅是移植成功內核,可以掛載文件系統運行,至于驅動會陸續添加。 第一步:到內核官網上下載最新的內核,我下載的是linux-3.3-rc3.tar.bz2。 第二步:解壓內核,進入arch/arm/mach-s3c64xx目錄下,看到不少6410的板級文件,我們這里選擇mini6410開開展工作,在目錄下將mach-mini6410.c文件復制一份,命名為:mach-jfj6410.c。這里我們將文件里面關于mini6410的字樣都修改為jfj6410.但是這里要注意,MACHINE_START(JFJ6410, JFJ6410 )這里的JFJ6410要使用大寫,稍候說明為什么。大家都知道在一個目錄下添加了文件后,都應該
[單片機]
基于S3C2440的Linux內核移植和yaffs2文件系統制作-- 配置Linux內核
1.3.3 配置Linux內核 1、 進入Linux-2.6.29.1內核主目錄,通過以下命令將2410的默認配置文件寫到當前目錄下的.config。S3C2410的配置和S3C2440差不多,,在這基礎上進行修改。 make s3c2410_defconfig 2、 配置內核模塊的功能,有幾種方式可以進行界面選擇: make menuconfig(文本選單的配置方式,在有字符終端下才能使用) make xconfig(圖形窗口模式的配置方式,圖形窗口的配置比較直觀,必須支持Xwindow下才能使用) make oldconfig(文本配置方式,在原內核配置的基礎修改時使用) 這里使用make menuconfi
[單片機]
小廣播
設計資源 培訓 開發板 精華推薦

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

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

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 西青区| 理塘县| 肇东市| 长岛县| 金阳县| 玉树县| 青龙| 望都县| 汤阴县| 河曲县| 乌兰浩特市| 湖北省| 洪江市| 永胜县| 山阴县| 永年县| 奎屯市| 庆城县| 浪卡子县| 南投县| 左贡县| 福海县| 册亨县| 四川省| 常宁市| 杭州市| 孟州市| 甘南县| 任丘市| 开远市| 平江县| 乌拉特前旗| 儋州市| 定南县| 兴和县| 囊谦县| 岳西县| 旅游| 石渠县| 兴隆县| 恩施市|