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函式由核心實...