rtd1296 mtd 設備驅動分析


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM