Skip to main content

同构 AMP 多系统

文档说明
  • 原始页数: 36 页
  • 文档版本: 1.0
  • 发布日期: 2025-06-12
  • 原始文件: 查看或下载 PDF

正文按原始 PDF 的文本层、书签层级和页面顺序转换,仅移除重复页眉、页脚与水印,不改写技术内容。

1 前言

1.1 文档简介

本文档基于TINA5.0 构建环境介绍全志的同构AMP 多系统开发环境,区别于异构AMP 系统。

  1. 介绍在ARM 多核架构下,隔离出若干个cpu 核心用于跑其他从系统,如baremetal/freertos 等小型操作系统。

主系统(如Linux)来管理其生命周期。并且通过rpmsg 等架构进行主系统与从系统的通信。

  1. 描述了UBOOT 直接运行多核SMP 的Freertos。

1.2 目标读者

  • sunxi 同构amp 驱动的开发人员/维护人。

  • sunxi 同构amp 多系统环境开发任务/维护者。

  • sunxi smp freertos 系统的开发者和维护者。

1.3 适用范围

T536 T153 等芯片同构AMP 多系统。

2 相关术语介绍

表2-1: 异构框架相关术语。

术语解释说明
SUNXIAllwinner 一系列SoC 硬件平台

可运行在裸机或RTOS 上用于异构多核系统间通信的第三方开源库

Rpmsg定义了异构多核系统中核与核之间进行通信时所

使用的标准二进制接口

AMP非对称多处理(Asymmetric Multi-processing)

3 前提

目前同构AMP 多系统方案支持如下平台(默认配置)。

平台架构方案默认配置debug uart

A55*4 demo_amp linux(cpu0/1) + freertos(cpu3) + baremetal(cp

u2)uart0+uar15+uart8

T153 A7*4 demo_nand

linux(cpu0/1) + freertos(cpu3) + baremetal(cp

uart0

_amp

u2)

+uart1+uart1

目前支持同构AMP 多系统的配置如下。

# T536:
linux │buildroot │t536 │demo_amp │default │linux-5.10-rt
# T153
linux │buildroot │t153 │demo_amp_nand │default │linux-5.10-rt

如下SDK 介绍均使用上述的(T536) 平台配置去操作,其他芯片的配置类似。

4 从系统编译构建

构建AMP 系统的首要目标,就是要生成对应的同构amp 系统镜像。目前tina 平台,支持构建freertos 和baremetal。如下提供简单的构建和使用方式,更详细的请参考freertos 和baremetal 的使用指南。

4.1 freertos编译构建

目前freertos 支持集成在整个build 构建中,SDK 需要配置如下才会使能该功能。

以T536为例,构建T536的freertos需要在对应的BoardConfig.mk文件新增或者修改变量LICHEE_RTOS_PROJECT_NAME。

${SDK_ROOT}/device/config/chips/${LICHEE_IC}/configs/${LICHEE_BOARD}/BoardConfig.mk。

LICHEE_RTOS_PROJECT_NAME=t536_e907_demo@amp_rv0.bin:t536_demo@amp_arm64_rtos.bin

在${SDK_ROOT} 目录下重新./build config后通过如下命令查看即可了解是否生效。

${SDK_ROOT}$ cat .buildconfig │grep "LICHEE_RTOS_PROJECT_NAME"
HEE_RTOS_PROJECT_NAME=t536_e907_demo@amp_rv0.bin:t536_demo@amp_arm64_rtos.bin

目前freertos 支持smp 模式,smp 使用不同版型配置,因此需要改成如下才会编译构建。

LICHEE_RTOS_PROJECT_NAME=t536_e907_demo@amp_rv0.bin:t536_demo_smp@amp_arm64_rtos.bin

Freertos 构建常用命令。

cd ${SDK_ROOT}
./build.sh rtos
# build rtos
./build.sh rtos clean
# clean rtos
./build.sh rtos menuconfig
# set and save rtos config
cd ${SDK_ROOT}/rtos/
source envsetup.sh
# 导出环境变量
lunch_rtos
# 选择配置
m
#buildrtos
m clean
# clean rtos
mrtos
# build rtos
mrtos_menuconfig
# set and save rtos config

生成的freertos 系统镜像(如amp_arm64_rtos.bin)会自动拷贝到如下位置。

${SDK_ROOT}/device/config/chips/${LICHEE_IC}/configs/bin/

4.2 baremetal编译构建

目前baremetal 支持集成在整个Tina build 构建中,需要配置如下才会使能该功能。

以T536为例,构建T536的baremetal需要在对应的BoardConfig.mk文件新增或者修改变量LICHEE_BAREMETAL_PROJECT_NAME。

${SDK_ROOT}/device/config/chips/${LICHEE_IC}/configs/${LICHEE_BOARD}/BoardConfig.mk。

LICHEE_BAREMETAL_PROJECT_NAME:=t536_demo@amp_arm64_bare.bin

在${SDK_ROOT} 目录下重新./build config后通过如下命令查看即可了解是否生效。

${SDK_ROOT}$ cat .buildconfig │grep "LICHEE_BAREMETAL_PROJECT_NAME"
HEE_BAREMETAL_PROJECT_NAME=t536_demo@amp_arm64_bare.bin

baremetal 构建常用命令。

cd ${SDK_ROOT}
./build.sh baremetal
cd ${SDK_ROOT}/rtos/lichee/baremetal
./build.sh config
# config before build
./build.sh
# build baremetal
./build.sh clean
# clean baremetal
./build.sh menuconfig
# set and save baremetal config

生成的baremetal 系统镜像(amp_arm64_bare.bin)会自动拷贝到如下位置。

${SDK_ROOT}/device/config/chips/${LICHEE_IC}/configs/bin/

5 引导方式

5.1 前提

若需求要求freertos 或者baremetal 提前启动(在内核之前架加载运行),内核的gic 的dict 不能重初始化,需要临时屏蔽对应接口。

T}/kernel/${LICHEE_KERN_VER}路径下打上此补丁。

${SDK_ROOT}/device/config/chips/${LICHEE_IC}/patch/kernel/${LICHEE_KERN_VER}/
0001-gic-Handle-dist-init-when-Amp-system-Loaded-earlier-.patch

根据从系统在不同时间上加载引导,这里提供了三种引导方式。其中三种方式是互斥的,选择其中一种,务必把其他引导方式的配置去除。

  1. Boot0 引导同构AMP 从系统;

  2. Uboot 引导同构AMP 从系统;

  3. Kernel 引导同构AMP 从系统。

