uboot spi nor flash初始化相关的阅读分析(一)

发布于:2024-07-11 ⋅ 阅读:(47) ⋅ 点赞:(0)

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) 设置关机处理函数 
	

在这里插入图片描述