杂项设备
杂项设备是一种字符设备,设备号是固定的,为10
杂项设备驱动代码
/********filename : test.c********************************/
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/miscdevice.h>
#include <linux/init.h>
#define MISC_NAME "miscdriver_test"
/**********************************************************/
static int misc_open(struct inode *inode, struct file *file)
{
printk("misc open\n");
return 0;
}
/**********************************************************/
static const struct file_operations misc_fops =
{
.owner = THIS_MODULE,
.open = misc_open,
};
/**********************************************************/
static struct miscdevice misc_dev =
{
.minor = MISC_DYNAMIC_MINOR,//这是次设备号,如果为255,会自动分配一个次设备号.MISC_DYNAMIC_MINOR就是255
.name = MISC_NAME,//设备的名字,加载成功会在/dev/下创建一个以MISC_NAME为名字的设备
.fops = &misc_fops,//文件操作指针,供上层调用
};
/**********************************************************/
static int __init misc_init(void)
{
int ret;
ret = misc_register(&misc_dev);
if (ret)
{
printk("misc_register error\n");
return ret;
}
return 0;
}
static void __exit misc_exit(void)
{
misc_deregister(&misc_dev);
}
/**********************************************************/
module_init(misc_init);
module_exit(misc_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("XXX");
Makefile
ifneq ($(KERNELRELEASE),)
obj-m:=test.o
else
KDIR := /lib/modules/$(shell uname -r)/build
PWD:=$(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.ko *.o *.symvers *.cmd *.cmd.o
endif
obj-m := ${OBJ}.o #OBJ 是模块名,不能与目标文件名相同.
${OBJ}-objs := file1.o file2.o # 目标文件名
KDIR := /lib/modules/$(shell uname -r)/build
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean
关于驱动的文件
make之后,会创建一个test.ko
isnmod test.ko之后
1.会在/dev目录下创建一个miscdriver_test文件
hunda@hunda-Veriton-X275 ~/sdk_root/300/mpp/extdrv/nvp6124b $ ll /dev/miscdriver_test
crw------- 1 root root 10, 55 4月 13 10:32 /dev/miscdriver_test
2.会在/proc/misc中添加一条记录
hunda@hunda-Veriton-X275 ~/sdk_root/300/mpp/extdrv/nvp6124b $ cat /proc/misc
55 miscdriver_test
3.会在/proc/modules中添加一条记录
hunda@hunda-Veriton-X275 /proc $ cat modules
test 16384 0 - Live 0x0000000000000000 (OE)
4.在/proc/devices中会有这个记录(如果之前有杂项设备,10 misc这一行是存在的)
hunda@hunda-Veriton-X275 /proc $ cat devices
Character devices:
1 mem
4 /dev/vc/0
4 tty
4 ttyS
5 /dev/tty
5 /dev/console
5 /dev/ptmx
5 ttyprintk
6 lp
7 vcs
10 misc
代码分析
drivers/char/misc.c中misc_register中
dev = MKDEV(MISC_MAJOR, misc->minor);//MISC_MAJOR === 10
然后调用了device_create,申请设备号,注册设备结构体,注册设备,创建设备,创建设备节点
##参考文档