分类: 嵌入式
2009-12-17 18:12:21
(四)
u-boot- 1.1.6已经可以通过"nand write..."、"nand write.jffs2..."等命令来烧写cramfs、jffs2文件系统映象文件,下面增加"nand write.yaffs..."命令实现yaffs文件系统映象的烧写。
1、在commom/cmd_nand.c中增加"nand write.yaffs..." 的使用说明,代码添加如下:
U_BOOT_CMD(nand, 5, 1, do_nand,
"nand - NAND sub-system\n",
"info - show available NAND devices\n"
"nand device [dev] - show or set current device\n"
"nand read[.jffs2] - addr off|partition size\n"
"nand write[.jffs2] - addr off|partiton size - read/write `size' bytes starting\n"
" at offset `off' to/from memory address `addr'\n"
"nand read.yaffs addr off size - read the `size' byte yaffs image starting\n"
" at offset `off' to memory address `addr'\n"
"nand write.yaffs addr off size - write the `size' byte yaffs image starting\n"
" at offset `off' from memory address `addr'\n"
"nand erase [clean] [off size] - erase `size' bytes from\n"
" offset `off' (entire device if not specified)\n"
"nand bad - show bad blocks\n"
……………………
……………………
然后,在 nand 命令的处理函数 do_nand 中增加对"nand yaffs..."的支持。do_nand 函数仍在 commom/cmd_nand.c 中实现,代码修改如下:
……………………
……………………
opts.quiet = quiet;
ret = nand_write_opts(nand, &opts);
}
}
else if ( s != NULL && !strcmp(s, ".yaffs")){
if (read) {
nand_read_options_t opts;
memset(&opts, 0, sizeof(opts));
opts.buffer = (u_char*) addr;
opts.length = size;
opts.offset = off;
opts.readoob = 1;
opts.quiet = quiet;
ret = nand_read_opts(nand, &opts);
} else {
nand_write_options_t opts;
memset(&opts, 0, sizeof(opts));
opts.buffer = (u_char*) addr;
opts.length = size;
opts.offset = off;
opts.noecc = 1;
opts.writeoob = 1;
opts.blockalign = 1;
opts.quiet = quiet;
opts.skipfirstblk = 1;
ret = nand_write_opts(nand, &opts);
}
} else {
if (read)
ret = nand_read(nand, off, &size, (u_char *)addr);
else
ret = nand_write(nand, off, &size, (u_char *)addr);
}
…………………
…………………
2、在 include/nand.h 中进行如下修改,增加 skipfirstblk 成员:
struct nand_write_options {
u_char *buffer;
………………
………………
int pad;
int blockalign;
int skipfirstblk;
};
3、在 drivers/nand/nand_util.c 修改 nand_write_opts 函数,增加对 skipfirstblk 成员的支持:
int nand_write_opts(nand_info_t *meminfo, const nand_write_options_t *opts)
{
int imglen = 0;
………………
………………
int result;
int skipfirstblk = opts->skipfirstblk;
………………
………………
} while (offs < blockstart + erasesize_blockalign);
}
if (skipfirstblk) {
mtdoffset += erasesize_blockalign;
skipfirstblk = 0;
continue;
}
readlen = meminfo->oobblock;
………………
进行上面移植后,u-boot 已经支持 yaffs 文件系统映象的烧写,由于前面设置"opts.noecc=1" 不使用ECC校验码,烧写时会提示很多提示信息,可以修改 drivers/nand/nand_base.c 文件中的 nand_write_page 函数,将其注释掉。
case NAND_ECC_NONE:
//printk (KERN_WARNING "Writing data without ECC to NAND-FLASH is not recommended\n");
最后在u-boot顶层目录执行:make s3c2410_config
make
命令后,在u-boot顶层目录中生成u-boot.bin文件,用jtag线下到板子上reset正常启动。