uboot logo 保持到 kernel或者说延迟logo的显示

本文档详细介绍了如何在imx6ul单核A7平台上实现开机Logo显示的过程。主要内容包括:修改uboot内的帧缓冲区地址、logo分区与烧录、通过cmdline传递fb地址给kernel、在kernel中获取并显示logo数据。

方案参考了天外之客大佬的博文

硬件配置

imx6ul 单核A7
256m 内存
256m nandflash


任务清单

  1. 修改uboot内fb获取的地址。
  2. 修改uboot内的logo。
  3. 将fb内存地址传递给kernel
  4. 在kernel中获取到logo的数据。
  5. kernel显示logo

修改uboot内fb获取的地址

/driver/video/mxsfb.c
在vidoe_hw_init()中,uboot 申请了fb的空间,但是在这里我们需要一个比较靠后的地址(原因见注1)。在这里使用了

void *memalign(size_t alignment, size_t size)

The obsolete function memalign() allocates size bytes and returns a pointer to the allocated memory. The memory address will be a multiple of alignment, which must be a power of two.
alignment必须是2的次方,并且最后的返回的地址是alignment的倍数。
所以我选择了增大了alignment。但由于我在修改前没有打印出来数据,所以我并不知道到底这一下管不管用,但是我写上了。

这个相对比较简单,直接对nandflash进行分区流出一个logo的分区。
将图片用mfgtools烧入nand logo分区。
在uboot中 nandread 到内存
然后可以用splashimage进行显示,注意设置splashpos,来确定是否在水平方向和垂直方向的位置。

将fb内存地址传递给kernel

通过cmdline的方法传递数据,将fb的物理地址存入cmdline,然后传递给kernel

在kernel中获取到logo的数据

为了数据不受污染,我在屏幕硬件初始化的时候就把图像数据进行了备份。
这块表示不是很理解,我现在用的内存比较小256m,那么是不是所有的物理内存都映射到了内核空间?是不是
256m,已经就是意味着3g—-3g+256m的空间?现在的理解是这样,请哪位懂得教育一下。
cmdline传来了fb的物理地址,再通过phys_to_virt将物理地址转为可以访问的虚拟地址。然后马上把数据进行保存,防止后面数据污染该区域。

这个相对来说比较常规。
屏蔽了小企鹅,然后通过重写了
struct fb_ops mxsfb_ops 内的 fb_imageblit,把指针指向自己写的函数,不再使用内核的函数。
在该函数内,获取fb的地址和大小,然后将保存的数据刷入kernel的fb内。


这样就完成啦

注1:
在uboot中的申请的内存空间,在uboot退出之后虽然数据没有消失,但是有可能已经在内核初始化的时候,被内存的数据覆盖了。所以需要使用比较靠后的空间,尽量避免被内核覆盖。

<think>嗯,用户的问题是关于MT6835开机不显示uboot logokernel logo的解决方案。用户提供了几个引用资料,我需要仔细分析这些信息并结合MTK平台通用调试方法给出解决方案。 用户给出的引用[1]和[2]详细说明了Android开机logo显示机制,分为uboot logokernel logo两个阶段。引用[3]提到了修改uboot logo的具体代码位置,引用[4]则描述了preloader加载uboot的流程。这些信息都很关键。 从技术角度看,开机logo显示可能有几个关键原因:首先是图片文件本身的问题,比如格式或路径错误;其次是显示驱动初始化失败;还有可能是显示时序配置不当。用户特别提到MT6835平台,这个平台和之前引用的MT6765/MT6763应该有很多相似之处。 我注意到引用[2]中提到的代码位置很有参考价值,虽然路径是mt6765,但MT6835的代码结构应该类似。特别是cust_display.h这个配置文件很重要,它决定了uboot阶段是否开启logo显示功能。另外mt_logo.c这个文件负责实际加载图片,需要重点检查。 考虑到用户可能正在做底层开发,我会提供具体的代码检查点和调试步骤。比如建议用户先确认CFG_ENABLE_LOGO宏是否开启,再检查图片资源是否编译进镜像。还会提醒时序参数的重要性,因为即使图片加载成功,如果刷新率或分辨率设置错误,屏幕也可能无显示。 用户没有说明具体开发阶段,但既然是调试开机logo,应该是系统工程师或驱动开发人员。因此回复要包含技术细节,比如如何dump内存验证图片加载、如何检查framebuffer初始化状态等。同时要注意避免太专业的术语,毕竟用户可能正在焦头烂额地调试。 最后要给出清晰的排查步骤:从配置开关检查开始,到图片格式验证,再到驱动初始化状态确认,最后是时序参数调试。这样用户就能按顺序排查问题。另外补充常见陷阱,比如忘记make clean导致旧图片残留,这个细节很容易被忽略。 </think>针对MT6835开机不显示uboot logokernel logo的问题,综合引用资料和MTK平台通用调试方法,解决方案如下: --- ### **核心排查步骤** #### 1. **确认LOGO配置开关** - 检查`ProjectConfig.mk`中的关键配置项: ```makefile MTK_BOOTLOGO_SUPPORT = yes # 必须开启 CFG_ENABLE_LOGO = 1 # uboot显示开关 ``` - 验证`cust_display.h`是否启用LOGO支持: ```c #define CFG_ENABLE_LOGO 1 // 确保定义为1 ``` *引用位置与MT6765类似(见引用[2])* #### 2. **验证图片资源状态** - **路径检查** 确认LOGO图片路径正确(通常位于`vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo`) - **格式要求** 图片必须为 **未压缩的RGB565位图**(`.bmp`),分辨率需与屏参一致 - **编译验证** 检查编译日志,确认LOGO图片被正确打包进`boot.img`: ```bash pack_bootimages: LOGO binary found at vendor/.../logo.bin ``` #### 3. **驱动初始化诊断** - 在`mt_logo.c`**添加调试日志**,确认代码执行流程: ```c void display_logo() { printf("[LOGO] Enter display_logo\n"); // 添加日志 ... if (logo_load_success) printf("[LOGO] Image loaded at 0x%x\n", fb_addr); else printf("[LOGO] Load failed!\n"); // 失败定位 } ``` - 检查`platform.c`中**显示驱动初始化**: ```c void platform_init(void) { ... display_init(); // 必须调用 } ``` #### 4. **时序参数校准** - 在`cust_display.h`检查**屏幕时序参数**是否与硬件匹配: ```c #define FRAME_WIDTH 1080 // 实际屏幕宽度 #define FRAME_HEIGHT 2400 // 实际屏幕高度 #define VSYNC_WIDTH 10 // 同步信号脉宽 ``` *参数错误会导致信号无法输出(引用[2]时序配置)* #### 5. **硬件级排查** - **背光控制**:测量背光电路电压,确认PWM信号是否使能 - **信号探测**:用示波器检查MIPI-DSI时钟信号,确认数据传输 - **替换测试**:尝试显示纯色块(非LOGO图片)验证硬件通路: ```c fill_screen(0xFFFF); // 填充白色测试 ``` --- ### **常见问题根源** 1. **图片格式错误** - 使用Photoshop另存为时勾选`16位RGB565`,禁用Alpha通道 2. **屏参配置冲突** - 核对`cust_display.h`与LCM规格书(重点检查`lcm_params`) 3. **内存地址越界** - 确认LOGO加载地址在FB分配范围内(`mt_logo.h`中`FB_START_ADDR`) 4. **编译版本残留** - 执行`make clean`后重新编译,避免旧配置干扰 > **调试建议**:通过串口日志观察启动流程,若出现`[LOGO] Enter display_logo`但无后续输出,重点检查图片加载函数;若函数未进入,则排查初始化流程是否被跳过。 --- ### **进阶排查工具** | 方法 | 命令/操作 | 作用 | |-----------------------|-----------------------------|--------------------------| | **LK阶段日志** | `dmesg | grep "display"` | 过滤显示初始化日志 | | **内存地址dump** | `adb shell dd if=/proc/fb` | 导出帧缓存分析内容 | | **LK调试模式** | 修改Makefile添加`-g`编译选项 | 允许JTAG单步调试 | ---
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值