27 miscdevice裝置驅動應用及實現原理

2021-08-02 10:54:35 字數 2873 閱讀 7896

miscdevice是字元裝置驅動的簡化版本,方便實現乙個簡單的字元裝置驅動.

//只適用於沒有同型別的裝置驅動. 也就是乙個驅動只對應乙個硬體.

#include 

struct miscdevice ;

extern

int misc_register(struct miscdevice * misc); //註冊miscdevice物件

extern

int misc_deregister(struct miscdevice *misc);//反註冊

測試**, test.c:

#include 

#include

#include

#include

ssize_t myread(struct file *fl, char __user *buf, size_t len, loff_t *off)

struct file_operations fops = ;

struct miscdevice mymdev = ;

static

int __init test_init(void)

static

void __exit test_exit(void)

module_init(test_init);

module_exit(test_exit);

module_license("gpl");

//編譯載入驅動後,裝置檔案會自動建立.

// miscdevice裝置驅動實現起來比較簡單,但無法實現乙個裝置驅動支援多個同類的裝置.因miscdevice只能指定乙個次裝置號, 也就乙個裝置號。同類的裝置是由不同的次裝置號區分開的。所以miscdevice只適用於只有乙個裝置的裝置驅動,例如: rtc, 看門狗.

// miscdevice的工作原理.

#include 

#include

#include

#define myma 4095

ssize_t myread2(struct file *fl, char __user *buf, size_t len, loff_t *off)

struct file_operations fops2 = ;

int myopen(struct inod *ind, struct file *fl)

ssize_t myread(struct file *fl, char __user *buf, size_t len, loff_t *off)

struct file_operations fops = ;

static

int __init test_init(void)

static

void __exit test_exit(void)

miscdevice裝置驅動的實現原理:

在核心原始碼drivers/char/misc.c檔案裡:

static int __init misc_init(void)

subsys_initcall(misc_init); //會在核心子系統初始化自動呼叫misc_init函式.

///

當我們實現miscdevice裝置驅動時,初始化乙個miscdevice物件, 呼叫misc_register(物件的位址)註冊.

misc_list是在misc.c檔案裡的乙個全域性核心煉表頭, 用於通過miscdevice物件的list成員,存放所有的miscdevice物件.

int misc_register(struct miscdevice * misc)

}if (misc->minor == misc_dynamic_minor)

//建立裝置檔案

dev = mkdev(misc_major, misc->minor);

misc->this_device = device_create(misc_class, misc->

parent, dev,

misc, "%s", misc->name);

list_add(&misc->

list, &misc_list); //通過list成員,把miscdevice物件加入misc_list鍊錶.

//也可以在misc_list煉表裡根據次裝置號找到相應的miscdevice物件

out:

mutex_unlock(&misc_mtx);

return err;

}

static const struct file_operations misc_fops = ;  

//當主裝置號為10,次裝置號(0~255)的所有裝置檔案開啟操作時,會呼叫misc_fops物件裡的open函式.

static int misc_open(struct inode * inode, struct file * file)

}err =

0; old_fops = file->f_op;

file->f_op = new_fops; //把file物件的f_op成員指向我們的file_operations物件的位址, 以後我們的file_operations裡實現的函式就會得到呼叫.

//如果我們實現的file_operations物件裡有open函式,則呼叫

if (file->f_op->open)

}fops_put(old_fops);

fail:

mutex_unlock(&misc_mtx);

return err;

}

雜項裝置(misc device)

雜項裝置也是在嵌入式系統中用得比較多的一種裝置驅動。在 linux 核心的include linux目錄下有miscdevice.h檔案,要把自己定義的misc device從裝置定義在這裡。其實是因為這些字元裝置不符合預先確定的字元裝置範疇,所有這些裝置採用主編號10 一起歸於misc devic...

字元雜項裝置(miscdevice)

misc雜項裝置是主裝置號為10的驅動裝置 在linux核心原始碼miscdevice.h裡雜項裝置描述結構體定義 struct miscdevice extern int misc register struct miscdevice misc extern int misc deregister...

字元雜項裝置(miscdevice)

misc雜項裝置是主裝置號為10的驅動裝置 在linux核心原始碼miscdevice.h裡雜項裝置描述結構體定義 struct miscdevice extern int misc register struct miscdevice misc extern int misc deregister...