在嘉楠K230上快速启动原神

好久没更新文章了,为了给东家的芯片打个广告,百闲之中抽时间写个软文,做下宣传。首先K230是一个面向端侧和边缘市场的AIOT芯片,双核异构,大核频率最高1.6GHz,板载内存最大2GB,这个配置移植个安卓然后运行原神看起来是痴心妄想了,所以我们只能换个思路,把启动动画摘出来作为开机视频播放,进而模拟一个启动效果。当然了我们需要先到github下载官方的sdk。https://github.com/kendryte/k230_sdk

现在我们先做一些准备工作,比如先看看已有的开源资源能不能帮我们实现这个目标。首先我们非常聪明的找到了一份官方的指导文档《K230_图像实战_开机视频和开机logo》看起来可以实现我们的目的。根据文档的描述内容使用一个sample_vdec.elf的可执行程序,可以帮助我们播放一个视频。当然了根据程序的名字我们也能猜到,这其实是一个解码的程序,只能够播放视频码流,并不能直接播放mp4文件。 

MP4(MPEG-4 Part 14)是一种常见的多媒体容器格式,用于存储音频、视频、字幕和其他多媒体数据。它是由国际标准化组织(ISO)定义的。MP4文件可以使用多种编码方式来压缩音视频数据,其中之一就是H.264编码。

H.264,也称为AVC(Advanced Video Coding),是一种视频压缩标准。它是由国际电信联盟(ITU)和国际标准化组织(ISO)共同制定的。H.264编码技术可以有效地压缩视频数据,提供较高的图像质量,并在相对较低的比特率下实现高效的视频传输。 

简而言之,言而简之,H264算是MP4里的一部分,包含了MP4里的视频信息,我们这个sample_vdec播放的是H264而不是mp4文件。所以我们需要先得到一个H264的视频素材。接下来

  • 第一步:我们使用手机录屏得到一个1080P的视频素材

  • 第二步:把视频素材上传到PC

  • 第三步:使用ffmpeg得到一个H264文件

    ffmpeg -i yuanshen.mp4 -c copy yuanshen.h264

好了现在素材有了,我们按照文档描述,修改rt-smart的init.sh脚本内容/bin/sample_vdec -i /bin/yuanshen.h264, 然后把视频文件和sample_vdec.elf统统拷贝到大核rt-smart的userapps/root/bin下面,重新编译SDK。编译好的镜像重新烧写到SD卡,插卡上电启动即可。

好了,事情到这里似乎就结束了,but我们实际启动的时候会发现它好像还是慢了一丢丢,当我拨下电源开关总是要等那么几百毫秒似乎,完全不够丝滑。那我们如何进一步优化呢?

首先我们刚才是用SD卡烧写的镜像,sd卡的初始化以及速度都是比较慢的,当然了好处是它可以做得足够大。事实上软件层面我们已经使用了大核rt-smart这样的操作系统,还默认编译了嘉楠提供的快启配置,所以此时我们要进一步提升启动速度,那么就要先摒弃掉SD卡,改用flash启动。事实上我希望能在datasheet上找到spi和sdio接口的performance描述来证明我的说法,很可惜暂时没找到。不过一般的常识性知识来说,嵌入式端存储设备的速度对比nor flash > nand flash > emmc > sd卡

k230_sdk中flash启动是经过特殊处理的,由于板载的flash大小只有32M,所以在默认的编译脚本中会对整个镜像做裁剪。其裁剪流程参考脚本board/common/gen_image_script/gen_image_comm_func.sh中的gen_image_spinor()函数。sdk本身对flash存储的内容做了分区

# spi nor cfg param partion config
#
CONFIG_SPI_NOR_QUICK_BOOT_CFG_BASE=0x200000
CONFIG_SPI_NOR_QUICK_BOOT_CFG_SIZE=0x80000
# CONFIG_SPI_NOR_QUICK_BOOT_CFG_SUPPORT_BAKEUP is not set
CONFIG_SPI_NOR_FACE_DB_CFG_BASE=0x280000
CONFIG_SPI_NOR_FACE_DB_CFG_SIZE=0x10000
# CONFIG_SPI_NOR_FACE_DB_CFG_SUPPORT_BAKEUP is not set
CONFIG_SPI_NOR_SENSOR_CFG_CFG_BASE=0x290000
CONFIG_SPI_NOR_SENSOR_CFG_CFG_SIZE=0x40000
CONFIG_SPI_NOR_AI_MODE_CFG_BASE=0x300000
CONFIG_SPI_NOR_AI_MODE_CFG_SIZE=0x700000
CONFIG_SPI_NOR_SPECKLE_CFG_BASE=0xa00000
CONFIG_SPI_NOR_SPECKLE_CFG_SIZE=0x10000
CONFIG_SPI_NOR_RTT_APP_BASE=0xd00000
CONFIG_SPI_NOR_RTT_APP_SIZE=0x2c0000

分别是快启配置,人脸数据,sensor参数,ai模型,散斑,大核程序这些分区。我们的目标就是把我们的解码程序放到大核程序这个分区,把码流文件放到ai模型分区当做程序的参数文件使用。根据模型的大小和码流文件的大小我们在sdk目录下使用make menuconfig重新配置flash分区以及加载的ddr位置。

#
# Memory configuration
#
CONFIG_MEM_TOTAL_SIZE=0x20000000
CONFIG_MEM_IPCM_BASE=0x00100000
CONFIG_MEM_IPCM_SIZE=0x00100000
CONFIG_MEM_RTT_SYS_BASE=0x00200000
CONFIG_MEM_RTT_SYS_SIZE=0x07E00000
CONFIG_MEM_MMZ_BASE=0x10000000
CONFIG_MEM_MMZ_SIZE=0x0FC00000
CONFIG_MEM_LINUX_SYS_BASE=0x08000000
CONFIG_MEM_LINUX_SYS_SIZE=0x08000000
​
#
# spi nor cfg part configuration
#
CONFIG_MEM_QUICK_BOOT_CFG_BASE=0x00000000
CONFIG_MEM_QUICK_BOOT_CFG_SIZE=0x00040000
CONFIG_MEM_SENSOR_CFG_BASE=0x00040000
CONFIG_MEM_SENSOR_CFG_SIZE=0x000c0000
CONFIG_MEM_AI_MODEL_BASE=0x1F000000
CONFIG_MEM_AI_MODEL_SIZE=0x01000000
CONFIG_MEM_FACE_DATA_BASE=0x14000000
CONFIG_MEM_FACE_DATA_SIZE=0x00040000
CONFIG_MEM_SPECKLE_BASE=0x14040000
CONFIG_MEM_SPECKLE_SIZE=0x01000000
CONFIG_MEM_RTAPP_BASE=0x18000000
CONFIG_MEM_RTAPP_SIZE=0x8000000
CONFIG_MEM_BOUNDARY_RESERVED_SIZE=0x00001000

观察DDR的配置,可以发现AI模型和RTAPP使用的内存区域与MMZ的内存区域重合,这是SDK为了节约内存做的特殊设计,rt-smart大核使用的是romfs,uboot在启动是会将AI模型和大核程序加载到指定的内存地址。而romfs则将自己的文件位置也指向这块固定地址。同时这块mmz内存区域是多媒体设备和AI引擎运气时所需要使用的地址,rt-smart在动态加载程序时并不需要这块地址,所以我们可以对这块地址进行复用,这样做的好处是可以节省内存,坏处是程序运行后如果使用了mmz区域,那么romfs中原先指向的保存程序的内存区域就会被破坏,程序退出后无法再运行第二次了。

/*src/big/rt-smart/kernel/bsp/maix3/applications/romfs.c*/
const static struct romfs_dirent _bin[] = {
  {ROMFS_DIRENT_FILE, "init.sh", _bin_init_sh, sizeof(_bin_init_sh)},
  {ROMFS_DIRENT_FILE, "test.kmodel", (char*)0x1f000000, 0x698800},
  {ROMFS_DIRENT_FILE, "fastboot_app.elf", (char*)0x18000000, 405968},
};

配置完内存区域之后,我们为了避免更改当前的脚本文件,需要对我们的解码程序做修改和重命名。首先为了能让程序识别伪装成test.kmodel的码流文件,我们需要对解码程序源码进行修改。

/*k230_sdk/src/big/mpp/userapps/sample/sample_vdec/sample_vdec.c*/
diff --git a/userapps/sample/sample_vdec/sample_vdec.c b/userapps/sample/sample_vdec/sample_vdec.c
index 582dc3f2..0ab8358e 100644
--- a/userapps/sample/sample_vdec/sample_vdec.c
+++ b/userapps/sample/sample_vdec/sample_vdec.c
@@ -433,7 +433,7 @@ int main(int argc, char *argv[])
                 vdec_debug("Cannot open input file!!!\n");
                 return -1;
             }
-            if (strcmp(ptr, ".h264") == 0 || strcmp(ptr, ".264") == 0)
+            if (strcmp(ptr, ".h264") == 0 || strcmp(ptr, ".264") == 0 || strcmp(ptr, ".kmodel") == 0)
             {
                 type = K_PT_H264;
                 vdec_debug("file type is H264\n");

重新编译程序,将得到的sample_vdec.elf解码程序拷贝到roomfs使用的src/big/rt-smart/userapps/root/bin目录下,命名为fastboot_app.elf。将视频码流文件重新命名为test.kmodel。修改src/big/rt-smart/init.sh的内容

/bin/fastboot_app.elf -i /bin/test.kmodel

之后再重新编译生成镜像。在k230_sdk目录下运行

make uboot;make build-image

注意不要直接使用make命令,不然之前做得修改就会被全部覆盖为sdk的默认配置了。将编译生成的flash镜像烧录到spinor flash里之后。上电就可以看到光速启动原神的画面啦。大家可以到b站搜索标题为【原神启动,但是开发板光速】的视频,观看丝滑的启动效果。

  • 29
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值