AU1200 SoC 及 NorFlash 物理地址与虚拟地址的映射机制

基准文档: au1200_datasheet.pdf, ml2010-0129.pdf(美菱项目电路图), S29GL064N90TFI04 Flash datasheet


 

 

 

      以上为AU1200 SoC的结构/接口示意图,其中左上角为MIPS32 Core(Au1 Core),其他模块均为各种SoC片上的外设控制器,所有的这些片内模块都是通过SoC内部的System Bus 和 Peripheral Bus 进行连接和通信的。

      Au1 Core作为一个典型的MIPS32架构的CPU,其特性符合《See MIPS Run, 2nd》文档中的描述,此处参考该文 2.8 节中的描述的MIPS架构地址空间基本概念和图示。在程序中(即使是已经过编译、汇编和链接得到的可执行二进制程序,也不论是应用程序还是系统程序)使用的任何地址都是虚拟地址,当MIPS-Core读取这些程序的机器指令时,这些虚拟地址都要通过特定的地址映射机制进行地址转换(不一定非得是通过MMU),从而由Au1 Core的数据总线送出物理地址到 SoC 的  System Bus 上。虽然MIPS的地址映射机制与x86不一样,VM中某些区域的虚拟地址到物理地址的转换非常简单,但是虚拟地址和物理地址的值肯定时不一样的。

      MIPS CPU运行的状态同样也分为用户态和内核态,不过和其他处理器的内核态/用户态机制不同,MIPS架构下当从内核态切换到用户态时,除了应用程序不能访问虚拟地址空间高2GB区域(虚拟地址最高位为1),否则会引发错误导致trap之外,其他并没有任何区别。程序所见的虚拟地址空间布局如下:

  • kuseg(0x0000 0000~0x8000 0000) —— 这是应用程序可以使用的VM,该区域的所有VP需要通过MMU进行映射,因此对于这个区域地址的引用必须首先确保MMU(或其他特定的地址映射机构)已经正确设定(而这个工作通常是由OS kernel完成的),故而在OS kernel没有完全启动之前,这个区域在程序中是不可访问的;


  • kseg0(0x8000 0000~0xA000 0000) —— 这个区域的虚拟地址到物理地址的映射很简单,直接将虚拟地址高3位置零即可。但是MIPS设计方案中规定,这个区域的地址都是通过Cache来访问的,所以在Cache没有初始化设定好之前,这个区域也是不可用的。对于有MMU的系统,OS Kernel代码中常使用该区域地址。

 

  • kseg1(0xA000 0000~0xC000 0000) —— 与kseg0区域一样, 这个区域的虚拟地址到物理地址的映射仍然是直接将虚拟地址高3位置零即可,并且对这个区域地址的访问不再需要通过Cache,因此kseg1区域是MIPS Core 处理器启动的同时就可以由程序直接访问的唯一VM区域 。MIPS Core CPU上电后执行的第一条指令的虚拟地址为 0xBFC0 0000,该地址就是,且必然是位于kseg1区域中的,该地址经过MIPS架构的地址映射后,对应的物理地址为 0x1FC0 0000
          同时,硬件连接上也必须保证系统启动存储设备(NorFlash,或者ROM等)中,系统启动代码(YAMON、UBoot等)所处位置与 0x1FC0 0000 对应 ——注意是“对应”,而不是“就是” ,即系统上电启动后,传输到NorFlash设备地址总线上的物理地址并不是0x1FC0 0000,在本项目使用的AU1200 SoC硬件环境下,系统上电启动后,传输到NorFlash地址总线上的地址信号是由NorFlash自身的地址总线宽度、SRAM Controller共同决定的。详见下述

 

  • kseg2(0xC000 0000~0xFFFF FFFF) ——MIPS CPU内核态下程序才可访问的VM区域,一般只有OS kernel代码才会使用这个区域的地址,这个区域的地址同样需要经过MMU映射,因此也必须要在MMU初始化完成之后才可用。

 

      AU1200 SoC 中,Au1-Core 会将32位的虚拟地址转换为36-bit的物理地址送上 System Bus(datasheet, 2.5),System Bus 的36-bit物理总线由 36-bits 地址总线sysbus_addr[35:0] 和 32-bits数据总线sysbus_data[31:0] 复用。

      AU1200 SoC中,Flash、ROM等外设是通过片内的SRAM Controller控制和连接的。SRAM Controller描述位于datasheet中的3.2节,它包括4个片选(chip select),在美菱项目原理图中,这个四个片选信号对应于AU_CS0~AU_CS3引脚,我们使用的是AU_CS0来作为NorFlash的片使能(见原理图P7)。

      对于sysbus_addr[36], sysbus_addr[35:32]的值见AU1200 datasheet, Table 20 所述,我们使用SRAM Controller连接的是NorFlash,因此对于NorFlash,System Bus传递过来的36-bits物理地址中高四位为0。

 

      在AU1200 datasheet 3.2.5 节中描述了SRAM Controller 连接NorFlash时,发送给NorFlash的各种信号,其中的RAD[14:0]就是AU1200 SoC真正发送给NorFlash物理设备的地址信号 ,RAD[14:0]在美菱项目电路图中对应于 AU_ADDR[0:14] 这一组15根引脚。由于SRAM Controller内部实现的地址锁存机制(Datasheet 3.2.2节),最终AU1200 SoC传出给NorFlash、ROM设备的地址数据可以达到 30 bits,即可以寻址最大1 GB的 NorFLash设备,而这30 bits的地址值正是SoC内的System Bus传递给SRAM Controller的36-bits 物理地址中的低30 bits,分两次发送到NorFlash物理外设的地址引脚上。

 

      在美菱项目中, 我们使用的 8MB NorFlash(型号:S29GL064N90TFI04, 其中的64表示64Mbit)是按word(16 bits)进行寻址的,并且由于我们在电路设计中, NorFlash 的 BYTE# 引脚被拉高,所以每次NorFlash读写都是2 Bytes的数据(详见 Flash datasheet)。因此,我们使用的8MB NorFlash实际有效的地址引脚共22根(A0~A21) ,222 × 2 Bytes = 8MB,即NorFlash的地址总线为23 bits。在电路原理图中所标识出来的A23实际是无效的,仅仅只是为了一个系列NorFlash封装一致,才往往将该系列NorFlash封装的地址引脚数统一为该系列中大容量NorFlash的地址引脚数。

 

     我们只使用了SRAM Controller通过 RAD[14:0]+锁存 送出来的30-bits地址中的22位, 即对应于原理图Page 7中所示的 AU_ADDR1 ~ AU_ADDR14LATCH_ADDR15 ~ LATCH_ADDR22 在美菱项目电路原 理图Page 7中可见,我们外加了一个地址锁存器SN74LVC16374ADGGR,锁存 AU_ADDR[0:15]中的AU_ADDR[0:7],这正是SRAM Controller通过内部的锁存机制送出来的15-bits物理地址的低8位。 AU_ADDR[1:14] 和 LATCH_ADDR[15:22] 这22根引脚,依次对应于SoC片内System Bus传递的 sysbus_addr[0:35]中的 sysbus_addr[1:22] ,对应连接至NorFlash外设的 A0~A21这22根引脚。

     为什么将 AU_ADDR1 和 A0 连接而不是将 AU_ADDR0 和 A0 连接呢?这还是因为我们使用的NorFlash是以word(16 bits)寻址的,而程序所面对的虚拟地址空间则是按8-bits字节寻址的,假设在程序中需要操作0xBFD0 0000 和 0xBFD0 0001 这两个地址中的字节数据,但是这两个8-bits数据在NorFlash中其实是同一个16-bits单元中的数据,因此我们在程序中使用的 0xBFD0 0000 和 0xBFD0 0001 这两个地址需要在NorFlash中对应于同一个基本数据单元——将 AU_ADDR1 和 A0 引脚连接就可以达到这个目的。

 

 

 

      最后来说明程序中(这里的“程序”包括在机器上跑的典型应用程序,flash_eraseall、flashcp等flash软件,也包括BDI内置软件,BDI控制台下使用erase、prog、go等命令时都是直接使用虚拟地址 )所使用的系统上电启动地址 0xBFC0 0000 是如何一步一步映射到NorFlash A0~A21这22根引脚上的:

  1. VM中的虚拟地址0xBFC0 0000 经过Au1 Core 输出36-bits 的 0x0 1FC0 0000 到Soc内的System Bus的 sysbus_addr[35:0]上,送至SRAM Controller
  2. SRAM Controller将0x0 1FC0 0000中的低30-bits,即 0x1FC00000(01 1111 1100 0000 0000 0000 0000 0000=011111110000000 000000000000000)通过 RAD[14:0](即AU1200 SOC的 AU_ADDR[0:14] 这一组15根引脚)经过锁存机制分两次送出
                                                              ————在此之上的事情是由AU1200 SoC 片内完成的————
  3. 美菱PCB板上的外加地址锁存器 SN74LVC16374ADGGR 将 SoC AU_ADDR[0:14] 这组引脚上第二次输出的地址信号的 AU_ADDR[0:7],对应于 (0x1FC00000 = 011111110000000 000000000000000 )中的 ( 10000000 进行锁存,并由 LATCH_ADDR[15:22] 这8根引脚送出;
  4. SoC AU_ADDR[0:14] 这组引脚上第一次输出的地址信号中的AU_ADDR[1:14], 对应于(0x1FC00000 = 011111110000000 000000000000000 )中的( 00000000000000 )直接连接到NorFlash的 A0~A13 引脚
  5. 综合3、4步骤,NorFlash地址总线引脚 A21~A0 上对应的电位值应该是( 10000000 00000000000000 = 10 0000 0000 0000 0000 0000
    ——这就是0xBFC0 0000 这个AU1200上电启动虚拟地址最后对应于NorFlash物理设备上的地址引脚信号

      综上,上电启动地址对应到NorFlash的地址引脚的值 ( 10 0000 0000 0000 0000 0000 = 0x20000 0) 所标识的物理地址位于NorFlash中的最后 4MB 起始处,注意:此处的NorFlash的基本存储单元是16 bits=2 Bytes,因此上电启动地址之后的NorFlash容量为 (0x3FFFFF - 0x200000 + 1)*2 = 4MB,也就意为着作为上电执行的Yamon程序,应该保存在NorFlash的最后4MB起始处。

      如果NorFlash仍然保持word寻址,当NorFlash容量变为至4 MB,即NorFlash设备有效地址引脚变为 A0~A20,相应地,地址锁存器锁存的 AU1200 SoC 第二次输出的地址信号的 AU_ADDR[0:6], 最终NorFlash 地址总线引脚 A20~A0 上对应的值应该是 ( 0 0000 0000 0000 0000 0000 =0x000000 ), 即NorFlash的起始处。此时, Yamon程序仍然应该保存在NorFlash的最后4MB起始处,只是此时最后4MB也就是最开始的4MB而已

      当NorFlash容量小于 4 MB的时候,则无论容量是多少, 0xBFC0 0000 上电启动地址对应的NorFlash 地址总线引脚 A0~An (n<20)上信号全为0,则此时YAMON程序应该放在NorFlash的起始位置。


      同理,当NorFlash容量扩大至16 MB的时候, NorFlash 设备有效地址引脚变为 A0~A22,  相应地,地址锁存 器锁存的 AU1200 SoC 第二次输出的地址信号的 AU_ADDR[0:8], 最终 NorFlash 地址总线引脚 A20~A0 上对应的值应该是 ( 110 0000 0000 0000 0000 0000 =0x600000 ), 上电启动地址之后 的NorFlash容量为 (0x7FFFFF - 0x600000 + 1)*2 = 4MB ,即Yamon程序仍然应该保存在NorFlash的最后4MB起始处。

      同理,如果 NorFlash容量扩大至512 MB的时候, 假设引脚数也是足够的, NorFlash 设备有效地址引脚变为 A0~A27, 相应地,地址锁存器锁存 AU1200 SoC 第二次输出的地址信号中的AU_ADDR[0:13], 最终 NorFlash 地址总线引脚 A27~A0 上对应的值应该是 ( 1111 1110 0000 0000 0000 0000 0000 =0xFE00000 ), 上电启动地址之后 的NorFlash容量为 (0xFFFFFFF - 0xFE00000 + 1)*2 = 4MB, 即Yamon程序 仍然应该保存在NorFlash的最后4MB起始处。

      但是,当NorFlash容量扩大至1024 MB时, NorFlash 设备有效地址引脚变为 A0~A28, 地址锁存器锁存 SoC 第二次输出的地址信号中的全部AU_ADDR[0:14], 最终 NorFlash 地址总线引脚 A28~A0 上对应的值应该是 ( 0 1111 1110 0000 0000 0000 0000 0000 =0x0FE00000 ), 此时 上电启动地址之后 的NorFlash容量变为了 (0x1FFFFFFF - 0x0FE00000 + 1)*2 = 516 MB 了,即此时 Yamon程序仍 然应该保存在NorFlash的最后516MB起始处。而此时的情况也就是AU1200能够通过SRAM Controller寻址的最大容量NorFlash 了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值