song512
驱动牛犊
驱动牛犊
  • 注册日期2004-10-11
  • 最后登录2007-08-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3579回复:13

9054的地址映射问题,各位仁兄帮忙!

楼主#
更多 发布于:2004-10-11 07:44
9054的地址映射是怎么样的?

是不是local方定义一基地址+块大小,map之后,这块local地址就对应pci方一块地址?但是我看pci方的寄存器之中并没有说明local的这块地址大小的,pci如何知道呢?还有。。这个时候pci读local 的时候,在操作上是读哪一个地址(pci方的)?是从寄存器读还是直接从内存里读。。
小弟的头都大了好几天了,请各位帮忙,分无所谓

最新喜欢:

copyleftcopyle...
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2004-10-11 10:28
用户被禁言,该主题自动屏蔽!
song512
驱动牛犊
驱动牛犊
  • 注册日期2004-10-11
  • 最后登录2007-08-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-10-11 12:24
谢谢

(大小自己定)是在las0rr内定义大小,在las0ba内定义基地址么?

现在还有一个问题。。如果是映射成memory这种方式。那么pcibrr2内的基地址是不是指在内存中的地址,pci方(驱动或应用程序)又如何读写的?
zsh_7769
驱动小牛
驱动小牛
  • 注册日期2004-04-15
  • 最后登录2005-12-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-10-11 15:47
pci方(驱动或应用程序)读写时访问的是偏移地址而不是基地址,pci读local 的时候直接访问映射后的地址就可以了
song512
驱动牛犊
驱动牛犊
  • 注册日期2004-10-11
  • 最后登录2007-08-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-10-11 17:54
谢谢
pci方的这个映射地址是通过寄存器设定还是系统自动分配?
今天还听到一种说法:就是说地址映射之后,在设备管理器的属性卡的内存范围这项里可以看到映射后的这段地址,不知这是否正确??



[编辑 -  10/11/04 by  song512]
song512
驱动牛犊
驱动牛犊
  • 注册日期2004-10-11
  • 最后登录2007-08-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-10-11 23:34
我本来是做硬件的。。软件方面不懂。。
pci方到底是怎么样读这块映射过来的地址的?还有就是pci方是怎么知道这块地址的大小的?--databook好像有说,先写个全1到一个寄存器,然后再读它,9054会根据local方的设置返回一个值--这个不是很明白。。
大家帮帮忙。。时间很紧。。
还有谁能给我个配置eeprom的文件(默认的数值),谢谢了
song512@sohu.com
song512
驱动牛犊
驱动牛犊
  • 注册日期2004-10-11
  • 最后登录2007-08-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-10-12 07:37
===pci方(驱动或应用程序)读写时访问的是偏移地址而不是基地址,pci读local 的时候直接访问映射后的地址就可以了===

zsh-7769兄能说得再具体一些么。。。



大家帮帮我啊。。。
什么都可以说。。。或许有用的
你们要多少分就说,系统能允许我给多少,就给多少

[编辑 -  10/12/04 by  song512]
song512
驱动牛犊
驱动牛犊
  • 注册日期2004-10-11
  • 最后登录2007-08-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-10-12 10:41
还有一些不明白的:
1:las0rr是怎么定义所要映射的块大小的???
假设要把local的64k地质空间映射到pci,las0rr应该如何设定?何值?
2:pci方是如何知道local所定义的块的大小的?
3:pci方的基地址是不是指的是判词pci的物理地址?

怎么没有人帮我啊
baaniaw
驱动牛犊
驱动牛犊
  • 注册日期2004-06-28
  • 最后登录2011-12-03
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望31点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-10-12 14:58
当 PCI 设备上电时,硬件保持未激活状态。换句话说,该设备只会对配置事务做出响应。上电时,不会有内存和 I/O 端口映射到计算机的地址空间,其它设备相关功能,比如中断报告,也被禁止。

幸运的是,每个 PCI 主板均配备有能够处理 PCI 总线的固件,称为 BIOS、NVRAM 或 PROM(这取决于平台)。固件通过读写 PCI 控制器中的寄存器,提供了对设备配置地址空间的访问。

系统引导时,固件(或者 Linux 内核,如果经过配置的话)在每个 PCI 外设上执行配置事务,以便为设备的每个地址区域分配一个安全的位置。在驱动程序访问设备的时候,设备的内存和 I/O 区域已经映射到了处理器的地址空间。

基地址寄存器

PCI 规范指出,制造商必须将每个有效区域映射到可配置地址。这意味着,设备必须为每个区域装备一个可编程的 32 位地址解码器,利用了 64 位 PCI 扩展的任何 PCI 板,都应该有 64 位的可编程解码器。

实际的实现以及可编程解码器的使用,因如下事实而简化:一个区域中的字节数,通常是 2 的幂,例如 32 字节、4 KB 或者 2MB 等等。另外,也无需考虑将区域映射到不对齐地址的情况,1MB 的区域会对齐在 1MB 倍数的地址处,而 32 字节的区域会在 32 的倍数处对齐。PCI 规范利用了这种对齐,它指出地址解码器只需看到地址总线上的高位,而且只有高位是可编程的。这种约定也意味着任意区域的大小都必须是 2 的幂。

