杂项设备
杂项设备是一种字符设备,设备号是固定的,为10
杂项设备驱动代码
#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
,
.name
= 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
);
然后调用了device_create
,申请设备号
,注册设备结构体
,注册设备
,创建设备
,创建设备节点
##参考文档
misc_register、 register_chrdev 的区别总结
转载请注明原文地址: https://ju.6miu.com/read-666698.html