Linux内核API device_create

函数device_create()用于动态地创建逻辑设备,并对新的逻辑设备类进行相应的初始化,将其与此函数的第一个参数所代表的逻辑类关联起来,然后将此逻辑设备加到Linux内核系统的设备驱动程序模型中。函数能够自动地在/sys/devices/virtual目录下创建新的逻辑设备目录,在/dev目录下创建与逻辑类对应的设备文件。

device_create文件包含

#include <linux/device.h>

device_create函数定义

在内核源码中的位置:linux-3.19.3/drivers/base/core.c

函数定义格式:

struct device *device_create(struct class *cls, struct device *parent, dev_t devt, void *drvdata, const char *fmt, ...);

device_create输入参数说明

函数device_create()的第一个输入参数代表与即将创建的逻辑设备相关的逻辑类,此结构体的详细解释请读者参考极客笔记函数__class_create()分析文档的返回参数说明部分。

第二个输入参数代表即将创建的逻辑设备的父设备的指针,子设备与父设备的关系是:当父设备不可用时,子设备不可用,子设备依赖父设备,父设备不依赖子设备。此结构体的定义见文件linux-3.19.3/include/linux/device.h,如下代码所示:

struct device {
    struct device                    *parent;
    struct device_private          *p;
    struct kobject kobj;
    const char                        *init_name;
    const struct device_type      *type;
    struct mutex                     mutex;
    struct bus_type                 *bus;
    struct device_driver *driver;
    void                               *platform_data;
    void                               *driver_data;
    struct dev_pm_info             power;
    struct dev_pm_domain           *pm_domain;

#ifdef CONFIG_PINCTRL
    struct dev_pin_info            *pins;
#endif

#ifdef CONFIG_NUMA
    int                                 numa_node;
#endif
    u64                                 *dma_mask;
    u64                                 coherent_dma_mask;
    unsigned long                    dma_pfn_offset;
    struct device_dma_parameters *dma_parms;
    struct list_head                dma_pools;
    struct dma_coherent_mem       *dma_mem;
#ifdef CONFIG_DMA_CMA
    struct cma *cma_area;
#endif

    struct dev_archdata            archdata;
    struct device_node             *of_node;
    struct acpi_dev_node           acpi_node;
    dev_t                              devt;
    u32                                 id;
    spinlock_t                        devres_lock;
    struct list_head                devres_head;
    struct klist_node               knode_class;
    struct class  *class;
    const struct attribute_group **groups;
    void   (*release)(struct device *dev);
    struct iommu_group             *iommu_group;
    bool                               offline_disabled:1;
    bool                               offline:1;
};

其中:

  • 字段parent代表此设备的父设备。
  • 字段kobj代表设备的引用计数器。
  • 字段init_name代表设备的名字,对应/sys/drivers/virtual目录下设备目录名。
  • 字段type定义设备的类型。
  • 字段mutex设备的同步访问信号量。
  • 字段bus设备对应的总线类型。
  • 字段driver_data代表设备的私有数据。
  • 字段devt代表设备的设备号,包括主设备号和次设备号。
  • 字段class代表设备对应的逻辑类。
  • 字段release是一个函数指针,代表当其设备释放时调用的处理函数。

第三个输入参数是逻辑设备的设备号,此类型的详细信息请读者参考极客笔记函数cdev_add()分析文档的输入参数说明部分。

第四个输入参数是void类型的指针,代表回调函数的输入参数。

第五个输入参数是逻辑设备的设备名,即在目录/sys/devices/virtual创建的逻辑设备目录的目录名。

device_create返回参数说明

  • 函数device_create()的返回值是struct device结构体类型的指针,指向新创建的逻辑设备,此结构体在输入参数说明部分已说明。

device_create实例解析

函数device_create()必须和函数device_destroy()配对使用,这样才不会出现错误,所以此函数的实例解析请读者参考极客笔记函数device_destroy()的实例解析部分。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程