5.2 通用配置

无论使用何种引导方式,都需要如下的配置。

5.2.1 kernel menuconfig配置

CONFIG_AW_MSGBOX=y
CONFIG_AW_REMOTEPROC=y
RPROC_FW=y
CONFIG_AW_RPROC_FW_FROM_MEM=y
CONFIG_AW_RPROC_SUBDEV=y
CONFIG_AW_RPROC_SUBDEV_STANDBY=y
CONFIG_AW_REMOTEPROC_ARM_BOOT=y
CONFIG_AW_RPMSG_CTRL=y
CONFIG_AW_RPMSG_HEARTBEAT=y
属性释义
W_MSGBOX打开msgbox 通信功能
CONFIG_AW_REMOTEPROCbsp 独立仓库的remoteproc 驱动
CONFIG_AW_RPROC_FW用于uboot 或者boot0 快启获取固件镜像

CONFIG_AW_RPROC_FW_FROM_MEM从uboot amp 固件的加载地址获取镜像, 以解析资

CONFIG_AW_RPROC_SUBDEV从设备驱动开关,包括standby,资源表管理,看

门狗等子设备驱动

CONFIG_AW_REMOTEPROC_ARM_BOOT注册arm 作为rproc device 驱动CONFIG_AW_RPMSG_CTRL用于rpmsg char 字符设备,提供上层接口,用于

ampshell

5.2.2 DTS平台配置说明

如下是T536 的配置,其他平台配置类似,一些名称会有差别,发布的sdk 默认会携带如下信息。

reserved-memory {

/*

* The name should be "vdev%dbuffer".
* Its size should be not less than
*
RPMSG_BUF_SIZE * (num of buffers in a vring) * 2
*
= 512 * (num of buffers in a vring) * 2
/
arm_freertos_vdev0buffer: vdev0buffer@42444000 {
/* arm freertos rpmsg 通信内存*/
compatible = "shared-dma-pool";
reg = <0x0 0x42444000 0x0 0x40000>;
no-map;
};

/*

* The name should be "vdev%dvring%d".
* The size of each should be not less than
*
PAGE_ALIGN(vring_size(num, align))
*
= PAGE_ALIGN(16 * num + 6 + 2 * num + (pads for align) + 6 + 8 * num)
*
* (Please refer to the vring layout in include/uapi/linux/virtio_ring.h)
*/
arm_freertos_vdev0vring0: vdev0vring0@42484000 {
/* arm freertos rpmsg 通信内存*/
reg = <0x0 0x42484000 0x0 0x2000>;
no-map;
};
arm_freertos_vdev0vring1: vdev0vring1@42484000 {
/* arm freertos rpmsg 通信内存*/
reg = <0x0 0x42486000 0x0 0x2000>;
no-map;
};
arm_freertos_reserved: arm_ddr@49000000 {
/* arm freertos 预留的运行地址*/
reg = <0x0 0x49000000 0x0 0x01000000>;
no-map;
};
arm_freertos_mem_fw: arm_mem_fw@50000000 {
/* arm freertos 预留的运行地址*/
/* boot0 & uboot0 load elf addr */
reg = <0x0 0x50000000 0x0 0x01000000>;
};
arm_baremetal_reserved: arm_ddr@55000000 {
reg = <0x0 0x55000000 0x0 0x00a00000>;
no-map;
};
arm_baremetal_mem_fw: arm_mem_fw@56000000 {
/* boot0 & uboot0 load elf addr */
reg = <0x0 0x56000000 0x0 0x01000000>;
};
arm_baremetal_vdev0buffer: vdev0buffer@4248A000 {
compatible = "shared-dma-pool";
reg=<0x00x4248A0000x00x40000>;
no-map;
};

