lkm_unication 发表于 2013-8-15 20:57:29

重新烧写一次,但烧写时需要注意,必须先erase掉整个partion,而不是image多大就erase多大。

wshini7316 发表于 2013-8-15 22:08:55

lkm_unication 发表于 2013-8-15 20:57 static/image/common/back.gif
重新烧写一次,但烧写时需要注意,必须先erase掉整个partion,而不是image多大就erase多大。 ...

我是erase掉整个partion的。
而且我在跟踪中查看tags结构中的数据也都是正确的。
现在就是我扫描之后这些数据怎么处理的,是怎么cp出来的?

lkm_unication 发表于 2013-8-16 08:42:24

现在就是我扫描之后这些数据怎么处理的,是怎么cp出来的?

这个不懂,这需要深入yaffs2才能明白。

wshini7316 发表于 2013-8-16 17:46:21

lkm_unication 发表于 2013-8-16 08:42 static/image/common/back.gif
这个不懂,这需要深入yaffs2才能明白。

我跟踪了一下cp的时候的读函数过程如下:
int yaffs_file_rd(struct yaffs_obj *in, u8 * buffer, loff_t offset, int n_bytes)
                               |
static int yaffs_rd_data_obj(struct yaffs_obj *in, int inode_chunk, u8 * buffer)
                               |   
int nand_chunk = yaffs_find_chunk_in_file(in, inode_chunk, NULL);
所有有问题的文件,这个nand_chunk都是不正确的。

int yaffs_find_chunk_in_file(struct yaffs_obj *in, int inode_chunk,
                                  struct yaffs_ext_tags *tags)
{
        /*Get the Tnode, then get the level 0 offset chunk offset */
        struct yaffs_tnode *tn;
        int the_chunk = -1;
        struct yaffs_ext_tags local_tags;
        int ret_val = -1;
        struct yaffs_dev *dev = in->my_dev;

        if (!tags) {
                /* Passed a NULL, so use our own tags space */
                tags = &local_tags;
        }

        tn = yaffs_find_tnode_0(dev, &in->variant.file_variant, inode_chunk);
//有的时候在这就跳出了,这块主要涉及就是in->variant.file_variant这个结构体,还不知道是写入有问题还是读出有问题
        if (!tn)
                return ret_val;

        the_chunk = yaffs_get_group_base(dev, tn, inode_chunk);

        ret_val = yaffs_find_chunk_in_group(dev, the_chunk, tags, in->obj_id,
                                              inode_chunk);
//有的时候这地方返回0,这块还没分析。
        return ret_val;
}


struct yaffs_file_var {
        loff_t file_size;
        loff_t scanned_size;
        loff_t shrink_size;
        int top_level;
        struct yaffs_tnode *top;//这个结构是干什么用的?
};                        

lkm_unication 发表于 2013-8-16 18:01:34

