精华内容
下载资源
问答
  • pci总线
    千次阅读
    2018-10-19 17:45:08

    版权声明:本文为博主原创文章,未经博主允许不得转载。
    https://blog.csdn.net/huangweiqing80/article/details/83112671

    一、Pci的地址域

    PCI总线协议中定义了三个不同的地址空间:1、PCI配置空间;2、PCI memory空间;3、PCI的IO空间。如果对PCI没有形成一点感念的初学者,很难理解这几个空间的区别。
    简单的说,PCI配置空间是PCI设备的内部属性,设备内部保存了256bytes的空间作为内部register定义该设备的属性。访问配置空间使用IO读写(X86架构中使用CF8h/CFCh端口);而PCI设备的memory/IO空间则是映射到CPU地址域中,需要占用的memory/IO地址空间。访问这部分地址域只要使用简单直接的memory、IO访问方式就可以实现。
    每个PCI设备的配置空间数据都不一样。基本上都是以固定的形式。每个外围设备在其 PCI 配置空间中都包含一组明确定义的配置寄存器。这些寄存器不仅用于标识设备,还用于提供设备配置信息。生成配置周期的方法取决于主机架构,x86 计算机中使用的是特殊的 I/O 端口(CF8h/CFCh端口)。在其他平台上,可以将 PCI 配置空间内存映射到对应于主机地址域中 PCI 主桥 (host bridge) 的某些地址位置,比如MIPS架构中。

    二、PCI寻址

    我们先来看一个例子,我的电脑装有1G的RAM,1G以后的物理内存地址空间都是外部设备IO在系统内存地址空间上的映射。/proc/iomem描述了 系统中所有的设备I/O在内存地址空间上的映射。我们来看地址从1G开始的第一个设备在/proc/iomem中是如何描述的:
    40000000-400003ff : 0000:00:1f.1
    这是一个PCI设备,40000000-400003ff是它所映射的内存地址空间,占据了内存地址空间的1024 bytes的位置,而0000:00:1f.1则是一个PCI外设的地址,它以冒号和逗号分隔为4个部分,第一个16位表示域,第二个8位表示一个总线编 号,第三个5位表示一个设备号,最后是3位,表示功能号。
    因为PCI规范允许单个系统拥有高达256个总线,所以总线编号是8位。但对于大型系统而言,这是不够的,所以,引入了域的概念,每个PCI域可以拥有最 多256个总线,每个总线上可支持32个设备,所以设备号是5位,而每个设备上最多可有8种功能,所以功能号是3位。由此,我们可以得出上述的PCI设备 的地址是0号域0号总线上的31号设备上的1号功能。那上述的这个PCI设备到底是什么呢?下面是我的电脑上的lspci命令的输出:

        00:00.0 Host bridge: Intel Corporation 82845 845 (Brookdale) Chipset Host Bridge (rev 04)
        00:01.0 PCI bridge: Intel Corporation 82845 845 (Brookdale) Chipset AGP Bridge(rev 04)
        00:1d.0 USB Controller: Intel Corporation 82801CA/CAM USB (Hub #1) (rev 02)
        00:1d.1 USB Controller: Intel Corporation 82801CA/CAM USB (Hub #2) (rev 02)
        00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev 42)
        00:1f.0 ISA bridge: Intel Corporation 82801CAM ISA Bridge (LPC) (rev 02)
        00:1f.1 IDE interface: Intel Corporation 82801CAM IDE U100 (rev 02)
        00:1f.3 SMBus: Intel Corporation 82801CA/CAM SMBus Controller (rev 02)
        00:1f.5 Multimedia audio controller:Intel Corporation 82801CA/CAM AC'97 Audio Controller (rev 02)
        00:1f.6 Modem: Intel Corporation 82801CA/CAM AC'97 Modem Controller (rev 02)
        01:00.0 VGA compatible controller: nVidia Corporation NV17 [GeForce4 420 Go](rev a3)
        02:00.0 FireWire (IEEE 1394): VIA Technologies, Inc. IEEE 1394 Host Controller(rev 46)
        02:01.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+(rev 10)
        02:04.0 CardBus bridge: O2 Micro, Inc. OZ6933 Cardbus Controller (rev 01)
        02:04.1 CardBus bridge: O2 Micro, Inc. OZ6933 Cardbus Controller (rev 01)
    

    lspci 没有标明域,但对于一台PC而言,一般只有一个域,即0号域。通过这个输出我们可以看到它是一个IDE interface。由上述的输出可以看到,我的电脑上共有3个PCI总线(0号,1号,2号)。在单个系统上,插入多个总线是通过桥(bridge)来 完成的,桥是一种用来连接总线的特殊PCI外设。所以,PCI系统的整体布局组织为树型,我们可以通过上面的lspci输出,来画出我的电脑上的PCI系 统的树型结构:

    00:00.0(主桥)--00:01.0(PCI桥)-----01:00:0(nVidia显卡)
                      |
                      |---00:1d(USB控制器)--00:1d:0(USB1号控制器)
                      |                   |
                      |                   |--00:1d:1(USB2号控制器)                   |
                      |-00:1e:0(PCI桥)--02:00.0(IEEE1394)
                      |               |
                      |               |-02:01.0(8139网卡)
                      |               |
                      |               |-02:04(CardBus桥)-02:04.0(桥1)
                      |                                  |
                      |                                  |--02:04.1(桥2)
                      |
                      |-00:1f(多功能板卡)-00:1f:0(ISA桥)
                                           |
                                           |--00:1f:1(IDE接口)
                                           |
                                           |--00:1f:3(SMBus)
                                           |
                                           |--00:1f:5(多媒体声音控制器)
                                           |
                                           |--00:1f:6(调制解调器)
    

    由上图可以得出,我的电脑上共有8个PCI设备,其中0号总线上(主桥)上连有4个,1号总线上连有1个,2号总线上连有3个。00:1f是一个连有5个功能的多功能板卡。
    每一个PCI设备都有它映射的内存地址空间和它的I/O区域,这点是比较容易理解的。除此之外,PCI设备还有它的配置寄存器。有了配置寄存器,PCI的 驱动程序就不需要探测就能访问设备。配置寄存器的布局是标准化的,配置空间的4个字节含有一个独一无二的功能ID,因此,驱动程序可通过查询外设的特定 ID来识别其设备。所以,PCI接口标准在ISA之上的主要创新在于配置地址空间。

    三 、linux中pci设备知识

    Linux PCI设备驱动实际包括Linux PCI设备驱动和设备本身驱动两部分。PCI(Periheral Component Interconnect)有三种地址空间:PCI I/O空间、PCI内存地址空间和PCI配置空间。其中,PCI I/O空间和PCI内存地址空间由设备驱动程序使用,而PCI配置空间由Linux PCI初始化代码使用,用于配置PCI设备,比如中断号以及I/O或内存基地址。

    3.1 内核工作

    Linux内核主要就做了对PCI设备的枚举和配置;在Linux内核初始化时完成的。

    对于PCI总线,有一个叫做PCI桥的设备用来将父总线与子总线连接。作为一种特殊的PCI设备,PCI桥主要包括以下三种:

    1). Host/PCI桥: 用于连接CPU与PCI根总线,第1个根总线的编号为0。在PC中,内存控制器也通常被集成到Host/PCI桥设备芯片中,因此Host/PCI桥通常也被称为“北桥芯片组(North Bridge Chipset)”。

    2). PCI/ISA桥: 用于连接旧的ISA总线。通常,PCI中类似i8359A中断控制器这样的设备也会被集成到PCI/ISA桥设备中。因此,PCI/ISA桥通常也被称为“南桥芯片组(South Bridge Chipset)”

    3). PCI-to-PCI桥(以下称为PCI-PCI桥): 用于连接PCI主总线(Primary Bus)和次总线(Secondary Bus)。PCI-PCI桥所处的PCI总线称为主总线,即次总线的父总线;PCI-PCI桥所连接的PCI总线称为次总线,即主总线的子总线。

    3.1.2 遍历

    从Host/PCI桥开始进行探测和扫描,逐个“枚举”连接在第一条PCI总线上的所有设备并记录在案。如果其中的某个设备是PCI-PCI桥,则又进一步再探测和扫描连在这个桥上的次级PCI总线。就这样递归下去,直到穷尽系统中的所有PCI设备。其结果,是在内存中建立起一棵代表着这些PCI总线和设备的PCI树。

    每个PCI设备(包括PCI桥设备)都由一个pci_dev结构体来表示,而每条PCI总线则由pci_bus结构来表示。

    3.1.3 配置

    PCI设备中一般都带有一些RAM和ROM 空间,通常的控制/状态寄存器和数据寄存器也往往以RAM区间的形式出现,而这些区间的地址在设备内部一般都是从0开始编址的,那么当总线上挂接了多个设备时,对这些空间的访问就会产生冲突。所以,这些地址都要先映射到系统总线上,再进一步映射到内核的虚拟地址空间。

    配置就是通过对PCI配置空间的寄存器进行操作从而完成地址的映射。

    1.1.4 数据结构

    pci_driver数据结构定义在:include/linux/pci.h文件中。

    struct pci_driver {
    	struct list_head node;
    	const char *name;
    	const struct pci_device_id *id_table;	/* must be non-NULL for probe to be called */
    	int  (*probe)  (struct pci_dev *dev, const struct pci_device_id *id);	/* New device inserted */
    	void (*remove) (struct pci_dev *dev);	/* Device removed (NULL if not a hot-plug capable driver) */
    	int  (*suspend) (struct pci_dev *dev, pm_message_t state);	/* Device suspended */
    	int  (*suspend_late) (struct pci_dev *dev, pm_message_t state);
    	int  (*resume_early) (struct pci_dev *dev);
    	int  (*resume) (struct pci_dev *dev);	                /* Device woken up */
    	void (*shutdown) (struct pci_dev *dev);
    	struct pci_error_handlers *err_handler;
    	struct device_driver	driver;
    	struct pci_dynids dynids;
    };
    

    pci_dev也定义在include/linux/pci.h文件中。

    详细描述了一个PCI设备几乎所有的硬件信息,包括厂商ID、设备ID、各种资源等.

    /*
     * The pci_dev structure is used to describe PCI devices.
     */
    struct pci_dev {
    	struct list_head bus_list;	/* node in per-bus list */
    	struct pci_bus	*bus;		/* bus this device is on */
    	struct pci_bus	*subordinate;	/* bus this device bridges to */
    
    	void		*sysdata;	/* hook for sys-specific extension */
    	struct proc_dir_entry *procent;	/* device entry in /proc/bus/pci */
    	struct pci_slot	*slot;		/* Physical slot this device is in */
    
    	unsigned int	devfn;		/* encoded device & function index */
    	unsigned short	vendor;
    	unsigned short	device;
    	unsigned short	subsystem_vendor;
    	unsigned short	subsystem_device;
    	unsigned int	class;		/* 3 bytes: (base,sub,prog-if) */
    	u8		revision;	/* PCI revision, low byte of class word */
    	u8		hdr_type;	/* PCI header type (`multi' flag masked out) */
    	u8		pcie_cap;	/* PCI-E capability offset */
    	u8		pcie_type:4;	/* PCI-E device/port type */
    	u8		pcie_mpss:3;	/* PCI-E Max Payload Size Supported */
    	u8		rom_base_reg;	/* which config register controls the ROM */
    	u8		pin;  		/* which interrupt pin this device uses */
    
    	struct pci_driver *driver;	/* which driver has allocated this device */
    	u64		dma_mask;	/* Mask of the bits of bus address this
    					   device implements.  Normally this is
    					   0xffffffff.  You only need to change
    					   this if your device has broken DMA
    					   or supports 64-bit transfers.  */
    
    	struct device_dma_parameters dma_parms;
    
    	pci_power_t     current_state;  /* Current operating state. In ACPI-speak,
    					   this is D0-D3, D0 being fully functional,
    					   and D3 being off. */
    	int		pm_cap;		/* PM capability offset in the
    					   configuration space */
    	unsigned int	pme_support:5;	/* Bitmask of states from which PME#
    					   can be generated */
    	unsigned int	pme_interrupt:1;
    	unsigned int	pme_poll:1;	/* Poll device's PME status bit */
    	unsigned int	d1_support:1;	/* Low power state D1 is supported */
    	unsigned int	d2_support:1;	/* Low power state D2 is supported */
    	unsigned int	no_d1d2:1;	/* Only allow D0 and D3 */
    	unsigned int	mmio_always_on:1;	/* disallow turning off io/mem
    						   decoding during bar sizing */
    	unsigned int	wakeup_prepared:1;
    	unsigned int	d3_delay;	/* D3->D0 transition time in ms */
    
    #ifdef CONFIG_PCIEASPM
    	struct pcie_link_state	*link_state;	/* ASPM link state. */
    #endif
    
    	pci_channel_state_t error_state;	/* current connectivity state */
    	struct	device	dev;		/* Generic device interface */
    
    	int		cfg_size;	/* Size of configuration space */
    
    	/*
    	 * Instead of touching interrupt line and base address registers
    	 * directly, use the values stored here. They might be different!
    	 */
    	unsigned int	irq;
    	struct resource resource[DEVICE_COUNT_RESOURCE]; /* I/O and memory regions + expansion ROMs */
    
    	/* These fields are used by common fixups */
    	unsigned int	transparent:1;	/* Transparent PCI bridge */
    	unsigned int	multifunction:1;/* Part of multi-function device */
    	/* keep track of device state */
    	unsigned int	is_added:1;
    	unsigned int	is_busmaster:1; /* device is busmaster */
    	unsigned int	no_msi:1;	/* device may not use msi */
    	unsigned int	block_cfg_access:1;	/* config space access is blocked */
    	unsigned int	broken_parity_status:1;	/* Device generates false positive parity */
    	unsigned int	irq_reroute_variant:2;	/* device needs IRQ rerouting variant */
    	unsigned int 	msi_enabled:1;
    	unsigned int	msix_enabled:1;
    	unsigned int	ari_enabled:1;	/* ARI forwarding */
    	unsigned int	is_managed:1;
    	unsigned int	is_pcie:1;	/* Obsolete. Will be removed.
    					   Use pci_is_pcie() instead */
    	unsigned int    needs_freset:1; /* Dev requires fundamental reset */
    	unsigned int	state_saved:1;
    	unsigned int	is_physfn:1;
    	unsigned int	is_virtfn:1;
    	unsigned int	reset_fn:1;
    	unsigned int    is_hotplug_bridge:1;
    	unsigned int    __aer_firmware_first_valid:1;
    	unsigned int	__aer_firmware_first:1;
    	pci_dev_flags_t dev_flags;
    	atomic_t	enable_cnt;	/* pci_enable_device has been called */
    
    	u32		saved_config_space[16]; /* config space saved at suspend time */
    	struct hlist_head saved_cap_space;
    	struct bin_attribute *rom_attr; /* attribute descriptor for sysfs ROM entry */
    	int rom_attr_enabled;		/* has display of the rom attribute been enabled? */
    	struct bin_attribute *res_attr[DEVICE_COUNT_RESOURCE]; /* sysfs file for resources */
    	struct bin_attribute *res_attr_wc[DEVICE_COUNT_RESOURCE]; /* sysfs file for WC mapping of resources */
    #ifdef CONFIG_PCI_MSI
    	struct list_head msi_list;
    	struct kset *msi_kset;
    #endif
    	struct pci_vpd *vpd;
    #ifdef CONFIG_PCI_ATS
    	union {
    		struct pci_sriov *sriov;	/* SR-IOV capability related */
    		struct pci_dev *physfn;	/* the PF this VF is associated with */
    	};
    	struct pci_ats	*ats;	/* Address Translation Service */
    #endif
    };
    
    static inline struct pci_dev *pci_physfn(struct pci_dev *dev)
    {
    #ifdef CONFIG_PCI_IOV
    	if (dev->is_virtfn)
    		dev = dev->physfn;
    #endif
    
    	return dev;
    }
    

    1.1.5 pci初始化流程顺序

    pci这块代码在两个地方,一个是driver/pci,另一个是arch/x86/pci中。

    1. pci系统的初始化工作有内核来完成,在drivers/pci/probe.c文件中,调用postcore_initcall(pcibus_class_init);函数,在sys/class/下创建一个pci_bus目录

    2. drivers/pci/pci-driver.c文件,postcore_initcall(pci_driver_init); 注册pci总线,并在/sys/bus/下创建了一个pci目录

    3. arch/x86/pci/init.c文件中arch_initcall(pci_arch_init);体系架构相关,对于64 bit x86来说使用CONFIG_PCI_DIRECT的方式进行访问PCI配置空间。在内核编译时候可以指定。

    4. drivers/pci/pci-acpi.c文件中,调用arch_initcall(acpi_pci_init);

    5. arch/x86/pci/legacy.c文件中,调用subsys_initcall(pci_subsys_init);

    6. drivers/pci/slot.c文件中,subsys_initcall(pci_slot_init); 创建/sys/bus/slots文件。

    四、pci架构概貌

    在这里插入图片描述

    上图展现了pci驱动架构中,pci_bus.pci_dev之间的关系.

    如上图所示:所有的根总线都链接在pci_root_buses链表中. Pci_bus ->device链表链接着该总线下的所有设备.而pci_bus->children链表链接着它的下层总线.

    对于pci_dev来说,pci_dev->bus指向它所属的pci_bus. Pci_dev->bus_list链接在它所属bus的device链表上.此外,所有pci设备都链接在pci_device链表中.

    五、PCI设备与配置空间

    在i386系统结构中,对内存的访问和对输入/输出寄存器的访问通过两套不同的指令完成,所有的存储器和IO两个不同的地址空间。一般而言,内存的物理地址以及输入/输出寄存器的地址是由硬件决定的,不过对于内存的物理地址还可以通过地址映射机制来一次转换(I/O也可以映射)。可是,怎样处理外设的存储空间呢?理想的办法是系统软件自动设置,思路是:

    1、外设通过某种途径告诉系统,它有几个存储区间以及I/O地址空间,每个区间是多大,以及各自在本地的地址,显然这些地址都是局部的内部的,都从0开始算起。

    2、系统软件在知道了一共有多少外设,各自又有什么样的存储区间以后,就可以为这些区间分配“物理地址”,并且建立起这些区间与总线之间的连接,以后就可以通过这些地址来访问。显然,这里所谓的“物理地址”与真正的物理地址还是有些区别的,它实际上也是一种逻辑地址,所以常称为“总线地址”,因为这是CPU在总线上所看到的地址。可想而知,外设上一定有着某种地址映射机制。所谓的“为外设分配地址”,就是为其分配总线地址,并建立起映射。

    PCI设备上存在许多完成上述工作的寄存器(配置空间),那么系统初始化的时候如何访问这些寄存器?对于i386结构的处理器,PCI总线的设计者在I/O地址空间保留了8个字节用于这个目的,那就是0xCF8~0xCFF,这8个字节的地址空间构成了两个32位的寄存器,第一个是“地址寄存器”0xCF8,第二个是“数据寄存器”0xCFC,要访问配置空间的寄存器时,CPU先向地址寄存器(0xCF8)写入目标地址(PCI设备配置空间寄存器地址),然后通过数据寄存器进行读写数据。不过,写入地址寄存器的目标地址是一种包括总线号、设备号、功能号以及配置寄存器地址的综合地址。每个PCI设备最多有8个功能,所以设备号和功能号组合在一起又被称作“逻辑设备”号。

    在这里插入图片描述

    如上图所示,PCI标准规定每个设备的配置寄存器组最多可以有256字节的连续空间,其中开头的64字节的用途和格式是标准的,成为配置寄存器组的“头部”,这样的头部又有两种,“0型”头部用于一般的PCI设备,“1型”头部用于PCI桥,无论是“0型”还是“1型”,其开头的16个字节的用途和格式是共同的。

    六、PCI驱动之总线

    在内核中与PCI相关的结构体大概有pci_driver 、pci_bus_type 、pci_dev 、pci_bus ,我们前边所说的所有的PCI总线都是指的 pci_bus 。

    6.1 pci_bus

    struct pci_bus {
    	struct list_head node;		/* node in list of buses */
    	struct pci_bus	*parent;	/* parent bus this bridge is on */
    	struct list_head children;	/* list of child buses */
    	struct list_head devices;	/* list of devices on this bus */
    	struct pci_dev	*self;		/* bridge device as seen by parent */
    	struct list_head slots;		/* list of slots on this bus */
    	struct resource	*resource[PCI_BUS_NUM_RESOURCES];
    					/* address space routed to this bus */
     
    	struct pci_ops	*ops;		/* configuration access functions */
    	void		*sysdata;	/* hook for sys-specific extension */
    	struct proc_dir_entry *procdir;	/* directory entry in /proc/bus/pci */
     
    	unsigned char	number;		/* bus number */
    	unsigned char	primary;	/* number of primary bridge */
    	unsigned char	secondary;	/* number of secondary bridge */
    	unsigned char	subordinate;	/* max number of subordinate buses */
     
    	char		name[48];
     
    	unsigned short  bridge_ctl;	/* manage NO_ISA/FBB/et al behaviors */
    	pci_bus_flags_t bus_flags;	/* Inherited by child busses */
    	struct device		*bridge;
    	struct device		dev;
    	struct bin_attribute	*legacy_io; /* legacy I/O for this bus */
    	struct bin_attribute	*legacy_mem; /* legacy mem */
    	unsigned int		is_added:1;
    };
    
    

    几个重要的成员:
    children: PCI桥可以使当前总线得到扩展,当前总线上有几个PCI桥,那么当前总线就会拥有几个子总线,子总线会连接到父总线的children链表中。

    device: 连接在这条总线上的设备链表。

    ops: 当前总线访问总线上设备配置空间的 read、write 方法。

    在内核启动的过程中,首先会创建0级总线,然后枚举探测0级总线上的设备,如果是PCI桥,那么还要进入下一级子总线,最终所有的连接的PCI设备都将被探测到,详细的探测过程,我们在后边分析。

    6.2 注册pci总线

    struct bus_type pci_bus_type = {
    	.name		= "pci",
    	.match		= pci_bus_match,
    	.uevent		= pci_uevent,
    	.probe		= pci_device_probe,
    	.remove		= pci_device_remove,
    	.shutdown	= pci_device_shutdown,
    	.dev_attrs	= pci_dev_attrs,
    	.bus_attrs	= pci_bus_attrs,
    	.pm		= PCI_PM_OPS_PTR,
    };
    
    static int __init pci_driver_init(void)
    {
    	return bus_register(&pci_bus_type);
    }
    
    postcore_initcall(pci_driver_init);
    

    3.3 pci_bus_type

    看到 bus_type 显然这是个设备总线驱动模型里的“总线”,与前边提到的 pci_bus ,完全是两码事,那么pci_driver 和 pci_dev 就是注册到 pci_bus_type 的驱动和设备。分析总线设备驱动模型的时候,总要分析一下它的 match 函数(匹配规则)。

    static int pci_bus_match(struct device *dev, struct device_driver *drv)
    {
    	struct pci_dev *pci_dev = to_pci_dev(dev);
    	struct pci_driver *pci_drv = to_pci_driver(drv);
    	const struct pci_device_id *found_id;
     
    	found_id = pci_match_device(pci_drv, pci_dev);
    	if (found_id)
    		return 1;
     
    	return 0;
    }
    
    
    static const struct pci_device_id *pci_match_device(struct pci_driver *drv,
    						    struct pci_dev *dev)
    {
    	struct pci_dynid *dynid;
     
    	/* Look at the dynamic ids first, before the static ones */
    	spin_lock(&drv->dynids.lock);
    	list_for_each_entry(dynid, &drv->dynids.list, node) {
    		if (pci_match_one_device(&dynid->id, dev)) {
    			spin_unlock(&drv->dynids.lock);
    			return &dynid->id;
    		}
    	}
    	spin_unlock(&drv->dynids.lock);
     
    	return pci_match_id(drv->id_table, dev);
    }
    
    
    static inline const struct pci_device_id *
    pci_match_one_device(const struct pci_device_id *id, const struct pci_dev *dev)
    {
    	if ((id->vendor == PCI_ANY_ID || id->vendor == dev->vendor) &&
    	    (id->device == PCI_ANY_ID || id->device == dev->device) &&
    	    (id->subvendor == PCI_ANY_ID || id->subvendor == dev->subsystem_vendor) &&
    	    (id->subdevice == PCI_ANY_ID || id->subdevice == dev->subsystem_device) &&
    	    !((id->class ^ dev->class) & id->class_mask))
    		return id;
    	return NULL;
    }
    
    
    const struct pci_device_id *pci_match_id(const struct pci_device_id *ids,
    					 struct pci_dev *dev)
    {
    	if (ids) {
    		while (ids->vendor || ids->subvendor || ids->class_mask) {
    			if (pci_match_one_device(ids, dev))
    				return ids;
    			ids++;
    		}
    	}
    	return NULL;
    }
    
    

    通过分析代码,PCI设备与驱动的匹配方式有两种,一种是通过 pci_driver->dynids ,另一种是通过 pci_driver->idtable 。使用idtable 是总线设备驱动模型中常用的匹配方法,一般都是通过设备名来匹配,但是PCI比较特殊,它是通过设备的 vendor 、subvendor 、device 、subdevice 来匹配(这些都是在配置空间里可以读取到的)。
    至于 pci_driver->dynids ,它是通过用户空间给驱动增加匹配条件的一种方法(还记得I2C可以在用户空间创建设备吗,一样的)。

    error = pci_create_newid_file(drv);
    static int
    pci_create_newid_file(struct pci_driver *drv)
    {
    	int error = 0;
    	if (drv->probe != NULL)
    		error = driver_create_file(&drv->driver, &driver_attr_new_id);
    	return error;
    }
    
    

    在 pci_register_driver 函数中会调用到一个 pci_create_newid_file 函数,它在 sysfs 文件系统中会创建一个 new_id 的属性文件,通过这个属性文件,我们就可以来为该驱动增加匹配条件。
    内核帮助文档有说明:

    New PCI IDs may be added to a device driver pci_ids table at runtime as shown below:
    echo "vendor device subvendor subdevice class class_mask driver_data" > \
    

    /sys/bus/pci/drivers/{driver}/new_id

    对于这种方法不在详细分析。

    分析完设备总线驱动模型,我想整个PCI驱动的框架就非常清楚了,内核启动时,通过pci_bus之间的关系枚举出所有的 PCI 设备,并为每一个 PCI 设备创建一个 pci_dev ,根据配置空间的信息填充 pci_dev 之后,注册到pci_bus_type 。而,我们写的 pci_driver 在 idtable 里指定它所支持的设备信息,同样也注册到 pci_bus_type中去,信息一致匹配成功则调用 driver->probe 函数,然后你可以注册字符设备、块设备等等。

    本文参考了
    https://blog.csdn.net/notbaron/article/details/79643799
    https://blog.csdn.net/notbaron/article/details/80346988
    https://blog.csdn.net/zyboy2000/article/details/51971453
    http://blog.chinaunix.net/uid/25909619/list/1.html?cid=169563
    https://so.csdn.net/so/search/s.do?p=1&q=pci&t=blog&domain=&o=&s=&u=fudan_abc&l=&f=&rbg=0
    https://blog.csdn.net/lizuobin2/article/details/51828594

    更多相关内容
  • 1 PCI总线的特点及系统结构 PCI总线是一种兼容性最强、功能最全的计算机总线。他可同时支持多组外围设备,且不受制于处理器,为CPU及高速外围设备提供高性能、高吞吐量、低延迟的数据通路。PCI支持5 V及3.3 V的...
  • PCI总线的布线有什么特殊要求,我们可以从下面的几点来分析一下PCI
  • lspci命令用于显示当前主机的所有PCI总线信息,以及所有已连接的PCI设备信息。 现在主流设备如网卡储存等都采用PCI总线 语法格式:lspci [参数] 常用参数: -n 以数字方式显示PCI厂商和设备代码 -t 以树状结构...
  • PCI总线

    2021-11-02 10:27:48
    PCI是Peripheral Component Interconnect(外设部件互连标准)的缩写,它是目前个人电脑中使用最为广泛的接口,...PCI 总线结构图 PCI即Peripheral Component Interconnect,中文意思是“外围器件互联”,是由PCISIG

    PCI是Peripheral Component Interconnect(外设部件互连标准)的缩写,它是目前个人电脑中使用最为广泛的接口,几乎所有的主板产品上都带有这种插槽。PCI插槽也是主板带有最多数量的插槽类型,在目前流行的台式机主板上,ATX结构的主板一般带有5~6个PCI插槽,而小一点的MATX主板也都带有2~3个PCI插槽,可见其应用的广泛性。

    PCI 总线结构图

    PCI即Peripheral Component Interconnect,中文意思是“外围器件互联”,是由PCISIG (PCI Special Interest Group)推出的一种局部并行总线标准。PCI总线是由ISA(Industy Standard Architecture)总线发展而来的,ISA并行总线有8位和16位两种模式,时钟频率为8MHz,工作频率为33MHz/66MHz。是一种同步的独立于处理器的32位或64位局部总线。从结构上看,PCI是在CPU的供应商和原来的系统总线之间插入的一级总线,具体由一个桥接电路实现对这一层的管理,并实现上下之间的接口以协调数据的传送。从1992年创立规范到如今,PCI总线已成为了计算机的一种标准总线。已成为局部总线的新标准,广泛用于当前高档微机、工作站,以及便携式微机。主要用于连接显示卡、网卡、声卡。PCI总线是32位同步复用总线。其地址和数据线引脚是AD31~AD0。PCI的工作频率为33MHz。

    PCI总线结构

    PCI总线是一种树型结构,并且独立于CPU总线,可以和CPU总线并行操作。PCI总线上可以挂接PCI设备和PCI桥片,PCI总线上只允许有一个PCI主设备,其他的均为PCI 从设备,而且读写操作只能在主从设备之间进行,从设备之间的数据交换需要通过主设备中转。 [1] PCI总线结构如下图所示。

    在处理器系统中,含有PCI总线和PCI总线树这两个概念。这两个概念并不相同,在一颗PCI总线树中可能具有多条PCI总线,而具有血缘关系的PCI总线组成一颗PCI总线树。PCI总线由HOST主桥或者PCI桥管理,用来连接各类设备,如声卡、网卡和IDE接口卡等。在一个处理器系统中,可以通过PCI桥扩展PCI总线,并形成具有血缘关系的多级PCI总线,从而形成PCI总线树型结构。在处理器系统中有几个HOST主桥,就有几颗这样的PCI总线树,而每一颗PCI总线树都与一个PCI总线域对应。

    与HOST主桥直接连接的PCI总线通常被命名为PCI总线0。考虑到在一个处理器系统中可能有多个主桥。

    PCI总线取代了早先的ISA总线。当然与在PCI总线后面出现专门用于显卡的AGP总线,与现在的PCI Express总线相比,功能没有那么强大,但是PCI能从1992用到现在,说明他有许多优点,比如即插即用(Plug and Play)、中断共享等。在这里我们对PCI总线做一个深入的介绍。

    从数据宽度上看,PCI总线有32bit、64bit之分;从总线速度上分,有33MHz、66MHz两种。目前流行的是32bit @ 33MHz,而64bit系统正在普及中。改良的PCI系统,PCI-X,最高可以达到64bit @ 133MHz,这样就可以得到超过1GB/s的数据传输速率。如果没有特殊说明,以下的讨论以32bit @ 33MHz为例。

    不同于ISA总线,PCI总线的地址总线数据总线分时复用的。这样做的好处是,一方面可以节省接插件的管脚数,另一方面便于实现突发数据传输。在做数据传输时,由一个PCI设备做发起者(主控,Initiator或Master),而另一个PCI设备做目标(从设备,Target或Slave)。总线上的所有时序的产生与控制,都由Master来发起。PCI总线在同一时刻只能供一对设备完成传输,这就要求有一个仲裁机构(Arbiter),来决定在谁有权力拿到总线的主控权。

    当PCI总线进行操作时,发起者(Master)先置REQ#,当得到仲裁器(Arbiter)的许可时(GNT#),会将FRAME#置低,并在AD总线上放置Slave地址,同时C/BE#放置命令信号,说明接下来的传输类型。所有PCI总线上设备都需对此地址译码,被选中的设备要置DEVSEL#以声明自己被选中。然后当IRDY#与TRDY#都置低时,可以传输数据。当Master数据传输结束前,将FRAME#置高以标明只剩最后一组数据要传输,并在传完数据后放开IRDY#以释放总线控制权。

    这里我们可以看出,PCI总线的传输是很高效的,发出一组地址后,理想状态下可以连续发数据,峰值速率为132MB/s。实际上,目前流行的33M@32bit北桥芯片一般可以做到100MB/s的连续传输。

    PCI总线特点

    (1)传输速率高最大数据传输率为132MB/s,当数据宽度升级到64位,数据传输率可达264MB/s。这是其他总线难以比拟的。它大大缓解了数据I/O瓶颈,使高性能CPU的功能得以充分发挥,适应高速设备数据传输的需要。

    (2)多总线共存采用PCI总线可在一个系统中让多种总线共存,容纳不同速度的设备一起工作。通过HOST-PCI桥接组件芯片,使CPU总线和PCI总线桥接;通过PCI-ISA/EISA桥接组件芯片,将PCI总线与ISA/EISA总线桥接,构成一个分层次的多总线系统。高速设备从ISA/EISA总线卸下来,移到PCI总线上,低速设备仍可挂在ISA/EISA总线上,继承原有资源,扩大了系统的兼容性。

    (3)独立于CPU PCI总线不依附于某一具体处理器,即PCI总线支持多种处理器及将来发展的新处理器,在更改处理器品种时,更换相应的桥接组件即可。

    (4)自动识别与配置外设 用户使用方便。

    (5)并行操作能力。

    PCI总线的主要性能

    (1)总线时钟频率33.3MHz/66.6MHz。

    (2)总线宽度32位/64位。

    (3)最大数据传输率132MB/s(264MB/s)。

    (4)支持64位寻址。

    (5)适应5V和3.3V电源环境。

    即插即用的实现

    所谓即插即用,是指当板卡插入系统时,系统会自动对板卡所需资源进行分配,如基地址、中断号等,并自动寻找相应的驱动程序。而不象旧的ISA板卡,需要进行复杂的手动配置。

    实际的实现远比说起来要复杂。在PCI板卡中,有一组寄存器,叫"配置空间"(Configuration Space),用来存放基地址与内存地址,以及中断等信息。

    内存地址为例。当上电时,板卡从ROM里读取固定的值放到寄存器中,对应内存的地方放置的是需要分配的内存字节数等信息。操作系统要跟据这个信息分配内存,并在分配成功后把相应的寄存器中填入内存的起始地址。这样就不必手工设置开关来分配内存或基地址了。对于中断的分配也与此类似。

    中断共享的实现

    ISA卡的一个重要局限在于中断是独占的,而我们知道计算机的中断号只有16个,系统又用掉了一些,这样当有多块ISA卡要用中断时就会有问题了。

    PCI总线的中断共享由硬件与软件两部分组成。

    硬件上,采用电平触发的办法:中断信号在系统一侧用电阻接高,而要产生中断的板卡上利用三极管的集电极将信号拉低。这样不管有几块板产生中断,中断信号都是低;而只有当所有板卡的中断都得到处理后,中断信号才会恢复高电平。

    软件上,采用中断链的方法:假设系统启动时,发现板卡A用了中断7,就会将中断7对应的内存区指向A卡对应的中断服务程序入口ISR_A;然后系统发现板卡B也用中断7,这时就会将中断7对应的内存区指向ISR_B,同时将ISR_B的结束指向ISR_A。以此类推,就会形成一个中断链。而当有中断发生时,系统跳转到中断7对应的内存,也就是ISR_B。ISR_B就要检查是不是B卡的中断,如果是,要处理,并将板卡上的拉低电路放开;如果不是,则呼叫ISR_A。这样就完成了中断的共享。

    通过以上讨论,我们不难看出,PCI总线有着极大的的优势。而近年来的市场情况也证实了这一点。

    总线设备

     语音

    在PCI总线中有三类设备,PCI主设备、PCI从设备和桥设备。其中PCI从设备只能被动地接收来自HOST主桥,或者其他PCI设备的读写请求;而PCI主设备可以通过总线仲裁获得PCI总线的使用权,主动地向其他PCI设备或者主存储器发起存储器读写请求。而桥设备的主要作用是管理下游的PCI总线,并转发上下游总线之间的总线事务。

    一个PCI设备可以即是主设备也是从设备,但是在同一个时刻,这个PCI设备或者为主设备或者为从设备。PCI总线规范将PCI主从设备统称为PCI Agent设备。在处理器系统中常见的PCI网卡、显卡、声卡等设备都属于PCI Agent设备。

    在PCI总线中,HOST主桥是一个特殊的PCI设备,该设备可以获取PCI总线的控制权访问PCI设备,也可以被PCI设备访问。但是HOST主桥并不是PCI设备。PCI规范也没有规定如何设计HOST主桥。

    在PCI总线中,还有一类特殊的设备,即桥设备。桥设备包括PCI桥、PCI-to-(E)ISA桥和PCI-to-Cardbus桥。PCI桥的存在使PCI总线极具扩展性,处理器系统可以使用PCI桥进一步扩展PCI总线。

    PCI桥的出现使得采用PCI总线进行大规模系统互连成为可能。但是在目前已经实现的大规模处理器系统中,并没有使用PCI总线进行处理器系统与处理器系统之间的大规模互连。因为PCI总线是一个以HOST主桥为根的树型结构,使用主从架构,因而不易实现多处理器系统间的对等互连。

    即便如此PCI桥仍然是PCI总线规范的精华所在,掌握PCI桥是深入理解PCI体系结构的基础。PCI桥可以连接两条PCI总线,上游PCI总线和下游PCI总线,这两个PCI总线属于同一个PCI总线域,使用PCI桥扩展的所有PCI总线都同属于一个PCI总线域。

    其中对PCI设备配置空间的访问可以从上游总线转发到下游总线,而数据传送可以双方向进行。在PCI总线中,还存在一种非透明PCI桥,该桥片不是PCI总线规范定义的标准桥片,但是适用于某些特殊应用。

    主要性能

     语音

    (1)传输速率高最大数据传输率为132MB/s,当数据宽度升级到64位,数据传输率可达264MB/s。这是其他总线难以比拟的。它大大缓解了数据I/O瓶颈,使高性能CPU的功能得以充分发挥,适应高速设备数据传输的需要。

    (2)多总线共存采用PCI总线可在一个系统中让多种总线共存,容纳不同速度的设备一起工作。通过HOST-PCI桥接组件芯片,使CPU总线和PCI总线桥接;通过PCI-ISA/EISA桥接组件芯片,将PCI总线与ISA/EISA总线桥接,构成一个分层次的多总线系统。高速设备从ISA/EISA总线卸下来,移到PCI总线上,低速设备仍可挂在ISA/EISA总线上,继承原有资源,扩大了系统的兼容性。

    (3)独立于CPU PCI总线不依附于某一具体处理器,即PCI总线支持多种处理器及将来发展的新处理器,在更改处理器品种时,更换相应的桥接组件即可。

    (4)自动识别与配置外设 用户使用方便。

    (5)并行操作能力。

    PCI (Peripheral Component Interconnect)总线是一种高性能局部总线,是为了满足外设间以及外设与主机间高速数据传输而提出来的。在数字图形、图像和语音处理,以及高速实时数据采集与处理等对数据传输率要求较高的应用中,采用PCI总线来进行数据传输,可以解决原有的标准总线数据传输率低带来的瓶颈问题。

    总线特点

     语音

    PCI总线是一种同步的独立于处理器的32位或64位局部总线,最高工作频率为33MHz,峰值速度在32位时为132MB/s,64位时为264MB/s,总线规范由PCISIG发布。ISA总线相比,PCI总线和有如下显著的特点:

    (1)高速性

    PCI局部总线以33MHz的时钟频率操作,采用32位数据总线数据传输速率可高达132MB/s,远超过以往各种总线。而早在1995年6月推出的PCI总线规范2。l已定义了64位、66MHz的PCI总线标准。因此PCI总线完全可为未来的计算机提供更高的数据传送率。另外,PCI总线的主设备(Master)可与微机内存直接交换数据,而不必经过微机CPU中转,也提高了数据传送的效率。

    (2)即插即用性

    目前随着计算机技术的发展,微机中留给用户使用的硬件资源越来越少,也越来越含糊不清。在使用ISA板卡时,有两个问题需要解决:一是在同一台微机上使用多个不同厂家、不同型号的板卡时,板卡之间可能会有硬件资源上的冲突;二是板卡所占用的硬件资源可能会与系统硬件资源(如声卡、网卡等)相冲突。而PCI板卡的硬件资源则是由微机根据其各自的要求统一分配,决不会有任何的冲突问题。因此,作为PCI板卡的设计者,不必关心微机的哪些资源可用,哪些资源不可用,也不必关心板卡之间是否会有冲突。因此,即使不

    考虑PCI总线的高速性,单凭其即插即用性,就比ISA总线优越了许多。

    (3)可靠性

    PCI独立于处理器的结构,形成一种独特的中间缓冲器设计方式,将中央处理器子系统与外围设备分开。这样用户可以随意增添外围设备,以扩充电脑系统而不必担心在不同时钟频率下会导致性能的下降。与原先微机常用的ISA总线相比,PCI总线增加了奇偶校验错(PERR)、系统错(SERR)、从设备结束(STOP)等控制信号及超时处理等可靠性措施,使数据传输的可靠性大为增加。

    (4)复杂性

    PCI总线强大的功能大大增加了硬件设计和软件开发的实现难度。硬件上要采用大容量、高速度的CPLD或FPGA芯片来实现PCI总线复杂的功能。软件上则要根据所用的操作系统,用软件工具编制支持即插即用功能酶设备驱动程序

    (5)自动配置

    PCI总线规范规定PCI插卡可以自动配置。PCI定义了3种地址空间存储器空间,输入输出空间和配置空间,每个PCI设备中都有256字节的配置空间用来存放自动配置信息,当PCI插卡插入系统,BIOS将根据读到的有关该卡的信息,结合系统的实际情况为插卡分配存储地址、中断和某些定时信息。

    (6)共享中断

    PCI总线是采用低电平有效方式,多个中断可以共享一条中断线,而ISA总线是边沿触发方式。

    (7)扩展性好

    如果需要把许多设备连接到PCI总线上,而总线驱动能力不足时,可以采用多级PCI总线,这些总线上均可以并发工作,每个总线上均可挂接若干设备。因此PCI总线结构的扩展性是非常好的。由于PCI的设计是要辅助现有的扩展总线标准,因此与ISA,EISA及MCA总线完全兼容。

    (8)多路复用

    在PCI总线中为了优化设计采用了地址线和数据线共用一组物理线路,即多路复用。PCI接插件尺寸小,又采用了多路复用技术,减少了元件和管脚个数,提高了效率。

    (9)严格规范

    PCI总线对协议、时序、电气性能、机械性能等指标都有严格的规定,保证了PCI的可靠性和兼容性。由于PCI总线规范十分复杂,其接口的实现就有较高的技术难度。

     

    PCI总线信号定义示意图

    PCI总线标准所定义的信号线通常分成必需的和可选的两大类。其信号线总数为120条(包括电源、地、保留引脚等)。其中,必需信号线:主控设备49条,目标设备47条。可选信号线:51条(主要用于64位扩展、中断请求、高速缓存支持等)。主设备是指取得了总线控制权的设备,而被主设备选中以进行数据交换的设备称为从设备或目标设备。作为主设备需要49条信号线,若作为目标设备,则需要47条信号线,可选的信号线有51条。利用这些信号线便可以传输数据、地址,实现接口控制、仲裁及系统的功能。PCI局部总线信号如下所示。下面按功能分组进行说明:

    1)系统信号CLK IN:系统时钟信号,为所有PCI传输提供时序,对于所有的PCI设备都是输入信号。其频率最高可达33MHz/66MHz,这一频率也称为PCI的工作频率。 RST# IN:复位信号。用来迫使所有PCI专用的寄存器、定序器和信号转为初始状态。

    2).地址和数据信号 AD[31::00]T/S:地址、数据复用的信号。PCI总线上地址和数据的传输,必需在FRAME#有效期间进行。当FRAME#有效时的第1个时钟,AD[31::00]上的信号为地址信号,称地址期;当IRDY#和TRDY#同时有效时,AD[31::00]上的信号为数据信号,称数据期。一个PCI总线传输周期包含一个地址期和接着的一个或多个数据期。 C/BE[3::0]# T/S:总线命令和字节允许复用信号。在地址期,这4条线上传输的时总线命令;在数据期,它们传输的时字节允许信号,用来指定在数据期,AD[31::00]线上4个数据字节中哪些字节为有效数据,以进行传输。 PAR T/S:奇偶校验信号。它通过AD[31::00]和C/BE[3::0]进行奇偶校验。主设备为地址周期和写数据周期驱动PAR,从设备为读数据周期驱动PAR。

    3).接口控制信号 FRAME# S/T/S:帧周期信号,由主设备驱动。表示一次总线传输的开始和持续时间。当FRAME#有效时,预示总线传输的开始;在其有效期间,先传地址,后传数据;当FRAME#撤消时,预示总线传输结束,并在IRDY#有效时进行最后一个数据期的数据传送。 IRDY# S/T/S:主设备准备好信号。IRDY#要与TRDY#联合使用,当二者同时有效时,数据方能传输,否则,即为未准备好二进入等待周期。在写周期,该信号有效时,表示数据已由主设备提交到AD[31::00]线上;在读周期,该信号有效时,表示主设备已做好接收数据的准备。 TRDY# S/T/S:从设备(被选中的设备)准备好信号。同样TRDY#要与IRDY#联合使用,只有二者同时有效,数据才能传输。 STOP# S/T/S:从设备要求主设备停止当前的数据传送的信号。显然,该信号应由从设备发出。LOCK# S/T/S:锁定信号。当对一个设备进行可能需要多个总线传输周期才能完成的操作时,使用锁定信号LOCK#,进行独占性访问。例如,某一设备带有自己的存储器,那么它必需能进行锁定,以便实现对该存储器的完全独占性访问。也就是说,对此设备的操作是排它性的。IDSEL IN:初始化设备选择信号。在参数配置读/写传输期间,用作片选信号。 DEVSEL# S/T/S:设备选择信号。该信号由从设备在识别处地址时发出,当它有效时,说明总线上有某处的某一设备已被选中,并作为当前访问的从设备。

    4).仲裁信号(只用于总线主控器) REQ# T/S:总线占用请求信号。该信号有效表明驱动它的设备要求使用总线。它是一个点到点的信号线,任何主设备都有它自己的REQ#信号。 GNT# T/S:总线占用允许信号。该信号有效,表示申请占用总线的设备的请求已获得比准。

    5).错误报告信号 PERR# S/T/S:数据奇偶校验错误报告信号。一个设备只有在响应设备选择信号(DEVSEL#)和完成数据期之后,才能报告一个PERR#。SERR# O/D:系统错误报告信号。用做报告地址奇偶错、特殊命令序列中的数据奇偶错,以及其他可能引起灾难性后果的系统错误。它可由任何设备发出。

    6).中断信号 在PCI总线中,中断是可选项,不一定必须具有。INTA# O/D:用于请求中断。INTB# O/D、INTC# O/D、INTD# O/D:用于请求中断,仅对多功能设备有意义。所谓的多功能设备是指:将几个相互独立的功能集中在一个设备中。各功能与中断线之间的连接是任意的,没有任何附加限制。

    7.)其他可选信号 (1)高速缓存支持信号:SBO# IN/OUT、SDONE IN/OUT (2)64位总线扩展信号:REQ64# S/T/S、ACK65# S/T/S、AD[63::32]T/S、C/BE[7::4]#T/S、PAR64 T/S。 (3)测试访问端口/边界扫描信号:TCK IN、TDI IN、TDO OUT、TMS IN、TRST# IN。

     

     

    展开全文
  •  PCI总线(外设互联总线)与传统的总线标准——ISA总线(工业标准结构总线)相比,具有更高的传输率(132MBps)、支持32位处理器及DMA和即插即用等优点,用于取代ISA总线而成为目前台式计算机的事实I/O总线标准,在...
  • PCI总线规范简介

    2018-08-25 14:55:06
    PCI(Peripheral Component Interconnect),中文意思是“外围器件互联”,一种由英特尔(Intel)公司 1991 年推出的局部并行总线标准。此标准允许在计算机内安装多达10 个遵从PCI 标准的扩展卡。最早提出的 PCI 总线...
  • 摘要:介绍基于PCI总线加密卡的硬件组成部分。该加密卡汲取了现代先进的加密思想,实现了高强度加密功能。 关键词:加密卡 PCI总线 PCI9052 ISP 单片机加密是对软件进行保护的一种有效手段。从加密技术的发展历程及...
  • usb的有verilog和VHDL,pci的全verilog,我也看不大懂。。 设计 , 源代码
  •  《PCI总线设备开发宝典》详细介绍开发PCI总线设备的过程中所涉及的实际问题,包括PCI总线设备的电源分配、元器件的选择、配置芯片代码的编写、原理图和PCB图的设计、驱动程序与应用程序的设计以及安装和调试等。...
  • PCI总线标准协议——(中文版) 详细的介绍pcie 总线的原理
  • Compact PCI总线 Compact PCI总线简称CPCI,中文又称紧凑型PCI,是国际PICMG协会于1994年提出来的一种总线接口标准。它的出现解决了多年来电信系统工程师与设各制造商面临的棘手问题,将VME密集坚固的封装和大型...
  • 摘要:采用FPGA技术,在ALTERA公司的FLEX6000系列芯片上实现了从设备模式PCI总线的简化协议,并给出了Windows9x系统下的虚拟设备驱动程序,提供了与应用程序的接口。实现结果表明:该设备结构灵活,功能可靠,有利于...
  • 提出了一种使用CPLD解决双端口RAM地址译码和PCI接口芯片局部总线仲裁的的硬件设计方案,并给出了PCI总线接口芯片寄存器配置实例,介绍了软件包WinDriver开发设备驱动程序的具体过程。随着计算机技术的不断发展,为...
  • 以ADLINK的PCI7396数据采集卡为例,介绍PCI总线设备的配置空间,包括它的结构及访问方法,重点介绍PCI总线设备在VxWorks下驱动程序的开发步骤及编程要点,并对开发过程中的关键部分给予代码说明;在某综合控制系统中...
  •  同时,PCI总线存取延误小,采用总线主控和同步操作,不受处理器限制,具有自动配置功能,非常适合于高速外设。所以,它正迅速取代原先的ISA总线成为微型计算机系统的主流总线。  随着工业控制pci设备的增多,...
  • PCI总线系统体系结构

    2020-10-22 17:23:26
    在数字图形、图像和语音处理,以及高速实时数据采集与处理等对数据传输率要求较高的应用中,采用PCI总线来进行数据传输,可以解决原有的标准总线数据传输率低带来的瓶颈问题。PCI是目前计算机插卡式外设总线的事实...
  • 提出了基于PCI总线接口技术实现DMA数据传输系统的通用设计方法。该方法应用于雷达接收机综合测试仪,当雷达接收机工作时,采用DMA方式的数据传输速率可以稳定地达到70MB/s,能够有效地采集并保存雷达各种参数,供...
  • 虽然PCI总线也经历了从PCI、PCI-X到PCI Express的发展,但PCI总线由于存在时间长,开发工具、开发资料众多,在对数据吞吐量要求不是很高的工业控制、测量领域仍有着顽强的生命力。笔者在学习了相关设计资料的基础上...
  • 采用基于PCI总线的运动控制卡,在Visual Basic 6.0编程环境下开发摩擦试验机的运动控制系统,通过调用动态链接库(DLL)的方法实现试验机的运动控制。试验表明,本方案可大大缩短控制系统的开发周期,能够精确实现试验机的...
  • 3月,研华科技(Advantech)发布新款通讯卡 PCI-1612CU,它是一款 4 端口 RS-232/422/485 通用 PCI 总线通讯卡、同时支持 3.3 和 5 V 系统、带有强大的浪涌保护和隔离保护功能,是恶劣环境下长距离通讯应用的理想选择...
  • pci 总线及其应用

    2018-04-06 18:20:24
    pci总线及其应用,refers to termination requested before any data is transferred because the target is busy and temporarily unable to process the transaction. The target signals Retry by asserting ...
  • 在pcb layout中我们可以从下面的几点来分析一下PCI,PCI总线的布线有什么殊要求,如何做好PCI总线的布线,首先,PCI系统是一个同步时序的体统,而且是Common clock方式进行的。
  • 对实时传输, 传统的以太网络由于传输协议开销的不确定性, 很难满足实时网络的要求, 实时网络是一种应用于高实时性要求的专用网络通信技术, 一般采用基于高速网络的共享存储器技术实现。除了具有严格传输确定性...
  • Vxworks环境下PCI总线驱动程序的设计.pdf
  • PCI总线协议中文版

    2018-12-04 09:11:00
    很详细的PCI协议文档,中文注释,对想了解PCI以及PCIE协议的同学很有帮助
  • CPCI系统中PCI总线接口技术研究;微计算机应用;计算机论文
  •  ARINC429 总线具有设计维护方便,与航空电子系统兼容性好等优点,其作为一种重要的.已经广泛的应用于民用飞机上,空客公司的A310 飞机和波音公司的747 飞机均采用了ARINC429 总线。国外对此方向的研究比较成熟,Actel ...
  • 科瑞PCI总线系列手册rar,科瑞PCI总线系列手册

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,661
精华内容 15,864
关键字:

pci总线