关闭

第十二章:PCI驱动程序

标签: moduleclasstable
260人阅读 评论(0) 收藏 举报
分类:

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中断详见书

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:13542次
    • 积分:288
    • 等级:
    • 排名:千里之外
    • 原创:15篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章存档