相关函数英文版请查看:nvidia-Direct Rending Manager
函数原型请查看:xf86drm.c
函数原型请查看:xf86drmMode.c

文章目录

相关函数

    int drmGetCap (int fd, uint64_t capability,uint64_t * value )
    drmModeResPtr drmModeGetResources (int fd )
    void drmModeFreeResources(drmModeResPtr ptr)
    drmModeConnectorPtr drmModeGetConnector(int fd,uint32_t connector_id )
    void drmModeFreeConnector(drmModeConnectorPtr ptr )
    drmModeEncoderPtr drmModeGetEncoder (int fd,uint32_t encoder_id )
    void drmModeFreeEncoder(drmModeEncoderPtr ptr)
    int drmIoctl(int fd, unsigned long request, void * arg )
    int drmModeAddFB (int fd, uint32_t width, uint32_t height, uint8_t depth, uint8_t bpp, uint32_t pitch, uint32_t bo_handle, uint32_t * buf_id )
    int drmModeRmFB(int fd, uint32_t fb_id )
    drmModeCrtcPtr drmModeGetCrtc(int fd,uint32_t crtc_id)
    int drmModeSetCrtc (int fd,uint32_t crtc_id,uint32_t fb_id,uint32_t x,uint32_t y,uint32_t * connectors,int count,drmModeModeInfoPtr drm_mode )
    void drmModeFreeCrtc ( drmModeCrtcPtr ptr )
    int drmSetClientCap ( int fd, uint64_t capability, uint64_t value )
    int drmModeCreatePropertyBlob ( int fd, const void * data, size_t size, uint32_t * id )
    drmModePlanePtr drmModeGetPlane ( int fd, uint32_t plane_id )
    drmModeObjectPropertiesPtr drmModeObjectGetProperties ( int fd,uint32_t object_id, uint32_t object_type )
    drmModePropertyPtr drmModeGetProperty ( int fd, uint32_t propertyId )
    int drmModeAtomicAddProperty ( drmModeAtomicReqPtr req, uint32_t object_id, uint32_t property_id, uint64_t value )
    drmModePlaneResPtr drmModeGetPlaneResources ( int fd )
    int drmHandleEvent ( int fd, drmEventContextPtr evctx )
    int drmModePageFlip ( int fd, uint32_t crtc_id, uint32_t fb_id, uint32_t flags, void * user_data )
    int drmModeSetPlane ( int fd, uint32_t plane_id, uint32_t crtc_id, uint32_t fb_id, uint32_t flags, uint32_t crtc_x, uint32_t crtc_y, uint32_t crtc_w, uint32_t crtc_h, uint32_t src_x, uint32_t src_y, uint32_t src_w, uint32_t src_h )
    drm

相关结构体

    设备:dev、drmModeModeInfo
    资源:drmModeRes
    连接器:drmModeConnector
    编码器:drmModeEncoder
    CRTC:drmModeCrtc
    标题
————————————————

相关函数

int drmGetCap (int fd, uint64_t capability,uint64_t * value )

说明:
  获取DRM驱动程序的功能。
参数:
  [in] fd:打开的DRM设备的文件描述符
  [in] capability:需要从设备获取的DRM能力。支持功能:
    DRM_CAP_ASYNC_PAGE_FLIP:如果不支持,value设置为0,如果支持,value设置为1。
    DRM_CAP_DUMB_BUFFER:如果不支持,value设置为0,如果支持,value设置为1。
    DRM_CAP_CURSOR_WIDTH:如果支持该能力,“value”中存储DRM-NVDC允许的最大游标宽度,如果不支持,则为0。
    DRM_CAP_CURSOR_HEIGHT:如果支持该能力,“value”中存储DRM-NVDC允许的最大游标高度,如果不支持,则为0。
    DRM_CAP_TIMESTAMP_MONOTONIC:如果不支持,value设置为0,如果支持,value设置为1。仅支持Linux。
  [out] value:返回capability指定的capability值。


返回值:
  如果成功则为0,否则为-EINVAL。


函数原型

