搜索
bottom↓
12
返回列表 发新帖
楼主: wshini7316

uboot移植yaffs2写操作问题?

[复制链接]

出0入0汤圆

发表于 2013-8-15 20:57:29 | 显示全部楼层
重新烧写一次,但烧写时需要注意,必须先erase掉整个partion,而不是image多大就erase多大。

出0入0汤圆

 楼主| 发表于 2013-8-15 22:08:55 | 显示全部楼层
lkm_unication 发表于 2013-8-15 20:57
重新烧写一次,但烧写时需要注意,必须先erase掉整个partion,而不是image多大就erase多大。 ...

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

出0入0汤圆

发表于 2013-8-16 08:42:24 | 显示全部楼层
现在就是我扫描之后这些数据怎么处理的,是怎么cp出来的?


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

出0入0汤圆

 楼主| 发表于 2013-8-16 17:46:21 | 显示全部楼层
lkm_unication 发表于 2013-8-16 08:42
这个不懂,这需要深入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;//这个结构是干什么用的?
};                          

出0入0汤圆

发表于 2013-8-16 18:01:34 | 显示全部楼层
wshini7316 发表于 2013-8-16 17:46
我跟踪了一下cp的时候的读函数过程如下:
int yaffs_file_rd(struct yaffs_obj *in, u8 * buffer, loff_t ...

你研究得越来越深入了。

出0入0汤圆

 楼主| 发表于 2013-8-18 20:26:50 | 显示全部楼层
lkm_unication 发表于 2013-8-16 18:01
你研究得越来越深入了。

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

出0入0汤圆

 楼主| 发表于 2013-8-19 12:18:41 | 显示全部楼层
lkm_unication 发表于 2013-8-16 18:01
你研究得越来越深入了。

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

出0入0汤圆

发表于 2013-8-19 12:38:26 | 显示全部楼层
其实oob的layout,yaffs2是不关心,这一切都由mtd driver来转换的。移植时,我记得一般就是不打开软件ecc,不让yaffs2计算ecc,其他的,都由mtd解决。但不知道新版本的会有什么区别了。

出0入0汤圆

 楼主| 发表于 2013-8-19 17:43:42 | 显示全部楼层
lkm_unication 发表于 2013-8-19 12:38
其实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[word_in_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[word_in_map] << bit_in_word);
        }
//打印val值

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

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

        return val;
}

出0入0汤圆

 楼主| 发表于 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[word_in_map] = 0x9500

val = 0

val = 39583744

val = 0

val = 0

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

出0入0汤圆

 楼主| 发表于 2013-8-20 17:39:33 | 显示全部楼层
lkm_unication 发表于 2013-8-19 12:38
其实oob的layout,yaffs2是不关心,这一切都由mtd driver来转换的。移植时,我记得一般就是不打开软件ecc, ...

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

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

谢谢您一直的帮助!

出0入0汤圆

 楼主| 发表于 2013-8-20 17:40:23 | 显示全部楼层
终于完成了!
过程真是痛苦啊!

出0入0汤圆

 楼主| 发表于 2013-8-20 17:46:49 | 显示全部楼层
lkm_unication 发表于 2013-8-19 12:38
其实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

出0入0汤圆

发表于 2013-8-20 18:58:49 | 显示全部楼层
wshini7316 发表于 2013-8-20 17:39
今天终于找到问题了,查了半天yaffs2的源码。没想到在freescale提供的nand写页函数中有一个判断,如果pag ...


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

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

出0入0汤圆

发表于 2013-8-20 19:06:01 | 显示全部楼层
wshini7316 发表于 2013-8-20 17:46
再问您个问题,android的uboot中下面的宏定义是什么意思:
/*
* Android support Configs

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

出0入0汤圆

发表于 2013-8-21 08:51:48 | 显示全部楼层
wshini7316 发表于 2013-8-20 17:40
终于完成了!
过程真是痛苦啊!

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

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

  5.         switch(ops->mode) {

  6.         case MTD_OOB_PLACE:
  7.         case MTD_OOB_RAW:
  8.                 memcpy(chip->oob_poi + ops->ooboffs, oob, len);
  9.                 return oob + len;

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

  14.                 for(; free->length && len; free++, len -= bytes) {
  15.                         /* Write request not from offset 0 ? */
  16.                         if (unlikely(woffs)) {
  17.                                 if (woffs >= free->length) {
  18.                                         woffs -= free->length;
  19.                                         continue;
  20.                                 }
  21.                                 boffs = free->offset + woffs;
  22.                                 bytes = min_t(size_t, len,
  23.                                               (free->length - woffs));
  24.                                 woffs = 0;
  25.                         } else {
  26.                                 bytes = min_t(size_t, len, free->length);
  27.                                 boffs = free->offset;
  28.                         }
  29.                         memcpy(chip->oob_poi + boffs, oob, bytes);
  30.                         oob += bytes;
  31.                 }
  32.                 return oob;
  33.         }
  34.         default:
  35.                 BUG();
  36.         }
  37.         return NULL;
  38. }
复制代码

出0入0汤圆

 楼主| 发表于 2013-8-21 09:54:15 | 显示全部楼层
lkm_unication 发表于 2013-8-21 08:51
你yaffs2文件系统里读取tags时的oob组织还是在yaffs2里做的吧,建议把它改在mtd的driver里,这样yaffs2就 ...

好的。我看一下。
谢谢!

出0入0汤圆

 楼主| 发表于 2013-8-21 17:37:45 | 显示全部楼层
lkm_unication 发表于 2013-8-21 08:51
你yaffs2文件系统里读取tags时的oob组织还是在yaffs2里做的吧,建议把它改在mtd的driver里,这样yaffs2就 ...

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

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

出0入0汤圆

发表于 2013-8-21 18:19:03 | 显示全部楼层
wshini7316 发表于 2013-8-21 17:37
您这么一说,我这么一看,终于明白。原来只要把dev->param.inband_tags = 0 ;还有就是yaffs2的ecc关掉, ...

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

出0入0汤圆

 楼主| 发表于 2013-8-22 09:46:50 | 显示全部楼层
lkm_unication 发表于 2013-8-21 18:19
话虽然是这么说,但如果你不走一遍,会忽略很多细节的。
其实我在你这个主题里也学到很多关于yaffs2和mtd ...

呵呵!共同进步!

出0入0汤圆

 楼主| 发表于 2013-9-17 09:51:56 | 显示全部楼层
lkm_unication 发表于 2013-8-21 18:19
话虽然是这么说,但如果你不走一遍,会忽略很多细节的。
其实我在你这个主题里也学到很多关于yaffs2和mtd ...

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


还有一个问题,就是我现在更改了程序让他可以在启动的时候挂载ubifs文件,但是在ubiattach的时候VID偏移默认的总是512,我怎么将其改为2048.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 13:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表