/*

* The name should be "vdev%dvring%d".
* The size of each should be not less than
*
PAGE_ALIGN(vring_size(num, align))
*
= PAGE_ALIGN(16 * num + 6 + 2 * num + (pads for align) + 6 + 8 * num)
*
* (Please refer to the vring layout in include/uapi/linux/virtio_ring.h)
*/
arm_baremetal_vdev0vring0: vdev0vring0@424CA000 {
reg = <0x0 0x424CA000 0x0 0x2000>;
no-map;
};
m_baremetal_vdev0vring1:vdev0vring1@424CC000{
reg = <0x0 0x424CC000 0x0 0x2000>;
no-map;
};
arm_freertos_share_irq_table: share_irq_table@42489000 {
reg = <0x0 0x42489000 0x0 0x1000>;
no-map;
};
};
reserved-irq {
share-a55 {
arch-name = "a55";
memory-region = <&arm_share_irq_table>;
/* defined by sun55iw6-share-irq-dt.h */
share-irq =
<1
0x1
A55_PA_IRQ_NUM
ARM_PA_IRQ_NUM
0x00000000>,
<2
0x2
A55_PB_IRQ_NUM
ARM_PB_IRQ_NUM
0x00000000>,
<3
0x3
A55_PC_IRQ_NUM
ARM_PC_IRQ_NUM
0x00000000>,
<4
0x4
A55_PD_IRQ_NUM
ARM_PD_IRQ_NUM
0x00000000>,
<5
0x5
A55_PE_IRQ_NUM
ARM_PE_IRQ_NUM
0x00000000>,
<6
0x6
A55_PF_IRQ_NUM
ARM_PF_IRQ_NUM
0x00000000>,
<7
0x7
A55_PG_IRQ_NUM
ARM_PG_IRQ_NUM
0x00000000>,
<8
0x8
A55_PH_IRQ_NUM
ARM_PH_IRQ_NUM
0x00000000>,
<9
0x9
A55_PI_IRQ_NUM
ARM_PI_IRQ_NUM
0x00000000>,
<10
0xa
A55_PJ_IRQ_NUM
ARM_PJ_IRQ_NUM
0x00000000>,
<11
0xb
A55_PK_IRQ_NUM
ARM_PK_IRQ_NUM
0x00000000>,
<120xcA55_PL_IRQ_NUMARM_PL_IRQ_NUM0x00000000>,
<13
0xd
A55_PM_IRQ_NUM
ARM_PM_IRQ_NUM
0x00000000>;
};
};
&soc {
arm_rproc: arm_rproc@0 {
compatible = "allwinner,arm-rtos-rproc";
mboxes = <&msgbox_core0 8>;
/* rpmsg 需要的msgbox 节点,需提前保证msgbox功能使能*/
firmware-name = "amp_arm64_rtos.bin";
memory-region = <&arm_freertos_vdev0buffer>,
/* 配置为有rpmsg通信功能的内存属性*/
<&arm_freertos_vdev0vring0>,
<&arm_freertos_vdev0vring1>,
<&arm_freertos_reserved>,
<&arm_freertos_share_irq_table>;
fw-region = <&arm_freertos_mem_fw>;
boot-amp = <&amp0>;
auto-boot;
/* boot0 或者uboot引导务必增加此属性
*/
mbox-names = "arm-kick";
memory-mappings =
/* DDR front 1GB */
< 0x40000000
0x40000000
0x40000000 >;
share-irq = "a55";
status = "okay";
};
arm_baremetal_rproc: arm_rproc_bare@1 {
compatible = "allwinner,arm-barematal-rproc";
mboxes = <&msgbox_core0 4>;
mbox-names = "arm-kick";
rmware-name="amp_arm64_bare.bin";
memory-mappings =
/* DDR front 1GB */
< 0x40000000
0x40000000
0x40000000 >,
/* SRAM A2 */
< 0x40000
0x2BFFF
0x40000 >;
memory-region = <&arm_baremetal_vdev0buffer>,
/* 配置为无通信功能的内存属性*/
<&arm_baremetal_vdev0vring0>,
<&arm_baremetal_vdev0vring1>,
<&arm_freertos_share_irq_table>,
<&arm_baremetal_reserved>,
<&sram_reserved>;
fw-region = <&arm_baremetal_mem_fw>;
boot-amp = <&amp1>;
auto-boot;
/* boot0 或者uboot引导务必增加此属性
*/
/* only boot on remote baremetal core without
rsc table */
// only-boot;
/* 无通信功能,必须显示设置该属性*/
share-irq = "a55";
status = "okay";
};
};
sunxi_amp: sunxi-amp {
compatible = "sunxi,amp";
status = "okay";
amp-count = <2>;
amp0: amp0 {
cpu-id = <0x300>;
/* smp模式配置如下cpu-id = <0x200>,<0x300>
连续并且从小到大*/
entry-addr = <0x49000000>;
load-addr = <0x50000000>;
arch = <1>; /* 0:arm 1:arm64 */
image = "amp-freertos";
boot-stage = "uboot";
};
amp1: amp1 {
cpu-id = <0x200>;
entry-addr = <0x55000000>;
load-addr = <0x56000000>;
arch = <1>; /* 0:arm 1:arm64 */
image = "amp-arm";
boot-stage = "boot0";
&msgbox_core0 {
status = "okay";
};
属性释义
arm_freertos_vdev0bufferarm freertos 的共享内存预留地址
arm_freertos_vdev0vring0arm freertos rpmsg 通信viring 队列0
arm_freertos_vdev0vring1arm freertos rpmsg 通信viring 队列1
arm_freertos_reservedarm freertos 预留运行地址
tos_mem_fwarmfreertos预留的加载地址
arm_baremetal_vdev0bufferarm baremetal 的共享内存预留地址
arm_baremetal_vdev0vring0arm baremetalrpmsg-lite 通信viring 队列0
arm_baremetal_vdev0vring1arm baremetalrpmsg-lite 通信viring 队列1
arm_baremetal_reservedarm baremetal 预留运行地址
arm_baremetal_mem_fwarm baremetal 预留的加载地址
arm_freertos_share_irq_tablearm rtos/bare 与共享中断表的预留内存
share-a55arm 与共享中断表
arm_rprocarm freertos rproc 节点
metal_rprocarmbaremetalrproc 节点
sunxi_amp同构AMP 多系统启动配置
msgbox_core0A55 同构msgbox 节点

sunxi_amp 用于配置具体系统从哪个节点启动使用哪个核心。

属性说明
t总共的同构AMP 系统个数
cpu-id异构系统使用的核心序号
entry-add异构系统启动地址
arch异构系统架构:目前0 代表arm,1 代表arm64
image分区名称,用于ubootl 引导
boot-stage启动阶段,可选择boot0 uboot kernel

5.2.3 sys_partition.fex

在类似如下位置新增或者修改镜像分区。${SDK_ROOT}/device/config/chips/${LICHEE_IC}/configs/${LICHEE_BOARD}/buildroot/sys_partition.fex。

[partition]

name
= amp-freertos
size
= 32768
downloadfile = "amp_arm64_rtos.fex"
user_type
= 0x8000

[partition]

name
= amp-baremetal
size
= 32768
downloadfile = "amp_arm64_bare.fex"
user_type
= 0x8000
名称描述
name建议rtos 使用amp-freertos,bare 使用amp-baremetal
size根据系统镜像大小灵活配置

downloadfile目前仅支持amp_arm64_rtos.fex、amp_arm64_bare.fex、amp_arm_rtos.fex、

amp_arm_bare.fex

user_type默认0x8000 即可,无需改动

5.3 Boot0引导同构AMP从系统

注意:目前BOOT0 阶段引导AMP 从系统暂支持T536,T153 仍在开发进行中。

若想AMP 从系统在BOOT0 阶段。需要进行如下配置:

5.3.1 spl.dts设置

#include "spl.dtsi"
/ {
sunxi_amp: sunxi-amp {
compatible = "sunxi,amp";
status = "okay";
amp-count = <1>;
amp0: amp0 {
cpu-id = <0x200>;
#设置具体cpu跑从系统
entry-addr = <0x55000000>;
#从系统的运行首地址
load-addr = <0x56000000>;
arch = <1>;
/* 0:arm 1:arm64 */
image="amp-arm";
boot-stage = "boot0";
};
};
};
&flash_read {
part-name = "amp-baremetal";
# 与分区表的一致

/*

* 0x60000000: read dest addr (phy addr)
* 0xFFFFFFFF: read blk num (Select the minimum value between the configuration value
and the partition size.)
*/
dest-addr = <0x56000000 0xFFFFFFFF>;
};
ge│boot-stage需要如上图一致,其他参考DTS平台配置说明章节。

5.4 Uboot引导同构AMP从系统

5.4.1 uboot menuconfig设置

采用uboot 启动ARM 同构AMP 从系统的方法,主核Linux 环境下uboot 需要选中对应配置,部分方案已默认选中,此章节对所需配置进行介绍。

boot 启用一条mp 命令,使用方法见env.cfg参数设置。

在sdk 根目录, 执行./build.sh uboot_menuconfig

CONFIG_CMD_SUNXI_AMP
属性释义
CONFIG_CMD_SUNXI_AMP使用除core0 外的核心启动镜像

5.4.2 env.cfg参数设置

即uboot 可以配置启动baremetal 或启动freertos,或者两者都启动。${SDK_ROOT}/device/config/chips/${LICHEE_IC}/configs/${LICHEE_BOARD}/buildroot/env.cfg 文件中添加加载命令,内容如下:

boot_amp 指的是在跑linux 的前提下,取出若干个核心去跑freertos 或者baremetal。

boot_amp 命令后面的参数是固件加载地址,此地址会被dtsi 的覆盖。请注意!!!

boot_amp=boot_amp 0x50000000
bootcmd=run sunxi_pre_cmd boot_amp boot_normal

如上配置务必是需要才添加。

5.4.3 dts设置

amp0: amp0 {
image = "amp-freertos";
# 分区名称
boot-stage = "uboot";
#必须设置uboot
};
#主要注意image │boot-stage 需要如上图一致,其他参考DTS平台配置说明章节。

5.5 Kernel引导同构AMP从系统

5.5.1 从UBOOT改为Kernel

从UBOOT 启动到Kernel 启动,仅仅需要修改如下的dts 即可。

amp1: amp1 {
boot-stage = "kernel";
# 修改为kernel
};
arm_rproc: arm_rproc@0 {
/* auto-boot; */
/* kernel启动注释此属性
*/
};

\#主要注意boot-stage 需要如上图一致,其他参考DTS平台配置说明章节。

5.5.2 从BOOT0改为Kernel

从BOOT0 启动改为Kernel 启动,除了修改上一小章的DTS 配置还需如下修改。

如有,让BOOT0 失去启动从系统的能力。

删除spl.dts 文件,或者给文件名换一个名称。这个最简单的方式。

5.5.3 命令启动AMP系统

AMP 异构固件以amp_arm_bare.bin或者amp_arm_rtos.bin文件的形式存在于Linux 小机端的/lib/firmware 目录下,通过remoteproc 驱动来对从核生命周期进行管理,默认情况下,内核会加载remoteproc 驱动,在其过程中完成启动从核的操作。

启动/关闭的从系统,注意使用remoteproc 的节点。

如下拿T536 为例来进行操作。

# 获取rproc节点名称
cat /sys/class/remoteproc/remoteproc*/name
# 设置固件名:
rm64_rtos.bin>/sys/class/remoteproc/remoteproc1/firmware
# 启动freeros amp:
echo start > /sys/class/remoteproc/remoteproc1/state
# 关闭freertos amp:
echo stop > /sys/class/remoteproc/remoteproc1/state

6 通信

如下都是使用T536 来介绍,其他芯片操作类似。

6.1 快起方案

版型默认配置为引导单核FreeRTOS 系统,以下配置已默认打开。

6.1.1 dts配置

固件在boot0 或者uboot 快起引导需要支持auto_boot 功能,即在rproc 驱动加载前,rtos 固件需要等待内核通信端点建立完成,需打开的配置如下,设备树单核A55/A7 的rproc 节点中,如下介绍T536 arm 核心的配置。

arm_rproc: arm_rproc@0 {
...
fw-region = <&arm_freertos_mem_fw>;
...
oot;#快启动,boot0或uboot引导需要配置该属性
};
  • auto-boot 属性:快启(从系统在内核之前启动)需要打开该属性,arm rproc 会在驱动probe 时主动调用

rproc_add, 去注册通信相关资源。

  • arm_freertos_mem_fw: 快启动elf 固件的加载地址,用于快起rproc 启动从内存解析rpmsg 通信所需资源表,

以及uboot/boot 引导搬运程序段。

6.1.2 rtos config配置

境menuconfig 需要打开配置CONFIG_SLAVE_EARLY_BOOT,

│Symbol: SLAVE_EARLY_BOOT [=y]
│Type
: boolean
│Prompt: system will early boot before master rproc ready

Location:

-> System components

-> thirdparty components

-> OpenAMP Support

-> Libmetal Support (COMPONENTS_LIBMETAL [=y])
│(3)
-> OpenAMP Framework Support (COMPONENTS_OPENAMP [=y])

目的是在openamp 阻塞等待内核rproc 把资源表准备好。

注意:快起方案需要打开这两个配置才能正常使用rpmsg 通信。

6.2 普通方案

非快起方案rpmsg 通信只屏蔽快起方案的配置即可,相关配置已默认打开,这里描述下异构通讯通用配置:

6.2.1 设备树配置

/*

* channel0~3
: core0 -> core1
* channel4~7
: core0 -> core2
* channel8~12 : core0 -> core3
*/
msgbox_core0: msgbox_core0@03600000 {
compatible = "allwinner,sun55iw6-msgbox-core0";
#mbox-cells = <1>;
reg = <0x0 0x03600000 0x0 0x1000>,
<0x0 0x03601000 0x0 0x1000>,
<0x0 0x03602000 0x0 0x1000>,
<0x0 0x03603000 0x0 0x1000>;
interrupts = <GIC_SPI 166 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 171 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI172IRQ_TYPE_LEVEL_HIGH>;
clocks = <&ccu CLK_MSGBOX_CORE0>;
clock-names = "msgbox";
resets = <&ccu RST_BUS_MSGBOX_CORE0>;
reset-names = "rst";
local_id = <0>;
status = "disabled";
};

dtsi 配置主要是核间通信msgbox,需要起到rpmsg kick 的作用,目前用的core0 的msgbox ch0 和core3 msgbox ch0 通信,每个核有4 个通道,0 ~ 3 为core1,4 ~ 7 为core2,8 ~ 11 为core3 ,目前与core3 通信,使用通道0,所以arm rproc 节点msgbox 的remotepoint 节点mboxes 需要填入8。

arm_freertos_rproc: arm_rproc@0 {
/* core3 chn0 */
=<&msgbox_core08>;

通信运行需要预留系统内存。

arm_freertos_rproc: arm_rproc@0 {
/* core3 chn0 */
mboxes = <&msgbox_core0 8>;
memory-region = <&arm_freertos_vdev0buffer>,
<&arm_freertos_vdev0vring0>,
<&arm_freertos_vdev0vring1>,
<&arm_freertos_reserved>,
<&arm_freertos_share_irq_table>;

fw-region = <&arm_freertos_mem_fw>;

  • arm_freertos_vdev0buffer:rpmsg virtio 共享内存;

  • arm_freertos_vdev0vring0:rpmsg virtio 循环队列0 共享内存;

  • arm_freertos_vdev0vring0:rpmsg virtio 循环队列1 共享内存;

  • arm_freertos_reserved:单核a55 预留运行内存。

arm_freertos_reserved: arm_ddr@49000000 {
reg = <0x0 0x49000000 0x0 0x01000000>;
no-map;
};
0x49000000 的运行内存,rtosconfig 需要配置一致的起始地址,以amp 版型为例,rtos/lichee/rtos/
CHEE_IC}/demo/defconfig路径下defconfig。
CONFIG_ARCH_START_ADDRESS=0x49000000
CONFIG_ARCH_MEM_LENGTH=0x00a00000
  • arm_freertos_share_irq_table:此配置为gpio share irq 功能预留配置表功能,用于划分gpio 的同一组bank 的

二级中断,表可以在dts 配置。

reserved-irq {
share-a55 {
arch-name = "a55";
memory-region = <&arm_share_irq_table>;
/* defined by sun55iw6-share-irq-dt.h */
e-irq=
<1
0x1
A55_PA_IRQ_NUM
ARM_PA_IRQ_NUM
0x00000000>,
<2
0x2
A55_PB_IRQ_NUM
ARM_PB_IRQ_NUM
0x00000000>,
<3
0x3
A55_PC_IRQ_NUM
ARM_PC_IRQ_NUM
0x00000000>,
<4
0x4
A55_PD_IRQ_NUM
ARM_PD_IRQ_NUM
0x00000000>,
<5
0x5
A55_PE_IRQ_NUM
ARM_PE_IRQ_NUM
0x00000000>,
<6
0x6
A55_PF_IRQ_NUM
ARM_PF_IRQ_NUM
0x00000000>,
<7
0x7
A55_PG_IRQ_NUM
ARM_PG_IRQ_NUM
0x00000000>,
<8
0x8
A55_PH_IRQ_NUM
ARM_PH_IRQ_NUM
0x00000000>,
<9
0x9
A55_PI_IRQ_NUM
ARM_PI_IRQ_NUM
0x00000000>,
<10
0xa
A55_PJ_IRQ_NUM
ARM_PJ_IRQ_NUM
0x00000000>,
<11
0xb
A55_PK_IRQ_NUM
ARM_PK_IRQ_NUM
0x00000000>,
<12
0xc
A55_PL_IRQ_NUM
ARM_PL_IRQ_NUM
0x00000000>,
<13
0xd
A55_PM_IRQ_NUM
ARM_PM_IRQ_NUM
0x00000000>;
};
}

可见默认表中最后一项都默认配置为0,表示所有gpio 中断都注册linux 侧,若需要把某个中断注册到rtos 端,如PB10, 则需要把对应屏蔽bit 置位为1,如PB10 注册为RTOS 中断,PB 组中断项改为

<2
0x2
A55_PB_IRQ_NUM
ARM_PB_IRQ_NUM
0x00000400>,

6.2.2 内核config配置

linux 端需要打开以下配置。

CONFIG_AW_MSGBOX=y
CONFIG_AW_REMOTEPROC=y
CONFIG_SUNXI_RPROC_SHARE_IRQ=y
CONFIG_AW_REMOTEPROC_ARM_BOOT=y
CONFIG_AW_RPMSG_CTRL=y
CONFIG_AW_RPMSG_VIRTIO=y
  • CONFIG_AW_MSGBOX : msgbox 驱动开关用于rpmsg kick;

  • CONFIG_AW_REMOTEPROC:remoteproc 驱动开关;

  • CONFIG_SUNXI_RPROC_SHARE_IRQ:gpio share irq 功能开关;

  • CONFIG_AW_REMOTEPROC_ARM_BOOT:arm 核心rproc priv 驱动,管理单核内核引导及生命周期;

  • CONFIG_AW_RPMSG_CTRL:rpmsg ctrl 字符驱动,用于动态创建销毁通信端点;

W_RPMSG_VIRTIO:rpmsg总线驱动,匹配rpmsgdriver和通道device。

6.2.3 rtos config配置

amp 板级配置,rtos config 配置文件路径为

${SDK_ROOT}rtos/lichee/rtos/projects/${LICHEE_IC}/${LICHEE_BOARD}/defconfig

openamp 相关的配置

#
# OpenAMP Support
#
CONFIG_COMPONENTS_LIBMETAL=y
CONFIG_COMPONENTS_OPENAMP=y
CONFIG_AMP_SLAVE_MODE=y
CONFIG_MBOX_CHANNEL=0
CONFIG_MBOX_QUEUE_LENGTH=16
CONFIG_RPMSG_DEMO=y
CONFIG_RPMSG_TEST=y
CONFIG_RPMSG_CLIENT=y
CONFIG_RPMSG_CLIENT_TEST=y
CONFIG_RPMSG_CLIENT_QUEUE_SIZE=16
# CONFIG_RPMSG_CLIENT_DEBUG is not set
# CONFIG_RPMSG_HEARBEAT is not set
CONFIG_SLAVE_EARLY_BOOT=y
CONFIG_AMP_SHARE_IRQ=y
#
# Multi Console Support
#
CONFIG_MULTI_CONSOLE=y
# CONFIG_MULTI_CONSOLE_DEBUG is not set
CONFIG_UART_MULTI_CONSOLE=y
CONFIG_UART_MULTI_CONSOLE_AS_MAIN=y
CONFIG_RPMSG_MULTI_CONSOLE=y
CONFIG_RPMSG_CONSOLE_CACHE=y
  • CONFIG_COMPONENTS_LIBMETAL:openamp 跨平台公用组件;
  • CONFIG_COMPONENTS_OPENAMP:openamp 核心组件;

MP_SLAVE_MODE作为从端,主动发送端点名给nameservice;

  • CONFIG_MBOX_CHANNEL: openamp 默认使用msgbox 通道0;

  • CONFIG_MBOX_QUEUE_LENGTH:msgbox 消息队列缓存长度;

  • CONFIG_RPMSG_DEMO:rpmsg 简单测试程序;

  • CONFIG_RPMSG_TEST:老化测试程序;

  • CONFIG_RPMSG_CLIENT:与内核的rpmsg ctrl 驱动搭配,动态创建销毁通信端点;

  • CONFIG_RPMSG_CLIENT_TEST: 动态创建端点测试程序;

  • CONFIG_SLAVE_EARLY_BOOT:uboot/boot0 引导时需要使能;

  • CONFIG_AMP_SHARE_IRQ:GPIO 中断共享功能;

ULTI_CONSOLE ell 终端模式;

  • CONFIG_UART_MULTI_CONSOLE_AS_MAIN:串口终端作为主shell 接收命令,且注册为multi console;

  • CONFIG_RPMSG_MULTI_CONSOLE:用于amp shell, 新增一个rpmsg console,用于处理远端内核的amp shell 的

命令输入;

  • CONFIG_RPMSG_CONSOLE_CACHE:终端输入缓存模式。

6.3 通信测试

6.3.1 AMP_SHELL

amp 实现机制是在rtos 端实现一个简单的shell 终端,接受linux 端发送的rpmsg 输入指令,

返回对应的命令操作字符串,可以实现不接串口线的条件下,也能调试远端同构异构核。

  1. 上电进入主核Linux 系统。

Linux 端输入命令amp_shell -d /dev/rpmsg_ctrl-arm_rproc@0 进入ARM Freertos 控制台。

在通过amp_shell 进入的ARM AMP 控制台上输入命令,回显正常。

:

# amp_shell -d /dev/rpmsg_ctrl-arm_rproc\@0
opt = ?
rpmsg opt
[
176.865373] virtio_rpmsg_bus virtio0: creating channel sunxi,rpmsg_client addr 0x401
Creating Auto Free Endpoint...[
176.866667] sunxi:sunxi_dsufreq-8860000.dsufreq:[ERR]:
cpufreq cpu get failed
[
176.867004] sunxi:sound-mach:[WARN]: 372 asoc_simple_parse_ucfmt(): set data late to
default
Success Create /dev/rpmsg1
[
176.867026] sunxi:sound-mach:[ERR]: 488 simple_parse_of(): simple_dai_link_of failed
=============================
[
176.882242] rpmsg rpmsg_ctrl-arm_rproc@0: bind ept: 1(console)
AMP Shell
============================
msh >

6.3.2 RPMSG

在Freertos 环境输入以下命令:

rpmsg_test -N test -L 496 -c -v

口输入以下命令

rpmsg_test -r arm_rproc@0 -c test -L 496 -v

关键log

[rpmsg1]data:e8595a67e19c824924508829f84fbd75... [md5:e306202bce7ccbfee956027ee164fd21]

[rpmsg1] send: 0.496000Kb 0.000000ms infM/s
[rpmsg1] receive : 0.496000Kb 500.000000ms 0.000992Mb/s
data:000000002df45158cf8cb14046f6b54b... check:feb17eeb632d7bdbe2a3aaf7d8bbd296[rpmsg1]

success

[rpmsg1]data:e8595a67e19c824924508829f84fbd75... [md5:e306202bce7ccbfee956027ee164fd21]

end:0.496000Kb0.000000msinfM/s

[rpmsg1] receive : 0.496000Kb 504.000000ms 0.000984Mb/s
data:000000002df45158cf8cb14046f6b54b... check:feb17eeb632d7bdbe2a3aaf7d8bbd296[rpmsg1]

success

[rpmsg1]data:05de765554e8797ef0658a508c0c035f... [md5:f9661a12ec834ae13d44c83ac8b62390]

[rpmsg1] send: 0.496000Kb 0.000000ms infM/s
[rpmsg1] receive : 0.496000Kb 500.000000ms 0.000992Mb/s
data:000000002df45158cf8cb14046f6b54b... check:feb17eeb632d7bdbe2a3aaf7d8bbd296[rpmsg1]

success

[rpmsg1]data:05de765554e8797ef0658a508c0c035f... [md5:f9661a12ec834ae13d44c83ac8b62390]

[rpmsg1] send: 0.496000Kb 0.000000ms infM/s
[rpmsg1] receive : 0.496000Kb 504.000000ms 0.000984Mb/s
0002df45158cf8cb14046f6b54b...check:feb17eeb632d7bdbe2a3aaf7d8bbd296[rpmsg1]
success

[rpmsg1]data:704b4b43a9eb3333d0d51b372877ee47... [md5:030422bb17f8904db272cba8fe733505]

[rpmsg1] send: 0.496000Kb 0.000000ms infM/s
[rpmsg1] receive : 0.496000Kb 500.000000ms 0.000992Mb/s
data:000000002df45158cf8cb14046f6b54b... check:feb17eeb632d7bdbe2a3aaf7d8bbd296[rpmsg1]

success

[rpmsg1]data:704b4b43a9eb3333d0d51b372877ee47... [md5:030422bb17f8904db272cba8fe733505]

[rpmsg1] send: 0.496000Kb 0.000000ms infM/s
[rpmsg1] receive : 0.496000Kb 504.000000ms 0.000984Mb/s
data:000000002df45158cf8cb14046f6b54b... check:feb17eeb632d7bdbe2a3aaf7d8bbd296[rpmsg1]

success

6.3.3 RPMSG-LITE

Rpmsg_lite 主要用于裸机和linux 的Rpmsg 通信。

6.3.3.1 Linux端配置

oard.dts

arm_baremetal_vdev0buffer: vdev0buffer@4248A000 {
compatible = "shared-dma-pool";
reg = <0x0 0x4248A000 0x0 0x40000>;
no-map;
};
/*
* The name should be "vdev%dvring%d".
* The size of each should be not less than
*
PAGE_ALIGN(vring_size(num, align))
*
= PAGE_ALIGN(16 * num + 6 + 2 * num + (pads for align) + 6 + 8 * num)
*
* (Please refer to the vring layout in include/uapi/linux/virtio_ring.h)
/
arm_baremetal_vdev0vring0: vdev0vring0@424CA000 {
reg = <0x0 0x424CA000 0x0 0x2000>;
no-map;
};
arm_baremetal_vdev0vring1: vdev0vring1@424CC000 {
reg = <0x0 0x424CC000 0x0 0x2000>;
no-map;
};
arm_baremetal_rproc: a55_rproc_bare@1 {
compatible = "allwinner,arm-barematal-rproc";
mboxes = <&msgbox_core0 4>;
mbox-names = "arm-kick";
firmware-name = "amp_arm64_bare.bin";
memory-mappings =
/* DDR front 1GB */
< 0x40000000
0x40000000
0x40000000 >,
/* SRAM A2 */
< 0x40000
0x2BFFF
0x40000 >;
memory-region = <&arm_baremetal_vdev0buffer>,
<&arm_baremetal_vdev0vring0>,
<&arm_baremetal_vdev0vring1>,
<&arm_freertos_share_irq_table>,
<&arm_baremetal_reserved>,
<&sram_reserved>;
fw-region = <&arm_baremetal_mem_fw>;
boot-amp = <&amp1>;
auto-boot;
/* only boot on remote baremetal core without
rsc table */
// only-boot;
share-irq = "a55";
status = "okay";
};

6.3.3.1.2 Kernel config

CONFIG_AW_RPMSG_LITE_TEST:
Say y here to enable support for the rpmsg lite test driver.
:AW_RPMSG_LITE_TEST[=y]
Type
: tristate
Defined at bsp/drivers/rpmsg/Kconfig:54
Prompt: Allwinner RPMSG lite test driver
Depends on: AW_BSP [=y]
Location:
-> Allwinner BSP

-> Device Drivers

-> Rpmsg drivers
Selects: RPMSG_VIRTIO [=y]
6.3.3.2 RTOS端配置

OOT}/rtos/lichee/baremetal/components/rpmg-lite/examples。

void rpmsg_lite_communicate_test()
{
printf("rpmsg_lite_communicate_test start\n");
rproc_virtio_wait_remote_ready();
rpmsg_lite_base = (char *)resource_table_get_vring_da();
printf("rpmsg_lite_base: %p\r\n", rpmsg_lite_base);
int ret = 0;
my_rpmsg = rpmsg_lite_remote_init(rpmsg_lite_base, 0,
RL_NO_FLAGS, &rpmsg_ctxt);
if (!my_rpmsg) {
printf("Failed to initialize RPMsg Lite\n");
turn;
my_ept = rpmsg_lite_create_ept(my_rpmsg, RL_ADDR_ANY , ept_cb, NULL, &my_ept_ctxt);
if(!my_ept){
printf("rpmsg_lite_create_ept faile \n");
return;
}
ret = rpmsg_ns_announce(my_rpmsg, my_ept, RPMSG_LITE_NS_ANNOUNCE_STRING, (uint32_t)
RL_NS_CREATE);

if(ret != RL_SUCCESS){

printf("'rpmsg_ns_announce' failed ret = %d\n", ret);
return;

printf("communicate test end \n");

}
6.3.3.3 测试说明

1、先在baremetal 输入hal_rpmsg_test

2、

如下。

mount -t debugfs debugfs /sys/kernel/debug
echo 'file *remoteproc.c +p' > /sys/kernel/debug/dynamic_debug/control
echo 'file *rproc*.c +p' > /sys/kernel/debug/dynamic_debug/control
echo 'file *rpmsg*.c +p' > /sys/kernel/debug/dynamic_debug/control
# echo hello > /dev/rpmsg_test

linux 端串口log 显示如下。

# [
99.066003] sunxi_rpmsg_lite virtio2.sunxi,rpmsg_test_bare.-1.1: TX From 0x400, To 0x1,
Len 6, Flags 0, Reserved 0
[
99.066023] rpmsg_virtio TX: 00 04 00 00 01 00 00 00 00 00 00 00 06 00 00 00
................
9]rpmsg_virtioTX:68656c6c6f0a
hello.
[
99.066040] remoteproc remoteproc0: sunxi_rproc_kick,753 vqid = 0x1
[
99.066271] remoteproc remoteproc0: sunxi_rproc_mb_tx_done,264 name = arm-kick, vq_id = 0
x1
[
99.113524] remoteproc remoteproc0: sunxi_rproc_mb_rx_callback,243 name = arm-kick, vq_id
= 0x1
[
99.113554] virtio_rpmsg_bus virtio2: From: 0x1, To: 0x400, Len: 6, Flags: 0, Reserved: 0
[
99.113572] rpmsg_virtio RX: 01 00 00 00 00 04 00 00 00 00 00 00 06 00 00 00
................
[
99.113578] rpmsg_virtio RX: 68 65 6c 6c 6f 0a
hello.
[
99.113590] virtio_rpmsg_bus virtio2: Received 1 messages
[
99.113597] remoteproc remoteproc0: sunxi_rproc_kick,753 vqid = 0x0
[
99.113631] remoteproc remoteproc0: sunxi_rproc_mb_tx_done,264 name = arm-kick, vq_id = 0
x0
[
99.116294] remoteproc remoteproc0: sunxi_rproc_mb_rx_callback,243 name = arm-kick, vq_id
= 0x0
[
99.116316] virtio_rpmsg_bus virtio2: rpmsg_xmit_done
[
99.119060] remoteproc remoteproc0: sunxi_rproc_mb_rx_callback,243 name = arm-kick, vq_id
= 0x1
[
99.119081] virtio_rpmsg_bus virtio2: rpmsg_xmit_done

baremetal 端串口显示如下。

letter:/$ [59.662796] receive kick vq:1
[59.662842] rpmsg_virtio RX:
:
[59.662878]
0x42410000 : [59.662910]
400 [59.662935]
1 [59.663251]
0 [59.665071]
6 [59.666891]
0x42410010 : [59.669231] 6c6c6568 [59.671051]
a6f [59.672871]
0 [59.674691]
0 [59.676511]
0x42410020 : [59.678851]
0 [59.680672]
0 [59.682491]
[59.683706] src: 0x1024, data:hello
, len:6
[59.687785] rpmsg_virtio TX:
:
[59.690638]
0x42400200 : [59.692978]
1 [59.694798]
400 [59.696618]
0 [59.698438]
6 [59.700258]
0x42400210 : [59.702598] 6c6c6568 [59.704418]
a6f [59.706238]

6.3.4 RPBUF

板级没有配置rpbuf可参考其他方案增加预留地址测试,有需求可联系fae。

7 引导同构双核 SMP freertos

此处单独描述在一个Linux 主系统下,划分2 个cpu 跑SMP Freertos。目前该方案仅仅支持在UBOOT 和Kernel 阶段加载运行。

因为默认配置方案是支持linux + freertos + baremetal,因此需要对sdk 进行一定修改才能使用。跟随如下步骤,可跑起2core Linux + 2 core Freertos。

7.1 构建Freertos smp 系统镜像

以T536 为例,构建T536 的freertos 需要新增或者修改LICHEE_RTOS_PROJECT_NAME。修改为t536_demo_smp版型。

LICHEE_RTOS_PROJECT_NAME=t536_e907_demo@amp_rv0.bin:t536_demo_smp@amp_arm64_rtos.bin

在${SDK_ROOT} 目录下重新./build config后通过如下命令查看即可了解是否生效。

${SDK_ROOT}$ cat .buildconfig │grep "LICHEE_RTOS_PROJECT_NAME"
export LICHEE_RTOS_PROJECT_NAME=t536_e907_demo@amp_rv0.bin:t536_demo_smp@amp_arm64_rtos.bin

7.1.1 board.dts

给freertos 增加一个使用的cpu。

amp0: amp0 {
cpu-id = <0x200>, <0x300>;
};

7.2 关闭baremetal从系统

若默认配置baremetal 占用了一个cpu,因此必须把该从系统从多系统方案中抹除。

7.2.1 spl.dtb

如有,让BOOT0 失去启动从系统的能力。删除spl.dts 文件,或者给文件名换一个名称。这个最简单的方式。

7.2.2 board.dts

若有,disabled arm_baremetal_rproc 节点。

arm_baremetal_rproc: arm_rproc_bare@1 {
status = "disabled;
};

重新配置后,编译打包把固件烧写到样机,若成功,rtos 的uart 会打印如下信息。版型demo 会一直循环两个核心打印。

原文第 30 页插图

图7-1: 2-core-linux-2-core-rtos

8 uboot启动多核FreeRTOS

由于目前没有单一的RTOS SDK,想要uboot 启动多核RTOS,需要借助Tina 的sdk,改动如下。

8.1 关闭boot0启动从系统

8.1.1 spl.dtb

让BOOT0 失去启动从系统的能力。删除spl.dts 文件,或者给文件名换一个名称。这个最简单的方式。

8.2 构建Freertos smp 系统镜像

8.2.1 选择smp版型

,构建T536 的需要新增或者修改LICHEE_RTOS_PROJECT_NAME。

LICHEE_RTOS_PROJECT_NAME=t536_e907_demo@amp_rv0.bin:t536_demo_smp@amp_arm64_rtos.bin

在${SDK_ROOT} 目录下重新./build config后通过如下命令查看即可了解是否生效。

${SDK_ROOT}$ cat .buildconfig │grep "LICHEE_RTOS_PROJECT_NAME"
export LICHEE_RTOS_PROJECT_NAME=t536_e907_demo@amp_rv0.bin:t536_demo_smp@amp_arm64_rtos.bin

8.2.2 修改freertos cpu核数

在${SDK_ROOT} 目录下如下命令。

./build.sh rtos menuconfig
# 选择带smp版型
CONFIG_NR_CPUS=4

8.2.3 修改Freertos调试uart

修改为uart0 与uboot 等保持一致,方便开发调试。

./build.sh rtos menuconfig
# 选择带smp版型
ORT=0

8.3 env.cfg参数设置

uboot 启动freertos,不启动kernel。

${SDK_ROOT}/device/config/chips/${LICHEE_IC}/configs/${LICHEE_BOARD}/buildroot/env.cfg 文件中添加加载命令,内容如下:

boot_rtos 指的是不跑内核,uboot 结束后直接带起freertos。

boot_rtos=boot_rtos0x50000000amp-freertos
bootcmd=run sunxi_pre_cmd boot_rtos

8.4 sys_partition.fex

SDKROOT /device/config/chips/{LICHEE_IC}/configs/${LICHEE_BOARD}/buildroot/sys_partition.fex。

保留核心的镜像分区。

[mbr]
size = 16384

[partition_start]

[partition]

name
= boot-resource
size
= 65536
downloadfile = "boot-resource.fex"
user_type
= 0x8000

[partition]

name
= env
size
= 32768
downloadfile = "env.fex"
user_type
= 0x8000
[partition]
name
= amp-freertos
size
= 32768
downloadfile = "amp_arm64_rtos.fex"
user_type
= 0x8000

重新配置后,编译打包把固件烧写到样机,若成功,uart0 会打印如下信息。

原文第 33 页插图

图8-1: uhoot-run-4-core-freertos

9 关于Freertos smp的使用提醒。

Freertos smp 架构是社区近两年合并到主分支,可参考的资料不多,在使用上难免会遇到一些问题。在多核同步竞争资源这块,需要使用者做好临界区的保护,防止出现具有风险的操作。

10 QA

10.1 同构核uart串口没有输出

先合入kernel 的补丁,然后断电起来之后可以重新拔插一下串口看看有无输出。

本文档及内容受著作权法保护,其著作权由珠海全志科技股份有限公司(“全志”)拥有并保留一切权利。

本文档是全志的原创作品和版权财产,未经全志书面许可,任何单位和个人不得擅自摘抄、复制、修改、发表或传播本文档内容的部分或全部,且不得以任何形式传播。

商标声明

(不完全列举)均为珠海

份有限公司的商标或者注册商标。在本文档描述的产品中出现的其它商标,产品名称,和服务名

称,均由其各自所有人拥有。

免责声明

您购买的产品、服务或特性应受您与珠海全志科技股份有限公司(“全志”)之间签署的商业合同和条款的约束。本文档中描述的全部或部分产品、服务或特性可能不在您所购买或使用的范围内。使用前请认真阅读合同条款和相关说明,并严格遵循本文档的使用说明。您将自行承担任何不当使用行为(包括但不限于如超压,超频,超温使用)造成的不利后果,全志概不负责。

本文档作为使用指导仅供参考。由于产品版本升级或其他原因,本文档内容有可能修改,如有变更,恕不另行通知。全志尽全力在本文档中提供准确的信息,但并不确保内容完全没有错误,因使用本文档而发生损害(包

间接的、偶然的、特殊的损失)或发生侵犯第三方权利事件,全志概不负责。本文档中的所有陈

述、信息和建议并不构成任何明示或暗示的保证或承诺。

本文档未以明示或暗示或其他方式授予全志的任何专利或知识产权。在您实施方案或使用产品的过程中,可能需要获得第三方的权利许可。请您自行向第三方权利人获取相关的许可。全志不承担也不代为支付任何关于获取第三方许可的许可费或版税(专利税)。全志不对您所使用的第三方许可技术做出任何保证、赔偿或承担其他义务。