Linux字符驱动(二)
Linux下有个直接注册字符设备的方法,register_chrdev和unregister_chrdev:
static inline int register_chrdev(unsigned int major, const char *name,
const struct file_operations *fops)
{
return __register_chrdev(major, 0, 256, name, fops);
}
static inline void unregister_chrdev(unsigned int major, const char *name)
{
__unregister_chrdev(major, 0, 256, name);
}
从上面代码可以看出,它会申请指定主设备号major的字符设备(256个子设备)。当major为0时,则会自动分配主设备号,并通过返回值返回申请到的主设备号。
chrdev02.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
///
int major=0;
///
int chrdev02_open(struct inode *inode, struct file *filp)
{
printk("chrdev02 open.\n");
return 0;
}
struct file_operations chrdev02_ops = {
.owner = THIS_MODULE,
.open = chrdev02_open,
};
static int __init chrdev02_init(void)
{
printk("chrdev02_init.\n");
//int register_chrdev(unsigned int major, const char *name,
// const struct file_operations *fops)
// if major=0, dynamic alloc devno, and return its devno
// minor count=256
if ((major=register_chrdev(0, "chrdev02", &chrdev02_ops))<0) {
printk("register chrdev failed.\n");
return -ENOMEM;
}
printk("major=%d\n", major);
return 0;
}
static void __exit chrdev02_exit(void)
{
//void unregister_chrdev(unsigned int major, const char *name)
unregister_chrdev(major, "chrdev02");
printk("chrdev02 exit.\n");
}
module_init(chrdev02_init);
module_exit(chrdev02_exit);
MODULE_AUTHOR("Rbin.Yao");
MODULE_DESCRIPTION("A simple char device.");
MODULE_VERSION("V1.0");
MODULE_LICENSE("GPL");
Makefile:
obj-m := chrdev02.o
PWD := $(shell pwd)
KDIR := /lib/modules/$(shell uname -r)/build
all: chrdev02_test
make -C $(KDIR) M=$(PWD) modules
clean:
make -C $(KDIR) M=$(PWD) clean
chrdev02_test: chrdev02_test.c
gcc $< -o $@
chrdev02_test.c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
int main(int argc, char **argv)
{
int fd;
fd = open("/dev/chrdev02", O_RDONLY);
if (fd<0) {
perror("open /dev/chrdev02 failed.");
} else {
printf("open /dev/chrdev02 ok!\n");
close(fd);
}
return 0;
}