国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

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

發(fā)布者:SerendipityDawn最新更新時(shí)間:2024-11-07 來源: cnblogs關(guān)鍵字:u-boot  移植  start 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

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

使用環(huán)境

PC:     Centos5.4


kernel: 3.0.1


corss:  arm-linux-gcc 4.4.1


arm:    s3c6410

uboot:  uboot-2010-03

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




uboot的第一階段,其實(shí)做的事情也是比較多的,,但是一般來說,重點(diǎn)就是配置各種硬件環(huán)境,來保證第二階段能正常啟動(dòng).

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

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

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

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

代碼到內(nèi)存中去呢?沒錯(cuò)-----s3c6410在啟動(dòng)的時(shí)候會(huì)幫我們以nand的最基本的時(shí)序.搬移nand中的前8K代碼,到stepping

這樣就可以執(zhí)行了.而uboot的代碼遠(yuǎn)比這個(gè)大..以至于我們得緊靠這部分代碼,來完成剩下的代碼部分的搬移....


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


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


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

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

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


前面一部分是MMU啥的...直接招待after_copy:這個(gè)標(biāo)簽

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

沒錯(cuò)..所以我們得把copy代碼添加在這里..從nand中把數(shù)據(jù)搬移出來,放到這之前完成,這樣才對(duì)得起這個(gè)after_copy的標(biāo)簽

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



圖片轉(zhuǎn)文字:


 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



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

接著,我們要去添加我們要調(diào)用的copy_from_nand

這個(gè)文件比較大,分析篇我會(huì)重點(diǎn)分析,究竟nand是如何搬移數(shù)據(jù)的. 在cpu/arm1176/下創(chuàng)建個(gè)文件nand_cp.c,這里我們只要復(fù)制下好了,

[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下.你會(huì)發(fā)現(xiàn).編譯好了....編譯器記得重新make smdk6410_config下.因?yàn)槲覀冃薷牧祟^文件,需要重新生成.mk文件


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

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

沒錯(cuò),你只要查找替換就行了...因?yàn)槲覀儸F(xiàn)在編譯的已經(jīng)是6410了.不是6400了...


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



cpu/arm1176/s3c64xx/Makefile




把6400改成64XX因?yàn)?我們的配置文件里面已經(jīng)沒有6400了....

這個(gè)請(qǐng)查看頭文件中的配置定義...


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

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

推薦閱讀最新更新時(shí)間:2025-06-07 23:48

