| 類型 | 特點 | 典型設備 |
|---|---|---|
| 字符設備 (c) | 字節流、無緩衝、順序訪問、不支持隨機讀寫 | 串口、鍵鼠、GPU、大多數 PCI 卡 |
| 塊設備 (b) | 塊為單位、緩衝區緩存、支持隨機訪問、請求隊列 | 磁盤、SSD、RAID 卡 |
open/release/read/write/ioctl/mmap/llseek/poll 等回調。
static const struct pci_device_id my_pci_ids[] = {
{ PCI_DEVICE(0x10EC, 0x8168) }, // Realtek RTL8111
{ 0, }
};
MODULE_DEVICE_TABLE(pci, my_pci_ids);
static int my_probe(struct pci_dev *dev, const struct pci_device_id *id) {
// 1. 啟用設備 pci_enable_device(dev)
// 2. 請求 BAR 區域 pci_request_regions(dev, "my_drv")
// 3. 映射 I/O 內存 pci_ioremap_bar(dev, 0)
// 4. 分配設置中斷 pci_alloc_irq_vectors / request_irq
// 5. 初始化字符設備 cdev_add / device_create
// 6. 保存私有數據 pci_set_drvdata(dev, priv)
return 0;
}
static void my_remove(struct pci_dev *dev) {
// 逆序釋放:釋放中斷、解除映射、釋放 BAR、禁用設備、銷毀 cdev/device
}
static struct pci_driver my_pci_driver = {
.name = "my_pci_drv",
.id_table = my_pci_ids,
.probe = my_probe,
.remove = my_remove,
};
module_pci_driver(my_pci_driver); // 內建 init/exit
| 功能 | API | 說明 |
|---|---|---|
| 啟用設備 | pci_enable_device(dev) | 分配資源、設置命令寄存器 (Memory/IO/BusMaster) |
| 請求 BAR | pci_request_regions(dev, name) | 標記 I/O 內存區域佔用,防衝突 |
| 映射 BAR | pci_ioremap_bar(dev, bar_idx) | 返回內核虛擬地址,自動處理 64位 BAR |
| MSI-X 中斷 | pci_alloc_irq_vectors(dev, 1, n, PCI_IRQ_MSIX) | 分配向量,配合 request_irq 使用 |
| DMA 映射 | dma_alloc_coherent / dma_map_single | 獲取總線地址,處理一致性/流式映射 |
| 電源管理 | pci_save_state / pci_restore_state | 掛起/恢復時保存恢復配置空間 |
lspci -vvv -s <域:總線:設備.功能> 查看配置空間、BAR、驅動綁定。cat /proc/bus/pci/devices (舊) 或 cat /sys/bus/pci/devices/.../config (二進制配置空間)。dmesg -T 追蹤驅動 probe 打印。echo 1 > /sys/bus/pci/devices/.../remove 觸發熱拔除測試。