----------------------------------------------------------
使用環(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)查看頭文件中的配置定義...
上一篇:ok6410的mplayer移植
下一篇:u-boot2010.03 移植篇(三)-----進(jìn)一步修改start.S,smdk6410.h,支持nand啟動(dòng)及配置DM9000網(wǎng)卡
推薦閱讀最新更新時(shí)間:2025-06-07 23:48




設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- Microchip 升級(jí)數(shù)字信號(hào)控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測(cè)試
- LTM4602HV 演示板、28V、6A 降壓模塊穩(wěn)壓器
- PCB書簽 尺子 卡片
- PeanutPI
- 平衡自行車+獨(dú)輪車
- AM1DR-1209SZ 9V 1 瓦 DC-DC 轉(zhuǎn)換器的典型應(yīng)用
- NCV33074ADR2G 直流耦合反相放大器最大輸出擺幅的典型應(yīng)用
- 【明日方舟】羅德島本艦主控板V6.2
- DC795A,使用 LT5527EUF 4.5V 至 5.25V 高線性下變頻混頻器的演示板
- XL4016可調(diào)恒壓恒流實(shí)驗(yàn)電源
- 帶內(nèi)部開關(guān)的 PAM2863 2A LED 驅(qū)動(dòng)器的典型應(yīng)用
- 上汽大眾:汽車網(wǎng)絡(luò)安全漏洞防護(hù)
- 恩智浦推出全新電池控制IC系列 助力新能源解決方案發(fā)展
- 全球首條GWh級(jí)新型固態(tài)電池生產(chǎn)線樣件下線
- 總投資455億元!三大動(dòng)力電池項(xiàng)目齊刷進(jìn)度條
- 現(xiàn)代汽車韓國(guó)建氫燃料電池廠,2028年投產(chǎn)
- 6月融資一覽:智能汽車芯片、第三代半導(dǎo)體、機(jī)器人成資本焦點(diǎn)
- 艙駕一體“點(diǎn)燃”新戰(zhàn)事
- 汽車智能化2.0引爆「萬億蛋糕」,誰在改寫游戲規(guī)則?
- 2025研華智能系統(tǒng)產(chǎn)業(yè)伙伴峰會(huì)成功舉辦
- 意法半導(dǎo)體公布2025年第二季度財(cái)報(bào)和電話會(huì)議時(shí)間安排
- 翻譯手機(jī)新品類誕生 1999元糖果S20發(fā)布
- 華為Nova 3發(fā)布時(shí)間確認(rèn):7月18日深圳 或搭麒麟970
- 魅族神秘新機(jī)獲無線電核準(zhǔn) 或?yàn)轺茸錢8
- 索尼PS4銷量超8000萬臺(tái) 前景不甚光明
- 探索手機(jī)新形態(tài) OPPO申請(qǐng)可折疊手機(jī)專利
- 微信回應(yīng)被下架:暗黑模式下,微信“認(rèn)慫”
- CES Asia 2020延期舉辦,參展商可全額退款
- 封閉全國(guó),意大利新冠肺炎病例激增!
- 美股跌超7%:科技企業(yè)恐受影響
- 微信回應(yīng)被下架:蘋果要求所有APP適配iOS 13夜間模式
- 求OV2640各種資料.資料帝現(xiàn)身吧.阿門
- Microchip有獎(jiǎng)問答 | 新品 MCU 獨(dú)立于內(nèi)核的外設(shè)(CIP)技術(shù)解密
- 各種CCS的編譯錯(cuò)誤
- PCB EMI設(shè)計(jì)規(guī)范步驟
- CCS工程加載與調(diào)試
- 89美元Xilinx Spartan-6 LX9 開發(fā)板--基于FPGA的LCD遠(yuǎn)程更新
- 各位電子設(shè)計(jì)工程師大佬之前是如何成長(zhǎng)的?
- 每逢大暴雨就面臨時(shí)不時(shí)斷網(wǎng)的我
- PCB板設(shè)計(jì)
- 一個(gè)FPGA倍頻器的問題