wshini7316 发表于 2013-8-16 17:46 static/image/common/back.gif
我跟踪了一下cp的时候的读函数过程如下:
int yaffs_file_rd(struct yaffs_obj *in, u8 * buffer, loff_t ...

你研究得越来越深入了。

wshini7316 发表于 2013-8-18 20:26:50

lkm_unication 发表于 2013-8-16 18:01 static/image/common/back.gif
你研究得越来越深入了。

没办法啊。总得把问题解决了啊!
还希望得到您的帮助啊!
周一我在测试一下看看到底是写入还是读出的问题。

wshini7316 发表于 2013-8-19 12:18:41

lkm_unication 发表于 2013-8-16 18:01 static/image/common/back.gif
你研究得越来越深入了。

yaffs2文件系统的移植,除了更改oob区的格式还要更改其他的什么东西啊。我总感觉有什么参数没有更改造成的?

lkm_unication 发表于 2013-8-19 12:38:26

其实oob的layout,yaffs2是不关心,这一切都由mtd driver来转换的。移植时,我记得一般就是不打开软件ecc,不让yaffs2计算ecc,其他的,都由mtd解决。但不知道新版本的会有什么区别了。

wshini7316 发表于 2013-8-19 17:43:42

lkm_unication 发表于 2013-8-19 12:38 static/image/common/back.gif
其实oob的layout,yaffs2是不关心,这一切都由mtd driver来转换的。移植时,我记得一般就是不打开软件ecc, ...

我现在将原来system文件中挂载有问题的一个文件单独压缩,system/app/AccountAndSyncSettings.apk,unyaffs2加压正常,文件正确。
然后挂载测试,将存在一页读取错误,跟踪如下:
the_chunk = yaffs_get_group_base(dev, tn, inode_chunk);函数返回0
u32 yaffs_get_group_base(struct yaffs_dev *dev, struct yaffs_tnode *tn, unsigned pos)
{
        u32 *map = (u32 *) tn;
        u32 bit_in_map;
        u32 bit_in_word;
        u32 word_in_map;
        u32 val;

        pos &= YAFFS_TNODES_LEVEL0_MASK;

        bit_in_map = pos * dev->tnode_width;
        word_in_map = bit_in_map / 32;
        bit_in_word = bit_in_map & (32 - 1);
        val = map >> bit_in_word;
//打印val值

        if (dev->tnode_width > (32 - bit_in_word)) {
                bit_in_word = (32 - bit_in_word);
                word_in_map++;
                val |= (map << bit_in_word);
        }
//打印val值

        val &= dev->tnode_mask;
//打印val值

        val <<= dev->chunk_grp_bits;
//打印val值

        return val;
}

wshini7316 发表于 2013-8-19 17:44:40

*************yaffs_file_rd**************
dev->tnode_width = 0x12

dev->tnode_mask = 0x3ffff

dev->chunk_grp_bits = 0

bit_in_map = 90

word_in_map = 2

map = 0x9500

val = 0

val = 39583744

val = 0

val = 0

----------the_chunk = 0---- ret_val = 0xffffffff

wshini7316 发表于 2013-8-20 17:39:33

lkm_unication 发表于 2013-8-19 12:38 static/image/common/back.gif
其实oob的layout,yaffs2是不关心,这一切都由mtd driver来转换的。移植时,我记得一般就是不打开软件ecc, ...

今天终于找到问题了,查了半天yaffs2的源码。没想到在freescale提供的nand写页函数中有一个判断,如果page中的数据都是0xff,就不去写此页,不去管spare区的数据。所以导致在镜像中如果page数据都是0xff,但是oob又有tags的结构的时候,就没有正确的写入到nand中。还都是0xff。

现在更改之后挂载system文件可以正常启动了。

谢谢您一直的帮助!

wshini7316 发表于 2013-8-20 17:40:23

终于完成了!{:biggrin:}{:biggrin:}{:biggrin:}{:biggrin:}{:biggrin:}
过程真是痛苦啊!

wshini7316 发表于 2013-8-20 17:46:49

lkm_unication 发表于 2013-8-19 12:38 static/image/common/back.gif
其实oob的layout,yaffs2是不关心,这一切都由mtd driver来转换的。移植时,我记得一般就是不打开软件ecc, ...

再问您个问题,android的uboot中下面的宏定义是什么意思:
/*
* Android support Configs
*/

#define CONFIG_USB_DEVICE
#define CONFIG_FASTBOOT                1
#define CONFIG_IMX_UDC                1
#define CONFIG_FASTBOOT_STORAGE_EMMC
#define CONFIG_FASTBOOT_VENDOR_ID        0xbb4
#define CONFIG_FASTBOOT_PRODUCT_ID        0xc01
#define CONFIG_FASTBOOT_BCD_DEVICE        0x311
#define CONFIG_FASTBOOT_MANUFACTURER_STR"Freescale"
#define CONFIG_FASTBOOT_PRODUCT_NAME_STR "i.mx53 loco"
#define CONFIG_FASTBOOT_CONFIGURATION_STR"Android fastboot"
#define CONFIG_FASTBOOT_INTERFACE_STR    "Android fastboot"
#define CONFIG_FASTBOOT_SERIAL_NUM       "12345"
#define CONFIG_FASTBOOT_TRANSFER_BUF       0x80000000
#define CONFIG_FASTBOOT_TRANSFER_BUF_SIZE 0x8000000 /* 128M byte */

#define CONFIG_ANDROID_RECOVERY

#define CONFIG_ANDROID_RECOVERY_BOOTARGS_MMC \
        "setenv bootargs ${bootargs} init=/init root=/dev/mmcblk0p4 rootfs=ext4"
#define CONFIG_ANDROID_RECOVERY_BOOTCMD_MMC\
        "run bootargs_base bootargs_android_recovery;mmc read 0 ${loadaddr} 0x800 0x1800;bootm"
#define CONFIG_ANDROID_RECOVERY_CMD_FILE "/recovery/command"

#define CONFIG_ANDROID_CACHE_PARTITION_MMC 6

lkm_unication 发表于 2013-8-20 18:58:49

wshini7316 发表于 2013-8-20 17:39 static/image/common/back.gif
今天终于找到问题了,查了半天yaffs2的源码。没想到在freescale提供的nand写页函数中有一个判断,如果pag ...

这个bug很隐蔽,但freescale的这个bug是不可原谅的。因为driver不能这么主观武断。

我其实没有什么实质性的帮忙,呵呵!
any way,还是要恭喜你啊!

lkm_unication 发表于 2013-8-20 19:06:01

wshini7316 发表于 2013-8-20 17:46 static/image/common/back.gif
再问您个问题,android的uboot中下面的宏定义是什么意思:
/*
* Android support Configs


这些宏有些是freescale移植fastboot所用的,android的fastboot是通过usb进行的;
有些是bootloader的加载参数,根据不同的情况加载不同的分区,比如说在kernel里应为某个原因需要重启,如需要恢复系统,那么就在CPU的重启也不会被reset的寄存器里致个标志,在bootloader里根据该标志加载不同的分区,还可以用于系统更新等,总之没有固定的用法,可以自己规划。

lkm_unication 发表于 2013-8-21 08:51:48

wshini7316 发表于 2013-8-20 17:40 static/image/common/back.gif
终于完成了!
过程真是痛苦啊!

你yaffs2文件系统里读取tags时的oob组织还是在yaffs2里做的吧,建议把它改在mtd的driver里,这样yaffs2就脱离硬件了,降低了耦合度。

可参考nand_base里的nand_fill_oob,我的nand_fill_oob是以下的内容:static uint8_t *nand_fill_oob(struct nand_chip *chip, uint8_t *oob,
                                  struct mtd_oob_ops *ops)
{
        size_t len = ops->ooblen;

        switch(ops->mode) {

        case MTD_OOB_PLACE:
        case MTD_OOB_RAW:
                memcpy(chip->oob_poi + ops->ooboffs, oob, len);
                return oob + len;

        case MTD_OOB_AUTO: {
                struct nand_oobfree *free = chip->ecc.layout->oobfree; // 用分段free里的内容组合成连续的oob内容返回,这样tags就是连续的了
                uint32_t boffs = 0, woffs = ops->ooboffs;
                size_t bytes = 0;

                for(; free->length && len; free++, len -= bytes) {
                        /* Write request not from offset 0 ? */
                        if (unlikely(woffs)) {
                                if (woffs >= free->length) {
                                        woffs -= free->length;
                                        continue;
                                }
                                boffs = free->offset + woffs;
                                bytes = min_t(size_t, len,
                                              (free->length - woffs));
                                woffs = 0;
                        } else {
                                bytes = min_t(size_t, len, free->length);
                                boffs = free->offset;
                        }
                        memcpy(chip->oob_poi + boffs, oob, bytes);
                        oob += bytes;
                }
                return oob;
        }
        default:
                BUG();
        }
        return NULL;
}

