在驱动已探测到设备后, 它常常需要读或写 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;

}

Linux 内核存取配置空间的更多相关文章

  1. 通用Linux内核优化配置

    通用Linux内核优化配置 针对CentOS6.CentOS7.Redhat6.Redhat7等系统 net.ipv4.ip_forward = net.ipv4.conf. net.ipv4.con ...

  2. linux内核的配置

    以2.6.35.7版本的内核为例 总结:.config决定了Make时的条件编译与连接..config文件由两次配置第一次make XX_defconfig 第二次menuconfig. 1.分析源码 ...

  3. Linux内核编译配置脚本

    环境 宿主机平台:Ubuntu 16.04.6 目标机:iMX6ULL Linux内核编译配置脚本 在linux开发过程中熟练使用脚本可以大大简化命令行操作,同时对于需要经常重复操作的指令也是一种备忘 ...

  4. Linux 内核存取 I/O 和内存空间

    一个 PCI 设备实现直至 6 个 I/O 地址区. 每个区由要么内存要么 I/O 区组成. 大部分 设备实现它们的 I/O 寄存器在内存区中, 因为通常它是一个完善的方法(如同在" I/O ...

  5. linux内核图形配置疑难解决

    配置linux内核是遇到的问题:(1)问题一make gconfig * * Unable to find the GTK+ installation. Please make sure that * ...

  6. Nginx 服务并发过10万的Linux内核优化配置

    以下Linux 系统内核优化配置均经在线业务系统测试,服务器运行状态良好,用了一些时间整理,现和大家分享一下,如有那位高人看到配置上有问题,请给与指出! # Controls the use of T ...

  7. 【转】Nginx服务并发过10万的Linux内核优化配置

    http://www.linuxidc.com/Linux/2012-11/75151.htm以下Linux 系统内核优化配置均经在线业务系统测试,服务器运行状态良好,用了一些时间整理,现和大家分享一 ...

  8. Linux内核参数配置

    Linux在系统运行时修改内核参数(/proc/sys与/etc/sysctl.conf),而不需要重新引导系统,这个功能是通过/proc虚拟文件系统实现的. 在/proc/sys目录下存放着大多数的 ...

  9. 1. Linux内核的配置与裁减:

    一.内核的配置和编译流程: 1)编写driver及其子目录下的Kconfig文件,将驱动的配置项写入menuconfig配置界面:2)  执行make menuconfig命令,进入内核配置界面,将对 ...

随机推荐

  1. Directx11教程(65) 渲染到纹理

    原文:Directx11教程(65) 渲染到纹理     通常情况下,我们的render target都是后缓冲,但也可以把render target设置为一个2d 纹理,然后再通过贴图的方式,把这个 ...

  2. shell学习(21)- tr

    Linux tr 命令用于转换或删除文件中的字符. tr 指令从标准输入设备读取数据,经过字符串转译后,将结果输出到标准输出设备. 在tr中利用集合的概念,可以轻松地将字符从一个集合映射到另一个集合中 ...

  3. jquery on事件

    可以给后添加的动态元素绑定事件

  4. UVA_694:The Collatz Sequence

    Language: C++ 4.8.2 #include<stdio.h> int main(void) { long long int m, n, copy_m; ; ; ) { sca ...

  5. python 数据的写入

  6. oralce GROUPING SETS

    select id,area,stu_type,sum(score) score from students group by grouping sets((id,area,stu_type),(id ...

  7. Gym - 101620H_Hidden Hierarchy(树+模拟)

    Hidden Hierarchy 题目链接 题目描述 You are working on the user interface for a simple text-based file explor ...

  8. GMTC2019|闲鱼-基于Flutter的架构演进与创新

    2012年应届毕业加入阿里巴巴,主导了闲鱼基于Flutter的新混合架构,同时推进了Flutter在闲鱼各业务线的落地.未来将持续关注终端技术的演变及趋势 Flutter的优势与挑战 Flutter是 ...

  9. 详解Python中内置的NotImplemented类型的用法

    它是什么? ? 1 2 >>> type(NotImplemented) <type 'NotImplementedType'> NotImplemented 是Pyth ...

  10. 插入blob字段的简单方法

    1. 按普通方法组织插入语句 ,f2为Blob型字段 insert into table (f1,f2,f3) values ('a',:para,'c') 2.对应每个blob型字段,OracleC ...