u-boot移植5--从nandflash启动

上传人:206****923 文档编号:88627357 上传时间:2019-05-05 格式:DOC 页数:12 大小:108KB
返回 下载 相关 举报
u-boot移植5--从nandflash启动_第1页
第1页 / 共12页
u-boot移植5--从nandflash启动_第2页
第2页 / 共12页
u-boot移植5--从nandflash启动_第3页
第3页 / 共12页
u-boot移植5--从nandflash启动_第4页
第4页 / 共12页
u-boot移植5--从nandflash启动_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《u-boot移植5--从nandflash启动》由会员分享,可在线阅读,更多相关《u-boot移植5--从nandflash启动(12页珍藏版)》请在金锄头文库上搜索。

1、Uboot移植5-支持从nand flash启动同时支持norflash和nandflash启动方法一:在时钟修改方法一条件下:修改cpu/arm920t/start.S/*#ifndef CONFIG_SKIP_RELOCATE_UBOOTrelocate:*/* relocate U-Boot to RAM */adrr0, _start/* r0 - current position of code */ldrr1, _TEXT_BASE/* test if we run from flash or RAM */cmp r0, r1 /* dont reloc during debug

2、*/beq stack_setup/*check code position*/ldrr0,=48000000ldrr0,r0andsr0,r0,#6bnenor_boot#defineLENGTH_UBOOT 0x60000#defineNAND_CTL_BASE 0x4e000000/*offset*/#defineoNFCONF 0x00#defineoNFCONT0x04#defineoNFCMD0x08#defineoNFSTAT0x20nand_boot:movr1,#NAND_CTL_BASEldrr2,=(712)|(78)|(74)strr2,r1,#oNFCONFldrr2

3、,r1,#oNFCONFldrr2,=(14)|(01)|(10)strr2,r1,#oNFCONTldrr2,r1,#oNFCONTldrr2,=(0x6)strr2,r1,#oNFSTATldrr2,r1,#oNFSTATmovr2,#0xffstrr2,r1,#oNFCMDmovr3,#0nand1:addr3,r3,#0x1cmpr3,#0xabltnand1nand2:ldrr2,r1,#oNFSTATtstr2,#0x4beqnand2ldrr2,r1,#oNFCONTorrr2,r2,#0x2strr2,r1,#oNFCONTldrsp, DW_STACK_STARTmovfp,

4、 #0ldrr0, =TEXT_BASE movr1, #0x0 movr2, #LENGTH_UBOOTblnand_read_lltstr0, #0x0 beqok_nand_read bad_nand_read:loop2: b loop2ok_nand_read:mov r0, #0ldr r1, =TEXT_BASEmov r2, #0x400go_next:ldr r3, r0, #4ldr r4, r1, #4teq r3, r4bne notmatchsubs r2, r2, #4beq stack_setupbne go_nextnotmatch:loop3:b loop3n

5、or_boot:adrr0, _start /* r0 - current position of code */ ldrr1, _TEXT_BASE /* test if we run from flash or RAM */ ldrr2, _armboot_startldrr3, _bss_startsubr2, r3, r2/* r2 - size of armboot */addr2, r0, r2/* r2 - source end address */copy_loop:ldmiar0!, r3-r10/* copy from source address r0 */stmiar1

6、!, r3-r10/* copy to target address r1 */cmpr0, r2/* until source end addreee r2 */blecopy_loop/* Set up the stack */接着在board/mao2440下新建文件nand_boot.c,代码如下。并在makefile中添加编译项。#include #include #define _REGb(x) (*(volatile unsigned char *)(x)#define _REGw(x) (*(volatile unsigned short *)(x)#define _REGi(

7、x) (*(volatile unsigned int *)(x)#define NF_BASE 0x4e000000#define NFCONF _REGi(NF_BASE + 0x0)#define NFCONT _REGi(NF_BASE + 0x4)#define NFCMD _REGb(NF_BASE + 0x8)#define NFADDR _REGb(NF_BASE + 0xc)#define NFDATA _REGb(NF_BASE + 0x10)#define NFDATA16 _REGw(NF_BASE + 0x10)#define NFSTAT _REGb(NF_BASE

8、 + 0x20)#define NFSTAT_BUSY 1#define nand_select() (NFCONT &= (1 1)#define nand_deselect() (NFCONT |= (1 1)#define nand_clear_RnB() (NFSTAT |= (1 2)static inline void nand_wait(void)int i; while (!(NFSTAT & NFSTAT_BUSY)for (i=0; i 11; /* addr / 2048 */NFCMD = NAND_CMD_READ0;NFADDR = nand-bad_block_o

9、ffset & 0xff;NFADDR = (nand-bad_block_offset 8) & 0xff;NFADDR = page_num & 0xff;NFADDR = (page_num 8) & 0xff;NFADDR = (page_num 16) & 0xff;NFCMD = NAND_CMD_READSTART;nand_wait();data = (NFDATA & 0xff);if (data != 0xff)return 1;return 0; static int nand_read_page_ll(struct boot_nand_t * nand, unsigne

10、d char *buf, unsigned long addr) unsigned short *ptr16 = (unsigned short *)buf;unsigned int i, page_num;nand_clear_RnB();NFCMD = NAND_CMD_READ0;page_num = addr 11; /* addr / 2048 */* Write Address */NFADDR = 0;NFADDR = 0;NFADDR = page_num & 0xff;NFADDR = (page_num 8) & 0xff;NFADDR = (page_num 16) &

11、0xff;NFCMD = NAND_CMD_READSTART;nand_wait();for (i = 0; i page_size1); i+) *ptr16 = NFDATA16; ptr16+; return nand-page_size; static unsigned short nand_read_id() unsigned short res = 0; NFCMD = NAND_CMD_READID; NFADDR = 0; res = NFDATA; res = (res 8) | NFDATA; return res; extern unsigned int dynpart

12、_size; /* low level nand read function */ int nand_read_ll(unsigned char *buf, unsigned long start_addr, int size) int i, j; unsigned short nand_id; struct boot_nand_t nand; /* chip Enable */ nand_select(); nand_clear_RnB(); for (i = 0; i 10; i+) ; nand_id = nand_read_id(); nand.page_size = 2048; nand.block_size = 128 * 1024; nand.bad_block_offset = nand.page_size; / nand.size = 0x8000000; if(start_addr & (nand.block_size-1) | (size & (nand.block_size-1) return -1; /* invalid alignment */ for (i=start_addr; i (st

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 其它中学文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号