Skip to main content

小核开机动画

一、概述

​ 本文以PD_X2600_VAST_V2.0开发板为例,需要使用开发板配套的LCD屏(型号:lcd_fw050)、串口小板、数据线

1.1 X2600大小核是什么?

​ x2600的Xburst-2 core 主频⾼达1.2GHz, 存在32KB I-Cache以及256KB 的⼆级cache, 性能强, 主频⾼, 可泛称为⼤核 ​ x2600的RISC-V核⼼ 主频为⼤核⼆分频,存在16KB I-Cache,使⽤riscv指令集,可读写DDR内存, 外设总线结构如下:

1

==x2600 RISC-V核⼼可泛称为小核==, 本文使用x2600 riscv 小核的特点:快速启动实时性⾼软件开发简单能调用片上外设资源

1.2 小核开机播放动画的目的

​ x2600芯片上电开机在系统启动到应用正常运行前需要等待一段时间,固件越大需要等待的时间就越久 ​ 芯片快速启动方案可以在这段等待时间中让外设先工作起来(如LCD显示logo),x2600有双核CPU可以跑双系统,在uboot SPL阶段同时启动大小核,在大核启动系统到应用运行的这段时间,小核系统已经运行起来可以执行了,这样芯片开机不需要过多等待系统初始化就可以让小核控制屏幕显示动画&logo,或者其他外设工作直到衔接到大核系统应用运行起来。

1.3 小核开机动画启动方案原理

2

方案实现原理:

  • 大小核原理:双核双系统运行
  • 动画播放原理:H264解码、FB显控
  • 大核H264、FB资源接管原理:驱动初始化由应用层触发
  • 大核等待小核通知原理:mailbox实现大小核通信
  • 大核继承小核FB配置原理:SHARE_MEM_MB 预留内存
  • 小核运行memory原理:RTOS_SIZE_MB 或 reserved_memory 预留内存
  • 小核运行内存回收原理:RMEM_MB 预留内存

启动方案总结 spl阶段启动RISCV小核,大小核同时运行

小核:1.初始化H264解码、LCD、FB控制器,保存FB配置参数到 预留内存SHARE_MEM_MB 2.解码一份嵌入的h264文件并显示,释放H264解码、FB资源 3.大小核通信,通知大核开机动画播放结束,停止运行

大核:1.加载kernel内核并启动,加载rootfs文件系统 2.执行系统初始化流程,驱动加载等初始化操作 ->等待小核通知开机动画结束 3.收到小核通知后或等待超时,触发H264解码、FB驱动的初始化 4.执行其他初始化操作,小核运行memory为RTOS_SIZE_MB则回收小核运行内存,正常运行

二、小核开机动画启动方案具体实现

2.1 双核双系统启动


3

​ 如上图所示,是在SPL阶段做了控制,芯片启动到SPL阶段时让小核运行起来,在uboot是通过宏定义==CONFIG_SPL_MCU_RTOS_BOOT==进行控制的

4

在大核工程uboot路径下的boards.cfg 配置表中,找到工程对应的编译配置,加上

SPL_MCU_RTOS_BOOT
# SPL_MCU_RTOS_BOOT 在spl阶段启⽤⼩核

2.2 大核H264解码、FB资源接管 - 驱动初始化由应用层触发


​ 由于小核在播放动画时需要使用片上的h264解码器、LCD和FB控制器资源,所以在大核加载驱动的时候,H264、FB驱动可以先加载但不能操作,需要等待小核播放完动画释放资源后,大核才能接管H264、FB资源进行操作,所以驱动的初始化操作在大核接管后由应用层触发。

驱动是否应用层触发由工程配置决定,勾选对应选项即可,具体实现如下: FB驱动:

5

6

H264驱动:

7

2.3 大小核通信 - 大核等待小核通知动画播放结束


​ 目前大小核通信主要通过两块环形缓冲区(读、写)来实现,这块内存由小核申请(默认为读写都为256字节) 大小核通过对这块环形缓冲去进行轮询读写实现双方的通信

