/* * Partition definition structure: * * An array of struct partition is passed along with a MTD object to * add_mtd_partitions() to create them. * * For each partition, these fields are available: * name: string that will be used to label the partition"s MTD device. * size: the partition size; if defined as MTDPART_SIZ_FULL, the partition * will extend to the end of the master MTD device. * offset: absolute starting position within the master MTD device; if * defined as MTDPART_OFS_APPEND, the partition will start where the * previous one ended; if MTDPART_OFS_NXTBLK, at the next erase block. * mask_flags: contains flags that have to be masked (removed) from the * master MTD flag set for the corresponding MTD partition. * For example, to force a read-only partition, simply adding * MTD_WRITEABLE to the mask_flags will do the trick. * * Note: writeable partitions require their size and offset be * erasesize aligned (e.g. use MTDPART_OFS_NEXTBLK). */
struct mtd_partition { char *name; /* identifier string */ 标识字符串 u_int32_t size;/* partition size */ 分区大小 u_int32_t offset;/* offset within the master MTD space */ 主MTD空间内的偏移 u_int32_t mask_flags;/* master MTD flags to mask out for this partition */ struct nand_ecclayout *ecclayout;/* out of band layout for this partition (NAND only)*/ struct mtd_info **mtdp;/* pointer to store the MTD object */ }; 现在来看下6410中的定义:struct mtd_partition s3c_partition_info[] = { { .name = "Bootloader", .offset = 0, .size = (256*SZ_1K), .mask_flags = MTD_CAP_NANDFLASH, }, { .name = "Kernel", .offset = (256*SZ_1K), .size = (4*SZ_1M) - (256*SZ_1K), .mask_flags = MTD_CAP_NANDFLASH, }, #if defined(CONFIG_SPLIT_ROOT_FILESYSTEM) { .name = "Rootfs", .offset = (4*SZ_1M), // .size = (512*SZ_1M),//(48*SZ_1M), .size = (80*SZ_1M),//(48*SZ_1M), }, #endif { .name = "File System", .offset = MTDPART_OFS_APPEND, .size = MTDPART_SIZ_FULL, } };
struct s3c_nand_mtd_info s3c_nand_mtd_part_info = { .chip_nr = 1, .mtd_part_nr = ARRAY_SIZE(s3c_partition_info), .partition = s3c_partition_info, }; 2、下面来看add_mtd_partitions函数,源码如下:/* * This function, given a master MTD object and a partition table, creates * and registers slave MTD objects which are bound to the master according to * the partition definitions. * (Q: should we register the master MTD object as well?) */ int add_mtd_partitions(struct mtd_info *master, const struct mtd_partition *parts, int nbparts) { struct mtd_part *slave; u_int32_t cur_offset = 0; int i;
printk(KERN_NOTICE "Creating %d MTD partitions on "%s":
", nbparts, master->name);
for (i = 0; i < nbparts; i++) { 主要就是这个循环体,应该是分别添加每个struct mtd_partition结构 slave = add_one_partition(master, parts + i, i, cur_offset); if (!slave) return -ENOMEM; cur_offset = slave->offset + slave->mtd.size; }