mtd 分區一般采用3種方式實現
1、內核寫死 mtd_partition
2、u-boot 傳參
為了使kernel能夠解析mtdparts信息,我們需要將內核中的Device Drivers -> Memory Technology Device (MTD) support ->Command line partition table parsing選項開啟
3、dts 傳參
1296的實現方式是u-boot傳參
linux 調用 parse_mtd_partitions (注意part_probes參數)和 add_mtd_partitions實現
具體代碼如下:linux-4.4.18/drivers/mtd$ vi chips/rtk_sfc.c
static const char * const part_probes[] = { "cmdlinepart", "RedBoot", NULL };
#ifdef CONFIG_MTD_CMDLINE_PARTS
printk("[%s]descriptor size 0x%x\n",__FUNCTION__,(unsigned int)descriptor.size);
nr_parts = parse_mtd_partitions(&descriptor, part_probes, &parts, 0);
#endif
if(nr_parts <= 0) {
printk(KERN_NOTICE "Rtk SFC: using single partition\n");
if(add_mtd_device(&descriptor)) {
printk(KERN_WARNING "Rtk SFC: (for SST/SPANSION/MXIC/WINBOND SPI-Flash) Failed to register new device\n");
return -EAGAIN;
}
}
else {
printk(KERN_NOTICE "Rtk SFC: using dynamic partition\n");
add_mtd_partitions(&descriptor, parts, nr_parts);
}
另外,發現rtd1296會多一個disc分區,原來是他修改了add_mtd_partitions函數,把整個設備作為一個完整的分區添加了。
代碼如下:
linux-4.4.18/drivers/mtd$ vi mtdpart.c
add_mtd_partitions函數最后:
//#ifdef CONFIG_MTD_NAND_DISC
#if defined(CONFIG_ARCH_RTD129X) || defined(CONFIG_ARCH_RTD119X)
struct mtd_partition partDISC = {0};
// The name that represents the whole MTD Flash device
partDISC.name = "disc";
partDISC.size = master->size;
partDISC.offset = 0;
slave = allocate_partition(master, &partDISC, nbparts, 0);
if (IS_ERR(slave))
return PTR_ERR(slave);
mutex_lock(&mtd_partitions_mutex);
list_add(&slave->list, &mtd_partitions);
mutex_unlock(&mtd_partitions_mutex);
add_mtd_device(&slave->mtd);
#endif