网站优化的监测评价,网站开发角色分类,设计咨询服务合同,企业网站建设规范接前一篇文章#xff1a;DRM全解析 —— ADD_FB#xff08;1#xff09; 本文参考以下博文#xff1a;
DRM驱动#xff08;四#xff09;之ADD_FB
特此致谢#xff01; 上一回围绕libdrm与DRM在Linux内核中的接口#xff1a;
DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, d…接前一篇文章DRM全解析 —— ADD_FB1 本文参考以下博文
DRM驱动四之ADD_FB
特此致谢 上一回围绕libdrm与DRM在Linux内核中的接口
DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, drm_mode_addfb_ioctl, 0),
进行了相关宏的展开。本文开始对于drm_mode_addfb_ioctl函数进行详解。drm_mode_addfb_ioctl函数在drivers/gpu/drm/drm_framebuffer.c中代码如下
int drm_mode_addfb_ioctl(struct drm_device *dev,void *data, struct drm_file *file_priv)
{return drm_mode_addfb(dev, data, file_priv);
}
drm_mode_addfb_ioctl函数只是一层简单封装实际的工作交给了drm_mode_addfb_ioctl函数。它就在上边代码如下
/*** drm_mode_addfb - add an FB to the graphics configuration* dev: drm device for the ioctl* or: pointer to request structure* file_priv: drm file** Add a new FB to the specified CRTC, given a user request. This is the* original addfb ioctl which only supported RGB formats.** Called by the user via ioctl, or by an in-kernel client.** Returns:* Zero on success, negative errno on failure.*/
int drm_mode_addfb(struct drm_device *dev, struct drm_mode_fb_cmd *or,struct drm_file *file_priv)
{struct drm_mode_fb_cmd2 r {};int ret;if (!drm_core_check_feature(dev, DRIVER_MODESET))return -EOPNOTSUPP;r.pixel_format drm_driver_legacy_fb_format(dev, or-bpp, or-depth);if (r.pixel_format DRM_FORMAT_INVALID) {drm_dbg_kms(dev, bad {bpp:%d, depth:%d}\n, or-bpp, or-depth);return -EINVAL;}/* convert to new format and call new ioctl */r.fb_id or-fb_id;r.width or-width;r.height or-height;r.pitches[0] or-pitch;r.handles[0] or-handle;ret drm_mode_addfb2(dev, r, file_priv);if (ret)return ret;or-fb_id r.fb_id;return 0;
}在讲解此函数之前先来看一下用户空间一般流程中调用此步骤ioctl系统调用的上下文 struct drm_mode_create_dumb create {};uint32_t fb_id;create.width width;create.height height;create.bpp 32;drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, create); //创建显存,返回一个handledrmModeAddFB(fd, create.width, create.height, 24, 32, create.pitch,create.handle, fb_id);
在libdrm全解析系列文章以及DRM全解析 —— CREATE_DUMB系列文章中讲过在用户空间中通过
drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, create)
最终在内核中在不同的显卡驱动相对应的函数中创建了一个dumb buffer对象实际上是分配了struct drm_gem_object *gobj返回的是与分配的struct drm_gem_object *gobj绑定的handle。
drm_gem_object创建之后需要与一块drm_framebuffer进行绑定使用因为最终刷图使用的是fb。因此使用下面接口创建drm_framebuffer并与之前创建的struct drm_gem_object *gobj进行绑定。
围绕DRM_IOCTL_MODE_ADDFB宏的用户态和内核态上下调用流程如下图所示 对于drm_mode_addfb函数的详细解析放到下一篇文章中。