系统相关常见问题
V821是否已支持RTOS系统
V821芯片包含两个CPU。一个是主核心RISC-V CPU,运行Tina Linux系统,为芯片主系统;一个是RISC-V MCU,运行FreeRTOS系统,主要功能是提供通用算力补充、辅助 Linux 实现休眠唤醒、低功耗管理以及WIFI相关功能。
V821 是合封的 WIFI 吗?合封的什么型号?是什么接口?
V821 不是合封的 WIFI,是集成在一体的低功耗 WIFI,其 WIFI 数字硬件与 CPU 集成在一块晶圆上,其通过内部总线访问,不像传统合封 WIFI 通过内部金线合封 CPU 和 WIFI 晶圆,相较于合封低功耗 WIFI 既保证了 WIFI 吞吐性能,又相较于合封高性能 WIFI 模块实现了较低的功耗。
V821 启动引导
V821 启动核心
V821与之前的芯片有所不同,其启动核心是RISC-V MCU,通过RISC-V MCU来引导RISC-V CPU主核心启动。
V821 启动架构
V821双核异构系统BOOT代码结构与之前的平台大部分相同(BROM、BOOT0、UBOOT、FES),不过增加了E907_BOOT、PMBOOT、UBOOT-EFEX三部分。

- E907_BOOT:
系统启动时该代码运行在RISC-V MCU,用于启动RISC-V CPU并使其跳转到BOOT0。
- PMBOOT:
系统休眠唤醒时该代码运行在RISC-V CPU,是裁剪过的BOOT0代码。
- UBOOT-EFEX:
系统烧写时使用的UBOOT代码,运行在RISC-V MCU。
V821 启动流程
V821 启动分为常电与快起两个方案,这里以常电的启动流程作为演示说明,其流程如下图所示:

- 首先,由芯片内部的BROM在RISC-V MCU上运行,并寻找启动介质(SDCARD/EMMC/SPI-NOR/SPI-NAND),并加载“BOOT0”(包含E907_BOOT和BOOT0)到 SRAM,然后跳转到E907_BOOT执行。
- E907_BOOT启动RISC-V CPU并使其跳转到BOOT0执行。
- BOOT0初始化DRAM,从FLASH加载OpenSBI、UBOOT、RTOS到DRAM。其中RTOS引导在 RISC-V MCU 上运行,此外引导 OpenSBI 在 RISC-V CPU 上运行。
- UBOOT最终加载引导Linux内核。
- 待 Linux 启动后建立异构通讯。
V821 烧写流程
V821双核异构系统烧写流程与启动有所区别,简化为全流程在RISC-V MCU执行,因此需要注意此时UBOOT-EFEX由RISC-V MCU编译工具链生成,使用独立配置sun300iw1p1_efex_defconfig

修改 PL 口默认电压
V821 PL 口中,PL0 PL1 固定为 1.8V 电平,无法修改,PL2~PL7 可以配置 1.8V 或者 3.3V,可以在 BOOT0 修改
首先确认当前方案使用的配置文件,这里以 perf2b 板级为例,查看 BoardConfig_nor.mk 和 BoardConfig.mk 中配置的 LICHEE_BOOT0_BIN_NAME,分布对应 SPI NOR 方案与 eMMC 方案下使用的 BOOT0 配置。

如果 BoardConfig_nor.mk 和 BoardConfig.mk中没有配置 LICHEE_BOOT0_BIN_NAME ,则标识方案使用默认配置,根据具体存储器件选择 mmc.mk,spinor.mk,nand.mk 即可
| 软件方案 | 存储器件 | 配置文件 |
|---|---|---|
| 普通 | SPI NOR | brandy/brandy-2.0/spl/board/sun300iw1p1/spinor.mk |
| 普通 | SPI NAND | brandy/brandy-2.0/spl/board/sun300iw1p1/nand.mk |
| 普通 | eMMC/SD NAND | brandy/brandy-2.0/spl/board/sun300iw1p1/mmc.mk |
| 快起 | SPI NOR | brandy/brandy-2.0/spl/board/sun300iw1p1/spinorfastboot.mk |
| 快起 | eMMC/SD NAND | brandy/brandy-2.0/spl/board/sun300iw1p1/mmcfastboot.mk |
前往 brandy/brandy-2.0/spl/board/sun300iw1p1 找到配置文件

这里以 spinorpmc.mk 为例,配置 CFG_SUNXI_PL_1V8=y 则 PL 口为 1.8V 如果注释或者删除则 PL 口为 3.3V

另外 fes 文件夹中的配置是执行 fes 时使用的,也需要配置

如何查看各模块时钟频率
mount -t debugfs none /sys/kernel/debug
cat /sys/kernel/debug/clk/clk_summary
如示例:

如果没有节点,需要手动开启 DebugFS representation of clock tree
CONFIG_COMMON_CLK_DEBUG=y

