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

5 篇文章 0 订阅

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

硬件配置

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退出之后虽然数据没有消失,但是有可能已经在内核初始化的时候,被内存的数据覆盖了。所以需要使用比较靠后的空间,尽量避免被内核覆盖。

  • 1
    点赞
  • 12
    收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 2

打赏作者

青澜爸爸

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值