PCI驱动程序
1.使用struct pci_driver结构来描述
成员
id_table //驱动支持的设备列表
(*probe) //函数指针
(*remove)//函数指针
2.PCI驱动注册
pci_register_driver(struct pci_driver *drv)
3.在PCI驱动使用PCI设备的任何资源(I/O区或者中断)之前,驱动必须调用如下函数使能设备
pci_enable_device(struct pci_dev *dev)
4.获取基地址
一个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)
返回指定区域的末地址。
5.中断
中断号存放于配置寄存器PCI_INTERRUPT_LINE
中 , 驱动不必去检查它, 因为从 PCI_INTERRUPT_LINE
中找到的值保证是正确的。 如果设备不支持中断, 寄存
器 PCI_INTERRUPT_PIN 中的值是0, 否则它是非零的
值。 但因为驱动开发者通常知道设备是否是支持终端,
所以常常不需要访问 PCI_INTERRUPT_PIN。
1.使用struct pci_driver结构来描述
成员
id_table //驱动支持的设备列表
(*probe) //函数指针
(*remove)//函数指针
2.PCI驱动注册
pci_register_driver(struct pci_driver *drv)
3.在PCI驱动使用PCI设备的任何资源(I/O区或者中断)之前,驱动必须调用如下函数使能设备
pci_enable_device(struct pci_dev *dev)
4.获取基地址
一个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)
返回指定区域的末地址。
5.中断
中断号存放于配置寄存器PCI_INTERRUPT_LINE
中 , 驱动不必去检查它, 因为从 PCI_INTERRUPT_LINE
中找到的值保证是正确的。 如果设备不支持中断, 寄存
器 PCI_INTERRUPT_PIN 中的值是0, 否则它是非零的
值。 但因为驱动开发者通常知道设备是否是支持终端,
所以常常不需要访问 PCI_INTERRUPT_PIN。

本文介绍了PCI驱动程序的基础概念,包括如何使用struct pci_driver结构来描述驱动,并详细解释了注册过程及关键函数pci_register_driver的使用。此外,还阐述了如何通过特定函数启用设备并获取I/O基地址以及处理中断。
567

被折叠的 条评论
为什么被折叠?



