由于f1c系列的性价比,所以我选用了f1c做产品,但所有程序和硬件都做好时,突然想起了从u-boot启动到kernal出现1秒的花屏这个问题,这问题客户是百分百不能接受的,于是花了两天时间去解决这问题。
1。从u-boot的源代码 /drivers/video/sunix/sunix_display.c里找到sunxi_simplefb_setup这个函数,再往里面看找到
start = gd->bd->bi_dram[0].start;
size = gd->bd->bi_dram[0].size - sunxi_display.fb_size;
这两行代码説明,framebuffer的内存是放到总内存大小的最后,gd->bd->bi_dram[0].start,gd->bd->bi_dram[0].size这两个是Uboot从硬件里获取到的内存起始地址及大小。
于是在网上找资料,找了很多资料都説fb放到最后就不会被kernal覆盖掉。但奇怪了,fb已经在最后了为啥还是花屏。
2。直接今天看到/drivers/video/sunix/sunix_display.c, 里有这么一段话
/*
* Do not report the framebuffer as free RAM to the OS, note we cannot
* use fdt_add_mem_rsv() here, because then it is still seen as RAM,
* and e.g. Linux refuses to iomap RAM on ARM, see:
* linux/arch/arm/mm/ioremap.c around line 301.
*/
于是在网上再找资料,无意中看到一篇文章説用cat /proc/iomem查看kernal中占用的RAM空间,运行后,注意到80000000-83FFFFFF : System RAM
靠,这不是把fb干掉了,难怪花屏,然后按着文章试用在uboot的启动参数里加入memmap=1m$0x83EFFFFF,结果还是不行,试了好几个memmap方式都不行, 最后想了一吓反正kernal都是从0x80000000开始,我是否可以用mem=63M的参数限制kernal的RAM空间呢。抱着一丝的希望。结果成功了,启动不花屏了。
3。最后提醒大家,fb这个空间不一定是1M的,空间最小大小是按屏幕分辩率的,例如我的480x272的屏为例最小大小为480x272x4=510K,为了方便,我直接保留1M,还有,我的CPU是F1C200s,所以我的是mem=63M, 如果是100s那就应该是31M了。
本人写作水平有限,敬请见谅
最近编辑记录 wupaul2001 (2020-03-03 00:53:46)
离线
终于有人对这个问题动手了,这也是困扰了我很久的问题。感谢分享
不过内核的东西我了解很少,请问这里的“mem=63M“,是在uboot里设置的传递给kernel的参数的吗?就是修改uboot中的bootargs,加上这么一句?
离线
感谢分享
离线
及时雨, 感谢分享, 那个花屏我想了一个月都没想明白。
离线
感谢分享
离线
太棒了,等找到我的 tiny200 一定记得试一试
离线
终于有人对这个问题动手了,这也是困扰了我很久的问题。感谢分享
不过内核的东西我了解很少,请问这里的“mem=63M“,是在uboot里设置的传递给kernel的参数的吗?就是修改uboot中的bootargs,加上这么一句?
对的
离线
谢谢楼主分享,我f1c也有同样问题。不过我在玩a33主线Linux的时候,没有这个问题,我也没有去设置kernel的mem大小,为什么就没问题呢?按照一楼的思路,只要不保留高位地址就应该会出问题
离线
谢谢楼主分享,我f1c也有同样问题。不过我在玩a33主线Linux的时候,没有这个问题,我也没有去设置kernel的mem大小,为什么就没问题呢?按照一楼的思路,只要不保留高位地址就应该会出问题
不一定在启动参数,可以在设备树中保留, 可以修改ioremap保留,方法各式各样
离线
不一定在启动参数,可以在设备树中保留, 可以修改ioremap保留,方法各式各样
有可能,我查一下。
另外,在uboot中需要保留这个1MB吗?我看有人说需要设置CONFIG_SYS_MEM_TOP_HIDE
Continuity with Linux Boot Logo
If you want Linux to keep your U-Boot Logo during boot process, then some tweaks are needed:
define CONFIG_SYS_MEM_TOP_HIDE in U-Boot configuration file, here we reserve 2MBytes:
#define CONFIG_SYS_MEM_TOP_HIDE (2 << 20)
离线
有可能,我查一下。
另外,在uboot中需要保留这个1MB吗?我看有人说需要设置CONFIG_SYS_MEM_TOP_HIDE
Continuity with Linux Boot Logo
If you want Linux to keep your U-Boot Logo during boot process, then some tweaks are needed:
define CONFIG_SYS_MEM_TOP_HIDE in U-Boot configuration file, here we reserve 2MBytes:
#define CONFIG_SYS_MEM_TOP_HIDE (2 << 20)
Uboot本来就用这1M作为fb
离线
linux 的 device tree中加上
chosen {
simplefb_lcd: framebuffer-lcd0 {
compatible = "allwinner,simple-framebuffer",
"simple-framebuffer";
allwinner,pipeline = "de_be0-lcd0";
clocks = <&ccu CLK_BUS_LCD>, <&ccu CLK_BUS_DE_BE>,
<&ccu CLK_TCON>, <&ccu CLK_DE_BE>,
<&ccu CLK_DRAM_DE_BE>;
status = "okay";
};
};
然后把CONFIG_VIDEO_DT_SIMPLEFB打开后,发现正确预留了内存
# cat /proc/iomem
...
80000000-81e88fff : System RAM
80008000-805fffff : Kernel code
80700000-8075b493 : Kernel data
离线
感谢分享,试了下,还是楼主方式修改boot参数,加上mem=30M简单有效(我是f1c100s,800*480屏幕)
离线
这个是全志的官方支持吗?网上找不到资料,这里确是一堆不全的东西
离线
好文, 这个花屏纠结了很久,晚点试一试。
离线
由于f1c系列的性价比,所以我选用了f1c做产品,但所有程序和硬件都做好时,突然想起了从u-boot启动到kernal出现1秒的花屏这个问题,这问题客户是百分百不能接受的,于是花了两天时间去解决这问题。
1。从u-boot的源代码 /drivers/video/sunix/sunix_display.c里找到sunxi_simplefb_setup这个函数,再往里面看找到
start = gd->bd->bi_dram[0].start;
size = gd->bd->bi_dram[0].size - sunxi_display.fb_size;
这两行代码説明,framebuffer的内存是放到总内存大小的最后,gd->bd->bi_dram[0].start,gd->bd->bi_dram[0].size这两个是Uboot从硬件里获取到的内存起始地址及大小。于是在网上找资料,找了很多资料都説fb放到最后就不会被kernal覆盖掉。但奇怪了,fb已经在最后了为啥还是花屏。
2。直接今天看到/drivers/video/sunix/sunix_display.c, 里有这么一段话
/*
* Do not report the framebuffer as free RAM to the OS, note we cannot
* use fdt_add_mem_rsv() here, because then it is still seen as RAM,
* and e.g. Linux refuses to iomap RAM on ARM, see:
* linux/arch/arm/mm/ioremap.c around line 301.
*/
于是在网上再找资料,无意中看到一篇文章説用cat /proc/iomem查看kernal中占用的RAM空间,运行后,注意到80000000-83FFFFFF : System RAM
靠,这不是把fb干掉了,难怪花屏,然后按着文章试用在uboot的启动参数里加入memmap=1m$0x83EFFFFF,结果还是不行,试了好几个memmap方式都不行, 最后想了一吓反正kernal都是从0x80000000开始,我是否可以用mem=63M的参数限制kernal的RAM空间呢。抱着一丝的希望。结果成功了,启动不花屏了。3。最后提醒大家,fb这个空间不一定是1M的,空间最小大小是按屏幕分辩率的,例如我的480x272的屏为例最小大小为480x272x4=510K,为了方便,我直接保留1M,还有,我的CPU是F1C200s,所以我的是mem=63M, 如果是100s那就应该是31M了。
本人写作水平有限,敬请见谅
480x272 的屏 改成480x600 就可以了,mem 大于1M ,虽然笨方法,但是很有效,
离线
这不是浪费了1M?永远用不到了
离线
@wupaul2001
亲测可行,感谢大神分享!
离线
在设置mem=30M后 free -m 发现内存的total size也少了2m
感觉这个应该不是最优解
# cat /proc/iomem
01c00000-01c0002f : 1c00000.sram-controller
01c02000-01c02fff : 1c02000.dma-controller
01c05000-01c05fff : 1c05000.spi
01c0c000-01c0cfff : 1c0c000.lcd-controller
01c0f000-01c0ffff : 1c0f000.mmc
01c13000-01c133ff : usb@1c13000
01c13000-01c133ff : musb-hdrc.1.auto
01c13400-01c1340f : 1c13400.phy
01c20000-01c203ff : clock@1c20000
01c20800-01c20bff : 1c20800.pinctrl
01c23400-01c237ff : 1c23400.lradc
01c23c00-01c23fff : 1c23c00.codec
01c25000-01c2501f : serial
01c27000-01c273ff : 1c27000.i2c
01e60000-01e6ffff : 1e60000.display-backend
80000000-81ffffff : System RAM
80008000-807fffff : Kernel code
80900000-8096c34b : Kernel data
#
修改前的,看起来reserve是有的,等再找找问题
离线