#include <linux/pci.h> #include <linux/module.h> static const struct pci_device_id my_ids[] = PCI_DEVICE(0x1234, 0x5678) , 0, ; MODULE_DEVICE_TABLE(pci, my_ids);
// 1. Enable the PCI device pci_enable_device(pdev); // 2. Request ownership of memory regions (BARs) pci_request_regions(pdev, "my_driver"); pci device driver
| Offset | Field | Purpose | |--------|-------|---------| | 0x00 | Vendor ID | Manufacturer (e.g., 0x10DE for NVIDIA) | | 0x02 | Device ID | Specific model (e.g., 0x1B80 for GTX 1080) | | 0x08 | Class Code | Device category (e.g., 0x030000 for VGA) | | 0x10 | BARs (Base Address Registers) | Memory/I/O addresses assigned by firmware | | 0x3C | Interrupt Line | Which IRQ the device is wired to | The driver matches the Vendor/Device ID against its internal table. A mismatch means the driver should ignore the device. 3. Key Responsibilities of a PCI Driver A. Probing – The Handshake The kernel calls the driver’s probe() function when a matching device is found. Inside probe() , the driver must: #include <linux/pci