本文中的内容主要是根据MPC8572ERM.pdf手册第2章Memory Map的内容进行了分析和解读。阅读下面的内容的同时,请参考这本手册。
MPC8572提供了灵活的地址空间分配,它定义了12个本地访问窗口(LAW, Local Access Window),我们可以认为LAW是一个基址可变,长度可变的地址范围,所以用英文比较形象的形容为window。这十二个LAW可以灵活的被分配给以下几个目标,并且为每一个目标都规定了一个目标编码。这里的目标我们可以认为是某一个具体的物理总线,某一个具体的外设控制器等。我们访问这些物理总线或者外设控制器都是通过这些LAW来访问。
目标接口编码
目标接口 目标编码
PCIE 3 00000
PCIE2 00001
PCIE1 00010
Local bus 00100
Interleaved SDRAM 01011
Serial RapidIO 01100
DDR SDRAM1 01111
DDR SDRAM2 10110
既然这12个LAW都是基址、长度可变的地址空间范围,那我们在访问之前就需要配置或者通过某种方式知道它们的基址和范围,这样我们才可以对映射到这些窗口的总线或者外设进行访问。事实上,每一个窗口都有对应的一对寄存器:
LAWBARn : 本地窗口基址寄存器( n 从0 到 11)
LAWARn: 本地窗口属性寄存器( n 从0 到 11)
顾名思义,LAWBARn定义了每个窗口的基址,理论上你可以把这个窗口放在0到64G地址空间的任意一个位置。
LAWARn定义了三个域( field) :
其中第0位是en域,是否使能这个窗口。
其中第7 - 11位是TART_ID域,这个窗口对应的总线或者外设控制器,请参考我上面的目标接口编码。
第26 - 31位是SIZE域,定义了这个窗口的大小。
那接下来大家的问题可能是我如何访问这些LAWBAR和LAWAR寄存器呢,其中如手册2.2.3章节描述,这些LAW相关的寄存器都位于CCSRBAR寄存器定义的窗口(LAW)中,CCSRBAR定义了一个1M大小的窗口,并且在地址空间访问的时候这个窗口的优先级别高于其他窗口。CCSBAR有一个初始的默认值为0xFF700,如手册中Table 4-4所示。这样的话,如果我们在MPC8572上电之后,需要马上访问和配置LAWBARn和LAWAR寄存器,就可以以0xFF70_0000为基址,然后再加上各个LAWBAR和LAWAR寄存器的偏移量来进行操作,其中LAWBAR和LAWAR寄存器的偏移量在手册的2.2.3.1章节描述的Table 2-4。
总结如下:
mpc8572通过本地访问窗口提供了一个非常灵活的地址映射机制。我们在初始需要进行配置的时候,需要对CCSRBAR定义的IO寄存器窗口中的相应LAW寄存器进行访问,来完成对想要的操作。