7.1 創(chuàng)建nand_read.c
【注意】
本程序只能用于讀取2K/頁的Nand。本人的Micro2440上的Nand Flash為256M,型號為K9F2G08
[www.linuxidc.com@linuxidc u-boot-2011.06]$ touch board/samsung/micro2440/nand_read.c
[www.linuxidc.com@linuxidc u-boot-2011.06]$ cat> board/samsung/micro2440/nand_read.c
#define rNFCONF (*(volatile unsigned *)0x4E000000)
#define rNFCONT (*(volatile unsigned *)0x4E000004)
#define rNFCMD (*(volatile unsigned *)0x4E000008)
#define rNFADDR (*(volatile unsigned *)0x4E00000C)
#define rNFDATA8 (*(volatile unsigned char*)0x4E000010)
#define rNFSTAT (*(volatile unsigned *)0x4E000020)
#define CMD_READ1 0x00 /* 頁讀命令周期1 */
#define CMD_READ2 0x30 /* 頁讀命令周期2 */
#define CMD_RESET 0xFF /* 復(fù)位 */
#define NF_CMD(cmd) {rNFCMD=(cmd);} /* 寫命令 */
#define NF_ADDR(addr) {rNFADDR=(addr);} /* 寫地址 */
#define NF_RDDATA8() (rNFDATA8) /* 讀8位數(shù)據(jù) */
#define NF_nFCE_L() {rNFCONT&=~(1<<1);} /* 片選使能 */
#define NF_nFCE_H() {rNFCONT|=(1<<1);} /* 片選禁用 */
#define NF_WAITRB() {while(!(rNFSTAT&(1<<1)));} /* 等待就緒 */
#define NF_CLEAR_RB() {rNFSTAT |= (1<<2);} /* 清除就緒/忙位 */
#define NF_DETECT_RB() {while(!(rNFSTAT&(1<<2)));} /* 等待就緒 */
#define TACLS 1
#define TWRPH0 2
#define TWRPH1 1
void delay(int i)
{
while(i-->0);
}
void Nand_Init(void)
{
rNFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4)|(0<<0);
rNFCONT = (1<<4)|(1<<1)|(1<<0);
}
static void Nand_Reset(void)
{
NF_nFCE_L(); /* 片選使能 */
NF_CLEAR_RB(); /* 清除就緒/忙位 */
NF_CMD(CMD_RESET); /* 寫復(fù)位命令 */
NF_DETECT_RB(); /* 等待就緒 */
NF_nFCE_H(); /* 片選禁用 */
}
unsigned char Nand_ReadPage(const int page, unsigned char * const buffer)
{
int i;
Nand_Reset();
NF_nFCE_L();
NF_CLEAR_RB();
NF_CMD(CMD_READ1);
NF_ADDR(0x0);
NF_ADDR(0x0);
NF_ADDR(page&0xff);
NF_ADDR((page>>8)&0xff);
NF_ADDR((page>>16)&0xff);
NF_CMD(CMD_READ2);
NF_DETECT_RB();
for (i = 0; i < 2048; i++)
{
buffer[i] = NF_RDDATA8();
}
NF_nFCE_H();
}
int nand_read(int start_page, int read_pages, unsigned char *buffer)
{
int i;
Nand_Init();
for(i=0; i
Nand_ReadPage(start_page, buffer + 2048*i);
start_page++;
}
return 0;
}
7.2 board/samsung/micro2440/Makefile
COBJS := micro2440.o flash.o nand_read.o
7.3 arch/arm/cpu/arm920t/u-boot.lds
.text :
{
arch/arm/cpu/arm920t/start.o (.text)
board/samsung/micro2440/libmicro2440.o (.text)
*(.text)
}
【說明】
如果是在RAM中運(yùn)行,一定要刪去board/samsung/micro2440/libmicro2440.o (.text),否則在RAM中也不能運(yùn)行。原因尚不理解,需要閱讀代碼。
7.4 arch/arm/cpu/arm920t/start.S
下面紅色部分是添加的部分,黑色的代碼用于定位。
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_crit
#endif
#ifdef CONFIG_S3C2440_NAND_BOOT
ldr sp, =0x30008000
ldr r0, =0x0;
ldr r1, _end_ofs
mov r1, r1, LSR #11
add r1, r1, #1
ldr r2, =(CONFIG_SYS_TEXT_BASE)
bl nand_read
ldr pc, =relocations
#endif
......
......
copy_loop:
ldmia r0!, {r9-r10} /* copy from source address [r0] */
stmia r1!, {r9-r10} /* copy to target address [r1] */
cmp r0, r2 /* until source end address [r2] */
blo copy_loop
#ifdef CONFIG_S3C2440_NAND_BOOT
relocations:
ldr r6, =CONFIG_SYS_TEXT_BASE
#endif
#ifndef CONFIG_PRELOADER
/*
* fix .rel.dyn relocations
*/
......
......
clbss_l:str r2, [r0] /* clear loop... */
add r0, r0, #4
cmp r0, r1
bne clbss_l
bl coloured_LED_init
bl red_LED_on
#endif
#ifdef CONFIG_S3C2440_NAND_BOOT
ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
ldr r0,=0x00000000
ldr pc, =board_init_f
#endif
/*
* We are done. Do not return, instead branch to second part of board
* initialization, now running from RAM.
*/
#ifdef CONFIG_NAND_SPL
7.5 include/configs/micro2440.h
#define CONFIG_S3C2440_NAND_BOOT /* #define CONFIG_SKIP_LOWLEVEL_INIT */
【說明】
由于要在Nand Flash中運(yùn)行,所以需要注釋掉#define CONFIG_SKIP_LOWLEVEL_INIT
7.6 arch/arm/lib/board.c
void board_init_f (ulong bootflag)
{
......
gd->mon_len = _bss_end_ofs + 0x100000; /* why */
......
這里的修改參考了bscbem的日志:http://www.linuxidc.com/Linux/2011-02/32772p4.htm
如果有讀者想了解原理請參考這個日志。
/* relocate_code (addr_sp, id, addr); */ #ifdef CONFIG_S3C2440_NAND_BOOT /*add by wzc*/ __asm__ __volatile__('mov sp,%0'::'r'(addr_sp):'sp');/*add by wzc*/ board_init_r(id, addr); #else relocate_code (addr_sp, id, addr); /* NOTREACHED - relocate_code() does not return */ #endif }【說明】至于gd->mon_len = _bss_end_ofs + 0x100000;我也不理解,需要閱讀源代碼才能解釋。
7.7 下載到Nand Flash
到這里應(yīng)該就可以從Nand Flash啟動了。
上一篇:u-boot-2011.03在mini2440/micro2440上的移植 支持yaffs下載
下一篇:u-boot-2011.03在mini2440/micro2440上的移植 結(jié)束語及資源下載
推薦閱讀最新更新時間:2025-04-23 18:11



設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- 英飛凌微控制器:以全新實惠套件和強(qiáng)大開發(fā)環(huán)境為開發(fā)者提供支持
- iTOP-i.MX6開發(fā)板設(shè)備數(shù)驅(qū)動Menuconfig的用法
- 迅為IMX6ULL開發(fā)板Qt for Android搭建開發(fā)環(huán)境
- 迅為i.MX8M mini開發(fā)板Windots QT系統(tǒng)開發(fā)環(huán)境搭建
- 迅為IMX8MM開發(fā)板Yocto系統(tǒng)使用Gstarwmra(一)
- 迅為IMX8M mini開發(fā)板Linix系統(tǒng)修改默認(rèn)屏幕
- iTOP-4412開發(fā)板支持4G以上文件系統(tǒng)擴(kuò)展
- 迅為IMX8MM開發(fā)板Yocto系統(tǒng)設(shè)置開機(jī)自啟動
- 迅為IMX6Q開發(fā)板 Buildroot文件系統(tǒng)mqtt測試
- 【訓(xùn)練營】rgb燈帶+879174A
- MC34072DR2G 高阻抗差分放大器的典型應(yīng)用
- MC33174DTBR2G 有源高 Q 陷波濾波器的典型應(yīng)用
- 用于編程欠壓鎖定的 LT3066EMSE-3.3 線性穩(wěn)壓器的典型應(yīng)用電路
- OP495GSZ 低噪聲單電源前置放大器的典型應(yīng)用
- 使用 Semtech 的 SC485 的參考設(shè)計
- 0.8 至 3.3V DC 至 DC 單輸出筆記本電源
- TDA7294 93 功放板
- LM317T、三端正可調(diào)穩(wěn)壓器的典型應(yīng)用
- OP184ESZ-REEL輸出過載恢復(fù)運(yùn)放測試電路典型應(yīng)用
- 高通攜手中國“汽車朋友圈”亮相2025上海車展: 加速駕駛輔助普惠,推動艙駕創(chuàng)新升級
- 工業(yè)市場正在快速回暖,德州儀器如何重塑電力電子市場?
- 特斯拉:美國交付的Model Y/3電池包已實現(xiàn)100%美國生產(chǎn)
- 地平線與博世深化合作,攜手為多家車企提供輔助駕駛產(chǎn)品
- 強(qiáng)化中國市場戰(zhàn)略布局,德州儀器正靈活應(yīng)對全球關(guān)稅挑戰(zhàn)
- Molex莫仕通過本地合作和創(chuàng)新加強(qiáng)支持中國汽車行業(yè)
- 貿(mào)澤開售Texas Instruments適用于高分辨率AR HUD的 全新DLP4620S-Q1 0.46"汽車數(shù)字微鏡器件
- ROHM推出高功率密度的新型SiC模塊,將實現(xiàn)車載充電器小型化!
- 用上車規(guī)級UFS 4.0,讓出行變得高效且可靠
- 車載測試技術(shù)解析:聚焦高帶寬、多通道同步采集與協(xié)議分析
- 谷歌:設(shè)計芯片,AI只需要6小時
- 帶你了解“新基建”中的硬核科技有哪些
- 三星首款QRNG芯片手機(jī)即將面市,安全性更勝一籌
- 三星的6億像素圖像傳感器到底是什么鬼?
- iQOO Neo3:用瑞聲科技超線性雙揚(yáng)聲器打造“神仙音質(zhì)”
- 蘋果“查找”應(yīng)用全面升級了 提供全新第三方查找體驗
- 谷歌曝光Pixel Buds A新無線耳機(jī)采用深綠色配色
- “查找”支持第三方是什么意思 又會給用戶和行業(yè)帶來改變
- 三星Galaxy Quantum 2首批諜照曝光,或被韓國獨(dú)占
- 小米11 Ultra維修價格曝光:換主板2400元 比K40標(biāo)準(zhǔn)版都貴