1. 確定主設備號??
- ??手動指定??:明確設備號時,使用
register_chrdev_region()
靜態申請(需確保未被占用)。 - ??動態分配??:通過
alloc_chrdev_region()
由內核自動分配主設備號(更靈活,推薦)。dev_t dev; alloc_chrdev_region(&dev, 0, 1, "mydevice"); // 動態分配主設備號
??2. 定義file_operations結構體??
- ??結構體作用??:關聯用戶空間系統調用與驅動函數(如
open/read/write
)。 - ??關鍵成員??:
static struct file_operations fops = {.owner = THIS_MODULE, // 模塊所有者標識.open = drv_open, // 設備打開函數.read = drv_read, // 數據讀取函數.write = drv_write, // 數據寫入函數.release = drv_release, // 設備關閉函數 };
??3. 實現驅動函數??
需實現drv_open
、drv_read
、drv_write
等函數,并處理硬件交互邏輯:
- ??示例:
open
函數??(初始化硬件或分配資源):static int drv_open(struct inode *inode, struct file *filp) {printk(KERN_INFO "Device opened\n");return 0; }
- ??數據傳輸函數??:需通過
copy_from_user()
和copy_to_user()
實現用戶空間與內核空間的數據交換。
??4. 注冊驅動到內核??
- ??入口函數??:通過
module_init()
指定驅動加載時的初始化函數:static int __init mydrv_init(void) {// 注冊字符設備,主設備號設為0表示自動分配int ret = register_chrdev(0, "mydevice", &fops);if (ret < 0) {printk(KERN_ERR "Register failed\n");return ret;}// 自動創建設備節點(后續補充)return 0; } module_init(mydrv_init);
- ??出口函數??:通過
module_exit()
指定驅動卸載時的清理函數:static void __exit mydrv_exit(void) {unregister_chrdev(major, "mydevice"); } module_exit(mydrv_exit);
??5. 自動創建設備節點??
- ??使用
class_create
和device_create
??:static struct class *dev_class; static dev_t dev;static int __init mydrv_init(void) {// 創建設備類dev_class = class_create(THIS_MODULE, "mydevice_class");// 創建設備節點(/dev/mydevice)device_create(dev_class, NULL, dev, NULL, "mydevice");return 0; }static void __exit mydrv_exit(void) {device_destroy(dev_class, dev); // 銷毀節點class_destroy(dev_class); // 銷毀類 }
- ??作用??:用戶空間可通過
/dev/mydevice
直接訪問設備,無需手動mknod
。
- ??作用??:用戶空間可通過
??6. 其他完善步驟??
- ??錯誤處理??:檢查
register_chrdev
、class_create
等函數的返回值,避免資源泄漏。 - ??資源釋放??:在出口函數中釋放所有申請的資源(如設備號、內存)。
- ??兼容性??:確保驅動代碼與內核版本匹配,遵循內核編碼規范。
??總結流程圖??
驅動初始化(入口函數)
├─ 分配設備號(動態/靜態)
├─ 初始化file_operations結構體
├─ 注冊字符設備(register_chrdev)
├─ 創建設備類(class_create)
└─ 創建設備節點(device_create)驅動卸載(出口函數)
├─ 注銷字符設備(unregister_chrdev)
├─ 銷毀設備節點(device_destroy)
└─ 銷毀設備類(class_destroy)
通過以上步驟,可完成一個完整的Linux字符設備驅動開發流程。具體實現需結合硬件特性調整函數邏輯(如中斷處理、DMA操作)