Linux裝置驅動 新增裝置節點

2021-07-24 03:57:32 字數 3221 閱讀 8545

1 環境描述

host:ubuntu14.04(64bit)

target:smdk2410

kernel:linux-2.6.39.4

2 前言

我們在剛開始寫linux裝置驅動程式的時候, 很多時候都是利用mknod命令手動建立裝置節點,實際上linux核心為我們提供了一組函式,可以用來在模組載入的時候自動在/dev目錄下建立相應裝置節點,並在解除安裝模組時刪除該節點,當然前提條件是使用者空間移植了udev[2]。從linux 核心2.6的某個版本之後,devfs不復存在,udev成為devfs的替代。與devfs不同的是,udev是使用者空間的[2]。

核心中定義struct class結構體,該結構體的乙個變數對應乙個。核心同時提供了class_create(),可以用它來建立乙個類,這個類存放於sysfs下面。一旦建立好了這個類,再呼叫device_create()/dev目錄下建立相應的裝置節點。這樣,載入模組的時候,使用者空間中的udev會自動響應device_create()函式,去/sysfs下尋找對應的類從而建立裝置節點[1]。

在驅動用加入對udev的支援主要做的就是:在驅動初始化的**裡呼叫class_create()為該裝置建立乙個struct class,再為每個裝置呼叫device_create()建立對應的裝置[1],大致用法如下[2]:

struct class *myclass = class_create(this_module, 「my_device_driver」);

device_create(myclass, null, mkdev(major_num, 0), null, 「my_device」);

這樣的module被載入時,udev daemon就會自動在/dev下建立my_device裝置檔案[2]。 

: 在2.6較早的核心中device_create()的曾用名為class_device_create()[1]。

3 framebuffer裝置節點

建立framebuffer裝置節點的主要流程是,先定義乙個struct class指標變數fb_class,然後在fbmem_init()中呼叫class_create()建立類並且賦值給fb_class,然後在do_register_framebuffer()中呼叫device_create()根據上述fb_class建立裝置節點。

(1)fb_class

struct class *fb_class;

export_symbol(fb_class);

/* 原始檔:drivers/video/fbmem.c */

(2)class_create()

static int __init fbmem_init(void)

return 0;

}/* 原始檔:drivers/video/fbmem.c */

(3)device_create()

do_register_framebuffer()函式中,就呼叫device_create()建立fbn裝置節點(n=0~31),如下面函式第25行所示:

static int do_register_framebuffer(struct fb_info *fb_info)

else

fb_init_device(fb_info);

if (fb_info->pixmap.addr == null)

} fb_info->pixmap.offset = 0;

if (!fb_info->pixmap.blit_x)

fb_info->pixmap.blit_x = ~(u32)0;

if (!fb_info->pixmap.blit_y)

fb_info->pixmap.blit_y = ~(u32)0;

if (!fb_info->modelist.prev || !fb_info->modelist.next)

init_list_head(&fb_info->modelist);

fb_var_to_videomode(&mode, &fb_info->var);

fb_add_videomode(&mode, &fb_info->modelist);

registered_fb[i] = fb_info;

event.info = fb_info;

if (!lock_fb_info(fb_info))

return -enodev;

fb_notifier_call_chain(fb_event_fb_registered, &event);

unlock_fb_info(fb_info);

return 0;

}/* 原始檔:drivers/video/fbmem.c */

參考資料

[1]linux自動建立裝置節點 

[2]class_create(),device_create自動建立裝置檔案結點

linux驅動自動新增裝置節點

大概思路 先在驅動初始化的 裡呼叫class create 為該裝置建立乙個class 再為每個裝置呼叫device create 在2.6較早的核心中用class device create 建立對應的裝置 驅動退出函式時先刪除 裝置,再刪除類 下面以乙個簡單字元裝置驅動來展示如何使用這幾個函式 ...

ubuntu乙太網裝置節點 新增裝置節點

mknod 建立塊裝置或者字元裝置檔案。此命令的適用範圍 redhat rhel ubuntu centos suse opensuse fedora。1 語法 mknod 選項 裝置名 裝置型別 主裝置號 次裝置號 建立字元裝置檔案 root localhost mknod dev ttywj c...

新增裝置輪詢操作

private ifacilityservice facilitysrva servicelocator.get private ifacilityservice facilitysrvb servicelocator.get 需要生成兩個 類實體,不然同乙個 類實體的,兩次呼叫會是按序列化方式進行...