字符设备驱动基础上-作业

1.字符设备驱动之申请设备号实验

示例代码

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>

unsigned int major_id = 502;
const char major_name[] = "test";
const struct file_operations major_fops = {
	};

static int __init my_chrdrv_init(void)
{
	//一般都是申请资源
	//申请设备号
	int ret = register_chrdev(major_id, major_name, &major_fops);
	if (ret == 0){
		printk("register ok\n");
		}
	else{
		printk("register failed");
		return -EFAULT;
	}
	return 0;
}

static void __init my_chrdrv_exit(void)
{
	//一般都是释放资源
	//释放设备号资源
	unregister_chrdev(major_id, major_name);	
}

MODULE_LICENSE("GPL");

module_init(my_chrdrv_init);
module_exit(my_chrdrv_exit);

效果展示:

[root@farsight ]# cat /proc/devices
Character devices:
  1 mem
  2 pty
  3 ttyp
  4 /dev/vc/0
  4 tty
...
253 tpm
254 gpiochip
[root@farsight ]# insmod chr_drv.ko
[  117.470884] chr_drv: loading out-of-tree module taints kernel.
[  117.476144] register ok
[root@farsight ]# cat /proc/devices
Character devices:
  1 mem
  2 pty
  3 ttyp
  4 /dev/vc/0
  4 tty
...
253 tpm
254 gpiochip
502 test
[root@farsight ]# rmmod chr_drv.ko
[root@farsight ]# cat proc/devices
Character devices:
  1 mem
  2 pty
  3 ttyp
  4 /dev/vc/0
  4 tty
  4 ttyS
···
252 rtc
253 tpm
254 gpiochip

2.字符设备驱动之创建设备节点实验

3.创建设备节点:

1,手动创建--缺点/dev/目录中文件都是在内存中,断电后/dev/文件就会消失

    mknod /dev/设备名  类型  主设备号 次设备号
    比如:
        mknod  /dev/mychr0  c  502 0


    [root@farsight ]# mknod /dev/mychr0 c 502 0
    [root@farsight ]# ls /dev/mychr0 -l
    crw-r--r--    1 0        0         502,   0 Jan  1 00:01 /dev/mychr0

2,自动创建(通过udev/mdev机制)

    struct class *class_create(owner, name)//创建一个类
        参数1: THIS_MODULE
        参数2: 字符串名字,自定义
        返回一个class指针

    //创建一个设备文件
    struct device *device_create(struct class * class, struct device * parent, dev_t devt, 
                        void * drvdata, const char * fmt,...)
    参数1: class结构体,class_create调用之后到返回值
    参数2:表示父亲,一般直接填NULL
    参数3: 设备号类型 dev_t
            dev_t devt
                #define MAJOR(dev)	((unsigned int) ((dev) >> MINORBITS))
                #define MINOR(dev)	((unsigned int) ((dev) & MINORMASK))
                #define MKDEV(ma,mi)	(((ma) << MINORBITS) | (mi))
    参数4:私有数据,一般直接填NULL
    参数5和6:表示可变参数,字符串,表示设备节点名字
销毁动作:
        void device_destroy(devcls,  MKDEV(dev_major, 0));
        参数1: class结构体,class_create调用之后到返回值
        参数2: 设备号类型 dev_t

        void class_destroy(devcls);
        参数1: class结构体,class_create调用之后到返回值

效果展示

    [root@farsight ]# insmod chr_drv.ko [   33.757337] VMEM_VDD_2.8V: disabling
    [   34.262594] chr_drv: loading out-of-tree module taints kernel.
    [   34.268058] register ok
    [root@farsight ]# rmmod chr_drv.ko
    [root@farsight ]#