當前位置:編程學習大全網 - 編程語言 - 求問linux nor flash驅動編程過程中add_mtd_partitions和del_mtd_partitions怎麽用?

求問linux nor flash驅動編程過程中add_mtd_partitions和del_mtd_partitions怎麽用?

add_mtd_partitions函數,add_mtd_partitions()會對每壹個新建分區建立壹個新的mtd_part 結構體,將其加入mtd_

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;

}

  • 上一篇:會計電算化用的什麽軟件?
  • 下一篇:合成大西瓜被指做局騙財,超166萬人被騙?對此妳怎麽看?
  • copyright 2024編程學習大全網