Linux驱动开发之静态分配字符设备、注册

一、驱动源代码

#include
#include
#include
#include
#include

static int hello_major = 248; // 主设备号
static int hello_minor = 0; // 次设备号
static int number_of_devices = 1; // 设备的数量

struct cdev cdev; // 静态定义字符设备
dev_t dev = 0;

struct file_operations hello_fops = {
.owner = THIS_MODULE
};


// 字符设备注册
static void char_reg_setup_cdev(void)
{
int error, devno = MKDEV (hello_major, hello_minor); // 主设备号、次设备号合并为设备号
cdev_init (&cdev, &hello_fops); // 初始化字符设备
cdev.owner = THIS_MODULE;
error = cdev_add (&cdev, devno, 1); // 添加字符设备到内核
if (error)
printk (KERN_ERR "Error %d adding char_reg_setup_cdev", error);
}

static __init char_driver_init(void)
{
int result;
  
dev = MKDEV (hello_major, hello_minor); // 主设备号、次设备号合并为设备号
result = register_chrdev_region (dev, number_of_devices, "hello"); // 静态注册设备号: name 体现在"/proc/devices"中
if (result<0) {
printk (KERN_ERR "char_driver_init: can't get major number %d\n", hello_major);
return result;
    }

char_reg_setup_cdev();
printk(KERN_INFO "char_driver_init\n");
return 0;

}

static __exit char_driver_exit(void)
{
dev_t devno = MKDEV (hello_major, hello_minor);// 主设备号、次设备号合并为设备号
cdev_del(&cdev); // 从内核移除字符设备,注销字符设备
unregister_chrdev_region (devno, number_of_devices);// 注销设备号

printk(KERN_INFO "char_driver_exit\n");
}

module_init(char_driver_init);
module_exit(char_driver_exit);

MODULE_LICENSE("GPL");
MODULE_VERSION("v1.0");
MODULE_AUTHOR("[email protected]");
MODULE_DESCRIPTION("Char Driver Module");
MODULE_ALIAS("char driver module");

二、Makefile

ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:                               
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:                                             
$(MAKE) -C $(KERNELDIR) M=$(PWD) clean
else
    obj-m := char_reg.o
endif


你可能感兴趣的:(Linux驱动开发)