DRM property编程

2025-04-22 08:31
6

DRM property编程
1   struct drm_mode_object {
uint32_t id;
uint32_t type;
struct drm_object_properties *properties;
struct kref refcount;
void (*free_cb)(struct kref *kref);
};
uint32_t type的定义有以下几种:
#define DRM_MODE_OBJECT_CRTC 0xcccccccc
#define DRM_MODE_OBJECT_CONNECTOR 0xc0c0c0c0
#define DRM_MODE_OBJECT_ENCODER 0xe0e0e0e0
#define DRM_MODE_OBJECT_MODE 0xdededede
#define DRM_MODE_OBJECT_PROPERTY 0xb0b0b0b0
#define DRM_MODE_OBJECT_FB 0xfbfbfbfb
#define DRM_MODE_OBJECT_BLOB 0xbbbbbbbb
#define DRM_MODE_OBJECT_PLANE 0xeeeeeeee
#define DRM_MODE_OBJECT_ANY 0

2   
struct drm_object_properties {
int count;
struct drm_property *properties[DRM_OBJECT_MAX_PROPERTY];
uint64_t values[DRM_OBJECT_MAX_PROPERTY];
};
drm_object_properties 代表 drm_mode_object的全部属性,它由 drm_property组成一个数组,每项代表一个属性。

3
struct drm_property {
struct list_head head;
struct drm_mode_object base;
uint32_t flags;
char name[DRM_PROP_NAME_LEN];
uint32_t num_values;
uint64_t *values;
struct drm_device *dev;
struct list_head enum_list;
};
每种属性都有对应的创建函数,例如:
drm_property_create_enum().
drm_property_create_bitmask()
drm_property_create_object().

drm的object原子模式支持两种属性: drm_property和drm_property_blob,它们的作用类似。一个object可以分别具有这两种属性, 在用户空间可以更新和设置这些属性。

struct drm_property_blob {
struct drm_mode_object base;
struct drm_device *dev;
struct list_head head_global;
struct list_head head_file;
size_t length;
void *data;
};

drm_property_create_blob()函数,创建的是struct drm_property_blob类型。其成员变量struct drm_mode_object base的id就是其属性值。drm 驱动可以根据该 ID 找到对应的 drm_property_blob 结构体,该结构体中存放着property_blob的特定相关信息。

4   属性名称和属性id(property ID)
在用户空间一般引用属性id(property ID)来进行操作。property ID来自于
struct drm_mode_object 的id变量值。

5   本drm驱动的modeset中全局配置参数
struct drm_mode_config{}结构体中记录了两种属性drm_property和drm_property_blob的链表指针。其属性id(property ID)在DRM框架中是唯一的。

struct list_head property_list;
struct list_head property_blob_list;
所有object的属性都连接到上面两个链表中。