8

9

小核播放动画结束通知大核接管


​ 使用小核播放开机动画,需要在vendor.c文件中调用example/fb_h264_boot_animation_example.c文件中boot_animation_example() 按照使用的LCD屏和FB配置修改开机动画文件中的视频宽高、嵌入的开机动画H264文件、显示使用的fb图层(默认fb1)

  • VIDEO_WIDTH、VIDEO_HEIGHT:是H264动画视频的分辨率大小,按照使用LCD屏的分辨率选择合适的H264视频文件

10

在解码显示完开机动画后释放资源,然后通知大核接管

11

12

大核等待小核播放动画结束 - 接管H264、FB资源并触发驱动初始化


​ 使用小核播放开机动画,需要在大核系统初始化流程中加上S30wait_mcu_boot_antimation脚本

13

2.4 大核继承小核的FB配置实现


FB配置: 小核:根据大核的应用场景配置所需要使用的数据链路、fb图层以及帧数,设置SHARE_MEM_MB的大小 大核:不手动配置,使用小核的fb配置

继承原理: 通过预留内存的方式,预留出独有于FB驱动可用的内存空间SHARE_MEM,小核初始化FB需要申请的内存都在SHARE_MEM申请,也把FB配置参数、状态保存起来。大核的fb驱动加载初始化时,就可以继承SHARE_MEM中保存的FB配置、状态,就不需要再重新初始化fb控制器和申请内存了。

14

SHARE_MEM内存大小的计算方式:

举例:LCD分辨率为720*1280,只使用fb0一帧,则SHARE_MEM_MB = 720 * 1280 * 4 * 1 + 4096 = 3.52 MB 取整等于 4 MB 4:一个像素点占用的字节数 4096:小核保存fb配置占用的字节数 注:若使用rotator输出图像,则LCD一帧申请的内存大小需要512字节对齐

在uboot是通过==SHARE_MEM_MB==来定义这块预留内存,在大核工程uboot路径下的boards.cfg 配置表中找到工程对应的编译配置,加上

SHARE_MEM_MB=16
# SHARE_MEM_MB=16 分配16M的内存给LCD

2.5 不同应用场景下的小核memory配置


​ 小核运⾏时需要空间, ⼜小核不存在ROM, 但可读写操作内存, 故需要在linux内为其分配⼀块内存不与其他核产⽣冲突。已知Linux⽬前存在预留内存 RMEM_MB,RTOS_SIZE_MB,SHARE_MEM_MB,解码用到的reserved_memory 其在内存中分布及代码如下,根据大核的应用场景来选择如何分配小核memory配置

15

有H264解码预留内存的情况


​ 在需要H264解码的应用场景下,在工程的kernel配置中有配置预留内存用于h246解码。小核跑开机动画时,因为解码的felix驱动初始化是由应用层触发的,所以这块预留内存比较特殊在应用层触发前不会被使用。 ​ 应用层触发的操作又是在小核动画播放结束后才进行的,所以解码预留的内存可以先作为小核memory让小核工作运行,大核接管时小核已经运行结束了,接下来就由大核继续使用解码预留内存。从而省下额外为小核预留内存资源,避免小核运行结束后无法回收造成的内存资源浪费。

根据不同工程kernel配置中解码预留内存的地址、大小,设置小核memory选项的实际分配

16

17

无H264解码预留内存的情况

在没有H264解码需求的情况下,那就需要额外为小核预留内存资源。⽬前运⾏小核不会⽤到RTOS_SIZE_MB, 故可将小核起始地址设置在RTOS_SIZE_MB内, 且小核镜像⼤小不超过RTOS_SIZE_MB边界即可。 ​ 在uboot是通过==RTOS_SIZE_MB==来定义这块预留内存,根据工程uboot对应的编译配置在boards.cfg 配置表找到工程对应的编译配置,加上

