u-boot移植5--从nandflash启动.doc_第1页
u-boot移植5--从nandflash启动.doc_第2页
u-boot移植5--从nandflash启动.doc_第3页
u-boot移植5--从nandflash启动.doc_第4页
u-boot移植5--从nandflash启动.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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 */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,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, #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 loop3nor_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!, 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(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 + 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_offset & 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, unsigned 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) & 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_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 (start_addr + size);) j = nand_read_page_ll(&nand, buf, i); i += j; buf += j; /* chip Disable */ nand_deselect(); return 0; 最后在board/mao2440/u-boot.lds中添加:.text : cpu/arm920t/start.o(.text) board/mao2440/nand_boot.o(.text) *(.text)结果:方法二、在时钟修改方法二条件下:修改cpu/arm920t/start.S/* Set up the stack */stack_setup:ldrr0, _TEXT_BASE/* upper 128 KiB: relocated uboot */subr0, r0, #CFG_MALLOC_LEN/* malloc area */subr0, r0, #CFG_GBL_DATA_SIZE /* bdinfo */#ifdef CONFIG_USE_IRQsubr0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)#endifsubsp, r0, #12/* leave 3 words for abort-stack */blclock_init/#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 */beq clear_bssldrr2, _armboot_startldrr3, _bss_startsubr2, r3, r2/* r2 - size of armboot */#if 1blCopyCode2Ram#elseaddr2, r0, r2/* r2 - source end address */copy_loop:ldmiar0!, r3-r10/* copy from source address r0 */stmiar1!, r3-r10/* copy to target address r1 */cmpr0, r2/* until source end addreee r2 */blecopy_loop#endif/#endif/* CONFIG_SKIP_RELOCATE_UBOOT */clear_bss:在board/mao2440/boot_init.c中增加如下代码#include #include #include #define _REGb(x) (*(volatile unsigned char *)(x)#define _REGw(x) (*(volatile unsigned short *)(x)#define _REGi(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 + 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_offset & 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, unsigned 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) & 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(void) unsigned short res = 0; NFCMD = NAND_CMD_READID; NFADDR = 0; res = NFDATA; res = (res 8) | NFDATA; return res; extern unsigned int dynpart_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 (start_addr + size);) j = nand_read_page_ll(&nand, buf, i); i += j; buf += j; /*

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论