zoukankan      html  css  js  c++  java
  • Linux 内核存取配置空间

    在驱动已探测到设备后, 它常常需要读或写 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-2+3-4+5 ... 99的所有数的和)
    小作业(3、输出 1-100 内的所有奇数 4、输出 1-100 内的所有偶数)
    小作业(求1-100的所有数的和)
    作业小练习(使用while循环输入 1 2 3 4 5 6 8 9 10)
    keepalived介绍
    nginx日志文件配置
    Nginx配置文件编写实例
    Nginx部署流程
    nginx服务介绍
    http协议原理介绍
  • 原文地址:https://www.cnblogs.com/fanweisheng/p/11147064.html
Copyright © 2011-2022 走看看