Chinaunix首页 | 论坛 | 博客
  • 博客访问: 955494
  • 博文数量: 116
  • 博客积分: 3923
  • 博客等级: 中校
  • 技术积分: 1337
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-23 01:22
文章分类

全部博文(116)

文章存档

2013年(1)

2012年(17)

2011年(69)

2009年(29)

分类: LINUX

2009-04-30 18:06:51

project     : Nand flash layout
instruction : Nand flash format imformation


1 block  = 32 pages
1 sector = 512 bytes
1 pages  = 512 bytes



--  _________________________________0x0400_0000 ( total: 64 M )
--  |  Partition Table          |---> (the upmost 1 block)
--  |___________________________|____0x03FF_C000 ( Partition Table )
--  |                           |
--  |                           |
--  |      root (61.67M)        |
--  |                           |
--  |___________________________|____0x0025_0000
--  |      kernel(2M)           |
--  |___________________________|____0x0005_0000
--  |      param (64K)          |
--  |___________________________|____0x0004_0000
--  |      eboot(128K)          |
--  |___________________________|____0x0002_0000
--  |      vivi (128K)          |
--  |___________________________|____0x0000_0000 ( Nand Flash base )


(1) the default MTD partitions:

mtd_partition_t default_mtd_partitions[] = {    /*struct mtd_partition_t was defined at include/priv_data.h*/
    {
        name:        "vivi",
        offset:        0,
        size:        0x00020000,
        flag:        0
    }, {
        name:        "eboot",
        offset:        0x00020000,
        size:        0x00020000,
        flag:        0
    },{
        name:        "param",
        offset:        0x00040000,
        size:        0x00010000,
        flag:        0
    },{
        name:        "kernel",
        offset:        0x00050000,
        size:        0x00200000,
        flag:        0
    }, {
        name:        "root",
        offset:        0x00250000,
        size:        0x03DAC000,
        flag:        0
    }
};


(2) Partition Table detailed:

|---- 8 bytes----||-- 4 bytes--|-4bytes-|-4bytes-||- Nx12 bytes-|| --- 4 bytes ---- | ................... || ..........
--------------------------------------------------------------------------------------------------------------------------
| bon_part_magic ||-- Offset --|--Size--|--flag--|| ... ... ... || P1 num_bad_block | 1 ... num_bad_block || P2 ... ...
--------------------------------------------------------------------------------------------------------------------------
|----------------||----------- part 1 -----------||-- ... ... --|| -------  the bad block of part 1 ------|| P2 ... ...

typedef struct {
    ulong offset;
    ulong size;
    ulong flag;
    ulong num_bad_block;
    unsigned short *bad_blocks;
} bon_partition_t;



(3) the code fragment for writting partition in ViVi.

int write_partition(struct mtd_info *mtd, ulong offset)
{
    unsigned char oobbuf[NAND_OOB_SIZE];
    char buf[NAND_SECTOR_SIZE];
    struct erase_info erase;
    unsigned int *s;
    int i, k;
    size_t retlen;
    if (mtd->read_oob(mtd, offset, NAND_OOB_SIZE, &retlen, oobbuf))
        return -1;
    if (oobbuf[5] != 0xFF) return -1;
    if (mtd->read(mtd, offset, NAND_SECTOR_SIZE, &retlen, buf)) {
        printk("read error: mark bad: offset = %lX\n", offset);
        mark_bad(mtd, offset);
        return -1;
    }
    erase.addr = offset;
    erase.len = mtd->erasesize;

    if (mtd->erase(mtd, &erase) < 0) {
        printk("erase error: mark bad: offset = %lX\n", offset);
        mark_bad(mtd, offset);
        return -1;
    }
    memcpy(buf, bon_part_magic, 8);
    s = (unsigned int *)(buf+8);
    *s++ = num_part;
    for (i = 0; i < num_part; i++) {
        *s++ = parts[i].offset;
        *s++ = parts[i].size;
        *s++ = parts[i].flag;
    }
    for (i = 0; i < num_part; i++) {
        *s++ = parts[i].num_bad_block;
        for (k = 0; k < parts[i].num_bad_block; k++) {
            *s++ = parts[i].bad_blocks[k];
            printk("k = %d block = %d\n", k, parts[i].bad_blocks[k]);
        }
    }
    if (mtd->write(mtd, offset, NAND_SECTOR_SIZE, &retlen, buf))
        return -1;
    if (retlen != NAND_SECTOR_SIZE) {
        printk("write error: offset = %lu\n", offset);
        mark_bad(mtd, offset);
        return -1;
    }
    return 0;
}

阅读(1363) | 评论(0) | 转发(0) |
0

上一篇:MMU Initial In ViVi

下一篇:clearcase create branch

给主人留下些什么吧!~~