1.MTD启动流程:
1.1生成MTD节点
arch/arm/dts/rv1126-u-boot.dtsi
spi_nand: flash@0 {
u-boot,dm-spl;
compatible = "spi-nand";
reg = <0>;
spi-tx-bus-width = <1>;
spi-rx-bus-width = <4>;
spi-max-frequency = <96000000>;
};
DTS-> compatible = "spi-nand";
->spinand_probe
->mtd_device_register
->mtd_device_parse_register
->add_mtd_partitions
->add_mtd_device
->dev_set_name(&mtd->dev, "mtd%d", i);
->device_create(&mtd_class, mtd->dev.parent, MTD_DEVT(i) + 1, NULL,"mtd%dro", i);
===================================================================
1.2,生成节点后注册读写函数;
驱动层 | 核心层 | 设备层 |
驱动函数 | core | 硬件函数 |
==============================例1:=====================================
驱动层:yaffs
核心层:
设备层:(硬件相关)
总结:
yaffs驱动层:
->yaffs_mtd_drv_install //注册驱动读写函数等
->yaffs_mtd_write //驱动的写函数
->yaffs_mtd_read //驱动的读函数\
->mtd_read_oob //核心层的读函数
核心层:
->mtd_read_oob //核心层的读函数
->mtd->_read_oob //mtd就是核心结构体
->到达设备层读函数
设备层:
->spinand_init//设备初始化的时候设置了_read_oob
->mtd->_read_oob = spinand_mtd_read;
->spinand_read_page//设备的读操作
==============================例2:uboot==================================
设备层:
核心层:
驱动层:
======================================================================
这里分析一下ID获取这些
//设备层:
->spinand_init
->spinand_detect
->spinand_id_detect
->spinand_manufacturer_match
->spinand_manufacturers[i];//这个是数组
->xtx_spinand_table//这个就是存放ID这些参数
=========================================================================
mtd烧录工具,是uboot工具,调用后会谈到do_mtd函数
核心是:do_mtd
直接去干 核心层的读函数:mtd_read_oob
=========================================================================
rk自己一套的rkflash,预留;
compatible = "rockchip,sfc";
->rksfc_probe
->rkflash_dev_init
->sfc_nand_mtd_init
->mtd_device_register
->mtd_device_parse_register
=========================核心层=========================
->add_mtd_partitions
->add_mtd_device
->dev_set_name(&mtd->dev, "mtd%d", i);//生成节点
核心层