/---------------------------drm.h-----------------------------------/
/** DRM_IOCTL_GET_CAP ioctl argument type */
struct drm_get_cap {
	__u64 capability;
	__u64 value;
};
/---------------------------xf86drm.c-----------------------------------/
drm_public int drmGetCap(int fd, uint64_t capability, uint64_t *value)
{
    struct drm_get_cap cap;
    int ret;

    memclear(cap);
    cap.capability = capability;

    ret = drmIoctl(fd, DRM_IOCTL_GET_CAP, &cap);
    if (ret)
        return ret;

    *value = cap.value;
    return 0;
}

drmModeResPtr drmModeGetResources (int fd )

说明
  获取有关DRM设备的crtc、编码器和连接器的信息。
  获取DRM设备的主要资源的列表。DRM应用程序通常在早期调用此函数来识别可用的显示和其他资源。但是,该函数不报告平面资源。这些可以通过drmModeGetPlaneResources查询。
参数
  fd:打开的DRM设备的文件描述符。
返回值
  如果成功,则为drmModeResPtr结构,否则为空。
注意
  drmModeResPtr结构的min_width、min_height、max_width和max_height成员被设置为占位符值。
   drmModeResPtr其实就是_drmModeRes *,结构体下面有。
后置条件
  如果调用成功,应用程序必须通过调用drmModeFreeResources释放资源信息结构。
—————————————————————————————————————————

void drmModeFreeResources(drmModeResPtr ptr)

说明:
  释放资源信息结构。
  释放由drmModeGetResources分配的drmModeResPtr结构。
参数:
  ptr:一个指向待释放资源的指针。

—————————————————————————————————————————

drmModeConnectorPtr drmModeGetConnector(int fd,uint32_t connector_id )

说明:
  获取连接器的信息。
  如果connector_id是有效的,获取一个drmModeConnectorPtr结构,该结构包含连接器的信息,例如可用模式、连接状态、连接器类型和附加的编码器(如果有的话)。
参数:
  fd:打开的DRM设备的文件描述符。
  connector_id:要检索的连接器的连接器ID。
返回值:
  如果成功,则为drmModeConnectorPtr结构;如果找不到连接器或API内存不足,则为NULL。
注意:
  连接器->mmWidth和连接器->mmHeight目前设置为占位符值。
后置条件:
  如果调用成功,应用程序必须通过调用drmModeFreeConnector释放连接器信息结构。

—————————————————————————————————————————

void drmModeFreeConnector(drmModeConnectorPtr ptr )

说明:
  释放一个连接器。
  释放drmModeGetConnector分配的drmModeConnectorPtr结构。
参数:
  ptr:一个指向待释放资源的指针。

—————————————————————————————————————————

drmModeEncoderPtr drmModeGetEncoder (int fd,uint32_t encoder_id )

说明:
  获取编码器的信息。
  获取一个drmModeEncoderPtr结构,它包含关于指定编码器的信息,例如当前的CRTC和兼容的CRTC。
参数:
  fd:打开的DRM设备的文件描述符。
  crtc_id:要检索的CRTC的CRTC ID。
返回值:
  如果成功,则为drmModeEncoderPtr结构;如果找不到编码器或API内存不足,则为NULL。
注意:
  DRM-NVDC中的编码器在启动时连接到单个CRTC,并且不能重新配置。在possible_crtcs中只设置了一个位,而在possible_cloning中没有设置位(也就是说,possible_cloning的值为0)。
后置条件:
  如果调用成功,应用程序必须调用drmModeFreeEncoder来释放分配的结构。

—————————————————————————————————————————

void drmModeFreeEncoder(drmModeEncoderPtr ptr)

说明:
  释放一个编码器。
  释放drmModeEncoderPtr由drmModeGetEncoder分配的结构。
参数:
  ptr:一个指向待释放资源的指针。
—————————————————————————————————————————

int drmIoctl(int fd, unsigned long request, void * arg )

说明:
  发出DRM输入/输出控制(IOCTL)。
  这个函数主要用于LIBDRM不支持执行所需操作的函数的情况。LIBDRM在特性上可能落后于内核接口,这个函数允许尽早访问新接口。
参数:
  [in] fd:打开的DRM设备的文件描述符。
  [in] reques:一个支持的DRM IOCTL…常量。
  [in,out] arg:指向ioctl数据结构的指针:
    如果请求是DRM_IOCTL_MODE_CREATE_DUMB,一个drm_mode_create_dumb结构
    如果请求是DRM_IOCTL_MODE_MAP_DUMB, drm_mode_map_dumb结构
    如果请求是DRM_IOCTL_MODE_DESTROY_DUMB,一个drm_mode_destroy_dumb结构
