Chinaunix首页 | 论坛 | 博客
  • 博客访问: 299487
  • 博文数量: 52
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 587
  • 用 户 组: 普通用户
  • 注册时间: 2017-03-09 09:24
个人简介

水滴

文章分类

全部博文(52)

文章存档

2021年(3)

2019年(8)

2018年(32)

2017年(9)

我的朋友

分类: LINUX

2021-10-15 10:16:04

linux中class_create和class_register说明

 

本文介绍linux中class_create和class_register的相关使用方法

1 class结构体介绍

    内核中定义了struct class结构体,顾名思义,一个struct class结构体类型变量对应一个类,内核同时提供了class_create(…)函数,可以用它来创建一个类,这个类存放于sysfs下面,一旦创建好了这个类,再调用device_create(…)函数来在/dev目录下创建相应的设备节点。这样,加载模块的时候,用户空间中的udev会自动响应device_create(…)函数,去/sysfs下寻找对应的类从而创建设备节点。

 

2 class相关API说明

如下表:

3 class_create()使用示例

示例一,通过class_create()、class_destroy()去注册和注销/sys/class/leds

#include
#include
#include

static struct class *leds_class
static int __init leds_init(void)
{
    // class_create动态创建设备的逻辑类,并完成部分字段的初始化,然后将其添加到内核中。创建的逻辑类位于/sys/class/。
    // 参数:
    //        owner, 拥有者。一般赋值为THIS_MODULE。
    //        name, 创建的逻辑类的名称。
    leds_class = class_create(THIS_MODULE, "leds");
    return 0;
}


static void __exit leds_exit(void)
{
     class_destroy(leds_class);
}


module_init(leds_init);
module_exit(leds_exit);
MODULE_LICENSE("GPL");

4 class_register()使用示例

示例二,通过class_register()、class_unregister()去注册和注销/sys/class/leds

代码如下:

#include
#include
#include
#include


#define CLASS_NAME "leds"
struct class *leds_class;


static void class_create_release (struct class *cls)
{
    printk("%s\n", __func__ );
    kfree(cls);
}


static int __init class_create_destroy_init(void)
{
    printk("%s\n", __func__);


    int ret;


    // 申请class结构体内存
    leds_class= kzalloc(sizeof(*leds_class), GFP_KERNEL);
    if (leds_class== NULL)
    {
        printk("create leds_class failed!\n");
        return -1;
    }
    printk("create leds_class success\n");


    leds_class->name = CLASS_NAME;
    leds_class->owner = THIS_MODULE;
    // 注销时class时的回调函数,在此回调函数中释放之前所分配的class结构体内存
    leds_classs->class_release = class_create_release;


    // 将class注册到内核中,同时会在/sys/class/下创建class对应的节点
    int retval = class_register(leds_class);
    if (ret)
    {
        printk("class_register failed!\n");
        kfree(mem_class);
        return -1;
    }
    printk("class_register success\n");




    return 0;
}


static void __exit class_create_destroy_exit(void)
{
    printk("%s\n", __func__);


    if (leds_class != NULL)
    {
        class_unregister(leds_class);
        leds_class = NULL;
    }
}


module_init(class_create_destroy_init);
module_exit(class_create_destroy_exit);


MODULE_LICENSE("GPL");

阅读(2057) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~