设为首页 加入收藏

TOP

Linux下的nandflash驱动分析(3)——基于S3C6410平台(一)
2014-11-24 12:31:39 来源: 作者: 【 】 浏览:4
Tags:Linux nandflash 驱动 分析 基于 S3C6410 平台

在上一篇中probe函数中的一个很重要的函数nand_scan函数,现在来说另外一个很重要的函数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;
};

/*
* 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\":\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->

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux下的nandflash驱动分析(2).. 下一篇Linux下avr的开发AVRDUDE的使用简..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·CPython是什么?PyPy (2025-12-26 06:50:09)
·Python|如何安装seab (2025-12-26 06:50:06)
·python要学习数据分 (2025-12-26 06:50:03)
·每日一道面试题-多线 (2025-12-26 06:20:17)
·java项目中哪些地方 (2025-12-26 06:20:14)