@misc是特殊的字符設備(讓一些特殊的字符設備驅(qū)動的編寫變得更簡單)
1) miscdevice結構體來描述一個misc設備
2) MISC_MAJOR == 10 (主設備號固定), 次設備號不同。
3) 雙向鏈表list_head 來管理設備
4) const char* name是/dev中設備文件的名稱
@misc子系統(tǒng)其他特點:
1) misc子系統(tǒng)能自動生成設備節(jié)點。
@實現(xiàn)misc子系統(tǒng)驅(qū)動主要流程:
1) 定義
@struct miscdevice misc;
2) 初始化(@結構體參考頭文件:include/linux/miscdevice.h)
misc.minor = MISC_DYNAMIC_MINOR; //255,讓系統(tǒng)動態(tài)分配次設備號
misc.name = "misc_name";
struct file_operations fops = {
.owner = THIS_MODULE,
};
misc.fops = &fops;
3) 注冊
misc_register
4) 注銷
misc_deregister
############
@雜項設備的次設備號的取值一般為255,讓系統(tǒng)自動分配,其他值可能不能使用,或者會出錯。
示例代碼如下:
###########
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>l
#include <linux/miscdevice.h>
MODULE_LICENSE("GPL");
#define DebugPrint() printk("---DebugPrint--- %s:%s--%d\n",__FILE__,__func__,__LINE__)
int misc_open (struct inode * ip, struct file * fp)
{
DebugPrint();
return 0;
}
int misc_close (struct inode * ip, struct file * fp)
{
DebugPrint();
return 0;
}
ssize_t misc_read (struct file * fp, char __user * buf, size_t n, loff_t * f)
{
DebugPrint();
return 0;
}
ssize_t misc_write (struct file *fp, const char __user *buf, size_t n, loff_t * f)
{
DebugPrint();
return 0;
}
struct file_operations misc_demo_fops={
.owner = THIS_MODULE,
.open =misc_open,
.release= misc_close,
.read = misc_read,
.write= misc_write,
};
struct miscdevice misc_demo={
.minor = MISC_DYNAMIC_MINOR,
.name ="misc_demo",
.fops = &misc_demo_fops,
};
static int __init misc_demo_init(void)
{
int ret=0;
DebugPrint();
ret = misc_register(&misc_demo);
if(ret != 0)
{
DebugPrint();
printk("misc_register error\n");
return ret;
}
return 0;
}
static void __exit misc_demo_exit(void)
{
DebugPrint();
misc_deregister(&misc_demo);
return ;
}
module_init(misc_demo_init);
module_exit(misc_demo_exit);
##############
Makefile參考:
##############
ifneq ($(KERNELRELEASE),)
obj-m:=misc_demo.o
else
KERNELDIR =/lib/modules/$(uname -r)/build/
PWD = $(pwd)
modules:
make -C $(KERNELDIR) M=$(PWD) modules
clean:
make -C $(KERNELDIR) M=$(PWD) clean
endif
########
注意:樓主使用的開發(fā)環(huán)境是ubuntu14.2,編譯鏈是gcc4.6.4