请教一下怎么把uboot中显示的logo保留到linux启动完成以后。
现在开机2~3秒显示一下logo,然后黑屏大概5秒左右知道我的程序开始显示内容。
我想让uboot中的logo一直显示下去,直到我的程序接管显示。请教大神如何处理,可以付费。
我用的全志的lichee系统,不是主线。(A33)
最近编辑记录 andrewgu (2021-01-01 23:29:50)
离线
请问V3s Simple Framebuffer 启动之后,就把uboot显示的图片给清理了,两秒黑屏才进入app, 有什么办法不让他清屏呢
http://whycan.com/t_4689.html#p46932
(出处:哇酷开发者社区【全志 V3S/F1C100s/X3】)
适合 simplefb驱动, 估计不适合drm驱动
离线
请问V3s Simple Framebuffer 启动之后,就把uboot显示的图片给清理了,两秒黑屏才进入app, 有什么办法不让他清屏呢
http://whycan.com/t_4689.html#p46932
(出处:哇酷开发者社区【全志 V3S/F1C100s/X3】)适合 simplefb驱动, 估计不适合drm驱动
谢谢,我学习一下。
离线
已经暴力解决。我经过调试以后发现,我这的问题是由于linux kernel启动的时候把uboot使用的framebuffer所在的内存释放了(mem_init->free_all_bootmem)。我尝试了多了方法进行了调整,均无效。最好强制修改了free_all_bootmem的代码,把framebuffer所在的页保留下来了。
离线
已经暴力解决。我经过调试以后发现,我这的问题是由于linux kernel启动的时候把uboot使用的framebuffer所在的内存释放了(mem_init->free_all_bootmem)。我尝试了多了方法进行了调整,均无效。最好强制修改了free_all_bootmem的代码,把framebuffer所在的页保留下来了。
可以分享一下吗?
离线
已经暴力解决。我经过调试以后发现,我这的问题是由于linux kernel启动的时候把uboot使用的framebuffer所在的内存释放了(mem_init->free_all_bootmem)。我尝试了多了方法进行了调整,均无效。最好强制修改了free_all_bootmem的代码,把framebuffer所在的页保留下来了。
我记得以前有大神解决方式是uboot传给kernel参数保留上几MB就好,因为fb的内存一般在末尾
离线
让uboot和kernel显示相同的内容不知道行不?
离线
分享一下修改代码:
修改文件linux-3.4/mm/bootmem.c中free_all_bootmem_core函数,其中有中文注解的部分是我加的代码。
static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata)
{
	struct page *page;
	unsigned long start, end, pages, count = 0;
	if (!bdata->node_bootmem_map)
		return 0;
	start = bdata->node_min_pfn;
	end = bdata->node_low_pfn;
	printk(KERN_NOTICE"nid=%td start=%lx end=%lx\n",
		bdata - bootmem_node_data, start, end);
	while (start < end) {
		unsigned long *map, idx, vec;
		map = bdata->node_bootmem_map;
		idx = start - bdata->node_min_pfn;
		vec = ~map[idx / BITS_PER_LONG];
		/*
		 * If we have a properly aligned and fully unreserved
		 * BITS_PER_LONG block of pages in front of us, free
		 * it in one go.
		 */
		if (IS_ALIGNED(start, BITS_PER_LONG) && vec == ~0UL) {
			int order = ilog2(BITS_PER_LONG);
			if(start==0x46400){ //保留uboot framebuffer所用的页面 andrew AICHIP 2021.1.2
				//因为我的屏幕是480*272的,所以保留BITS_PER_LONG*4就够了。
				count += BITS_PER_LONG*4;
				start += BITS_PER_LONG*4;
			}
			__free_pages_bootmem(pfn_to_page(start), order);
			count += BITS_PER_LONG;
			start += BITS_PER_LONG;
		} else {
			unsigned long off = 0;
			while (vec && off < BITS_PER_LONG) {
				if (vec & 1) {
					page = pfn_to_page(start + off);
					__free_pages_bootmem(page, 0);
					count++;
				}
				vec >>= 1;
				off++;
			}
			start = ALIGN(start + 1, BITS_PER_LONG);
		}
	}
	page = virt_to_page(bdata->node_bootmem_map);
	pages = bdata->node_low_pfn - bdata->node_min_pfn;
	pages = bootmem_bootmap_pages(pages);
	count += pages;
	while (pages--)
		__free_pages_bootmem(page++, 0);
	bdebug("nid=%td released=%lx\n", bdata - bootmem_node_data, count);
	return count;
}离线
这是修改以后的效果视频
离线
我记得SDK本身就不会黑啊
离线
我记得SDK本身就不会黑啊
我用的sinlinx的sdk,您还记得用的什么sdk吗?
离线
应该是可以等logo显示后把fb关掉,然后等开机后再打开fb
离线
应该是可以等logo显示后把fb关掉,然后等开机后再打开fb
每个人的情况可能不一样,我的情况应该是,linux kernel把uboot分配的显存给回收掉了。
离线