环境:rk3399 linux SDK linux kernel版本为4.4.179 uboot版本为201709
显示接口:HDMI

一、u-boot开启logo显示

uboot显示框架代码

u-boot/drivers/video/display-uclass.c
u-boot/drivers/video/drm/bmp_helper.c
u-boot/drivers/video/drm/rockchip_display.c

显示驱动代码

u-boot/drivers/video/drm/dw_hdmi.c
u-boot/drivers/video/drm/rockchip_dw_hdmi.c
u-boot/drivers/video/drm/rockchip_analogix_dp.c
u-boot/drivers/video/drm/rockchip_analogix_dp_reg.c
u-boot/drivers/video/drm/rockchip_mipi_dsi.c
u-boot/drivers/video/drm/rockchip-dw-mipi-dsi.c
u-boot/drivers/video/drm/rockchip-inno-mipi-dphy.c
u-boot/drivers/video/drm/rockchip_lvds.c
u-boot/drivers/video/drm/rockchip_panel.c
u-boot/drivers/video/drm/rockchip_rgb.c
u-boot/drivers/video/drm/rockchip_vop.c
u-boot/drivers/video/drm/rockchip_vop_reg.c

因为是HDMI显示,所以uboot的defconfig中需要开启以下宏:

CONFIG_DRM_ROCKCHIP_DW_HDMI=y
CONFIG_ROCKCHIP_INNO_HDMI_PHY=y
CONFIG_ROCKCHIP_VENDOR_PARTITION=y

dts配置如下:

&route_hdmi {status = "okay";logo,mode = "center";connect = <&vopb_out_hdmi>;
};&hdmi {#address-cells = <1>;#size-cells = <0>;#sound-dai-cells = <0>;status = "okay";
};&display_subsystem {status = "okay";
};&vopb_out_hdmi {status = "okay";
};&vopl_out_hdmi {status = "disabled";
};

注意:这里的dts是u-boot中的dts。还有就是route_hdmi节点中的connect属性需要和内核中的配置一样,否则可能导致kernel阶段的logo不显示。
在uboot的命令行下可以利用下面命令进行logo显示的测试,前提是已经烧写过包含logo_kernel.bmp和logo.bmp的内核镜像。

=> rockchip_show_bmp logo_kernel.bmp      #显示logo_kernel.bmp图片
=> rockchip_show_bmp logo.bmp            #显示logo.bmp图片
=> rockchip_show_logo                    #显示logo

二、kernel开启logo显示

建议烧写一个带桌面的文件系统方便观察。在确定hdmi显示正常的情况下在调试显示logo,显示logo的代码主要在下面两个文件中:

kernel/drivers/gpu/drm/drm_fb_helper.c
kernel/drivers/gpu/drm/rockchip/rockchip_drm_drv.c

rockchip_drm_drv.c中的show_loader_logo函数负责显示kernel阶段的logo。
内核的dts配置如下:

&hdmi {#address-cells = <1>;#size-cells = <0>;#sound-dai-cells = <0>;status = "okay";
};&display_subsystem {status = "okay";
};&route_hdmi {status = "okay";logo,mode = "center";connect = <&vopb_out_hdmi>;
};&vopb_out_hdmi {status = "okay";
};&vopl_out_hdmi {status = "disabled";
};

logo为bmp格式,存放在kernel目录下,logo_kernel.bmp是内核logo,logo.bmp为uboot的logo。logo在内核编译后会被打包到resource.img中。

三、遇到的问题

  1. uboot阶段logo可以正常显示,kernel阶段的logo没有显示。
    出现这种情况的原因是route_hdmi节点中配置connect属性uboot和kernel的不一样导致。
  2. kernel logo显示时间很短,立刻就黑屏,持续到进入桌面。
    这个问题,网上有人有相同的经历,不过我按照网上给出的方法试了一下没起作用(http://www.manongjc.com/detail/14-bbfbwuxqyrcbgdj.html)。通过下面的调用关系发现调用register_framebuffer(info)时黑屏,
#函数调用关系
rockchip_drm_bindshow_loader_logo(drm_dev)rockchip_drm_fbdev_init(drm_dev)    <rockchip_drm_fbdev.c:160>drm_fb_helper_initial_config(helper, PREFERRED_BPP); <drm_fb_helper.c +2112>drm_fb_helper_single_fb_probe(fb_helper, bpp_sel);register_framebuffer(info)

这里简单说一下追这个代码的方法。方法比较笨,各位看官莫要见笑。

  • 第一种方式就是添加"while(1);"让程序停下来,然后观察logo是否消失,如果消失就向后退,否则接着向下追。
  • 第二种方式就是先用printk添加一句打印,接着加个长一点的延迟,这样就可以通过log信息和屏幕的显示情况来定位黑屏时在调用那个函数时出现的。
    接前面,register_framebuffer(info)用于注册/dev/fb0设备在其前后加log会过滤出下面两个log信息:
[ 12.838342] Freeing drm_logo memory: 696K
[ 12.925085] Console: switching to colour frame buffer device 240x67

以上两个log位于"kernel/drivers/tty/vt/vt.c"中的do_bind_con_driver函数,因为是分多次打印一行信息的,所以用grep不好搜索出来。

static int do_bind_con_driver(const struct consw *csw, int first, int last,int deflt)
{...省略部分代码...pr_info("Console: switching ");if (!deflt)printk("consoles %d-%d ", first+1, last+1);if (j >= 0) {struct vc_data *vc = vc_cons[j].d;printk("to %s %s %dx%d\n",vc->vc_can_do_color ? "colour" : "mono",desc, vc->vc_cols, vc->vc_rows);if (k >= 0) {vc = vc_cons[k].d;update_screen(vc);}} elseprintk("to %s\n", desc);retval = 0;
err:module_put(owner);return retval;
};

在do_bind_con_driver中添加“dump_stack()”将堆栈打印出来,这样就可以看到调用关系。

[    2.843140] [<ffffff800808826c>] dump_backtrace+0x0/0x220
[    2.843147] [<ffffff80080884b0>] show_stack+0x24/0x30
[    2.843156] [<ffffff80084026ec>] dump_stack+0x94/0xbc
[    2.843163] [<ffffff80084cb8d0>] do_bind_con_driver+0x3c/0x318
[    2.843168] [<ffffff80084cbf34>] do_take_over_console+0x184/0x1c8
[    2.843176] [<ffffff8008472fbc>] do_fbcon_takeover+0x78/0xe0
[    2.843180] [<ffffff8008476940>] fbcon_event_notify+0x3f8/0x7d8
[    2.843186] [<ffffff80080b90c4>] notifier_call_chain+0x70/0x90
[    2.843191] [<ffffff80080b9548>] __blocking_notifier_call_chain+0x58/0x84
[    2.843197] [<ffffff80080b95b0>] blocking_notifier_call_chain+0x3c/0x4c
[    2.843202] [<ffffff8008492380>] fb_notifier_call_chain+0x30/0x3c
[    2.843207] [<ffffff8008493ad8>] register_framebuffer+0xa8/0x278
[    2.843215] [<ffffff80084f94b0>] drm_fb_helper_initial_config+0x17c/0x320
[    2.843221] [<ffffff80085444cc>] rockchip_drm_fbdev_init+0xe4/0x118
[    2.843228] [<ffffff8008529460>] rockchip_drm_bind+0x904/0x1930
[    2.843237] [<ffffff80085a617c>] try_to_bring_up_master.part.2+0xa0/0x114
[    2.843242] [<ffffff80085a62c4>] component_master_add_with_match+0xd4/0x12c
[    2.843248] [<ffffff8008528648>] rockchip_drm_platform_probe+0x244/0x260
[    2.843254] [<ffffff80085adee4>] platform_drv_probe+0x5c/0xb0
[    2.843259] [<ffffff80085abe20>] driver_probe_device+0x260/0x3d0
[    2.843263] [<ffffff80085abfe4>] __driver_attach+0x54/0xa0
[    2.843267] [<ffffff80085a9e58>] bus_for_each_dev+0x8c/0x9c
[    2.843272] [<ffffff80085ab724>] driver_attach+0x30/0x3c
[    2.843276] [<ffffff80085ab2f4>] bus_add_driver+0x1fc/0x240
[    2.843281] [<ffffff80085acbac>] driver_register+0xa0/0xd8
[    2.843286] [<ffffff80085ade28>] __platform_driver_register+0x58/0x64
[    2.843294] [<ffffff80090a1a1c>] rockchip_drm_platform_driver_init+0x1c/0x24
[    2.843299] [<ffffff80080830b8>] do_one_initcall+0x78/0x194
[    2.843306] [<ffffff8009070e04>] kernel_init_freeable+0x21c/0x220
[    2.843314] [<ffffff8008bf2920>] kernel_init+0x18/0x100
[    2.843318] [<ffffff8008082ef0>] ret_from_fork+0x10/0x20

这里可以利用在线的代码阅读网站对上面的过程进行追踪,其中“fbcon_event_notify”这个函数在一个“Framebuffer Console”的驱动中被发现,代码位于“drivers/video/console/fbcon.c”中。这个驱动会将屏幕设置成一个控制台输出,这也就是为啥logo显示一半就黑屏了,而且仔细观察会发现在黑屏的这段时间屏幕的左上角会有光标显示。找到这个驱动对用的控制宏CONFIG_FRAMEBUFFER_CONSOLE,在defconfig中将其注释掉,接下来logo的显示就正常了。

  1. 用自己的图片后显示的logo图片颜色不正常。
    第一种情况是kernel显示颜色异常,可以尝试修改kernel/drivers/gpu/drm/rockchip/rockchip_drm_drv.c,用下面两种情况的代码都试试。
        switch (bpp) {case 16:mode_cmd.pixel_format = DRM_FORMAT_BGR565;break;case 24:mode_cmd.pixel_format = DRM_FORMAT_BGR888;break;case 32:mode_cmd.pixel_format = DRM_FORMAT_XRGB8888;break;default:pr_err("%s: unsupport to logo bpp %d\n", __func__, bpp);return NULL;}
                switch (bpp) {case 16:mode_cmd.pixel_format = DRM_FORMAT_RGB565;break;case 24:mode_cmd.pixel_format = DRM_FORMAT_RGB888;break;case 32:mode_cmd.pixel_format = DRM_FORMAT_XRGB8888;break;default:pr_err("%s: unsupport to logo bpp %d\n", __func__, bpp);return NULL;}

第二种情况:在内核编译的时候如果判断到bmp图片头的6、7字节不是0xcf和0x20如果不是编译的时候会对图片做处理。详见脚本kernel/scripts/bmpconvert。可以尝试修改self.rb_swap=0,让不要转换图片,看看能否修改错误。编译过一次的图片6、7字节会被修改,所以不会跑到这个地方。

        self.rb_swap = 0if self.bfReserved1 != 8399 and self.biHeight > 0:self.reverse_bmp_data()print("reverse data at first time")if self.bfReserved1 != 8399:self.rb_swap = 0                #修改的地方print("swap bgr to rgb at first time")if self.force_revers:self.reverse_bmp_data()print("reverse data by force")if self.force_swap:self.rb_swap = 1print("swap rb by force'")if self.bfReserved1 == 8399:self.file.close()

RK3399开启开机logo相关推荐

  1. RK3399之开机Logo动画壁纸相关

    RK3399之开机Logo动画壁纸相关: https://notes.z-dd.net/2020/07/30/RK3399%E4%B9%8B%E5%BC%80%E6%9C%BALogo%E5%8A%A ...

  2. rk3399 u-boot修改开机logo以及开机动画和开机视频

    首先分析了一下uboot启动流程中的一部分代码,如下 第一部分:开机logo(下面代码分析排版有点乱,可以忽略) 1. ​ board_late_init //rk33xx.cboard/rockch ...

  3. RK3399开机LOGO替换及ADB的使用技巧

    本文硬件平台以飞凌嵌入式OK3399-C开发板(https://www.forlinx.com/product/rk3399-100.html)为基础进行讲解,其它RK3399产品,由于各个厂家设置不 ...

  4. linux内核开机显示企鹅logo,批改linux内核kernel开机logo(小企鹅)

    修改linux内核kernel开机logo(小企鹅) 修改linux内核kernel的开机图片(原为小企鹅图片). 转载请注明出处:http://blog.csdn.net/wang_zheng_ka ...

  5. 去掉linux开关机图片,在Deepin Linux系统下去掉NVIDIA开机Logo的方法

    要实现在deepin Linux或其他Linux系统下去掉NVIDIA开机Logo非常的简单,只需要两步就可以了,可以运用命令操作,也可手动操作.安装NVIDIA请参考在deepin系统中安装英伟达N ...

  6. WinCE开机Logo的实现(USB下载图片到nandflash)

    WinCE开机启动Logo使用Eboot读取NandFlash中的图片数据,然后显示的方式.对于开机logo的方式网友http://jazka.blog.51cto.com/809003/664131 ...

  7. Android开机logo修改方法

    一体机平台开机logo修改方法 1:修改Kernel中的Logo: 若是要替换Kernel中的开机Logo,只需要把内核目录drivers/video/logo下的logo_android_1024_ ...

  8. android 开机动画尺寸,Android开机Logo动画制作

    开机Logo制作 1.准备Logo图片 准备一张符合尺寸要求(例如:1280x720)的图片,最好是png或jgp. 2.用Hitool工具制作镜像文件 海思芯片使用的是Hitool工具,打开Hito ...

  9. Exynos4412开发板更换开机logo图片

    我以linux3.5内核为列子. 首先linux内核默认的开机logo在:linux3.5/drivers/video/logo/ 目录下的   logo_linux_clut224.ppm. 所以我 ...

最新文章

  1. layuiadmin上手好难_新手自学板绘先学SAI还是PS好?零基础绘画入门需知!
  2. poj3723Conscription
  3. java 开发人员工具_Java开发人员应该知道的5种错误跟踪工具
  4. ScaleAnimation动画
  5. word vba 打开弹出msgbox,每隔10秒刷新一次域值。
  6. 【1】TFTP软件的开发
  7. 企业信用评分卡模型概述
  8. 4G模块ME909S-821调试记录
  9. GPON(计算机网络相关)
  10. 深入学习jquery源码之高德地图组件的使用
  11. SAP License:仓库ERP系统
  12. 手机怎么申请邮箱?手机邮箱下载
  13. Python函数设计与使用
  14. MuiPlayer - 一款优秀的 H5 视频播放器框架
  15. php 连接已重置,[百思不得其解] Nginx 连接已重置 ERR_CONNECTION_RESET
  16. pdf文件有密码怎么解除
  17. DirectX12 3D游戏开发实践(龙书)第四章 Direct3D的初始化
  18. K12转向,高途们走到了十字路口
  19. 解决windows10网络数据使用量不统计问题以及任务管理器网络数据为0Mbps问题
  20. 文件对比8,单线程读,多线程对比,对比进度条,对比结果导出excel文件,已验收

热门文章

  1. 查找1-查找算法知识图谱
  2. 情人节挨打礼物-情侣头像自动生成
  3. mac qq怎么删除全部聊天记录
  4. 算法训练Day11|LeetCode 20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值
  5. PowerBulider使用Freeform風格數據顯示問題
  6. android 铃声管理器,android RingtoneManager 铃声管理器
  7. YOLOX-PAI:加速YOLOX,比YOLOV6更快更强
  8. Tomcat假死原因排查
  9. 反思 大班 快乐的机器人_大班音乐游戏:快乐的机器人
  10. linux 优先搜索树 pst,linux – PST到PDT的变化是4月1日而不是3月11日凌晨2点?