wshini7316 发表于 2013-8-21 09:54:15

lkm_unication 发表于 2013-8-21 08:51 static/image/common/back.gif
你yaffs2文件系统里读取tags时的oob组织还是在yaffs2里做的吧,建议把它改在mtd的driver里,这样yaffs2就 ...

好的。我看一下。
谢谢!

wshini7316 发表于 2013-8-21 17:37:45

lkm_unication 发表于 2013-8-21 08:51 static/image/common/back.gif
你yaffs2文件系统里读取tags时的oob组织还是在yaffs2里做的吧,建议把它改在mtd的driver里,这样yaffs2就 ...

您这么一说,我这么一看,终于明白。原来只要把dev->param.inband_tags = 0 ;还有就是yaffs2的ecc关掉,yaffs2源码就不用改了。
只需要将nand的ecclayout就够写好就ok了。
真是走了不少冤枉路啊!

真是太感谢您了!这回是真的把yaffs2移植好了!

lkm_unication 发表于 2013-8-21 18:19:03

wshini7316 发表于 2013-8-21 17:37 static/image/common/back.gif
您这么一说,我这么一看,终于明白。原来只要把dev->param.inband_tags = 0 ;还有就是yaffs2的ecc关掉, ...

话虽然是这么说,但如果你不走一遍,会忽略很多细节的。
其实我在你这个主题里也学到很多关于yaffs2和mtd driver的细节。也感谢你的这个主题。

wshini7316 发表于 2013-8-22 09:46:50

lkm_unication 发表于 2013-8-21 18:19 static/image/common/back.gif
话虽然是这么说,但如果你不走一遍,会忽略很多细节的。
其实我在你这个主题里也学到很多关于yaffs2和mtd ...

呵呵!共同进步!

wshini7316 发表于 2013-9-17 09:51:56

lkm_unication 发表于 2013-8-21 18:19 static/image/common/back.gif
话虽然是这么说,但如果你不走一遍,会忽略很多细节的。
其实我在你这个主题里也学到很多关于yaffs2和mtd ...

您好!我想再问您个问题,我现在想android起来之后挂载ubifs文件系统(手动mount),但是原bin文件中没有ubiattach命令。我从网上下源码编译之后复制到bin目录下,每次运行都提示找不到这个命令。可是在这个文件下已经有这个命令了啊?
不知道还需要更改什么其他的东西吗?


还有一个问题,就是我现在更改了程序让他可以在启动的时候挂载ubifs文件,但是在ubiattach的时候VID偏移默认的总是512,我怎么将其改为2048.
页: 1 [2]
查看完整版本: uboot移植yaffs2写操作问题?