在驱动已探测到设备后, 它常常需要读或写 3 个地址空间: 内存, 端口, 和配置. 特别 地, 存取配置空间对驱动是至关重要的, 因为这是唯一的找到设备被映射到内存和 I/O 空间的位置的方法.

因为微处理器无法直接存取配置空间, 计算机供应商不得不提供一个方法来完成它. 为存 取配置空间, CPU 必须写和读 PCI 控制器中的寄存器, 但是确切的实现是依赖于供应商 的, 并且和这个讨论无关, 因为 Linux 提供了一个标准接口来存取配置空间.

对于驱动, 配置空间可通过 8-位, 16-位, 或者 32-位数据传输来存取. 相关的函数原型 定义于 <linux/pci.h>:

int pci_read_config_byte(struct pci_dev *dev, int where, u8 *val); int pci_read_config_word(struct pci_dev *dev, int where, u16 *val); int pci_read_config_dword(struct pci_dev *dev, int where, u32 *val);

从由 dev 所标识出的设备的配置空间读 1 个, 2 个或者 4 个字节. where 参数 是从配置空间开始的字节偏移. 从配置空间取得的值通过 val 指针返回, 并且这 个函数的返回值是一个错误码. word 和 dword 函数转换刚刚读的值从小端到处理 器的本地字节序, 因此你不必处理字节序.

int pci_write_config_byte(struct pci_dev *dev, int where, u8 val); int pci_write_config_word(struct pci_dev *dev, int where, u16 val); int pci_write_config_dword(struct pci_dev *dev, int where, u32 val);

写 1 个, 2 个或者 4 个字节到配置空间. 象通常一样, 设备由 dev 所标识, 并 且象通常一样被写的值被传递. word 和 dword 函数转换这个值到小端, 在写到外 设之前.

所有的之前的函数被实现为真正调用下列函数的内联函数. 可自由使用这些函数代替上面 这些, 如果这个驱动在任何特别时刻不能及时存取 struct pci_dev :

int pci_bus_read_config_byte (struct pci_bus *bus, unsigned int devfn, int where, u8 *val); int pci_bus_read_config_word (struct pci_bus *bus, unsigned int devfn, int where, u16

*val);

int pci_bus_read_config_dword (struct pci_bus *bus, unsigned int devfn, int where, u32

*val);

就象 pci_read_function 一样, 但是 struct pci_bus * 和 devfn 变量需要来代 替 struct pci_dev *.

int pci_bus_write_config_byte (struct pci_bus *bus, unsigned int devfn, int where, u8 val); int pci_bus_write_config_word (struct pci_bus *bus, unsigned int devfn, int where, u16 val);

int pci_bus_write_config_dword (struct pci_bus *bus, unsigned int devfn, int where, u32 val);

如同 pci_write_ 函数, 但是 struct pci_bus * 和 devfn 变量需要来替代 struct pci_dev *.

使用 pci_read_ 函数寻址配置变量的最好方法是通过定义在 <linux/pci.h> 中的符号名. 例如, 下面的小函数获取一个设备的版本 ID , 通过在使用 pci_read_config_bye 时传 递一个符号名.

static unsigned char skel_get_revision(struct pci_dev *dev)

{

u8 revision;

pci_read_config_byte(dev, PCI_REVISION_ID, &revision); return revision;

}

最新文章

  1. 自定义委托类型 - .Net自带委托类型
  2. C语言 &#183; 未名湖边的烦恼
  3. WKwebView与JS交互(h5主动)
  4. Vue API阅读的小细节
  5. elastic-job
  6. ArcGIS Engine代码共享-工作空间(workspace)对象操作
  7. 关于C#中泛型类型参数约束(where T : class)
  8. cocos2d-x 创建工程详解
  9. oracle10~11g在centos5~6版本上安装整体总结如下
  10. 对 Linux 初级、中级、高级用户非常有用的 60 个命令
  11. Zepto源码笔记(二)
  12. Hibernate逆向工程全过程
  13. ArtTemplate 使用笔记
  14. linux终奌站 信息 格式 更改 /etc/bashrc
  15. python通过http请求发送soap报文进行webservice接口调用
  16. java对程序的简单加密
  17. jpa 比较复杂的查询和用in关键字
  18. 【深度学习】吴恩达网易公开课练习(class1 week4)
  19. 设计模式之装饰模式(Decorator)摘录
  20. Delphi的自动编译软件Want

热门文章

  1. C#中App.config文件配置获取
  2. js中+号强制转换小例子
  3. Effective C++: 01让自己习惯C++
  4. linux下安装composer以及使用composer安装laravel
  5. 基于颜色的R2V软件快速矢量化
  6. 坚守安全第一准则!阿里云接连通过等保2.0测评、ISO国际认证
  7. 命名分组(?&lt;name&gt;....)
  8. adam调参
  9. 2019-8-31-PowerShell-通过-WMI-获取系统服务
  10. phpstorm 中git 的使用