返回值:
  如果成功,则为0,否则为-1。
注意:
  DRM- nvdc不支持内核DRM的所有功能,所以只实现了一小部分IOCTL操作。
DRM-NVDC支持以下应用程序使用的IOCTL操作:
    DRM_IOCTL_MODE_CREATE_DUMB:创建一个哑(CPU)缓冲区。用于调试和简单的显示测试。加速渲染不可用。
    DRM_IOCTL_MODE_MAP_DUMB::映射一个用于CPU访问的哑缓冲区。与内核DRM不同,DRM- nvdc用mmap函数映射dumb缓冲区,并在返回的偏移量中返回一个有效的内存指针。应用程序不能在返回的偏移量上调用mmap。
    DRM_IOCTL_MODE_DESTROY_DUMB:销毁一个哑缓冲区。
    DRM_IOCTL_TEGRA_GEM_CREATE:创建一个HW缓冲区。

—————————————————————————————————————————

int drmModeAddFB (int fd, uint32_t width, uint32_t height, uint8_t depth, uint8_t bpp, uint32_t pitch, uint32_t bo_handle, uint32_t * buf_id )

说明:
  创建一个framebuffer.
  该函数使用指定的缓冲区对象作为内存后备存储,以指定的大小和格式创建一个framebufferbuffer对象可以是通过调用drmIoctl创建的“哑缓冲区”,请求参数设置为DRM_IOCTL_MODE_CREATE_DUMB,也可以是通过调用drmPrimeFDToHandle函数导入的dma-buf
参数:
  [in] fd:打开的DRM设备的文件描述符。
  [in] width:framebuffer的宽度以像素为单位。
  [in] height:framebuffer高度(像素)。
  [in] depth:framebuffer.深度,以比特为单位。
  [in] bpp:framebuffer.每像素位。
  [in] pitch:framebuffer间距,以字节为单位。
  [in] bo_handle:提供内存支持的缓冲区对象的句柄。
  [out] buf_id:在创建成功时接收到创建的framebuffer的ID。
返回值:
  如果framebuffer创建成功,则为0,否则为-1。
后置条件:
  如果调用成功,应用程序必须通过调用drmModeRmFB来删除(释放)framebuffer。
—————————————————————————————————————————

int drmModeRmFB(int fd, uint32_t fb_id )

说明:
  破坏一个framebuffer.。
  销毁(释放)由drmModeAddFB或drmModeAddFB2分配的帧缓冲区。
参数:
   fd:打开的DRM设备的文件描述符。
   fb_id:要销毁的framebuffer的ID。

返回值:
  如果销毁成功则为0,如果没有找到framebuffer则为-ENOENT。
—————————————————————————————————————————

drmModeCrtcPtr drmModeGetCrtc(int fd,uint32_t crtc_id)

说明:
  获取CRTC的信息。
  如果指定的CRTC ID有效,则获取一个drmModeCrtcPtr结构,该结构包含关于CRTC的信息,例如当前framebuffer、模式、位置、大小和gamma LUT元素的数量。
参数:
   fd:打开的DRM设备的文件描述符。
   crtc_id:要检索的CRTC的CRTC ID。
返回值:
  如果成功,则为drmModeCrtcPtr结构;如果找不到CRTC或API内存不足,则为NULL。
后置条件:
  如果调用成功,应用程序必须调用drmModeFreeCrtc来释放它返回的结构。
—————————————————————————————————————————

int drmModeSetCrtc (int fd,uint32_t crtc_id,uint32_t fb_id,uint32_t x,uint32_t y,uint32_t * connectors,int count,drmModeModeInfoPtr drm_mode )

说明:
  设置CRTC配置。
  如果指定了DRM模式(如果drm_mode不为NULL),在CRTC和指定的连接器上设置显示模式。新的fb_id, x,和y属性将设置在vblank。
参数:
  fd:打开的DRM设备的文件描述符。
  crtc_id:要设置的CRTC的ID。
  fb_id:此CRTC显示的帧缓冲区id,或者-1使用与前面操作相同的CRTC。
  x:从活动显示区域左侧到放置framebuffer的x偏移量。如果x是-1,x的偏移量不会改变。
  y:从活动显示区域顶部到放置framebuffer的y偏移量。如果y是-1,y的偏移量不会改变。
  connectors:一个指向要绑定到CRTC的连接器列表的指针。
  count:连接器列表中的连接器数量。
  drm_mode:设置模式,或NULL使用与前面操作相同的模式。
返回值:
  0:如果成功
  -EINVAL:如果无效的“crtc id”。
  -1:如果count无效,或者连接器指定的列表与CRTC不兼容。
  -errno:另外
—————————————————————————————————————————

void drmModeFreeCrtc ( drmModeCrtcPtr ptr )

说明:
  释放一个CRTC。
  释放由drmModeGetCrtc分配的drmModeCrtcPtr结构。
参数:
  ptr:一个指向需要释放的CRTC的指针。
—————————————————————————————————————————

int drmSetClientCap ( int fd, uint64_t capability, uint64_t value )

说明:
   启用或禁用DRM特性(功能)。
参数:
   fd:打开的DRM设备的文件描述符。
   capability:指定要启用或禁用的功能。支持的值是:
     DRM_CLIENT_CAP_ATOMIC (disabled by default)
     DRM_CLIENT_CAP_UNIVERSAL_PLANES (disabled by default)
   value:0表示禁用,1表示启用。
返回值:
   0表示成功,否则为-EINVAL。
—————————————————————————————————————————

int drmModeCreatePropertyBlob ( int fd, const void _ data, size_t size, uint32_t _ id )

说明:
  创建一个属性斑点( property blob)。
  存储一个不透明的内存块并返回它的ID。然后,可以将ID用于原子模式设置。.
注意:
  DRM-NVDC中,data必须为drmModeModeInfoPtr。当从drmModeModeInfoPtr创建属性blob时,返回的ID将成为CRTC属性中匹配名称MODE_ID的有效值。原子地将MODE_ID属性提交到创建的blobID会导致在该CRTC上设置模式。新的CRTC模式将是drmModeModeInfoPtr作为输入drmModeCreatePropertyBlob的模式。
后置条件
  如果调用成功,应用程序必须通过调用drmModeDestroyPropertyBlob销毁(释放)属性blob。
参数:
   fd:打开的DRM设备的文件描述符。
   data:属性blob的内容。什么数据是可接受的取决于实现。在DRM-NVDC中,数据必须是drmModeModeInfoPtr结构。
   size:data的大小
   id:返回blob的属性ID
返回值:
   0: 如果操作成功。
   -1:如果data不是一个有效的指针,或者如果size或id无效。
   -ENOMEM:如果不能分配块内存。
—————————————————————————————————————————

drmModePlanePtr drmModeGetPlane ( int fd, uint32_t plane_id )

说明:
  获取有关plane的信息。
  :如果plane_id有效,则获取一个drmModePlanePtr结构,该结构包含关于指定平面的信息,例如它当前的CRTC和兼容的CRTC,当前绑定的framebuffer, gamma步数,以及平面的位置。
注意:
  在DRM-NVDC中,平面在启动时连接到单个CRTC,且不可重构。drmModePlanePtr结构的possible_crtc成员总是恰好设置了一位。
后置条件
  如果调用成功,应用程序必须通过调用drmModeFreePlane释放平面信息结构。
参数:
   fd:打开的DRM设备的文件描述符。
   fd::Plane待检索的planeID。
返回值:
   如果成功,则为drmModePlanePtr结构,如果没有找到平面或API内存不足,则为NULL。
—————————————————————————————————————————

drmModeObjectPropertiesPtr drmModeObjectGetProperties ( int fd,uint32_t object_id, uint32_t object_type )

说明:
  获取DRM对象的所有属性。
  获取对象属性结构,该结构描述指定DRM对象的所有原子性可修改属性,以及不包含在相应drmModeCrtcPtrdrmModeConnectorPtrdrmModePlanePtr结构中的只读属性。然后,你可以通过drmModeGetProperty来检索单个属性,并通过drmModeAtomicAddProperty来改变它们的值。
drmModeObjectPropertiesPtr结构包含一个属性id数组(props)、一个对应属性值数组(prop_values)和每个数组中的元素数(count_props)。您可以通过在属性ID上调用drmModeGetProperty并查看返回的drmModePropertyPtr结构的名称字段来获得属性的名称。
  要以原子方式修改属性,可以通过调用drmModeAtomicAlloc创建一个drmModeAtomicReqPtr请求对象,然后调用drmModeAtomicAddProperty,指定drmModeAtomicReqPtr对象、要修改对象的对象ID、要修改属性的属性ID和属性的新值。然后使用drmModeAtomicCommit提交请求。您可以在原子请求中设置多个属性,并在单个操作中提交它们。

注意:
  并不是所有对象类型都受支持。
后置条件
  如果调用成功,应用程序必须通过调用drmModeFreeObjectProperties释放drmModeObjectPropertiesPtr结构体。
参数:
   fd:打开的DRM设备的文件描述符。
   object_id:要检索其属性的DRM对象的对象ID。
   object_type:表示对象类型的符号。支持以下对象类型:
      DRM_MODE_OBJECT_CRTC
      DRM_MODE_OBJECT_CONNECTOR
      DRM_MODE_OBJECT_PLANE
返回值:
   如果成功,则为drmModeObjectPropertiesPtr对象,否则为NULL
—————————————————————————————————————————

drmModePropertyPtr drmModeGetProperty ( int fd, uint32_t propertyId )

说明:
  获取描述DRM对象的属性的属性结构。
  DRM对象可以是一个平面、一个CRTC或一个连接器。
  这个函数操作drmModeObjectPropertiesPtr结构体,该结构体由drmModeObjectGetProperties()返回。
  可修改的属性取决于DRM对象类型:
    ①对于一个平面(对象类型DRM_MODE_OBJECT_PLANE):
        "SRC_X", "SRC_Y", "SRC_W", "SRC_H", "zpos", "alpha" "CRTC_X",         "CRTC_Y", "CRTC_W", "CRTC_H", "CRTC_ID", "FB_ID"
    ②对于一个CRTC(对象类型DRM_MODE_OBJECT_CRTC),支持的值是:
       "MODE_ID", "ACTIVE", "HDR_SUPPORTED"
    ③对于连接器(对象类型DRM_MODE_OBJECT_CONNECTOR),支持的值是:
        "CRTC_ID"
对于DRM平面,enum字段保存了定义属性的关键字对(名称:值)列表。

 
drmModePropertyPtr->enums[ ].
namedrmModePropertyPtr->enums[ ].value

名称字段支持的值在上面定义(例如,“SRC_X”,“SRC_Y”,或“SRC_W”)。该字段是可修改的。
    value字段支持的值为:
     "Primary", "Overlay", "Cursor"
    该字段是只读的.
    要识别平面类型,请遍历下面的列表来定位值字段与您要查找的值字段匹配的枚举。然后,从对应的名称字段获取值。
      drmModePropertyPtr->enums[ ]
注意:
  一个平面的zpos值初始化为相对于下一个平面的偏移量10。这是为了允许头部的灵活配置。例如:“Primary”类
    •"Primary" type Plane zpos = 10
    •First "Overlay" Plane zpos = 20
    •Next "Overlay" Plane zpos = 30
    •Etc.
  zpos的允许范围是[0,255]。数值上较大的平面遮挡数值上较小的平面。一个平面的alpha值将导致一个平面范围的透明度以及包含在缓冲区对象中的像素alpha被应用。alpha的允许范围是[0,255],其中0是完全透明的
后置条件
  如果调用成功,应用程序必须通过调用drmModeFreeProperty释放属性信息结构。
参数:
   fd:打开的DRM设备的文件描述符
   propertyId:要获取的属性对象的属性ID。
返回值:
   如果成功,则为drmModePropertyPtr,否则为NULL。
—————————————————————————————————————————

int drmModeAtomicAddProperty ( drmModeAtomicReqPtr req, uint32_t object_id, uint32_t property_id, uint64_t value )

说明:
  向原子请求添加属性。
  向原子请求添加属性和值。
参数:
   req:一个原子请求。
   object_id:需要修改的CRTC、平面或连接器的对象ID。
   property_id:属性需要修改的属性ID。
   value:属性的新值。
返回值:
   0:如果成功
   -1:如果req是NULL或者API内存不足。
   -EINVAL:如果DRM_CLIENT_CAP_ATOMIC未启用。
—————————————————————————————————————————

drmModePlaneResPtr drmModeGetPlaneResources ( int fd )

