LCD DRM驱动框架分析二_drm lcd初始化流程

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

	if (nr >= DRM_CORE_IOCTL_COUNT)
		goto err_i1;
	nr = array_index_nospec(nr, DRM_CORE_IOCTL_COUNT);
	ioctl = &drm_ioctls[nr];
}

drv_size = _IOC_SIZE(ioctl->cmd);
out_size = in_size = _IOC_SIZE(cmd);
if ((cmd & ioctl->cmd & IOC_IN) == 0)
	in_size = 0;
if ((cmd & ioctl->cmd & IOC_OUT) == 0)
	out_size = 0;
ksize = max(max(in_size, out_size), drv_size);

DRM_DEBUG("pid=%d, dev=0x%lx, auth=%d, %s\n",
	  task_pid_nr(current),
	  (long)old_encode_dev(file_priv->minor->kdev->devt),
	  file_priv->authenticated, ioctl->name);

/* Do not trust userspace, use our own definition */
func = ioctl->func;

if (unlikely(!func)) {
	DRM_DEBUG("no function\n");
	retcode = -EINVAL;
	goto err_i1;
}

if (ksize <= sizeof(stack_kdata)) {
	kdata = stack_kdata;
} else {
	kdata = kmalloc(ksize, GFP_KERNEL);
	if (!kdata) {
		retcode = -ENOMEM;
		goto err_i1;
	}
}

if (copy_from_user(kdata, (void __user *)arg, in_size) != 0) {
	retcode = -EFAULT;
	goto err_i1;
}

if (ksize > in_size)
	memset(kdata + in_size, 0, ksize - in_size);

retcode = drm_ioctl_kernel(filp, func, kdata, ioctl->flags);
if (copy_to_user((void __user *)arg, kdata, out_size) != 0)
	retcode = -EFAULT;

  err_i1:
if (!ioctl)
	DRM_DEBUG("invalid ioctl: pid=%d, dev=0x%lx, auth=%d, cmd=0x%02x, nr=0x%02x\n",
		  task_pid_nr(current),
		  (long)old_encode_dev(file_priv->minor->kdev->devt),
		  file_priv->authenticated, cmd, nr);

if (kdata != stack_kdata)
	kfree(kdata);
if (retcode)
	DRM_DEBUG("pid=%d, ret = %d\n", task_pid_nr(current), retcode);
return retcode;

}


`通过访问drmModeSetCrtc`相关的legacy接口,从而调用到了drm\_ioctl\_kernel - > IOCTL上:



return DRM_IOCTL(fd, DRM_IOCTL_MODE_SETCRTC, &crtc);


而所有与drm相关的定义都在`drivers/gpu/drm/drm_ioctl.c`中:



DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETCRTC, drm_mode_setcrtc, DRM_MASTER),


即最终处理函数是`drm_mode_setcrtc`。函数首先检查DRM设备的feature:



if (!drm_core_check_feature(dev, DRIVER_MODESET))
return -EOPNOTSUPP;


最终调用的就是`drm_crtc_funcs->set_config`回调函数,也就是`drm_atomic_helper_set_config`函数:



if (drm_drv_uses_atomic_modeset(dev))
ret = crtc->funcs->set_config(&set, &ctx);
else
ret = __drm_mode_set_config_internal(&set, &ctx);


struct drm\_crtc\_funcs结构体:



static const struct drm_crtc_funcs vop2_crtc_funcs =
{
.gamma_set = vop2_crtc_legacy_gamma_set,
.set_config = drm_atomic_helper_set_config,
.page_flip = drm_atomic_helper_page_flip,
.destroy = vop2_crtc_destroy,
.reset = vop2_crtc_reset,
.atomic_get_property = vop2_crtc_atomic_get_property,
.atomic_set_property = vo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值