- 1、本文档共17页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
pci总线结构介绍ppt整理
(一)pci配置寄存器 每个pci设备都有一个私有的至少256字节的地址空间,前64字节是标准 的(每个pci设备都有),后面的空间依赖设备来配置。 配置寄存器里包含了如下信息: 1.此pci设备的设备信息,如厂商id,设备id等 2.此设备工作时需要的io地址和mem地址起始地址以及长度 3.设备的irq号等 (二)配置寄存器的作用 1.linux内核启动时会从pci设备的配置寄存器里读取内存/IO起始地址 以及irq,并把这些信息赋值给struct pci_dev的相应成员; 2.pci驱动也会读写配置寄存器获得/保存设备相关的信息。 (三)配置寄存器的初始化 系统启动时,BIOS会为每个pci设备分配内存、IO空间以及irq号,并写 入相应pci设备的配置寄存器里去。 PCI配置寄存器 又叫”配置空间“ 标准pci配置寄存器 此pci设备用到了几个BAR?应该从哪个bar里读取所需的io地址或内存地 址? 这些信息是硬件相关的,需要查阅pci设备的datasheet才能得到以上信息 读取内存或io地址的函数: unsigned long pci_resource_start(struct pci_dev *dev, int bar); unsigned long pci_resource_end(struct pci_dev *dev, int bar); unsigned long pci_resource_len(struct pci_dev *dev, int bar); bar的取值为0~5 unsigned long pci_resource_flags(struct pci_dev *dev, int bar); 这个函数返回和这个资源相关联的标识. IORESOURCE_IO:io端口 IORESOURCE_MEM :内存 取得设备的io或mem 我们知道,外设都是通过读写设备上的寄存器来进行的,外设寄存器也 称为“I/O端口”。而IO端口有两种编址方式:独立编址和统一编制。 而具体采用哪一种则取决于CPU的体系结构。 如,PowerPC、m68k等采用 统一编址;而X86等则采用独立编址。 对于某一既定的系统,它要么是独立编址,也即“I/O端口”方式,外设 寄存器位于“I/O空间”; 要么是统一编制,也即“I/O内存”方式,外设寄存器位于“内存空间”。 io内存和io端口 对于Linux内核而言,它可能用于不同的CPU,所以它必须都要考虑这两种访问方式: 1.linux访问IO内存的流程是: request_mem_region() - ioremap() - ioread8()/iowrite8() - iounmap() - release_mem_region() 。 2.访问IO端口的方式: (1)Linux内核提供了如下一些访问I/O端口的内联函数(这种方法比较常用) unsigned inb(unsigned port); void outb(unsigned char byte, unsigned port); unsigned inw(unsigned port); void outw(unsigned short word, unsigned port); unsigned inl(unsigned port); void outl(unsigned longword, unsigned port); (2)linux访问io端口的新机制 ioport_map() - ioread8()/iowrite8() -ioport_unmap() linxu对io内存和io端口的访问 struct pci_dev { struct list_head global_list; struct list_head bus_list; struct pci_bus *bus; struct pci_bus *subordinate; void *sysdata; struct proc_dir_entry *procent; unsigned int devfn;//功能号 unsigned short vendor;//厂商号 unsigned short device;//设备号 unsigned short subsystem_vendor;//子厂商号 unsigned short subsystem_device;//子设备号 struct resource resource[DEVICE_CO
文档评论(0)