RTOS_SIZE_MB=32 #预留分配32M⽀持⼩核运⾏

​ 小核在运行完开机动画后就会结束运行,由于这块内存是预先保留下来给小核memory使用,无法被kernel内核回收。为了避免内存资源的浪费,如果工程uboot编译配置中有RMEM_MB配置,可以在大核配置工具中勾选【回收rtos_size到rmem内存】选项,当小核运行结束后大核就会自动将RTOS_SIZE_MB释放回收到RMEM_MB.

18

三、小核跑开机动画使用-大小核的配置流程

3.1 uboot配置


在工程uboot路径下的boards.cfg 配置表中,找到工程对应的编译配置,加上

SPL_MCU_RTOS_BOOT, SHARE_MEM_MB=16 ,RTOS_SIZE_MB=32,RMEM_MB=8
# SPL_MCU_RTOS_BOOT 在spl阶段启⽤⼩核
# SHARE_MEM_MB=16 分配16M的内存给LCD的FrameBuffer
# RTOS_SIZE_MB=32 根据实际情况选择RTOS_SIZE_MB为小核memory
# RMEM_MB=8 分配8M的内存给kernel中的rmem使用

3.2 kernel配置


配置H264解码驱动的初始化由应用层触发,在工程路径下的kernel/kernel目录终端下打开菜单界面

make menuconfig

找到并勾选上 【felix init triggered by user】选项,保存配置

路径:Ingenic device-drivers Configurations ---> [VPU] Drivers ---> felix init triggered by user

19

3.3 IConfigTool工程配置-大核


使用小核开机动画需要勾选以下选项,其他配置根据大核的实际情况配置

  • LCD外设配置(RST复位引脚、背光控制引脚、电源控制引脚) 20

    21

    22

  • FrameBuffer驱动 选择lcd配置方式为【使用 rtos 相同配置】,驱动初始化由应用层触发 23

  • fb_layer_mixer驱动初始化由应用层触发 24

  • mcu(片内riscv mcu)驱动 25

  • 开机等待riscv小核播放开机动画 26

  • mcu shell命令 27

  • RMEM shell命令(若小核memory使用RTOS_SIZE_MB配置28

  • 勾选完成后,保存配置

3.4 IConfigTool工程配置-小核


​ 使用小核开机动画,需要勾选以下配置

  • 根据情况设置小核的memory选项 1.有h264解码的情况29

    30

    2.无h264解码的情况

    31

    32

  • h264硬件解码驱动 33

  • 同大核LCD型号相同的LCD驱动 34

    35

  • 根据大核需求配置小核的FrameBuffer驱动,并勾选FB继承 36

    37

  • 勾选图像格式转换convert_yuv_to_rgb 39

  • 工程目录/libmcu/vendor/vendor.c文件中使用播放开机动画的example,修改LCD显示(默认fb1)h264动画文件 40

  • 勾选完成后保存配置,代码修改后保存

四、编译与烧录

4.1 固件编译


大核固件的编译,打开工程目录/build 路径下终端使用以下命令:

make 工程名称  # 选择要编译的工程
make # 编译

小核固件的编译,打开 工程目录/libmcu 路径下终端使用以下命令:

export PATH=$PWD/../tools/toolchains/riscv-victory0-r1.0.1/bin:$PATH   #将riscv 工具链添加到环境变量
make 小核工程名称 # 选择要编译的工程
make # 编译

4.2 固件烧录


大核固件烧录,打开烧录工具进行分区信息和固件地址的配置:

41

42

除了在烧录工具内配置外还需在uboot内s加上CONFIG_SPL_MCU_RTOS_BOOT宏定义 打开烧录工具进行分区信息和固件地址的配置:

43

44

要烧录的固件配置好后,保存烧录配置,点击开始就可以进行烧录了

烧录⽅法: 点击软件开始, 按住开发板BOOT键不放, 开发板重新上电或者按reset 键复位开发板

45