利用U-Boot實(shí)現(xiàn)uClinux向S3C44B0的移植
1 引言 S3C44B0是Samsung公司推出的一款為手持設(shè)備或其他通用設(shè)備開發(fā)的32位處理器,它基于ARM7TDMI核,沒有內(nèi)存管理單元(MMU)。在采用無MMU的微處理器的嵌入式系統(tǒng)中廣泛采用的就是uClinux系統(tǒng),作為linux的衍生系統(tǒng),其具有支持多任務(wù)、內(nèi)核精簡(jiǎn)、高效穩(wěn)定和源代碼開放的優(yōu)點(diǎn)。系統(tǒng)移植的基本過程包括:獲取較新版本的linux-2.6.9內(nèi)核源碼,根據(jù)目標(biāo)平臺(tái)對(duì)源碼中與硬件平臺(tái)相關(guān)部分進(jìn)行修改,添加必要的外設(shè)驅(qū)動(dòng)程序,對(duì)系統(tǒng)進(jìn)行針對(duì)目標(biāo)平臺(tái)的交叉編譯,生成的內(nèi)核映像文件的下載調(diào)試等。 2 硬件環(huán)境介紹 硬件平臺(tái)以S3C44B0為核心,采用的外部晶振頻率為6MHZ,內(nèi)核主頻最高可達(dá)到66MHZ,平臺(tái)以
[單片機(jī)]
利用<font color='red'>U-Boot</font>實(shí)現(xiàn)uClinux向<font color='red'>S</font>3C44B0的<font color='red'>移植</font>
【IMX6ULL學(xué)習(xí)筆記】五、U-BOOT移植與解析
一、移植自定義開發(fā)板流程 1、添加 mx6ull_kodo_emmc_defconfig 配置文件(.config) 在 /config s目錄下,復(fù)制 mx6ull_14x14_evk_emmc_defconfig 文件,重命名為 mx6ull_kodo_emmc_defconfig 并修改其中內(nèi)容,如下: CONFIG_SYS_EXTRA_OPTIONS= IMX_CONFIG=board/freescale/mx6ull_kodoboard/imximage.cfg,MX6ULL_EVK_EMMC_REWORK CONFIG_ARM=y CONFIG_ARCH_MX6=y CONFIG_TARGET_MX6ULL_K
[單片機(jī)]
【IMX6ULL學(xué)習(xí)筆記】五、<font color='red'>U-BOOT</font><font color='red'>移植</font>與解析
U-boot內(nèi)核移植步驟
Linux 3.3.5系統(tǒng)移植 將arch/arm/mach-s3c6410/下的,mach-smdk6410.c cp為mach-my6410.c; 打開arch/arm/mach-s3c6410/下的Kconfig,仿照MACH_SMDK6410做一個(gè)菜單項(xiàng): config MACH_MY6410 bool MY6410 select CPU_S3C6410 select SAMSUNG_DEV_ADC select S3C_DEV_HSMMC select S3C_DEV_HSMMC1 select S3C_DEV_I2C1 select SAMSUNG_DEV_IDE select
[單片機(jī)]
U-Boot移植(7)總結(jié)U-Boot工程的總體結(jié)構(gòu)
3、u-boot的通用目錄是怎么做到與平臺(tái)無關(guān)的? include/configs/100ask24x0.h 這個(gè)頭文件中主要定義了兩類變量。  一類是選項(xiàng),前綴是CONFIG_,用來選擇處理器、設(shè)備接口、命令、屬性等,主要用來決定是否編譯某些文件或者函數(shù)。 另一類是參數(shù),前綴是CFG_,用來定義總線頻率、串口波特率、Flash地址等參數(shù)。這些常數(shù)參量主要用來支持通用目錄中的代碼,定義板子資源參數(shù)。 這兩類宏定義對(duì)u-boot的移植性非常關(guān)鍵,比如drivers/cs8900.c,對(duì)cs8900而言,很多操作都是通用的,但不是所有的板子上面都有這個(gè)芯片,即使有它在內(nèi)存中映射的基地址也是平臺(tái)相關(guān)的。所以對(duì)于smdk2410板,在s
[單片機(jī)]
【嵌入式】從零開始移植U-boot到mini2440(二)——燒錄篇
燒錄 相關(guān)工具:j-link 軟件:j-flash ARM V4.70 在編譯成功之后,會(huì)生成u-boot.bin在output目錄下,這個(gè)二進(jìn)制文件就可以直接用于燒錄。 燒錄位置的確定方法 燒錄的時(shí)候,我這里選擇直接燒寫在NOR中,看S3C2440的SPEC和開發(fā)板的原理圖(找NOR的CE接口和S3C2440哪個(gè)引腳相連),當(dāng)我們選擇從NOR啟動(dòng)的時(shí)候,NOR Flash被映射到內(nèi)存0x0000_0000 ~ 0x0800_0000,也就是說我們直接把bin文件燒錄到0地址即可。 這里有一篇寫的蠻好的blog,解釋了ARM是如何通過NOR和NAND啟動(dòng)的。 https://www.cnblogs.com/aaron
[單片機(jī)]
【嵌入式】從零開始<font color='red'>移植</font><font color='red'>U-boot</font>到mini2440(二)——燒錄篇
uCGUI 移植S3C44B0X實(shí)驗(yàn)
一、實(shí)驗(yàn)?zāi)康?1. 初步掌握uCGUI底層硬件驅(qū)動(dòng)函數(shù); 2. 掌握將uCGUI移植到ARM S3C44BOX上的方法和步驟。 二、實(shí)驗(yàn)內(nèi)容 移植uCGUI到ARM處理器S3C44BOX上,并編寫Hello World程序,在Micetek 44B0實(shí)驗(yàn)平臺(tái)的LCD上顯示“Hello World!”字符串,在LCD顯示平面坐標(biāo)(20,20)處,顯示一個(gè)小于10000的整數(shù),該整數(shù)不斷循環(huán)加1,每次加1后立即更新顯示,從而反應(yīng)出顯示輸出的速度。 三、預(yù)備知識(shí) 1. uCGUI的體系結(jié)構(gòu): uCGUI包含三個(gè)總的文件夾:ApplicaTIon,Config,GUI.其中: Ⅰ ApplicaTIon是應(yīng)用程序的文件夾,它中間包含
[單片機(jī)]
基于S3C2440的Linux內(nèi)核移植和yaffs2文件系統(tǒng)制作--根文件系統(tǒng)
第二章 制作根文件系統(tǒng) 2.1 根文件系統(tǒng)預(yù)備知識(shí) 嵌入式Linux中都需要構(gòu)建根文件系統(tǒng),構(gòu)建根文件系統(tǒng)的規(guī)則在FHS(Filesystem Hierarchy Standard)文檔中,下面是根文件系統(tǒng)頂層目錄。 目錄 內(nèi)容 bin 存放所有用戶都可以使用的、基本的命令。 sbin 存放的是基本的系統(tǒng)命令,它們用于啟動(dòng)系統(tǒng)、修復(fù)系統(tǒng)等。 usr 里面存放的是共享、只讀的程序和數(shù)據(jù)。 proc 這是個(gè)空目錄,常作為proc文件系統(tǒng)的掛載點(diǎn)。 dev 該目錄存放設(shè)備文件和其它特殊文件。 etc 存放系統(tǒng)配置文件,包括啟動(dòng)文件。 lib 存放共享庫和可加載塊(即驅(qū)動(dòng)程序),共享庫用于啟動(dòng)系統(tǒng)、運(yùn)行根文件系統(tǒng)中的可執(zhí)行程序。 boo
[單片機(jī)]
基于WINCE&S3C2410的多串口移植技術(shù)
  嵌入式系統(tǒng)已經(jīng)滲入到國(guó)民經(jīng)濟(jì)的各個(gè)領(lǐng)域,而嵌入式操作系統(tǒng)是嵌入式系統(tǒng)的靈魂。目前國(guó)際上常用的操作系統(tǒng)有 VxWorks、Windows CE、Linux等。其中,微軟公司開發(fā)的 Windows CE 以其快速的開發(fā)流程、靈活的軟硬件選擇和健壯的最終產(chǎn)品已成為越來越多嵌入式產(chǎn)品開發(fā)的首選。   由于嵌入式系統(tǒng)的硬件平臺(tái)種類繁多,WindowsCE.net支持的處理器種類就有ARM,POWER PC, MPS、X86等幾大類,各個(gè)大類之內(nèi)又包含多種CPU。各硬件廠商提供的 WindowsCE.net 的硬件驅(qū)動(dòng)并不全,因此開發(fā)人員經(jīng)常需要根據(jù)自己特定的硬件平臺(tái)進(jìn)行驅(qū)動(dòng)開發(fā)。WindowsCE.net的標(biāo)準(zhǔn)BSP一般只為我們開通了一
[單片機(jī)]
基于WINCE&<font color='red'>S</font>3C2410的多串口<font color='red'>移植</font>技術(shù)
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved