partitions中,並調用add_mtd_device()將此分區作為MTD設備加入mtd_table。成功時返回0,如果分配mtd_part時內存不足,則返回-ENOMEM。
1、在說這個函數前,先說下,與這有關的結構體struct mtd_part和struct
mtd_partition結構體,如下所示:
mtd_part結構體用於描述分區,其mtd_info結構體成員用於描述本分區
/* Our partition node structure */
struct
mtd_part {
struct mtd_info mtd;
分區的信息(大部分由其master決定
struct mtd_info
*master; 該分區的主分區
u_int32_t offset;
該分區的偏移地址
int index; 分區號
struct list_head list;
int registered;
};
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\":\n", 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;
}
return
0;
}