看看红色的区域,do_map_probe返回了一个mtd_info结构指针。那么表明这个函数在正确找到你的驱动(cfi驱动)后会填好这个表把其中的读写函数等设置到正确的值,具体的实现放到以后分析吧,其中的一个map_info参数,我暂时没有完全读懂,因为我以前不曾研究flash的底层驱动,你需要设置好bankwidth和基地址,和驱动名字,我只能通过一些信息猜测他用来管理这个主分区并给底层驱动使用的,如坏块信息就保存在这里。
最后是调用add_mtd_partitions根据你设置的分区表和主分区的mtd_info来分区。其实如果你不打算给这个主分区分成几个区,你可以直接把这个mtd_info加到mtd_table而不需要mtdpart.c中的处理。这是后话,先沿着这条路分析一下:这个函数跳到了文件mtdpart.c。当你的把主分区分成几个区以后这几个分区的mtd_info和你的主分区是大部分是一样的,只是在size,name等方面不一样。add_mtd_partitions函数太大了点,全部贴出来不合适,我挑几行吧。
slave->mtd.type = master->type; //复制了主分区的信息
slave->mtd.size = parts[i].size; //改了size
slave->mtd.oobblock = master->oobblock; //复制了主分区的信息
slave->mtd.name = parts[i].name; //改了名字
slave->mtd.bank_size = master->bank_size; //复制了主分区的信息
slave->mtd.read = part_read; //这个是自己的,下面分析看看
if(parts[i].mtdp)
{ /* store the object pointer (caller may or may not register it */
*parts[i].mtdp = &slave->mtd;
slave->registered = 0;//你也可以不加进mtd_table中
}
else
{
/* register our partition */
add_mtd_device(&slave->mtd););//最后是这个,加进mtd_table中的是而不是那个包含它的结构mtd_part
slave->registered = 1;
}
static int part_read (struct mtd_info *mtd, loff_t from, size_t len,
size_t *retlen, u_char *buf)
{
struct mtd_part *part = PART(mtd);
if (from >= mtd->size)
len = 0;
else if (from + len > mtd->size)
len = mtd->size - from;
if (part->master->read_ecc == NULL)
return part->master->read (part->master, from + part->offset,
len, retlen, buf);
else
return part->master->read_ecc (part->master, from + part->offset,
len, retlen, buf, NULL, &mtd->oobinfo);
}
这下清楚了:还是调用主分区的读函数,就是加上了偏移量而已。