如何查看CPU当前频率
查看cpu当前频率:
cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq
查看cpu调频策略:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
performance
表示当前调频策略为 performance, 它会以当前最大频率运行。其他常用的调频策略,如interactive,会根据实际负载调节频率。一般常用的就是这两种,如果想了解其他调频策略,可以查看内核源码中 Documentation/cpu-freq/governors.txt 该文档,或者网上资料。
提示
若找不到这个文件,说明该方案未支持调频,可以通过查看时钟树获取
cat /sys/kernel/debug/clk/clk_summary | grep pll-cpu
如果还是没有这个文件,需要内核开启配置
CONFIG_DEBUG_FS=y
CONFIG_COMMON_CLK_DEBUG=y
或者使用工具 cpu_monitor

或者查看 U-boot 的打印确认

:::
如何修改CPU主频
SYS 节点 CPU调频设置
# 设置用户调频模 式
echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# 查看可调频率
cd /sys/devices/system/cpu/cpu0/cpufreq/
cat scaling_available_frequencies
eg: 360000 480000 600000 720000 840000 960000 1080000
#设置CPU频率:
echo 720000 > scaling_setspeed #设置CPU主频为720M
echo 960000 > scaling_setspeed #设置CPU主频为960M
配置 0.92V 启用 1000MHz 频点
提示
由于 V821 支持 40M 或 24M 晶振,0.92V 的频点对应 40M 晶振是 1000MHz,对应 24M 晶振是 1008MHz,为了兼容两个晶振,默认 SDK 配置为两个晶振的最大公倍数 960MHz,若产品已知晶振型号,需要提升 0.92V 频率,可以手动修改支持最高频率。
:::
- 加载 SDK 环境变量
source build/envsetup.sh && lunch选择需要开发的板级 - 执行
quick_config,打开quick_config配置界面 - 执行
make distclean清除编译数据 - 选择
set_cpu_vf_0条目 - 修改文件
bsp/configs/linux-5.4-ansc/sun300iw1p1-vf.dtsi取消频点disable
bsp/configs/linux-5.4-ansc/sun300iw1p1-vf.dtsi
opp@960000000 {
opp-hz = /bits/ 64 <960000000>;
opp-microvolt-vf0000 = <920000>;
opp-microvolt-40m-vf0000 = <920000>;
clock-latency-ns = <244144>; /* 8 32k periods */
};
opp@1000000000 {
opp-hz = /bits/ 64 <1000000000>;
opp-microvolt-vf0000 = <0>;
opp-microvolt-40m-vf0000 = <920000>;
clock-latency-ns = <244144>; /* 8 32k periods */
status = "okay";
};
opp@1008000000 {
opp-hz = /bits/ 64 <1008000000>;
opp-microvolt-vf0000 = <920000>;
opp-microvolt-40m-vf0000 = <0>;
clock-latency-ns = <244144>; /* 8 32k periods */
status = "okay";
};

- 修改
brandy/brandy-2.0/spl/board/sun300iw1p1/clock.c配置启动频率 1000MHz
brandy/brandy-2.0/spl/board/sun300iw1p1/clock.c
void sunxi_board_pll_init(void)
{
#ifndef CFG_SUNXI_SIMPLEBOOT
#ifndef CFG_SUNXI_PMBOOT
printf("set pll start\n");
#ifdef CFG_SUNXI_VF_2_1
// 1200MHz
#define PLL_CPU_CLK_40M_N CCMU_AON_PLL_CPU_N_60
#define PLL_CPU_CLK_24M_N CCMU_AON_PLL_CPU_N_50
#else
// 1000MHz/1008MHz
#define PLL_CPU_CLK_40M_N 49
#define PLL_CPU_CLK_24M_N 41
#endif
// set PLL_CPU=hosc*N/D
// set PLL_VEDIO hosc*N/D
if (aw_get_hosc_freq() == HOSC_FREQ_40M) {
set_pll_general(CCMU_PLL_CPUX_CTRL_REG,
PLL_CPU_CTRL_REG_PLL_EN_ENABLE,
PLL_CPU_CTRL_REG_PLL_OUTPUT_GATE_ENABLE,
CCMU_AON_PLL_CPU_D_2,
PLL_CPU_CTRL_REG_PLL_INPUT_DIV_CLEAR_MASK,
PLL_CPU_CTRL_REG_PLL_INPUT_DIV_OFFSET,
PLL_CPU_CLK_40M_N);
// When efuse is burned, brom will initialize the vedio clock in advance.

- 修改
rtos/lichee/rtos-components/aw/pm/plat_sun300iw1p1/firmware/standby_main.c
rtos/lichee/rtos-components/aw/pm/plat_sun300iw1p1/firmware/standby_main.c
//1000MHz/1008MHz
#define PLL_CPU_CLK_40M_N 49
#define PLL_CPU_CLK_24M_N 41

修改使用 1.0V VF 表
- 加载 SDK 环境变量
source build/envsetup.sh && lunch选择需要开发的板级 - 执行
quick_config,打开quick_config配置界面 - 执行
make distclean清除编译数据 - 选择
set_cpu_vf_2条目
修改特殊频点
有些测试场景下,希望使用一些特殊的频点进行测试,这些频点不属于 VF 表测定的稳定频点,