📄 (ldd) ch15-外围总线概览(转载).txt
字号:
相连。
地理寻址工作的方式是:给计算机的每个ISA外围分配一个小整数,称做“卡选择号(CS
N)”。每个PnP设备有一个唯一的序列标志符,64位宽,被硬写入外围板子。CSN的分配
用这个唯一的序列号来确定PnP设备。但CSN只能在引导时被安全地分配,这要求BIOS理
解PnP。由于这个原因,如果没有一个配置盘,老计算机不能支持PnP。
符合PnP规范的接口板在硬件级十分复杂。它们比PCI板要精细的多,同时要求符杂的软
件。安装这类设备遇到困难并不罕见;即使安装没有问题,你仍然面对性能限制和ISA总
线有限的I/O空间。按我的观点,只要可能,最好是安装PCI设备并享受其新技术。
如果你对PnP的配置软件有兴趣,你可以浏览drivers/net/3c509.c,它的探测函数处理
了PnP设备。Linux2.1.33也为PnP增加了一些初始支持,见目录drivers/pnp。
其它PC总线
PCI和ISA是PC世界最常用的外围接口,但它们并不为仅有。下面是PC市场上找得到的其
PCI和ISA是PC世界最常用的外围接口,但它们并不为仅有。下面是PC市场上找得到的其
它总线特征的概述。
MCA
“微通道体系结构(MCA)”是用在PS/2计算机和一些笔记本上的一个IBM标准。微通道
的主要问题是缺乏文档,这导致了Linux上对MCA支持的缺乏。不过,在2.1.15,已经飘
荡多时的MCA补丁被加入了正式的核心;因此,新的核心可以在PS/2计算机上运行。
在硬件级,微通道具有比ISA多的特征。它支持多主DMA,32位地址和数据线,共享中断
线,以及访问每个板子配置寄存器的地理寻址。这种寄存器被称做“可编程选项选择(P
OS)”,但它们并不具有PCI寄存器的所有特征。Linux对MCA的支持包括一些引出到模块
的函数。
设备驱动程序可以通过读取整数值MCA_bus来确定它是否运行在一个微通道计算机上。如
果核心运行在一个MCA单元中,那么MCA_bus非0。如果这个符号是个预处理器宏,那么宏
MCA_bus__is_a_macro也要被定义。如果MCA_bus__is_a_macro未定义,那么MCA_bus是引
出到模块化代码的一个整数变量。事实上,MCA_bus对除PC外的所有平台仍然是个硬写为
0的宏----Linux X86的移植在2.1.15将宏改为变量。MCA_bus和MCA_bus__is_a_macro都
在<asm/processor.h>中定义。
EISA
扩展的ISA(EISA)是ISA的32位扩展,带一个兼容的接口连接器;ISA的设备板子可以插
入一个EISA连接器。额外的线路是在ISA连接下路由。
象PCI和MCA,EISA总线被设计来带无跳线设备,它与MCA有同样的特征:32位地址和数据
线,多主DMA,以及共享中断线。EISA设备由软件配置,但它们不需要任何特别的操作系
统支持。EISA驱动程序已经为以太网设备和SCSI控制器存在与Linux核心中。
EISA驱动程序检查EISA_bus确定是否主机带有EISA总线。类似于MCA_bus,EISA_bus要么
是宏,要么是变量,这依赖于EISA_bus__is_a_macro是否被定义了。这两个符号定义在<
asm/processor.h>。
至于驱动程序,核心中没有对EISA的特别支持,程序员必须自己处理ISA的扩展。驱动程
序用标准的EISA I/O操作访问EISA寄存器。核心中已有的驱动程序可以作为示例代码。
VLB
ISA的另一个扩展是“VESA Local Bus”接口总线,它通过增加一个长度方向的槽扩展IS
A连接器。这个额外的槽可以被VLB设备“单独”使用;由于它从ISA连接器复制了所有重
要的信号,设备可以被构造成只插入VLB插槽,而不用ISA插槽。单独的VLB外围很少见,
要的信号,设备可以被构造成只插入VLB插槽,而不用ISA插槽。单独的VLB外围很少见,
因为多数设备需要到达背板,这样它们的外部连接器是可用的。
Sbus
虽然多数Alpha计算机装备有PCI或ISA接口总线,多数基于Sparc的工作站使用Sbus连接
它们的外围。
Sbus是相当先进的一种设计,尽管它已经存在了很长时间了。它是想成为处理器无关的
,并专为I/O外围板子进行了优化。换句话说,你不能在Sbus的槽中插入额外的RAM。这
个优化的目的是简化硬件设备和系统软件的设计,这是以母板上的额外复杂性为代价的
。
总线的这种I/O偏向导致了一类外围,它们用虚地址传送数据,这样绕过了分配连续缓冲
区的需要。母板负责解码虚地址,并映射到物理地址上。这要求在Sbus上附带一些MMU(
内存管理单元)的能力,这部分负责的电路被称为“IOMMU”。这种总线的另一个特征是
:设备板子是地理寻址的,因此不需要在每个外围上实现地址解码器,也不需要处理地
址冲突。
Sbus外围在PROM中使用Forth语言来初始化它们。选择Forth是因为这个解释器是轻量级
的,可以容易地在任何计算机系统的固件里实现。另外,Sbus规范描述了引导过程,因
此符合条件的I/O设备可以简单地接入系统,并在系统引导时被识别出来。
此符合条件的I/O设备可以简单地接入系统,并在系统引导时被识别出来。
至于Linux,直到核心2.0也没有对Sbus设备的特别支持被引出到模块中。版本2.1.8增加
了对Sbus的特定支持,我鼓励感兴趣的读者去看看最近的核心。
快速参考
本节象往常一样,概述在本章中介绍的符号。
#include <linux/config.h>
CONFIG_PCI
这个宏用来条件编译PCI相关的代码。当一个PCI模块被加载入一个非PCI核心时,insmod
会抱怨说几个符号不能解析。
#include <linux/pci.h>
这个头文件包含PCI寄存器和几个销售商及设备ID的符号名。
#include <linux/bios32.h>
#include <linux/bios32.h>
所有下面列出的pcibios_函数在这个头文件中定义原型。
int pcibios_present(void);
这个函数返回一个布尔值表明我们运行的计算机是否具有PCI能力。
int pcibios_find_device(unsigned short vendor, unsigned short id, unsigned
short index,
unsigned char *bus, unsigned char *function);
int pcibios_find_class(unsigned int class_code, unsigned short index,
unsigned char *bus, unsigned char *function);
这些函数询问PCI固件关于设备是否有某个特定的签名,或属于某个特定的类。返回值是
一个出错说明;成功时,bus和function用来存储设备的位置。index第一次必须被传给0
,以后没查找一个新设备,就增加1。
PCIBIOS_SUCCESSFUL
PCIBIOS_DEVICE_NOT_FOUND
char *pcibios_strerror(int error);
这些宏,还有其它几个表示pcibios函数返回的整数值。DEVICE_NOT_FOUND一般被认为是
个成功值,因为成功地发现没有设备。pcibios_strerror函数用来将每个整数返回值转
换为一个字符串。
int pcibios_read_config_byte(unsigned char bus, unsigned char function,
unsigned char where, unsigned char *ptr);
int pcibios_read_config_word(unsigned char bus, unsigned char function,
unsigned char where, unsigned char *ptr);
int pcibios_read_config_dword(unsigned char bus, unsigned char function,
unsigned char where, unsigned char *ptr);
int pcibios_write_config_byte(unsigned char bus, unsigned char function,
unsigned char where, unsigned char val);
int pcibios_write_config_word(unsigned char bus, unsigned char function,
unsigned char where, unsigned short val);
int pcibios_write_config_dword(unsigned char bus, unsigned char function,
unsigned char where, unsigned int val);
这些函数用来读写PCI配置寄存器。尽管Linux核心负责字节序,程序员在从单个字节组
装多字节值时必须特别注意字节序。PCI总线是小印地安字节序。
-----------------------------------------------------------------------------
* 你可以在它自己的硬件手册中找到任何设备的ID。
* 这个信息居于基地址PCI寄存器的某个低序位中。
* 中断共享的问题是属于电气工程的;如果一个设备驱动程序驱动信号线为不活动----
* 你可以在它自己的硬件手册中找到任何设备的ID。
* 这个信息居于基地址PCI寄存器的某个低序位中。
* 中断共享的问题是属于电气工程的;如果一个设备驱动程序驱动信号线为不活动----
通过应用一个低阻抗电压级----中断便不能共享。另一方面,如果设备对不活动逻辑级
使用一个上拉电阻,那么共享就是可能的。多数ISA接口板使用上拉的方法。
--
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -