Linux字符驅動(二)

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章