第十二章:PCI驱动程序

原创 2012年03月30日 14:35:10

PCIperipheral component interconnect外围设备互联。

PCI接口

时钟频率一般是25MHz或者33MHz,最新的实现达到了66MHz甚至133MHz,配备32位数据总线。

PCI寻址

每一个PCI设备由一个总线编号、一个设备编号及一个功能编号来标识。

PCI规范允许单个系统拥有高达256个总线,每个总线可以支持32个设备,每个设备最多有八种功能。每种功能都可以在硬件级由一个16位的地址来标识。

每个外设板的硬件电路对如下三种地址空间的查询进行应答:内存位置,I/O端口和配置寄存器。前两种地址空间由同一PCI总线上的所有设备共享,配置查询每次只对一个槽位寻址,因此他们不会冲突。

配置寄存器以及初始化

某些PCI寄存器始终是小头的。

用三个或者五个PCI寄存器可以标识一个设备:vendorIDdeviceIDclasssubsystem vendorID以及subsystem deviceID

struct pci_device_id结构体用来定义该驱动程序支持的不同类型的PCI设备列表。其中包括下字段:

__u32 vendor; __u32 device; __32u subvendor; __32u subdevice; __32u class; __32u class_mask;

kernel_ulong_t drive_data;

前六个字段指定设备PCI厂商和设备ID,子系统厂商和子系统设备ID以及支持的一种PCI类设备。第七个字段用来保存PCI驱动程序用于区分不同设备的信息。

可以使用下面宏来辅助struct pci_device_id结构体的初始化:

PCI_DEVICE(vendor, device);

PCI_DEVICE_CLASS(device_class, device_class_mask);

一般创建一个struct pci_device_id的一个结构体数组,该数组用来通知用户空间这个特定的驱动程序支持什么设备。

MODULE_DEVICE_TABLE

这个宏用来将pci_device_id结构体导出到用户空间,使热插拔和模块装载系统知道什么模块针对什么硬件设备。例子:

MODULE_DEVICE_TABLE(pci, i810_ids);

注册PCI驱动程序

为了正确注册到内核,所有的PCI驱动程序必须创建主要的结构体struct pci_drive结构体。该结构体中由许多回调函数以及字段,向PCI核心描述了PCI驱动程序。

const char *name;

const struct pci_device_id *id_table;

int (*probe)(struct pci_dev *dev, const struct pci_device_id *id);

void (*remove)(struct pci_dev *dev);

int (*suspend)(struct pci_dev *dev, u32 state);

int (*resume)(struct pci_dev *dev);

注册函数:

pci_register_driver(&pci_drive);

pci_module_init(struct pci_driver *drv);

移除函数:

pci_unregister_drive(&pci_drive);

激活PCI设备

pci_enable_deive(struct pci_dev *dev);

访问配置空间系列函数详见书

PCI中断详见书

PCI驱动程序(第十二章 )

1、PCI(Peripheral Component Interconnect) 外围设备互联 2、PCI接口 (1)PCI寻址:每个PCI外设由一个总线编号,一个设备编号及一个功能编号来标识(b...
  • cnxxrj
  • cnxxrj
  • 2013年11月19日 13:42
  • 972

PCI驱动程序几个GUID

1、Device_Class_GUID包含在驱动程序中,由驱动程序注册,打开该设备文件时需要用到,位于XXXDeviceInterface.h中。2、驱动对应PCI硬件的Vendor ID、Devic...
  • BuilderChen
  • BuilderChen
  • 2010年02月24日 09:58
  • 1593

《Linux Device Drivers》第十二章 PCI驱动程序——note

简介 本章给出一个高层总线架构的综述讨论重点是用于访问Peripheral Component Interconnect(PCI,外围设备互联)外设的内核函数PCI总线是内核中得到最好支持的总线本章...
  • luopingfeng
  • luopingfeng
  • 2014年10月05日 13:59
  • 390392

PCI驱动程序(国嵌笔记)

PCI驱动程序 1.使用struct pci_driver结构来描述 成员 id_table //驱动支持的设备列表 (*probe) //函数指针 (*remove)//函...
  • G1036583997
  • G1036583997
  • 2015年03月11日 09:37
  • 502

基于WDF的PCI/PCIe接口卡Windows驱动程序(3)- 驱动程序代码(头文件)

原文出处:http://www.cnblogs.com/jacklu/p/4679304.html 在WDF的PCIe驱动程序中,共有四个.h文件(Public.h  Driver.h  Dev...
  • wolfman125
  • wolfman125
  • 2016年07月11日 14:34
  • 671

基于WDF的PCI/PCIe接口卡Windows驱动程序(2)-开发者需要了解的WDF中的一些重要的概念

原文出处:http://www.cnblogs.com/jacklu/p/4646601.html 1、WinDBG是唯一的内核驱动调试利器,但是开发PCIe的WDF驱动可以采用...
  • wolfman125
  • wolfman125
  • 2016年07月11日 14:32
  • 753

pci 驱动总结

/driver/pci/probe.c /arch/powerpc/kernel/pci_64.c 在pci驱动中pci调用pci_scan_device扫描每个设备的每个功能,当发现该功...
  • martin_yin
  • martin_yin
  • 2016年10月10日 16:15
  • 345

PCI设备WINDOWS驱动程序的开发

PCI设备WINDOWS驱动程序的开发摘要:本文主要介绍了在Windows9x操作系统下开发PCI设备驱动程序的方法。关键词:PCI设备 驱动程序 PCI设备概述近几年来,随着诸如图形处理、图像处理、...
  • Augusdi
  • Augusdi
  • 2011年01月14日 09:00
  • 2928

用VS2005+Driverstudio+DDK开发第一个PCI驱动程序(详解)

我的前面一篇文章已经总结了安装VS2005+Driverstudio+DDK来搭建环境。下面再来一步一步来编写我们的第一个PCI驱动程序。 1.在安装好软件后,打开VS2005,TOOL目录下会多一个...
  • shejiannan
  • shejiannan
  • 2013年11月20日 17:41
  • 2559

Linux下PCI设备驱动程序开发 --- PCI驱动程序实现(三)

  • fengyv
  • fengyv
  • 2006年06月19日 17:43
  • 6290
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第十二章:PCI驱动程序
举报原因:
原因补充:

(最多只允许输入30个字)