PCI9054中PCI端地址和Local地址的转换重映射
2009-02-19 14:16
260 查看
关于PCI总线的自我理解,做个笔记,理解错误的地方敬请指教
PCI端和Local端地址间访问的转换关系
系统上电之后,通过外部EPROM的设置来初始化Local端的寄存器。我们通过PCI Base Address Space2和Local Space0 地址空间的对应关系来做一说明。
在系统初始化Local端时,设置Local
Space0 的Address Range
寄存器地址空间的大小:
![](file:///C:/DOCUME~1/jch/LOCALS~1/Temp/msohtml1/01/clip_image002.gif)
例如Local端地址空间大小为1MB,即0xFFFFFh。在写入31-4位时应该是它的反码即0x0000h,其中的低4比特位由0:3来表示,即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中,在系统进行写入1到PCI基址寄存器中时,PCI9054通过这个写入信息,结合Local Space0
Range寄存器的值来返回一个值,而实际上PCI基址寄存器的0x78900000h值没有变,所以在后面的寻址时这个PCI基址0x78900000h依然存在:)再或者,在系统写入1到PCI基址寄存器的时候,已经把PCI基址寄存器的值读取出来并保存,在查询完Local端的地址空间大小的时候,重新写入0x78900000h到PCI基址寄存器,这后面一种假设情况似乎更符合PCI9054手册中的:PCI software writes all ones to PCI Base Address,then
return the value of 0xFFF00000h,and then PCI software writes to the PCI Base
Address Registers。Please Note:the 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 Base0(Mem映射)和PCI Base1(I/O映射)中。实际操作的地址就是“PCI Base0 基址寄存器 + offset”,通过offset来寻找芯片内部寄存器。
PCI端和Local端地址间访问的转换关系
系统上电之后,通过外部EPROM的设置来初始化Local端的寄存器。我们通过PCI Base Address Space2和Local Space0 地址空间的对应关系来做一说明。
在系统初始化Local端时,设置Local
Space0 的Address Range
寄存器地址空间的大小:
![](file:///C:/DOCUME~1/jch/LOCALS~1/Temp/msohtml1/01/clip_image002.gif)
例如Local端地址空间大小为1MB,即0xFFFFFh。在写入31-4位时应该是它的反码即0x0000h,其中的低4比特位由0:3来表示,即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中,在系统进行写入1到PCI基址寄存器中时,PCI9054通过这个写入信息,结合Local Space0
Range寄存器的值来返回一个值,而实际上PCI基址寄存器的0x78900000h值没有变,所以在后面的寻址时这个PCI基址0x78900000h依然存在:)再或者,在系统写入1到PCI基址寄存器的时候,已经把PCI基址寄存器的值读取出来并保存,在查询完Local端的地址空间大小的时候,重新写入0x78900000h到PCI基址寄存器,这后面一种假设情况似乎更符合PCI9054手册中的:PCI software writes all ones to PCI Base Address,then
return the value of 0xFFF00000h,and then PCI software writes to the PCI Base
Address Registers。Please Note:the 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 Base0(Mem映射)和PCI Base1(I/O映射)中。实际操作的地址就是“PCI Base0 基址寄存器 + offset”,通过offset来寻找芯片内部寄存器。
相关文章推荐
- PCI9054中PCI端地址和Local地址的转换重映射
- Linux-日常运维-网络地址转换、端口映射
- NAT地址转换-端口映射-静态路由
- 如何将V4L2映射的内存地址转换成物理地址?
- 关于存储器映射、存储器重映射、内存映射、地址映射、地址转换等计算机专业名词详解
- 存储器映射、重映射、内存映射、地址映射、地址转换解释
- kernel中常规内存映射区物现地址与虚拟地址转换
- Linux地址映射(3)--地址转换
- (转)Cache的地址映射与转换
- 线性RAM地址非线性映射转换-充分应用RAM地址空间-TFT液晶驱动
- Linux地址映射--地址转换(mmap,vma)
- docker(iptables)目标地址转换,运行中的容器映射端口
- Linux地址映射--地址转换
- 第11章 拾遗1:网络地址转换(NAT)和端口映射
- 地址空间的归纳总结---PCI 涉及到的地址映射转换
- 根据传递的目录名,文件名参数转换输出外部访问的URL地址
- Java8中 LocalDate和java.sql.Date的相互转换
- IP 地址和 Int 型之间的转换
- 外设IO地址空间中的地址怎么转换到内核态的虚拟地址空间(一个ioremap函数真的解释清楚了么)
- 地址映射 分段分页