⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch12.html

📁 Linux设备驱动经典
💻 HTML
📖 第 1 页 / 共 4 页
字号:
<html xmlns:cf="http://docbook.sourceforge.net/xmlns/chunkfast/1.0"><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>第&#160;12&#160;章&#160;PCI 驱动-Linux设备驱动第三版(中文版)- - </title><meta name="description" content="驱动开发- - " /><meta name="keywords" content="Linux设备驱动,中文版,第三版,ldd,linux device driver,驱动开发,电子版,程序设计,软件开发, " /><meta name="author" content="  www.21cstar.com QQ:610061171" /> <meta name="verify-v1" content="5asbXwkS/Vv5OdJbK3Ix0X8osxBUX9hutPyUxoubhes=" /><link rel="stylesheet" href="docbook.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.69.0"><link rel="start" href="index.html" title="Linux 设备驱动 Edition 3"><link rel="up" href="index.html" title="Linux 设备驱动 Edition 3"><link rel="prev" href="ch11s06.html" title="11.6.&#160;快速参考"><link rel="next" href="ch12s02.html" title="12.2.&#160;回顾: ISA"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">第&#160;12&#160;章&#160;PCI 驱动</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch11s06.html">上一页</a>&#160;</td><th width="60%" align="center">&#160;</th><td width="20%" align="right">&#160;<a accesskey="n" href="ch12s02.html">下一页</a></td></tr></table><hr></div><div class="chapter" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title"><a name="PCIDrivers.chap"></a>第&#160;12&#160;章&#160;PCI 驱动</h2></div></div></div><div class="toc"><p><b>目录</b></p><dl><dt><span class="sect1"><a href="ch12.html#ThePCIInterface.sect1">12.1. PCI 接口</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch12.html#PCIAddressing.sect2">12.1.1. PCI 寻址</a></span></dt><dt><span class="sect2"><a href="ch12.html#BootTime.sect2">12.1.2. 启动时间</a></span></dt><dt><span class="sect2"><a href="ch12.html#ConfigurationRegistersandInitialization.sect2">12.1.3. 配置寄存器和初始化</a></span></dt><dt><span class="sect2"><a href="ch12.html#MODULEDEVICETABLE.sect2">12.1.4. MODULEDEVICETABLE 宏</a></span></dt><dt><span class="sect2"><a href="ch12.html#RegisteringaPCIDriver.sect2">12.1.5. 注册一个 PCI 驱动</a></span></dt><dt><span class="sect2"><a href="ch12.html#OldStypePCIProbing.sect2">12.1.6. 老式 PCI 探测</a></span></dt><dt><span class="sect2"><a href="ch12.html#EnablingthePCIDevice.sect2">12.1.7. 使能 PCI 设备</a></span></dt><dt><span class="sect2"><a href="ch12.html#AccessingtheConfigurationSpace.sect2">12.1.8. 存取配置空间</a></span></dt><dt><span class="sect2"><a href="ch12.html#AccessingtheIOandMemorySpaces.sect2">12.1.9. 存取 I/O 和内存空间</a></span></dt><dt><span class="sect2"><a href="ch12.html#PCIInterrupts.sect2">12.1.10. PCI 中断</a></span></dt><dt><span class="sect2"><a href="ch12.html#HardwareAbstractions.sect2">12.1.11. 硬件抽象</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch12s02.html">12.2. 回顾: ISA</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch12s02.html#HardwareResources.sect2">12.2.1. 硬件资源</a></span></dt><dt><span class="sect2"><a href="ch12s02.html#ISAProgramming.sect2">12.2.2. ISA 编程</a></span></dt><dt><span class="sect2"><a href="ch12s02.html#ThePlugandPlaySpecification.sect2">12.2.3. 即插即用规范</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch12s03.html">12.3. PC/104 和 PC/104+</a></span></dt><dt><span class="sect1"><a href="ch12s04.html">12.4. 其他的 PC 总线</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch12s04.html#MCA.sect2">12.4.1. MCA 总线</a></span></dt><dt><span class="sect2"><a href="ch12s04.html#EISA.sect2">12.4.2. EISA 总线</a></span></dt><dt><span class="sect2"><a href="ch12s04.html#VLB.sect2">12.4.3. VLB 总线</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch12s05.html">12.5. SBus</a></span></dt><dt><span class="sect1"><a href="ch12s06.html">12.6. NuBus 总线</a></span></dt><dt><span class="sect1"><a href="ch12s07.html">12.7. 外部总线</a></span></dt><dt><span class="sect1"><a href="ch12s08.html">12.8. 快速参考</a></span></dt></dl></div><p>虽然第 9 章介绍了硬件控制的最低层, 本章提供了总线结构的高级一些的概括. 一个总线由电路接口和一个编程接口组成. 在本章, 我们涉及编程接口.</p><p>本章涉及许多总线结构. 但是, 主要的焦点在存取 PCI 外设的内核函数, 因为如今 PCI 总线是在桌面计算机和更大的计算机上最普遍使用的外设总线. 这个总线是被内核支持得最好的. ISA 对于电子爱好者仍然是普遍的, 在后面描述它, 尽管它更多的是一个裸露金属类型的总线, 并且没有更多的要讲的, 除了在第 9 章和第 10 章涵盖到的.</p><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="ThePCIInterface.sect1"></a>12.1.&#160;PCI 接口</h2></div></div></div><p>尽管许多计算机用户认为 PCI 是一种电路布线方法, 实际上它是一套完整的规格, 定义了一个计算机的不同部分应当如何交互.</p><p>PCI 规范涉及和计算机接口相关的大部分问题. 我们不会在这里涵盖全部; 在本节, 我们主要关注一个 PCI 驱动如何能找到它的硬件并获得对它的存取. 在第 2 章的"模块参数"一节和第 10 章的"自动探测 IRQ 号"一节讨论的探测技术可被用在 PCI 设备, 但是这个规范提供了一个更适合探测的选择.</p><p>PCI 体系被设计为 ISA 标准的替代品, 有 3 个主要目的: 当在计算机和它的外设之间传送数据时获得更好的性能, 尽可能平台无关, 以及简化添加和去除系统的外设.</p><p>PCI 总线通过使用一个比 ISA 更高的时钟频率, 获得更好的性能; 它的设置运行在 25 或者 33 MHz (它的实际频率是系统时钟的一个因数), 以及 66-MHz 甚至 133-MHz 的实现最近也已经被采用. 但是, 它配备有 32-位 数据线, 并且一个 64-位扩展已经被包含在规范中. 平台独立性常常是一个计算机总线设计的目标, 并且它是 PCI 的一个特别重要的特性, 因为 PC 世界已一直被处理器特定的接口标准占据. PCI 当前广泛用在IA-32, Alpha, PowerPC, SPARC64, 和 IA-64 系统中, 以及一些其他的平台.</p><p>但是, 和驱动作者最相关的, 是 PCI 对接口板的自动探测的支持. PCI 设备是无跳线的(不象大部分的老式外设)并且是在启动时自动配置的. 接着, 设备驱动必须能够存取设备中的配置信息以便能完成初始化. 这不用进行任何探测.</p><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="PCIAddressing.sect2"></a>12.1.1.&#160;PCI 寻址</h3></div></div></div><p>每个 PCI 外设有一个总线号, 一个设备号, 一个功能号标识. PCI 规范允许单个系统占用多达 256 个总线, 但是因为 256 个总线对许多大系统是不够的, Linux 现在支持 PCI 域. 每个 PCI 域可以占用多达 256 个总线. 每个总线占用 32 个设备, 每个设备可以是一个多功能卡(例如一个声音设备, 带有一个附加的 CD-ROM 驱动)有最多 8 个功能. 因此, 每个功能可在硬件层次被一个 16-位地址或者 key , 标识. Linux 的设备驱动编写者, 然而, 不需要处理这些二进制地址, 因为它们使用一个特定的数据结构, 称为 pci_dev, 来在设备上操作. </p><p>大部分近期的工作站至少有 2 个 PCI 总线. 在单个系统插入多于 1 个总线要通过桥实现, 桥是特殊用途的 PCI 外设, 它的工作是连接 2 个总线. 一个 PCI 系统的全部分布是一个树, 这里每个总线都连接到一个上层总线, 直到在树根的总线 0 . CardBus PC-card 系统也通过桥连接到 PCI 系统. 图<a href="ch12.html#ldd3-12-1.fig" title="图&#160;12.1.&#160;一个典型 PCI 系统的布局">一个典型 PCI 系统的布局</a>表示了一个典型的 PCI 系统, 其中各种桥被突出表示了.</p><div class="figure"><a name="ldd3-12-1.fig"></a><p class="title"><b>图&#160;12.1.&#160;一个典型 PCI 系统的布局</b></p><div><img src="images/snagitldd3/ldd3-12-1.png" alt="一个典型 PCI 系统的布局"></div></div><p>和 PCI 外设相关的 16-位硬件地址, 尽管大部分隐藏在 struct pci_dev 结构中, 仍然是可偶尔见到, 特别是当使用设备列表. 一个这样的情形是 lspci 的输出( pciutils 的一部分, 在大部分发布中都有)和在 /proc/pci 和 /porc/bus/pci 中的信息排布. PCI 设备的 sysfs 表示也显示了这种寻址方案, 还有 PCI 域信息. <sup>[<a name="id469697" href="#ftn.id469697">40</a>]</sup>当显示硬件地址时, 它可被显示为 2 个值( 一个 8-位总线号和一个 8-位 设备和功能号), 作为 3 个值( bus, device, 和 function), 或者作为 4 个值(domain, bus, device, 和 function); 所有的值常常用 16 进制显示.</p><p>例如, /proc/bus/pci/devices 使用一个单个 16-位 字段(来便于分析和排序), 而 /proc/bus/busnumber 划分地址为 3 个字段. 下面内容显示了这些地址如何显示, 只显示了输出行的开始:</p><pre class="screen">$ lspci | cut -d: -f1-30000:00:00.0 Host bridge0000:00:00.1 RAM memory0000:00:00.2 RAM memory0000:00:02.0 USB Controller0000:00:04.0 Multimedia audio controller0000:00:06.0 Bridge0000:00:07.0 ISA bridge0000:00:09.0 USB Controller0000:00:09.1 USB Controller0000:00:09.2 USB Controller0000:00:0c.0 CardBus bridge0000:00:0f.0 IDE interface0000:00:10.0 Ethernet controller0000:00:12.0 Network controller0000:00:13.0 FireWire (IEEE 1394)0000:00:14.0 VGA compatible controller$ cat /proc/bus/pci/devices | cut -f1000000010002001000200030003800480049004a0060007800800090

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -