完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
问题现象:
uboot阶段logo.bmp可以正常,并且可以持续显示到logo_kernel.bmp开始那一刻,但是logo_kernel.bmp可以显示,一闪而过,之后屏幕就一直持续黑屏直到显示桌面内容…… 问题排查: 查看启动日志: [ 4.212505] #################show_loader_logo##### ################## [4.262751] ###########fb_find_logo 深度 = 24############# [4.262751]释放drm_logo内存:3348K [4.325082]控制台:切换到彩色帧缓冲设备100x80[4.375269]rockchip-drm显示子系统:fb0:帧缓冲设备 发现drm内存被释放,查看show_loader_logo struct drm_atomic_state *state,*函数旧状态; 结构 device_node *np = drm_dev->dev->of_node; 结构 drm_mode_config *mode_config = &drm_dev->mode_config; 结构设备节点*根,*路由; 结构 rockchip_drm_mode_set *set, *tmp, *unset; 结构 list_head mode_set_list; 结构列表头模式未设置列表; 无符号平面掩码 = 0; 诠释; printk("##################%s#######################rn ",__func__); root = of_get_child_by_name(np,“路线”); if (!root) { dev_warn(drm_dev->dev, "无法解析显示资源n"); 返回; } if (init_loader_memory(drm_dev)) { dev_warn(drm_dev->dev, "未能解析加载器内存n"); 返回; } INIT_LIST_HEAD(&mode_set_list); drm_modeset_lock_all(drm_dev); 状态 = drm_atomic_state_alloc(drm_dev); if (!state) { dev_err(drm_dev->dev, "未能分配原子状态n"); ret = -ENOMEM; 转到错误解锁; } state->acquire_ctx = mode_config->acquire_ctx; for_each_child_of_node(root, route) { if (!of_device_is_available(route)) 继续; 设置= of_parse_display_resource(drm_dev,路线); if (!set) 继续; if (setup_initial_state(drm_dev, state, set)) { drm_framebuffer_unreference(set->fb); INIT_LIST_HEAD(&set->head); list_add_tail(&set->head, &mode_unset_list); 继续; } INIT_LIST_HEAD(&set-> list_add_tail(&set->head, &mode_set_list); } /* * mode_unset_list 存储未连接的路由,如果路由的 crtc * 没有被使用,我们应该关闭它。 */ list_for_each_entry_safe(unset, tmp, &mode_unset_list, head) { struct rockchip_drm_mode_set *tmp_set; int found_used_crtc = 0; list_for_each_entry_safe(set, tmp_set, &mode_set_list, head) { if (set->crtc == unset->crtc) { printk("############found 1 used crtc###### #####rn"); found_used_crtc = 1; 继续; } } if (!found_used_crtc) { 结构 drm_crtc *crtc = unset->crtc; int 管道 = drm_crtc_index(crtc); drm_dev->dev_private; if (unset->hdisplay && unset->vdisplay){ printk("############关闭未使用的crtc###########rn"); priv->crtc_funcs[管道]->crtc_close(crtc); } } list_del(&unset->head); kfree(未设置); } if (list_empty(&mode_set_list)) { dev_warn(drm_dev->dev, "can't not find any loader displayn"); ret = -ENXIO; 转到 err_free_state; } /* * state 保存初始设备状态,将 state 换成 * drm deivces 作为 old state,所以如果有新的 state 来了,可以 和这个 state 比较来判断哪个 state 需要更新。 */ drm_atomic_helper_swap_state(drm_dev, drm_atomic_state_free(状态); old_state = drm_atomic_helper_duplicate_state(drm_dev, mode_config->acquire_ctx); if (IS_ERR(old_state)) { dev_err(drm_dev->dev, "未能复制原子状态n"); ret = PTR_ERR_OR_ZERO(old_state); 转到 err_free_state; } state = drm_atomic_helper_duplicate_state(drm_dev, mode_config->acquire_ctx); if (IS_ERR(state)) { dev_err(drm_dev->dev, "未能复制原子状态n"); ret = PTR_ERR_OR_ZERO(状态); 转到 err_free_old_state; } state->acquire_ctx = mode_config->acquire_ctx; list_for_each_entry(set, &mode_set_list, head) /* * 我们不希望在 update_state 上看到任何失败。 */ WARN_ON(update_state(drm_dev, state, set, &plane_mask)); ret = drm_atomic_commit(状态); drm_atomic_clean_old_fb(drm_dev,plane_mask,ret); list_for_each_entry_safe(set, tmp, &mode_set_list, head) { list_del(&set->head); kfree(设置); } /* * 这里可能出现死锁吗? */ WARN_ON(ret == -EDEADLK); if (ret) { /* * 如果原子提交失败,则恢复显示状态。 */ drm_atomic_helper_swap_state(drm_dev, old_state); 转到 err_free_old_state; } //rockchip_free_loader_memory(drm_dev); //drm_atomic_state_free(old_state); drm_modeset_unlock_all(drm_dev); 返回; err_free_old_state: drm_atomic_state_free(old_state); err_free_state: drm_atomic_state_free(状态); err_unlock: drm_modeset_unlock_all(drm_dev); if (ret) dev_err(drm_dev->dev, "未能显示加载程序徽标n"); rockchip_free_loader_memory(drm_dev); } 内容的大致意思是部署备份区存储上个之后,如果重新分配并填充了frambuffer则更新备份区内容,启动也就是显示内容会更新 ......闪而过问题: RK官方也提供了更多对于我这个现象不适用的问题的基本解决方案,RK为了连接老款的framebuffer机制,如果配置linux内核显示里面的logo.c文件里面指定的内核应该是图片但是,但是会影响图片显示目录下 logo_kermpmp 文件的函数显示目录如果不按如上步骤操作在 logo.c 文件里面把 f_logo_late_late_里面的 logos_d 设置为 false,init,指定到内核 logo.c 的版本,我的是几只……过程启动的现象就是:uboot显示logo.bmp正常,随后logo_kernel.bmp一闪而过,显示画面直到进入桌面…… 附官方文档指导: |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
基于米尔瑞芯微RK3576核心板/开发板的人脸疲劳检测应用方案
678 浏览 0 评论
920 浏览 1 评论
814 浏览 1 评论
2030 浏览 1 评论
3275 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 20:33 , Processed in 0.447129 second(s), Total 40, Slave 34 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号