说明:
  获取Plane的有关信息。
  获取DRM设备的平面资源列表。DRM应用程序通常会提前调用这个函数来识别可用的显示层。
  默认情况下,返回的信息只包括“叠加”类型(常规)平面,而不是“主”和“光标”平面。如果DRM_CLIENT_CAP_UNIVERSAL_PLANES已被drmSetClientCap启用,则返回的信息包括“Primary”平面表示CTRCs,“Cursor”平面表示Cursors。这允许使用平面函数(如drmModeSetPlane)来操作crtc和游标。

注意:
  DRM-NVDC目前不实现“游标”类型平面。
后置条件
  打开DRM设备的文件描述符。
参数:
   fd:打开的DRM设备的文件描述符。
返回值:
   如果成功,则为drmModeResPtr结构,否则为NULL
—————————————————————————————————————————

int drmHandleEvent ( int fd, drmEventContextPtr evctx )

说明:
  轮询事件,指定回调函数。
  如果发生了指定类型的事件,则调用回调函数。
注意:
  DRM-NVDC仅支持Linux操作系统。支持evctx结构的vblank_handler字段。
后置条件

参数:
   fd:打开的DRM设备的文件描述符。
   evctx:包含回调指针的事件上下文
返回值:
   如果成功则为0,否则为-1。
—————————————————————————————————————————

int drmModePageFlip ( int fd, uint32_t crtc_id, uint32_t fb_id, uint32_t flags, void * user_data )

说明:
  请求指定CRTC上的页面翻转(framebuffer更改)。
  在指定的CRTC上安排翻页。默认情况下,CRTC将被重新编程,以在下一次垂直刷新后显示指定的framebuffer。
注意:
  drmModePageFlip不会等待呈现完成,也不会在翻转完成之前阻止未来的呈现。这与利用隐式同步的基于KMS的实现不同。当使用EGLOutput和DRM-NVDC时,同步是在内部处理的。
参数:
   fd:打开的DRM设备的文件描述符。
   crtc_id:CRTC要修改framebuffer的CRTC ID。
   fb_id:Framebuffer要显示的Framebuffer ID。
   flags:影响操作的标志。支持的值是:
        DRM_MODE_PAGE_FLIP_ASYNC:立即翻转,而不是vblank
        DRM_MODE_PAGE_FLIP_EVENT:发送翻页事件。
   user_data:如果请求vblank事件,则页面翻转处理程序使用的数据。
返回值:
   0 if successful.
  -EINVAL if crtc_id or fb_id is invalid.
  -errno otherwise
—————————————————————————————————————————

int drmModeSetPlane ( int fd, uint32_t plane_id, uint32_t crtc_id, uint32_t fb_id, uint32_t flags, uint32_t crtc_x, uint32_t crtc_y, uint32_t crtc_w, uint32_t crtc_h, uint32_t src_x, uint32_t src_y, uint32_t src_w, uint32_t src_h )

说明:
  更改平面的framebuffer和位置
注意:
  crtc_……和src_……参数接受特殊的输入值-1,这表示不改变硬件偏移值。(当给定这个值时,基于内核的DRM驱动程序返回错误代码-ERANGE。)平面上设置的framebuffer显示在crtc的顶部。平面的堆叠顺序由drmModeGetPlaneResources报告平面的顺序表示。所有drmModeSetPlane操作都同步到vblank并阻塞。
参数:
   fd::打开的DRM设备的文件描述符。
   plane_id:平面需要修改的平面ID。
   crtc_id:CRTC该平面所在CRTC的ID
   fb_id:Framebuffer在平面上显示的Framebuffer ID,或-1表示保持Framebuffer不变。
   flags:控制函数行为的标志。目前不支持外部使用标志。
   crtc_x:从有源显示区域左侧显示平面的偏移量
   crtc_y:从有源显示区域顶部到显示平面的偏移量。
   crtc_w:显示输出矩形的宽度。
   crtc_h:显示输出矩形的高度
   src_x:从源framebuffer左侧的剪辑偏移量(Q16.16固定点)。
   src_y:来自源framebuffer顶部的剪辑偏移量(Q16.16固定点)。
   src_w:源矩形的宽度(Q16.16固定点)。
   src_h:源矩形的高度(Q16.16固定点)。

返回值:
   0 : 如果成功
   -EINVAL:plane_id或crtc_id无效
   -errno:otherwise
—————————————————————————————————————————

drm

