misc裝置驅動模型及例項解析

2021-06-22 13:22:24 字數 3869 閱讀 8377

1、misc裝置驅動模型

本節我們來看一下misc裝置驅動模型的有關內容,首先是看看它的裝置結構體,定義在include/linux/miscdevice.h中:

[cpp]view plain

copy

struct miscdevice  ;  

結構體中的部分成員我們是一目了然的,主要是來看看有疑惑的幾點:

1、為什麼只有次裝置號呢?乙個裝置不是有主、次裝置號嗎?

其實,我想大家應該能夠想到了,此時沒有明確指定,那就說明應該是使用預設值。

2、主裝置號的預設值是多少呢?難道所有註冊為misc的裝置都有相同的主裝置號?怎麼區分各個裝置呢?

這個主裝置號是10.的確,所有註冊為misc的裝置都有相同的主裝置號:10.在使用過程中我們主要是通過次裝置號來區分各個裝置。這一點不難理解,核心將所有註冊為misc的裝置都歸為一大類。

3、結構體中的list_head結構體型別的list成員的作用是什麼呢?

核心自己會維護乙個misc_list鍊錶,所有註冊為misc的裝置都必須掛在這個鍊錶上,這個list就是該鍊錶的煉表頭。

4、結構體中的兩個device結構體型別指標作用是什麼呢?

作用就是建立裝置檔案,稍候就可以看到了!

5、我們如何定義自己的misc型別的裝置呢?

可如下定義:

[cpp]view plain

copy

static

struct miscdevice misc = ;  

其中的裝置檔案操作結構體和字元裝置類似,這裡就不再細講。

6、定義了自己的misc裝置,那麼我們如何向核心註冊/登出裝置呢?

使用如下兩個函式:

[cpp]view plain

copy

int misc_register(struct miscdevice * misc);    //在載入模組時會自動建立裝置檔案,是主裝置號為10的字元裝置

int misc_deregister(struct miscdevice *misc);   //在解除安裝模組時會自動刪除裝置檔案

好了,至此,整個裝置驅動的流程就完了,接下來深入了解一下misc裝置模型的工作原理。

首先看看misc初始化函式:

[cpp]view plain

copy

static

int __init misc_init(void)  

/*向核心註冊misc子系統*/

subsys_initcall(misc_init);   

接下來看看misc裝置驅動的註冊與登出函式:

註冊函式:

[cpp]view plain

copy

int misc_register(struct miscdevice * misc)  

}  /*動態分配裝置的次裝置號*/

if (misc->minor == misc_dynamic_minor)   

misc->minor = dynamic_minors - i - 1;  

set_bit(i, misc_minors);  

}  /*使用固定的主裝置號,動態分配的次裝置號構造裝置號*/

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

/*建立裝置檔案,這裡就是使用miscdevice結構體中兩個device型別指標的地方,

當然,這是和linux裝置驅動模型相關的*/

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

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

if (is_err(misc->this_device))   

/** add it to the front, so that later devices can "override"

* earlier defaults

*//*到這一步也就註冊成功了,將新註冊的misc裝置加入到核心維護的misc_list鍊錶中*/

list_add(&misc->list, &misc_list);  

out:  

mutex_unlock(&misc_mtx);  

return err;  

}  

登出函式:

[cpp]view plain

copy

int misc_deregister(struct miscdevice *misc)    

到這裡,差不多misc裝置驅動模型就差不多了。

2、misc裝置驅動例項

這裡貼乙個簡單的misc裝置驅動程式,方便大家對照上面的理論部分進行分析,此驅動程式是友善之臂6410開發板的led驅動程式,可以看看:

[cpp]view plain

copy

#include 

#include 

#include 

//#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#define device_name "leds"

static

long sbc2440_leds_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  

tmp = readl(s3c64xx_gpkdat);  

tmp &= ~(1 << (4 + arg));  

tmp |= ( (!cmd) << (4 + arg) );  

writel(tmp, s3c64xx_gpkdat);  

return 0;  

default:  

return -einval;  

}  }  

static

struct file_operations dev_fops = ;  

static

struct miscdevice misc = ;  

static

int __init dev_init(void)  

ret = misc_register(&misc);  

printk (device_name"\tinitialized\n");  

return ret;  

}  static

void __exit dev_exit(void)  

module_init(dev_init);  

module_exit(dev_exit);  

module_license("gpl");  

module_author("friendlyarm inc."); 

misc裝置驅動模型及例項解析

1 misc裝置驅動模型 本節我們來看一下misc裝置驅動模型的有關內容,首先是看看它的裝置結構體,定義在include linux miscdevice.h中 cpp view plain copy struct miscdevice 結構體中的部分成員我們是一目了然的,主要是來看看有疑惑的幾點 ...

LED驅動 misc裝置驅動例項

作為misc裝置驅動的乙個例項,我選擇最簡單的led的驅動。下面簡要記錄下led驅動的編寫和實驗過程。1 建立資料夾led 2 在led資料夾下編寫led驅動程式leds.c include include include include include include include includ...

MISC裝置驅動分析及實現

misc的意思是各式各樣。misc裝置屬於字元裝置,是因為字元裝置多種多樣,很多無法歸類的字元裝置都歸在misc裝置中 misc裝置共享了同乙個主裝置號 misc major 10 根據不同的次裝置號區分不同的裝置 misc由於共享了同一主裝置號,所以它是自動生成裝置節點的 它的open函式由核心實...