移植uboot第九步:支持yaffs映像烧写

uboot启动以后,先烧写jffss看看能不能用

tftp 30000000 fs_mini_mdev.jffs2
nand erase.part rootfs
nand write.jffs2 30000000 0x00260000 5b89a8

“5b89a8”是实际文件的大小,下载以后会显示的,直接copy过来就可以了。这个时候还不能直接启动,uboot传给内核的参数需要修改

bootargs=console=ttySAC0 root=/dev/mtdblock3 

修改为

bootargs=console=ttySAC0 root=/dev/mtdblock3 rootfstype=jffs2

说明根文件系统的格式是jffs2的。
命令:boot 启动。
结果:成功启动jffs格式的根文件系统

再来试试yaffs格式的根文件
uboot的参数修改为

bootargs=console=ttySAC0 root=/dev/mtdblock3 rootfstype=yaffs2

烧写YAFFS

tftp 30000000 fs_mini_mdev.yaffs2
nand erase.part rootfs
nand write.yaffs 30000000 260000  889bc0

出现错误,说没有yaffs,进入文件查找

#ifdef CONFIG_CMD_NAND_YAFFS
        } else if (!strcmp(s, ".yaffs")) {
            if (read) {
                printf("Unknown nand command suffix '%s'.\n", s);
                return 1;
            }
            ret = nand_write_skip_bad(nand, off, &rwsize,
                        (u_char *)addr, WITH_YAFFS_OOB);
#endif

CONFIG_CMD_NAND_YAFFS没有宏定义,将其在s3c2440.h文件中宏定义。
此外还需要一些修改,我直接跟着韦东山改的,是uboot里面逻辑之类的错误,不好好查代码根本查不出来。
在刚才的函数中找到nand_write_skip_bad函数,进入
a.找到下面这段代码

for (page = 0; page < pages; page++) {
                WATCHDOG_RESET();

                ops.datbuf = p_buffer;
                ops.oobbuf = ops.datbuf + pagesize;

                rval = nand->write_oob(nand, offset, &ops);
                if (!rval)      
                    break;

                offset += pagesize;
                p_buffer += pagesize_oob;
            }

修改为

for (page = 0; page < pages; page++) {
                WATCHDOG_RESET();

                ops.datbuf = p_buffer;
                ops.oobbuf = ops.datbuf + pagesize;

                rval = nand->write_oob(nand, offset, &ops);
                if (rval)       /* 原先是非,这样是错的,把非去掉 */
                    break;

                offset += pagesize;
                p_buffer += pagesize_oob;
            }

b.在上面代码的上方的

ops.mode = MTD_OOB_AUTO;

修改为

ops.mode = MTD_OOB_RAW;

编译,烧写。成功启动根文件系统

猜你喜欢

转载自blog.csdn.net/ltc844139730/article/details/52202785