@misc是特殊的字符设备(让一些特殊的字符设备驱动的编写变得更简单)
1) miscdevice结构体来描述一个misc设备
2) MISC_MAJOR == 10 (主设备号固定), 次设备号不同。
3) 双向链表list_head 来管理设备
4) const char* name是/dev中设备文件的名称
@misc子系统其他特点:
1) misc子系统能自动生成设备节点。
@实现misc子系统驱动主要流程:
1) 定义
@struct miscdevice misc;
2) 初始化(@结构体参考头文件:include/linux/miscdevice.h)
misc.minor = MISC_DYNAMIC_MINOR; //255,让系统动态分配次设备号
misc.name = "misc_name";
struct file_operations fops = {
.owner = THIS_MODULE,
};
misc.fops = &fops;
3) 注册
misc_register
4) 注销
misc_deregister
############
@杂项设备的次设备号的取值一般为255,让系统自动分配,其他值可能不能使用,或者会出错。
示例代码如下:
###########
#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
########
注意:楼主使用的开发环境是ubuntu14.2,编译链是gcc4.6.4