关于寄存器CHIP_N_CFG REGISTER=0x7E001200的值,如何设置,对应什么含义,下面是我的理解和分析: | Reserved | BRC_RBC | Address match | Address mask | | [31:17] | [16] | [15:8] | [7:0] | 0x150F8 | 0 | 1 | 0x50 | 0xF8 |
其中 (1)bit16=1,对应着1 = Bank-Row-Column organization,即BRC,含义上面已经说了,此处不多解释。 (2)bit15:8]=0x50,此值,决定了,AXI的地址值中的bit[31:24], (3)bit[7:0]=0xF8,此值,用于mask AXI的地址值中的bit[31:24]; 以上(2)和(3)是组合起来,才能看懂意思的。 此处我的理解是: 用一个普通的地址,来举例: 比如我的SDRAM的某个地址值是0x51000000 那么,对于AXI,即ARM的总线上的SDRAM的地址,其最高的8为,即bit[31:24]到底是什么值,是由S3C6400的数据手册中的地址映射Address Map决定的:
由此地址映射可见,SDRAM,是由DRAM Control 1,对应着宏定义DMC1_CHIP0_CFG中的DMC1。 然后此SDRAM的地址的取值范围,实际上可以是0x50000000-0x6FFFFFFF,所以,对应着bit[31:24]即最高8位,可以是0x50-0x6F的,而具体是哪个地址的范围,就是由上面的“Address match”决定的,此处Address match=0x50,说明此处配置的SDRAM的最高位的地址,是0x50开始的,而剩下的SDRAM的地址取指范围,注释中写的是“0x5000_0000~0x57ff_ffff (128 MiB)”,可以看到是0x58000000之下,到0x50000000,都是属于此SDRAM的空间范围,而高于0x58000000的值,就是无效的了,因此,需要有个Address mask,去将一个AXI总线上的SDRAM的地址,通过mask而得知有效的地址范围,然后再去和match比较, 举例,地址0x51000000,bit[31:24]是0x51,将0x51去mask处理,即0x51 &0xF8=0x50,是和我们之前配置的address match的0x50一样,由此得知,此地址值是SDRAM的,而且是有效的值,是在其取值范围内,没有超过最大范围(0x58000000). 而举个反例,比如0x59000000,不在0x50000000-0x57FFFFFF之间,超过了范围,那么此时0x59&0xF8=0x0x58说明此地址不是属于SDRAM的有效地址(实际上是超过了SDRAM的最大地址的值)。 由此,反过来再去看为何要这么设置,其实就是0x50决定了你的地址范围是0x50开头的那种地址0x5XXX XXXX,而剩下的XXX XXXX这段空间范围到底是多少,那么就得根据你的SDRAM的大小,此处是128MB=2^27=800 0000,所以,设置为 0x5000 0000 + 800 0000 = 0x5800 0000,而8 = 1000b,mask为0xF8,使得bit[2:0]这三位,都被mask掉,才能算出对应的有效地址。 【总结】 根据是Low-power还是正常电压的SDRAM,决定是RBC还是BRC; 根据自己选择0x50开始还是0x60开始是你SDRAM地址,去设置address match的值 根据自己的SDRAM的大小,算出高位的值,然后推算对应的address mask的值。 |