----------------------------------------------------------
使用環境
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了.... 這個請查看頭文件中的配置定義...
上一篇:ok6410的mplayer移植
下一篇:u-boot2010.03 移植篇(三)-----進一步修改start.S,smdk6410.h,支持nand啟動及配置DM9000網卡
推薦閱讀最新更新時間:2025-05-22 01:24


設計資源 培訓 開發板 精華推薦
- LTC2975 的典型應用 - 具有準確輸入電流和能量測量功能的 4 通道 PMBU 電源系統管理器
- STM32 Nucleo-64 開發板,帶 STM32WB15CC,支持 Arduino、ST Morpho 連接
- 使用 Analog Devices 的 LT1302CN8-5 的參考設計
- MC33364臨界導通模式反激轉換器的典型應用電路
- AD9754-EB,用于 AD9754、14 位、125 MSPS 高性能 D/A 轉換器的評估板
- LTC1064-3,優于用于數據通信的貝塞爾線性相位濾波器
- NCS2001SN2T1G 0.9V單電源運放正電容乘法器典型應用電路
- AM6TW-4803DH35Z ±3.3V 6 瓦雙路輸出 DC/DC 轉換器的典型應用
- 使用 Analog Devices 的 LTC1538IG-AUX 的參考設計
- DC1198B-B,使用 LTM4607EV、6 至 36 Vin 至 12V、5A 高效降壓-升壓 DC/DC 模塊穩壓器的演示板