MCU快速入门指南
范围
本章节概述了 RDK-S100 MCU 系统,旨在帮助读者快速了解并掌握相关内容,以便开展 MCU1 的开发工作。因为MCU0负责启动Acore、MCU1以及电源管理等功能,这部分不建议客户自行修改,默认不释放源码,提供地瓜验证过的bin文件。章节中仅对可能与 MCU1 发生冲突的部分进行简要说明,旨在帮助用户在开发过程中规避 MCU0 与 MCU1 之间的资源竞争问题。
基础信息
- MCU编译工具链为GCC工具链,版本为gcc-arm-none-eabi-10.3-2021.10
- MCU核为ARM R52+,可以用ARM R52 technical reference manual文档作为参考:官网链接
- MCU运行的操作系统均为FreeRTOS,版本为FreeRTOS Kernel V10.0.1
- MCU主要分为两部分:MCU0和MCU1。MCU0主要负责启动Acore、MCU1以及电源管理等功能,目前不开源;MCU1主要负责跑业务等功能,开源,客户可根据自己需求进行修改
MCU框架
MCU0是板子启动的开始,也是重中之重。因为MCU0负责启动Acore、MCU1以及电源管理等功能。Acore所运行的linux操作系统是客户开发功能的重要载体,而MCU1运行的FreeRTOS操作系统为客户的实时任务进行保驾护航。 MCU1通过linux的remoteproc框架实现,在Acore的sysfs通过向MCU0发送通知,从而控制MCU1的启动和关闭。同时在RDK-S100的休眠模式下,也是通知Acore通知MCU0从而操作MCU1,实现低功耗休眠功能。
开发环境
交叉编译是指在主机上开发和构建软件,然后把构建的软件部署到 开发板上运行。主机一般拥有比开发板更高的性能和更多的内存,可以高效完成代码的构建,可以安装更多的开发工具。
主机编译环境要求
推荐使用 Ubuntu 22.04 操作系统,保持和RDK S100相同的系统版本,减少因版本差异产生的依赖问题。
Ubuntu 22.04 系统安装以下软件包:
sudo apt-get install -y build-essential make cmake libpcre3 libpcre3-dev bc bison \
flex python3-numpy mtd-utils zlib1g-dev debootstrap \
libdata-hexdumper-perl libncurses5-dev zip qemu-user-static \
curl repo git liblz4-tool apt-cacher-ng libssl-dev checkpolicy autoconf \
android-sdk-libsparse-utils mtools parted dosfstools udev rsync python3-pip scons
pip install scons>=4.0.0
pip install ecdsa
pip install tqdm
编译MCU系统
- 编译会使用python3,RDK S100开发使用的python3的版本为3.8.10;
- mcu1的镜像分为debug和release两个版本。debug版本的镜像会有调试信息,而release版本不含调试信息。
/* 编译mcu1 */
cd mcu/Build/FreeRtos_mcu1
python build_freertos.py s100_sip_B debug/release
/*
1.首次编译会从arm官网下载一份工具链然后解压缩(10min左右),网速不好可能会存在工具链下载不成功或者工具链下载不完整的问题,可删除已下载的工具链,再多尝试下载几次。
2.如果已有相关工具链,可以将其移至/Build/ToolChain/Gcc/内,当检测到有工具链,就不会从官网下载。
mv 工具链地址/gcc-arm-none-eabi-10.3-2021.10/ 新代码/Build/ToolChain/Gcc/gcc-arm-none-eabi-10.3-2021.10
*/
编译成功标志
编译输出目录
output/
├── dbg # 该文件夹下包含debug版本的编译生成文件
| ├── objs # 编译生成的i/s/o文件
| └── S100_MCU_SIP_V2.0 # 编译生成的bin/map/elf等文件
| ├── custom_compiler_flags.py
| ├── S100_MCU_DEBUG.elf # mcu1启动文件
| ├── S100_MCU_DEBUG.map
| ├── S100_MCU_SIP_V2.0.bin
├── objs # 编译生成的i/s/o文件,根据编译的版本变化
├── rel # 该文件夹下包含release版本的编译生成文件
| ├── objs # 编译生成的i/s/o文件
| └── S100_MCU_SIP_V2.0 # 编译生成的bin/map/elf等文件
MCU1启动/关闭流程
MCU1的启动/关闭是由Acore经过remoteproc框架传递信息给mcu0进而实现启动/关闭mcu1。
MCU1启动原理与步骤
MCU1启动原理
MCU1启动步骤
下述启动流程以debug版本为例,release版本与其类似,只是少一些log打印。
- 经过上述编译流程,编译debug版本会在S100_MCU_SIP_V2.0文件夹下产生S100_MCU_DEBUG.elf文件(release版本类似),该文件为mcu1的firmware文件,因此需要将该文件推送到板端的/lib/firmware目录。举例子如下:
- 板端启动流程
cd /sys/class/remoteproc/remoteproc_mcu0
echo S100_MCU_DEBUG.elf > firmware
echo start > state
正常启动后,串口log打印下图所示 Acore侧串口打印
MCU侧串口打印
MCU1关闭原理与步骤
MCU1关闭原理
MCU1关闭步骤
下述关闭流程以debug版本为例,release版本与其类似,只是少一些log打印。
cd /sys/class/remoteproc/remoteproc_mcu0
echo S100_MCU_DEBUG.elf > firmware
echo stop > state
正常关闭后,串口log打印下图所示 Acore侧串口打印
MCU侧串口打印
stop mcu1之后,如果需要再次启动mcu1,必须等待系统进入wfi模式之后,才能再次start mcu1,见下图所示。原因解释:避免系统还没有进入wfi模式时,start mcu1会重新加载firmware至 mcu sram位置导致之前位置代码被覆盖,导致系统运行跑飞挂死
MCU0/MCU1模块划分
MCU整个系统含有ICU、RTC、IPC、port、CAN等模块,但是为了用户开发的方便,对于功能进行了划分,划分细节如下图所示。
MCU在sysfs上debug功能介绍
MCU目前在sysfs上支持查看系统状态alive,系统存活时间taskcounter,mcu版本mcu_version,sbl版本sbl_version等功能。
- 系统状态alive:表示mcu0\mcu1所处状态,分别为alive和dead两种。mcu alive状态每1s更新一次,所以获取状态会有1s延迟;
- 系统存活时间taskcounter:表示mcu启动后持续的时间,单位:秒;
- mcu版本mcu_version:可以查看mcu版本信息,包括debug版本还是release版本,以及编译的时间;
- sbl版本sbl_version:可以查看sbl版本信息以及编译的时间,但是只有在remoteproc_mcu0下可以查看;
- MCU串口log:可以查看MCU串口log信息,分别remoteproc_mcu0对应MCU0,remoteproc_mcu1对应MCU1。
系统状态alive,图示:
系统存活时间taskcounter,图示:
mcu版本mcu_version,图示:
sbl版本sbl_version,图示:
MCU串口log获取,图示:
MCU串口使用
如果RDK-S100含有连接方式如下,mcu串口和Acore串口共用一个串口,自行查看:设备管理器 -》端口-》MCU-COM-波特率921600