關鍵字:字元裝置檔案建立——device_create、字元裝置cdev 與裝置號dev_t的聯絡 、sys/class 目錄下建立類目錄class_create
linux下面一切皆是檔案,這句是有**的,這個**起因,應該就是vfs 虛擬檔案系統,將soc下面的所有外設,都抽象成乙個個檔案進行管理。外設驅動,又有字元裝置驅動、塊裝置驅動。根據io 讀寫裝置是乙個位元組來讀寫,還是根據一塊block 來讀寫,區別字元裝置還是塊裝置。
那麼linux 提出了這套思想,也就順便一併提供了字元裝置驅動 相關的整套核心介面,
包括、class_create(module,class_name) /sys/class/class_name 目錄檔案建立、
裝置檔案 節點建立 device_create() device_register() device_add();
字元裝置 & 裝置號的概念,每個裝置檔案都對應著乙個裝置號,linux kernel 應該就是根據devno裝置號來對裝置檔案進行管理。可以將裝置號:裝置檔案節點 看做是乙個key:value 鍵值對的組成。
一、重要的資料結構
struct cdev
406 struct device ;
二、例項演練
以乙個簡單的led裝置字元裝置驅動為例,下面分別用device_create()、device_register()、device_add()三個函式來建立裝置節點「/dev/led」:device_add()會在/sys目錄對應裝置目錄下建立uevent屬性節點,應用層的udev則會根據uevent來建立/dev目錄下的裝置節點
------》那麼問題來,uevent屬性節點是什麼?應用層udev 又是什麼?這兩者又是怎麼產生聯絡的?
1. device_create()
static class *led_class;
static int __init led_init(void)
cdev_init(&cdev, &led_fops);
cdev.owner = this_module;
ret = cdev_add(&cdev, devno, 1);//將定義好的cdev結構體與devno裝置號進行對映
if (ret)
goto out_free_cdev;
/* 建立裝置類 在/sys/class/目錄建立led_class類*/
led_class = class_create(this_module, "led_class");
if (is_err(led_class))
/* 建立裝置節點 */
dev = device_create(led_class, null, devno, null, "led");
if (is_err(dev))
return 0;
out_del_class:
class_destroy(c78x_class);
out_unregister_cdev:
cdev_del(cdev);
out_free_cdev:
kfree(cdev);
out_unregister_devno:
unregister_chrdev_region(devno, 1);
return ret;
}
這裡還有個cdev 結構體下關鍵段struct list_head list; ---用於鏈結上struct device結構體,
如果對linux核心重要資料結構struct list_head 不明白的,可以去看下
參考blog:
Linux字元裝置驅動 cdev結構體day00
day00 摘要 linux字元裝置驅動cdev結構體 1.cdev結構體 描述乙個字元裝置 定義 struct 1 dev t定義裝置號,32位,12位主裝置號,20位次裝置號.2 使用巨集major,minor可以獲得裝置主次號 major dev t dev 主裝置號 minor dev t ...
使用靜態裝置節點的cdev字元驅動GPIO
檔案 beep.rar 大小 21kb 儘管在2.6的核心版本已經支援udev,可以很方便的使用,並且使用也很舒服。但是使用udev,在啟動過程中掃瞄 sys class目錄並生成裝置節點的時間稍微有點長,在一些系統中是無法忍受的,所以沒辦法只好放棄udev,回到靜態裝置節點的時代,以加快啟動速度。...
驅動 linux裝置驅動 字元裝置驅動開發
preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...