PCI9054中PCI端地址和Local地址的转换重映射

关于PCI总线的自我理解,做个笔记,理解错误的地方敬请指教


PCI端和Local端地址间访问的转换关系

       系统上电之后,通过外部EPROM的设置来初始化Local端的寄存器。我们通过PCI Base Address Space2Local Space0 地址空间的对应关系来做一说明。

在系统初始化Local端时,设置Local Space0 Address Range 寄存器地址空间的大小:

   

例如Local端地址空间大小为1MB,即0xFFFFFh。在写入31-4位时应该是它的反码即0x0000h,其中的低4比特位由03来表示,即0x00000h。设置完了地址空间范围之后,就需要指定Local地址与PCI地址转换时涉及到的比特位,PCI9054手册上设高12位为两者的转换位。即高12位为0xFFF,那么整个Local Space0的范围寄存器设置为0xFFF00000h

     在设置Local Space0 基址寄存器,手册上设置为0x12300000h,如此,在PCI地址与Local端地址转换的时候,用Local Space0基址寄存器的高12位即0x123h替换PCI地址的高12位。

 

    PCI端的寄存器,由PCI上的主机来设置,在系统上电之后,PC机会给PCI端分配一个基地址0x78900000h,而PCI基址寄存器中存放的是空间偏移地址的。或者是这样理解,0x78900000h是存放在PCI基址寄存器2中,在系统进行写入1PCI基址寄存器中时,PCI9054通过这个写入信息,结合Local Space0 Range寄存器的值来返回一个值,而实际上PCI基址寄存器的0x78900000h值没有变,所以在后面的寻址时这个PCI基址0x78900000h依然存在:)再或者,在系统写入1PCI基址寄存器的时候,已经把PCI基址寄存器的值读取出来并保存,在查询完Local端的地址空间大小的时候,重新写入0x78900000hPCI基址寄存器,这后面一种假设情况似乎更符合PCI9054手册中的:PCI software writes all ones to PCI Base Addressthen return the value of 0xFFF00000hand then PCI software writes to the PCI Base Address RegistersPlease Notethe PCI Base Address were written twice

      在应用程序开发操作硬件的时候,例如:PCI基址寄存器+offset ,通过PCI驱动底层的地址转换得到PCI基址寄存器(0x78900000h+offset,这个地址可以找到PCI9054芯片的内部,然后,PCI9054芯片再把这个PCI地址进行重映射到Local端的内存空间地址,这一步根据Local Space0 Range 寄存器的设置,其高12位由Local端基址寄存器的高12位替换即所谓的重映射,而Local端基地址的高12位是0x123h,所以,PCI端的地址” PCI基址寄存器(0x78900000h+offset”----àLocal端地址0x12300000h +offset,如此完成地址的重映射。

   

        在驱动程序的开发中,我们所操作的Local端内存的偏移地址就是offset。而在操作PCI9054芯片的内部寄存器时,其基地址由主机进行分配进PCI Base0Mem映射)和PCI Base1I/O映射)中。实际操作的地址就是PCI Base0 基址寄存器 + offset,通过offset来寻找芯片内部寄存器。

 

你可能感兴趣的:(程序开发)