Chinaunix首页 | 论坛 | 博客
  • 博客访问: 425524
  • 博文数量: 131
  • 博客积分: 1990
  • 博客等级: 上尉
  • 技术积分: 996
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-24 12:15
文章分类
文章存档

2011年(4)

2010年(19)

2009年(108)

我的朋友

分类: 嵌入式

2009-10-30 16:22:30

u-boot- 1.1.6已经可以通过"nand write...""nand write.jffs2..."等命令来烧写cramfsjffs2文件系统映象文件,下面增加"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);

        }

…………………

…………………

2include/nand.h 中进行如下修改,增加 skipfirstblk 成员:

struct nand_write_options {
u_char *buffer;

………………

………………

int pad;

int blockalign;

int skipfirstblk;

}

3drivers/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正常启动。

阅读(1647) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~