将一个 PCI 区域映射到物理地址空间的工作,通过在配置寄存器高位中设置适当的值而实现。例如,对 1 MB 区域,它有 20 位的地址空间,通过设置寄存器的高 12 位来进行重新映射,这样,为了让 PCI 板具有 64 MB 到 65MB 的地址范围,可向寄存器写入 0x040xxxxx 范围的任意一个地址。实际情况下,只有很高的地址才用来映射 PCI 区域。

“部分解码”技术还有一个附加的有点,软件可以检查配置寄存器中的非可编程位数来判断 PCI 区域的大小。为此,PCI 标准指出不用的位必须在读取时始终为 0。标准还要求 I/O 区域的最小大小是 8 字节,而内存区域的最小范围是 16 字节,这样,就可以在基地址寄存器的低位中保存一些额外的信息:

位 0 位“空间(space)”位。如果区域映射到内存地址空间,则设置为 0;如果映射到 I/O 地址空间,则设置为 1。

位 1 和 2 是“类型(type)”位:内存区域可标记为 32 位区域、64 位区域或者“必须映射到 1 MB 以下的 32 位区域”(已废弃的 x86 特有类型,现在已不再使用)。

位 3 是“可预取(prefetchable)”位,用于内存区域。

Linux 2.4 中的 PCI I/O 资源

在 Linux 2.4 中,PCI 设备的 I/O 区域已经集成到了一般的资源管理。出于该原因,我们无需访问配置变量来获得设备内存和 I/O 空间的映射情况。获得区域信息的首选接口,由如下函数组成:

unsigned long pci_resource_start(struct pci_dev *dev, int bar);
该函数返回六个 PCI I/O 区域之一的第一个地址(内存地址或 I/O 端口编号)。该区域由整数的 bar(base address register,基地址寄存器)决定,可取 0 到 5 的值。

unsigned long pci_resource_end(struct pci_dev *dev, int bar);
该函数返回第 bar 个 I/O 区域的后一个地址。注意这是最后一个可用的地址,而不是该区域之后的第一个地址。

unsigned long pci_resource_flags(struct pci_dev *dev, int bar);
该函数返回资源关联的标志。

资源标志用来定义单个资源的某些特性。对与 PCI I/O 区域关联的 PCI 资源,该信息从基地址寄存器中获得,但对其它与 PCI 设备无关的资源,它可能来自任何地方。

所有的资源标志定义在 <linux/ioport.h> 中,下面列出其中最重要的几个:

IORESOURCE_IO
IORESOURCE_MEM
如果对应的 I/O 区域存在,将设置上面标志中的一个,而且只有一个。

IORESOURCE_PREFETCH
IORESOURCE_READONLY
上述标志定义内存区域是可预取的,或者是写保护的。对 PCI 资源来讲,从来不会设置后面的那个标志。

通过使用 pci_resource_ 函数,设备驱动程序可完全忽略底层的 PCI 寄存器,因为系统已经使用这些寄存器构建了资源信息。



[编辑 -  10/12/04 by  baaniaw]
song512
驱动牛犊
驱动牛犊
  • 注册日期2004-10-11
  • 最后登录2007-08-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-10-13 01:01
baaniaw兄,太谢谢了
我基本上明白了。。
就是你所说的那个例子。。(为了让 PCI 板具有 64 MB 到 65MB 的地址范围,可向寄存器写入 0x040xxxxx 范围的任意一个地址)我还有点疑问,如果是64m,对应的寄存器值是0xfc00 0000,这个64m-65m对应0x040x xxxx,我不是太明白。当寄存器的值中为1的位不连续的时候,是个怎么个重新映射法?
可否再说一下。。
song512
驱动牛犊
驱动牛犊
  • 注册日期2004-10-11
  • 最后登录2007-08-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-10-14 23:59
谢谢各位了。。。分一会给出。。少了点。。不好意思
song512
驱动牛犊
驱动牛犊
  • 注册日期2004-10-11
  • 最后登录2007-08-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-10-16 12:12
怎么分给不了 ???能否告知下。
shirullan
驱动牛犊
驱动牛犊
  • 注册日期2008-06-14
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分46分
  • 威望352点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2009-05-24 10:12
一起讨论一下。
edutainment
驱动牛犊
驱动牛犊
  • 注册日期2009-03-11
  • 最后登录2010-05-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望81点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2009-05-24 17:13
9054db-21上是这样说的
After a PCI reset, the software determines how much
address space is required by writing all ones (1) to a PCI
Base Address register and then reading back the value.
The PCI 9054 returns zeroes (0) in the Don’t Care
Address bits, effectively specifying the address space
required. The PCI software then maps the Local Address
space into the PCI Address space by programming the
PCI Base Address register.
游客

返回顶部