CMD:
- sf probe # NOR初始化
- sf read mem_addr nor_offset size #从NOR相应的分区(偏移地址)读取指定大小的字节到内存中
路径:u-boot-2017.01-g70d59ba-v2.0\cmd\sf.c
do_spi_flash_read_write
跟踪 spi_flash_read 函数:
路径:\u-boot-2017.01-g70d59ba-v2.0\include\spi_flash.h
如果定义了 CONFIG_DM_SPI_FLASH
如果没有定义 CONFIG_DM_SPI_FLASH
在调用 spi_falsh_read / spi_falsh_erase /spi_falsh_write 之前,必须要进行 spi_flash_probe ,这就是为了扫描出 flash设备,确定flash 的存储大小,页大小,擦除大小等。在spi_falsh_scan 中会对函数指针 falsh->read / falsh-> erase / falsh-> write 赋值,从而确定具体的读写,擦除操作函数。
路径:\u-boot-2017.01-g70d59ba-v2.0\drivers\mtd\spi\sf_probe.c
spi_flash_probe -> spi_flash_probe_tail -> spi_flash_probe_slave -> spi_flash_scan
我们这里追踪到 spi_falsh_read 操作最终会调用 spi_flash_cmd_read_ops()
路径:\u-boot-2017.01-g70d59ba-v2.0\drivers\mtd\spi\spi_flash.c
追踪到 spi_flash_copy_mmap
void __weak spi_flash_copy_mmap 有 __weak修饰符说明这个函数在其他地方也有定义,代码编译时会首先连接没有__weak修饰符的函数定义,如果其他地方的定义没有开启,再连接这个带有 __weak修饰的函数。
另一个地方的定义:
我们这里将 CONFIG_TI_EDMA3 (/include/configs/am57xx_evm.h)关掉了,所以最终会调用void __weak spi_flash_copy_mmap 函数去将 NOR中的数据读出。
我们添加的 spl_impl_memcpy 函数其实就是 lib/string.c:memcpy() ,和memcpy的代码一样。
SPL阶段读NOR:
\u-boot-2017.01-g70d59ba-v2.0\common\spl\spl_spi.c
spi_flash_read
头文件:\u-boot-2017.01-g70d59ba-v2.0\include\spi_flash.h
SPL 和Uboot阶段读NOR时调用的都是同一个 API !