Linux 字元裝置驅動cdev

2021-09-13 12:15:18 字數 1829 閱讀 3210

關鍵字:字元裝置檔案建立——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核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...