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

📄 (ldd) ch15-外围总线概览(转载).txt

📁 献给ARM初学者
💻 TXT
📖 第 1 页 / 共 4 页
字号:
      相连。
       
      地理寻址工作的方式是:给计算机的每个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 + -