函数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()的实例解析部分。