rk3568 , openharmony3.2 , 8G , 无法启动

问题: 目前使用 openharmony 3.2 版本的 镜像 ,在8G的核心板上 ,烧写之后,屏幕没有画面。

报错如下:

现象如下:

1 uboot阶段是 有画面的。

2、命令行可以正常进入系统。

3、 但是 没有进入 鸿蒙的 Lancher 界面,一致卡在 uboot 阶段的logo 上。

软件说明: 烧写的是openharmony3.2 版本的 镜像, 这个镜像 是公司 移植过的,在2G 内存的版本上 是可以正常运行的。也可以进入 lancher .

硬件说明: 3568 8G核心板, + 底板。

解决问题的总体逻辑: 看来是 rga 的错误, 这应该是 一个 关于 系统层的错误。

看看网上的资料,这份资料非常的重要。

总结:

1 、 这个说明 已经 非常具体了。连文档的 具体位置 都只出来了。

2、 原因就是 , RGA的问题,看来 ,对于 RGA的 的使用 内存 必须在 4G范围之内, 那为什么 类似 debian 之类的 linux 系统没有这个问题呢? 估计 要么没有用到RGA ,要么使用的时候 ,申请的内存在 4G以内。

3、 他的处理方式是 直接 将 8G内存 设置为 4G。 我也使用这种方式。

疑问: 那么有没有 一种方式,既可以解决这个问题,又可以使用8G的内存呢?

再来看看 这个资料 :

接下里 就是 我自己的操作了。

首先我 烧写了一下 2G 版本的镜像, 熟悉了一下流程。

然后, 由于 openharmony 源码中没有 uboot 的源码 ,所以 应该不涉及 鉴权的问题。

我改 uboot 的话,就直接 拿 3568 linux 源码中的 uboot 进行编译,编译出镜像 之后,然后 替换要烧写的 这个 uboot 镜像 就行。

文件路径:u-boot/arch/arm/mach-rockchip/param.c

我改的是这个地方:

 struct memblock *param_parse_ddr_mem(int *out_count)
264 {
265         struct udevice *dev;
266         struct memblock *mem;
267         struct ram_info ram;
268         int i, ret, count;
269
270         /*
271          * Get memory region of DDR
272          *
273          * 1. New: atags info;
274          * 2. Leagcy: os register;
275          */
276 #ifdef CONFIG_ROCKCHIP_PRELOADER_ATAGS
277         struct tag *t;
278         u64 base, size;
279         int n;
280
281         t = atags_get_tag(ATAG_DDR_MEM);
282         if (t && t->u.ddr_mem.count) {
283                 /* extend top ram size */
284                 if (t->u.ddr_mem.flags & DDR_MEM_FLG_EXT_TOP)
285                         gd->ram_top_ext_size = t->u.ddr_mem.data[0];
286
287                 /* normal ram size */
288                 count = t->u.ddr_mem.count;
289                 mem = calloc(count + MEM_RESV_COUNT, sizeof(*mem));
290                 if (!mem) {
291                         printf("Calloc ddr memory failed\n");
292                         return 0;
293                 }
294
295                 for (i = 0, n = 0; i < count; i++, n++) {
296                         base = t->u.ddr_mem.bank[i];
297                         size = t->u.ddr_mem.bank[i + count];
298
299
300
301         //topeet wang added
302                         base =0;
303                         size = 0xFFFFFFFF;
304         //topeet wang end
305         //
306         //
307                         /* 0~4GB */
308                         if (base < SZ_4GB) {
309                                 mem[n].base = base;
310                                 mem[n].size = ddr_mem_get_usable_size(base, size);
311                                 if (base + size > SZ_4GB) {
312                                         n++;
313                                         mem[n].base_u64 = SZ_4GB;
314                                         mem[n].size_u64 = base + size - SZ_4GB;
315                                 }
316                         }
317
318         //topeet wang added
318         //topeet wang added
319         //topeet wang added             } else {
320         //topeet wang added                     // 4GB+
321         //topeet wang added                     mem[n].base_u64 = base;
322         //topeet wang added                     mem[n].size_u64 = size;
323         //topeet wang added             }
324
325                         assert(n < count + MEM_RESV_COUNT);
326                 }
327
328                 *out_count = n;
329                 return mem;
330         }
331 #endif
332
333         /* Leagcy */
334         ret = uclass_get_device(UCLASS_RAM, 0, &dev);
335         if (ret) {
336                 debug("DRAM init failed: %d\n", ret);
337                 return NULL;
338         }
339         ret = ram_get_info(dev, &ram);
340         if (ret) {
341                 debug("Cannot get DRAM size: %d\n", ret);
342                 return NULL;
343         }
344
345         debug("SDRAM base=%lx, size=%lx\n",
346               (unsigned long)ram.base, (unsigned long)ram.size);
347
348         count = 1;
349         mem = calloc(1, sizeof(*mem));
350         if (!mem) {
351                 printf("Calloc ddr memory failed\n");
352                 return 0;
353         }
354
355         for (i = 0; i < count; i++) {
356                 mem[i].base = CONFIG_SYS_SDRAM_BASE;
357                 mem[i].size = ddr_mem_get_usable_size(mem[i].base, ram.size);
358         }
359
360         *out_count = count;
361         return mem;
362 }

改完之后 编译uboot + 单独烧写 uboot 。

系统可以启动 + 可以进入 鸿蒙的lancher .

参考资料:

8G内存版本的Dayu200烧录OH4.x后开机异常_rk3568 config.cfg-CSDN博客

dayu200替换DDR硬件内存为8G后OpenHarmony-3.2-Release不能正常显示界面,无法正常启动应用_AlgoIdeas-Laval社区

《U-Boot v2017(next-dev) 开发指南》

相关推荐
jerry-892 分钟前
通过配置核查,CentOS操作系统当前无多余的、过期的账户;但CentOS操作系统存在共享账户r***t
linux
涛ing1 小时前
21. C语言 `typedef`:类型重命名
linux·c语言·开发语言·c++·vscode·算法·visual studio
0xfather1 小时前
在Debian系统中安装Debian(Linux版PE装机)
linux·服务器·debian
workingman_li1 小时前
centos虚拟机异常关闭,导致数据出现问题
linux·运维·centos
Fireworkitte2 小时前
linux环境变量配置文件区别 /etc/profile和~/.bash_profile
linux
Jackson~Y2 小时前
Linux(LAMP)
linux·运维·服务器
不知 不知2 小时前
最新-CentOS 7安装1 Panel Linux 服务器运维管理面板
linux·运维·服务器·centos
花糖纸木5 小时前
【Linux】深刻理解动静态库
linux·运维·服务器
运维实战课程5 小时前
docker安装elk6.7.1-搜集nginx-json日志
linux·运维·服务器
运维实战课程5 小时前
docker安装elk6.7.1-搜集java日志
linux·运维·服务器