说明:
  
  
注意:
  
后置条件
  
参数:
   fd:
   fd:
返回值:   

—————————————————————————————————————————

相关结构体

设备:dev、drmModeModeInfo

struct modeset_dev {
	struct modeset_dev *next;		/指向下一个设备指针
	uint32_t width;					/缓冲区对象的宽度
	uint32_t height;				/缓冲区对象的高度
	uint32_t stride;				/缓冲区对象的步幅
	uint32_t size;					/缓冲区对象的大小
	uint32_t handle;				/
	uint8_t *map;					/指向内存映射缓冲区的指针
	drmModeModeInfo mode;			/显示模式
	uint32_t fb;					/
	uint32_t conn;					/连接器ID
	uint32_t crtc;					/crtc ID
	drmModeCrtc *saved_crtc;		/更改crtc前的配置
};

typedef struct _drmModeModeInfo {
	uint32_t clock;
	uint16_t hdisplay, hsync_start, hsync_end, htotal, hskew;
	uint16_t vdisplay, vsync_start, vsync_end, vtotal, vscan;

	uint32_t vrefresh;

	uint32_t flags;
	uint32_t type;
	char name[DRM_DISPLAY_MODE_LEN];
} drmModeModeInfo, *drmModeModeInfoPtr;

资源:drmModeRes

typedef struct _drmModeRes {

	int count_fbs;					/
	uint32_t *fbs;					

	int count_crtcs;				/显示控制器总数
	uint32_t *crtcs;

	int count_connectors;			/连接器总数
	uint32_t *connectors;

	int count_encoders;				/编码器总数
	uint32_t *encoders;

	uint32_t min_width, max_width;
	uint32_t min_height, max_height;
} drmModeRes, *drmModeResPtr;

连接器:drmModeConnector

typedef struct _drmModeConnector {
	uint32_t connector_id;					/当前连接到的连接器ID
	uint32_t encoder_id; 					/当前连接到的编码器ID
	uint32_t connector_type;				/当前连接到的连接器类型
	uint32_t connector_type_id;				/当前连接到的连接器类型ID
	drmModeConnection connection;			/当前连接器的连接状态(可看下面enum)
	uint32_t mmWidth, mmHeight; /**< HxW in millimeters */
	drmModeSubPixel subpixel;

	int count_modes;						/连接器的模式
	drmModeModeInfoPtr modes;

	int count_props;
	uint32_t *props; /**< List of property ids */
	uint64_t *prop_values; /**< List of property values */

	int count_encoders;
	uint32_t *encoders; /**< List of encoder ids */
} drmModeConnector, *drmModeConnectorPtr;

typedef enum {
	DRM_MODE_CONNECTED         = 1,
	DRM_MODE_DISCONNECTED      = 2,
	DRM_MODE_UNKNOWNCONNECTION = 3
} drmModeConnection;

编码器:drmModeEncoder

typedef struct _drmModeEncoder {
	uint32_t encoder_id;
	uint32_t encoder_type;
	uint32_t crtc_id;
	uint32_t possible_crtcs;
	uint32_t possible_clones;
} drmModeEncoder, *drmModeEncoderPtr;

CRTC:drmModeCrtc

typedef struct _drmModeCrtc {
	uint32_t crtc_id;
	uint32_t buffer_id; /**< FB id to connect to 0 = disconnect */

	uint32_t x, y; /**< Position on the framebuffer */
	uint32_t width, height;
	int mode_valid;
	drmModeModeInfo mode;

	int gamma_size; /**< Number of gamma stops */

} drmModeCrtc, *drmModeCrtcPtr;

标题

/---------------drm_mode.h-------------/
/* create a dumb scanout buffer */
struct drm_mode_create_dumb {
	__u32 height;
	__u32 width;
	__u32 bpp;
	__u32 flags;
	/* handle, pitch, size will be returned */
	__u32 handle;
	__u32 pitch;
	__u64 size;
};
struct drm_mode_destroy_dumb {
	__u32 handle;
};

/* set up for mmap of a dumb scanout buffer */
struct drm_mode_map_dumb {
	/** Handle for the object being mapped. */
	__u32 handle;
	__u32 pad;
	/**
	 * Fake offset to use for subsequent mmap call
	 *
	 * This is a fixed-size type for 32/64 compatibility.
	 */
	__u64 offset;
};