spi-nor驱动适配多种spi nor flash, 这些flash的驱动层代码差异, 由flash_info的几个参数表示.
spi-nor.c为mtd子系统服务, 为mtd层提供如下几个接口:
spi_nor_scan调用spi_nor_read_id从chip获取ID, 根据chip ID得到该芯片的flash_info
1. 设置mtd_info的type, writesize, size等参数
2. 设置mtd_info的_erase, _read, _write回调函数
3. 设置mtd_info 的erasesize
m25p80.c底层接口为common的spi调用接口, common spi接口会调用qspi master.
Linux spi子系统中, 存在两个角色
系统要访问spi device, 必须通过spi master设备访问, 通常spi master和spi device是一对多的关系, 一个spi master上挂载多个spi device, 通过chip select选取操作哪个spi device
一个spi master对应一个spi bus num, 系统有几个spi master就有几条spi bus. 参见spi_register_master
Linux操作系统会为每一个spi master创建相应的设备节点, 比如ti mcspi对应/dev/spi1, ti qspi对应/dev/spi32766
在spi_register_master的最后阶段, 会扫描device tree中master的子节点(master子节点就是挂在它下面的spi device).
spi_init首先初始化注册spi_bus_type, 这是所有spi初始化的起点, 没有spi_bus_type就无法就进行spi device和spi bus的匹配.
spi bus使用spi_match_device作为driver和device的匹配函数
1. 首先尝试匹配driver的of_match_table
2. 然后是id_table
3. 最后会尝试匹配spi device的modalias和driver->name
m25p80.c定义了一个spi driver m25p80_driver.
在系统初始化阶段module_spi_driver(m25p80_driver)会注册一个spi driver, 在注册过程中, kernel会查看spi_bus上的spi device是否match这个m25p80_driver, 如果match则调用m25p80_dirver的probe函数.