board_r.c
#ifdef CONFIG_CMD_SF
initr_snor,
#endif
static int initr_snor(void)
{
puts("SPI Nor: ");
spi_flash_probe(CONFIG_ENV_SPI_BUS, CONFIG_ENV_SPI_CS,
CONFIG_ENV_SPI_MAX_HZ, CONFIG_ENV_SPI_MODE);
return 0;
}
driver/mtd/spi/vendor_spi_nor.c
spiflash = fmc100_spi_nor_probe(&spiinfo_ex);
driver/mtd/spi/fmc100
/* FMC ip version check */
ret = fmc_ip_ver_check(); //检测版本号
ret = fmc100_spi_nor_init(host);
ret = fmc100_host_init(host); // static struct fmc_host fmc100_host; 给fmc100_host host->regbase host->iobase 赋值给硬件地址
host->set_system_clock = fmc_set_fmc_system_clock; // 实现fmc时钟函数
host->set_host_addr_mode = fmc100_set_host_addr_mode; // 实现4 addr函数
host->set_system_clock(NULL, ENABLE); //使能时钟
drivers/mtd/spi/fmc100.c
fmc100_spi_nor_scan
ret = match_chip_id(mtd, spi); //读取id 和比较id 返回id数组的值 出错的话 后面直接返回
spiinfo = fmc_spi_nor_serach_ids(ids, MAX_SPI_NOR_ID_LEN);
ret = chip_spi_init(mtd, spi, spiinfo, cs, ids); //这里做了很多工作 待分析
host->set_host_addr_mode(host, ENABLE); //使能4-byte 模式
spi_nor_func_hook(host);
spi_nor_flash->write = fmc100_dma_write;
spi_nor_flash->read = fmc100_dma_read;
spi_nor_flash->erase = fmc100_reg_erase_one_block;
fmc100_probe_spi_size(spi_nor_flash); //得到flash的大小并且串口打印出来
add_shutdown(fmc100_driver_shutdown); // 设置关机处理函数
总结:
(1) board_r.c initr_snor 调用运行的,初始化完成这个,就可以读取flash的环境变量.
(2) 检测版本号
(3) 给fmc100_host host->regbase host->iobase 赋值给硬件地址, 实现fmc时钟函数,实现实现4 addr函数
(4) host->set_system_clock(NULL, ENABLE); //使能时钟
(5) 读取id 和比较id 返回id数组的值 出错的话 后面直接返回
chip_spi_init(mtd, spi, spiinfo, cs, ids); //这里做了很多工作 待分析
(6) 使能4-byte 模式
(7) 给fmc100_host 实现读写和擦除函数
(8) 得到flash的大小并且串口打印出来
(9) 设置关机处理函数