分类: 嵌入式
2012-01-12 15:32:04
驱动描述
在Linux内核中,PCI 驱动使用structpci_driver 结构来描述:
struct pci_driver {
。。。。。。。。。。。。
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);
/* Device removed (NULL if not a hot-plug capable driver) */
。。。。。。。。。。。。
}
注册驱动
注册PCI 驱动, 使用如下函数:
pci_register_driver(struct pci_driver *drv)
使能设备
在PCI 驱动使用PCI 设备的任何资源(I/O 区或者中断)之前, 驱动必须调用如下函数来使能设备:
int pci_enable_device(struct pci_dev *dev)
获取基地址
一个PCI设备最多可以实现6个地址区域,大多数PCI设备在这些区域实现I/O寄存器。Linux提供了一组函数来获取这些区间的基地址:
pci_resource_start(struct pci_dev *dev, int bar)
返回指定区域的起始地址,这个区域通过参数bar 指定,范围从0-5,表示6个PCI区域中的一个。
pci_resource_end(struct pci_dev *dev, int bar)
返回指定区域的末地址。
中断
中断号存放于配置寄存器PCI_INTERRUPT_LINE中, 驱动不必去检查它, 因为从PCI_INTERRUPT_LINE中找到的值保证是正确的。如果设备不支持中断, 寄存器PCI_INTERRUPT_PIN 中的值是0,否则它是非零的值。但因为驱动开发者通常知道设备是否是支持终端,所以常常不需要访问PCI_INTERRUPT_PIN。