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) 开发指南》

相关推荐
小糖学代码7 小时前
LLM系列:1.python入门:3.布尔型对象
linux·开发语言·python
shizhan_cloud7 小时前
Shell 函数的知识与实践
linux·运维
Deng8723473487 小时前
代码语法检查工具
linux·服务器·windows
霍夫曼9 小时前
UTC时间与本地时间转换问题
java·linux·服务器·前端·javascript
月熊10 小时前
在root无法通过登录界面进去时,通过原本的普通用户qiujian如何把它修改为自己指定的用户名
linux·运维·服务器
大江东去浪淘尽千古风流人物11 小时前
【DSP】向量化操作的误差来源分析及其经典解决方案
linux·运维·人工智能·算法·vr·dsp开发·mr
赖small强12 小时前
【Linux驱动开发】NOR Flash 技术原理与 Linux 系统应用全解析
linux·驱动开发·nor flash·芯片内执行
IT运维爱好者13 小时前
【Linux】LVM理论介绍、实战操作
linux·磁盘扩容·lvm
LEEE@FPGA13 小时前
ZYNQ MPSOC linux hello world
linux·运维·服务器
郝学胜-神的一滴13 小时前
Linux定时器编程:深入理解setitimer函数
linux·服务器·开发语言·c++·程序人生