Linux字元裝置驅動的註冊

2021-07-15 06:23:07 字數 1607 閱讀 5404

很多學習linux程式設計的新人都會被字元裝置註冊搞糊塗了,我剛開始也一樣糊里糊塗的,看到網上例程有各種版本,就是呼叫module_init時傳遞的實參,先記為***_init()。大家可能還會看到雜項裝置驅動misc_register、平台裝置驅動platform_device_register

。但是作為linux程式設計的初級者,建議先不著急去學習複雜的註冊方式。現在我先貼出乙份比較標準的裝置註冊程式

1.定義全域性變數

#define device_name "tounie-fasync"

int major = 0;//定義主裝置號

static struct class * fasync_cls;//定義乙個類指標

struct cdev fasync_cdev;//定義乙個裝置結構體

裝置註冊函式

static int ***_init(void)

if(result)//註冊裝置號失敗,如果註冊裝置號成功result為0

/* 初始化cdev */

cdev_init(&fasync_cdev, &fasync_fops);//將裝置結構體與字元裝置操作函式關聯,實際上就是將fasync_fops賦給fasync_cdev的成員

/* 註冊cdev */

err = cdev_add(&fasync_cdev, fasyncn, 1);//向核心新增乙個字元裝置結構體

if(err)//向核心新增字元裝置結構體失敗

printk("adding cdev successed!\n");

/* 以下程式可以不要,如果不要需要在我們載入模組之後手動建立裝置節點,所以最好將這些工作全部在驅動程式中實現 */

/* 自動創建設別節點 */

/* 建立裝置類 */

fasync_cls = class_create(this_module, device_name);

if(is_err(fasync_cls))

/* 建立裝置節點 */

device_create(fasync_cls, null, fasyncn, null, device_name);

printk(device_name" initialized!\n");

return 0; }

/* 字元裝置驅動註冊程式到此完畢 */

你們可能會發現有些論壇貼出的程式沒那麼麻煩,人家一般就三個步驟:

1.register_chrdev(led_major, device_name, &tounie_leds_fops);//註冊字元裝置

2.led_class = class_create(this_module,device_name);//註冊字元裝置類

3.device_create(led_class,null,mkdev(led_major, 0),null,device_name);//建立裝置類

以上方法也可以實現字元裝置驅動的註冊,register_chrdev函式是2.6的核心以前的註冊方法,雖然現在一些版本還相容這些方法,但是在將來這些方法即將被淘汰,所以我們還是學習新核心的註冊方法比較好。

2.6版本以前的register_chrdev相當於register_chrdev_region、cdev_init和cdev_add三個函式的功能

Linux 驅動之字元裝置註冊

目的 給空模組新增驅動殼子 核心工作量 file operations及其元素填充 註冊驅動。腦海裡先有框架,知道自己要幹嘛 細節 不需要乙個字乙個字敲,可以到核心中去尋找參考 複製過來改 寫下的所有 必須心裡清楚明白,不能似懂非懂。先定義file operations結構體變數 自定義乙個file...

Linux字元裝置驅動程式的註冊

字元設各是 linux 中最簡單的裝置。在linux中,字元設各是用乙個叫做字元裝置結構的資料結構char device struct來描述的。為了管理上的方便,系統維護了乙個陣列chrdevslj,該陣列的每一項都代表乙個字元沒各。在檔案linux fs char dev.c中定義的char de...

02 註冊字元裝置驅動

從核心中最簡單的驅動程式入手,描述linux驅動開發,主要文章目錄如下 持續更新中 01 第乙個核心模組程式 02 註冊字元裝置驅動 03 open close 函式的應用 04 read write 函式的應用 05 ioctl 的應用 06 ioctl led燈硬體分析 07 ioctl 控制l...