概述

IFC(Integrated Internal Controller)用于访问异步NAND flash, 异步NOR flash,SRAM, generic ASIC memory和EPROM。T2080RDB-PC的IFC原理图,
NXP(Freescale) QorIQ T2080 IFC

NOR

特性:

  1. 支持地址数据复用ADM(address data multiplexed)NOR芯片
  2. 系统复位后,启动片选为CS0
  3. 数据宽度为8或16bits

T2080RDB-PC的NOR原理图,
NXP(Freescale) QorIQ T2080 IFC
参考RM 13.4.1.2.1,T2080RDB-PC采用Mode 0,地址复用时数据总线上为地址的MSB,功能框图,因为是16位的NOR,所以A26不使用,对于8位的NOR,A26接A0。Latch由74LVC16373锁存器完成。
NXP(Freescale) QorIQ T2080 IFC
地址转换流程,ADM_SHIFT=5,和T2080RDB-PC是对应的,及从A5到A30,A31悬空。
NXP(Freescale) QorIQ T2080 IFC
启动时的ADM_SHIFT由cfg_rcw_src决定,
NXP(Freescale) QorIQ T2080 IFC
而T2080RDB-PC的值为11,所以有32位的寻址能力。启动后ADM_SHIFT由IFC_CSORn_NOR寄存器决定,可以移动0到20位。
NXP(Freescale) QorIQ T2080 IFC
看下T2080RDB-PC的image分布,通过控制原理图中的CFG_VBANK0脚从0到1(CFG_VBANK1=0,CFG_VBANK2=0),切换0xE8xxxxxx到0xECxxxxxx(异或关系),这儿的CPU寻址的高地址出现在了低地址线。
NXP(Freescale) QorIQ T2080 IFC
RCW在0xE8000000,这是uboot看到的,估计也是内核看到的,这点从uboot代码可以看出,FLASH的基址在0xE8000000,CONFIG_SYS_NOR_AMASK是128MB,符合硬件设计,

//T208xRDB.h
#define CONFIG_SYS_FLASH_BASE		0xe8000000
#define CONFIG_SYS_FLASH_BASE_PHYS	(0xf00000000ull | CONFIG_SYS_FLASH_BASE)
#define CONFIG_SYS_NOR0_CSPR_EXT	(0xf)
#define CONFIG_SYS_NOR0_CSPR	(CSPR_PHYS_ADDR(CONFIG_SYS_FLASH_BASE_PHYS) | \
				CSPR_PORT_SIZE_16 | \
				CSPR_MSEL_NOR | \
				CSPR_V)
#define CONFIG_SYS_NOR_AMASK	IFC_AMASK(128*1024*1024)
//cpu_early_init.c
void setup_ifc(void)
{
	...
	
	/* Change flash's physical address */
	ifc_out32(&(ifc_regs.gregs->cspr_cs[0].cspr), CONFIG_SYS_CSPR0);
	ifc_out32(&(ifc_regs.gregs->csor_cs[0].csor), CONFIG_SYS_CSOR0);
	ifc_out32(&(ifc_regs.gregs->amask_cs[0].amask), CONFIG_SYS_AMASK0);

	return ;
}

CONFIG_SYS_NOR0_CSPR_EXT=0xf,说明手册里标注24-31的,在c语言里是低8位。
NXP(Freescale) QorIQ T2080 IFC
NOR启动不需要uboot spl,但T2080 CPC SRAM位512KB,不够装载uboot,所以代码在Nor中本地运行(in place),AMASK作用是定义一个Memory BANK的大小,参考RM,寄存器IFC_AMASKn的低16位不使用,所以最小的BANK为64KB(最小分配单位),也就是说,即使你占用的空间不到64KB,IFC也得分配64KB,下面的公式阐述了系统地址(40位空间用到CSPRn_EXT寄存器)和IFC地址(32位)的关系,可以看到cpu访存的高地址出现在了低地址了,位反序了。

BASE_ADDRn[0:23] = {CSPRn_EXT[BA_EXT], CSPRn[BA]}, n=0-7 (chip select)

{BASE_ADDRn[0:7], (BASE_ADDRn[8:23] & AMn[0:15])} == 
{SYSTEM_ADDR[39:32], (SYSTEM_ADDR[31:16] & AMn[0:15])}

相关文章: