1、preface

1)资料快车
1、源码

2、PM架构

1)AML内置riscv架构MCU,型号n200 - 即对应ARM电源架构中的SCP角色

2)软件跑FreeRTOS
使用版本Amazon FreeRTOS(现已更名为AWS IoT FreeRTOS):
https://docs.aws.amazon.com/freertos/

3)gcc编译器(编译LOG获取)
1、LDFLAGS = -L/opt/riscv-none-gcc/8.2.0-2.2-20190521-0004/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32im/ilp32 -lgcc --gc-sections
2、gcc/RTOSDemo.map与RTOSDemo.dis,便于符号与内存分析。

4)编译生成物 - 链接到bin/*/bl30.bin中去,运行时由ATF搬到n200的运行内存中去;

5) 编译信息
-- @@STATIC: arch__riscv
-- @@STATIC: boards__riscv
-- @@STATIC: drivers
-- @@STATIC: kernel__freertos
-- @@STATIC: libc__aml
-- @@STATIC: soc__riscv

6)中断控制器 - PIC interrupt 

1)这里以T950D4-t5d平台举例说明;

2)RTOS本身不复杂,难点在于理解ARM的电源架构;

n200在SOC中的位置
在这里插入图片描述

3、T950D4-t5d平台的源码目录

1)AML源码目录
/android/bootloader/uboot-repo/bl30/src_ao/demos/amlogic
/android/bootloader/uboot-repo/bl30/src_ao/demos/amlogic/driver  - 驱动集合
2) board目录
/android/bootloader/uboot-repo/bl30/src_ao/demos/amlogic/n200/t5d/t5d_am30ah_v1
3)引用的库
/android/bootloader/uboot-repo/bl30/src_ao/lib
4)编译打包脚本
/android/bootloader/uboot-repo/bl30/src_ao/scripts/amlogic

4、源码分析

1)基础概念

1.关机打印
power_mode: SUSPEND
ceaddr:521a000!
c_ip 1
cec not enable
keypad: add adc key [520]
[Bt_GpioIRQRegister]
bk->parentIRQs[i].irq is 14
Enter ddr suspend

ddr suspend is done
poweroff 5v
0xc000003a
Close wifi en

2.开机打印
exit_reason=6, powerkey
open wifi en
ADC key event 0x1, key code 520, responseTicks 0
Enter ddr resume
start lp2 exit init start...
ddr resume done 2609 us
meson_exit_suspend!
exit: cpu reg = 0x0
Done!
store_restore_clk_gate 1
store restore gp0 pll
use_sys_pll,drate =1464000000
sys pll lock done
Little core clk resume rate 1464000000
HHI_SYS_CPU_CLK_CNTL:a4020801!
HHI_SYS_PLL_CNTL0:d000003d!


3. 基础概念
- BL30: Amlogic Bootloader 的一个阶段,通常负责 Always-On/AO 子系统初始化与低功耗唤醒逻辑。
- AO CPU: Always-On 低功耗 CPU 子系统,负责待机/唤醒、定时、外设监听。
- FreeRTOS: 轻量实时操作系统,任务/队列/信号量/定时器等并发机制。
- STR (Suspend-to-RAM): 休眠至内存,关闭大部分电源,保留少量上下文。
- 邮箱通信 (Mailbox/MHU): SoC 子系统之间的 IPC 通道,用于跨核/跨电源域消息交互。
- 中断控制器 (PIC): 处理外设/CPU 中断优先级与分发。
- 设备唤醒源: IR、CEC、GPIO、ETH、RTC、BT、按键等。

4. 专业术语/缩略词全称
- BL30: Boot Loader stage 30
- AO: Always-On
- SoC: System on Chip
- RTOS: Real-Time Operating System
- PIC: Platform Interrupt Controller
- ISR: Interrupt Service Routine
- CSR: Control and Status Register (RISC-V)
- PMP: Physical Memory Protection
- MPP: Machine Previous Privilege (RISC-V)
- MIE: Machine Interrupt Enable (RISC-V)
- MTIME: Machine Timer Register
- STR: Suspend To RAM
- IR: Infrared
- CEC: Consumer Electronics Control (HDMI)
- VRTC: Virtual RTC
- DDR: Double Data Rate (Memory)
- MHU: Message Handling Unit (Mailbox)
- NMI: Non-Maskable Interrupt

2)RTOS总体架构

1.总体来说两个主要任务:
1)资源清理;
2)唤醒源配置;

2.汇编阶段启动部分
/android/bootloader/uboot-repo/bl30/src_ao/demos/amlogic/n200/start.S
call main --跳转至main函数

3.中断向量表
/android/bootloader/uboot-repo/bl30/src_ao/demos/amlogic/n200/vtable.S

4.
/android/bootloader/uboot-repo/bl30/src_ao/demos/amlogic/n200/t5d/t5d_am30ah_v1/main.c
main()
--vPICInit();  //中断控制器初始化
--stick_mem_init(); //持久化内存
--vMbInit();   //mailbox初始化
--vCoreFsmIdleInit(); //注册 CPU core idle 消息回调与中断。
--vCecCallbackInit(CEC_CHIP_T5);
--vRtcInit();
--vETHMailboxCallback(); 
/android/bootloader/uboot-repo/bl30/src_ao/demos/amlogic/driver/str/suspend.c
--create_str_task();
----xTaskCreate( vSTRTask, "STR_task", configMINIMAL_STACK_SIZE, NULL, 3, NULL )
------system_suspend(power_mode); //待机解初始化任务(关闭时钟、配置DDR自刷新、唤醒源配置)
------system_resume(power_mode);  //开机初始化任务(与解初始化相反)
/android/bootloader/uboot-repo/bl30/src_ao/demos/amlogic/driver/mailbox/mailbox.c
----xInstallRemoteMessageCallbackFeedBack(); //创建mailbox各种消息对应的处理函数
/android/bootloader/uboot-repo/bl30/src_ao/demos/amlogic/driver/mailbox/mailbox-htbl.c
------mailbox_htbl_reg_feedback()
--remoteCfgInit();
--vKeyPadCreate();
/android/bootloader/uboot-repo/bl30/src_ao/lib/FreeRTOS/tasks.c
--vTaskStartScheduler(); //开始任务调度


5.支持的唤醒源
/android/bootloader/uboot-repo/bl30/src_ao/demos/amlogic/driver/str/suspend.c
WakeUp_Reason vWakeupReason[] = {
	[UDEFINED_WAKEUP] = { .name = "undefine" },
	[CHARGING_WAKEUP] = { .name = "charging" },
	[REMOTE_WAKEUP] = { .name = "remote" },
	[RTC_WAKEUP] = { .name = "rtc" },
	[BT_WAKEUP] = { .name = "bt" },
	[WIFI_WAKEUP] = { .name = "wifi" },
	[POWER_KEY_WAKEUP] = { .name = "powerkey" },
	[AUTO_WAKEUP] = { .name = "auto" },
	[CEC_WAKEUP] = { .name = "cec" },
	[REMOTE_CUS_WAKEUP] = { .name = "remote_cus" },
	[ETH_PMT_WAKEUP] = { .name = "eth" },
	[CECB_WAKEUP] = { .name = "cecb" },
	[VAD_WAKEUP] = { .name = "vad" },
	[HDMI_RX_WAKEUP] = { .name = "hdmirx_plugin" },
	//cvte add begin
    [REMOTE_CUS_PAN1_WAKEUP] =  { .name = "remote_cus" },
    [REMOTE_CUS_PAN2_WAKEUP] =  { .name = "remote_cus" },
	//cvte add end
};

6.注册的mailbox消息
/android/bootloader/uboot-repo/bl30/src_ao/demos/amlogic/driver/str/suspend.c
create_str_task(void)
--xInstallRemoteMessageCallbackFeedBack(AOTEE_CHANNEL, MBX_CMD_SUSPEND,xMboxSuspend_Sem, 0);
--xInstallRemoteMessageCallbackFeedBack(AOREE_CHANNEL, MBX_CMD_GET_WAKEUP_REASON,xMboxGetWakeupReason, 1);
--xInstallRemoteMessageCallbackFeedBack(AOREE_CHANNEL, MBX_CMD_CLR_WAKEUP_REASON,xMboxClrWakeupReason, 0);	--xInstallRemoteMessageCallbackFeedBack(AOREE_CHANNEL, MBX_CMD_GET_STICK_REBOOT_FLAG,xMboxGetStickRebootFlag, 1);
--xInstallRemoteMessageCallbackFeedBack(AOREE_CHANNEL, MBX_CMD_PM_FREEZE,xMboxpm_sem, 1);

3)PM关键模块

1.stick memory - 重启也不会丢失数据的RAM内存,用于保存重启原因等
特殊内存区域:在芯片内部RAM中划定的一块特殊区域
复位保持性:即使系统重启(看门狗复位、软复位),内容也不会丢失
电池备份:某些设计有电池或电容保持数据
快速访问:直接内存映射,无需文件系统
/android/bootloader/uboot-repo/bl30/src_ao/demos/amlogic/n200/t5d/t5d_am301_v1/FreeRTOSConfig.h
#define configDEFAULT_HEAP_ADDR			0xfffc0000
#define configDEFAULT_HEAP_SIZE			(26 * 1024)
#define configSTICK_REG_ADDR			(configDEFAULT_HEAP_ADDR + configDEFAULT_HEAP_SIZE)
#define configSTICK_REG_SIZE			128

3.mailbox
mailbox-$(MAILBOX) = mailbox.o mailbox-irq.o mailbox-htbl.o rpc-user.o
mailbox-$(MAILBOX_PL) = mailbox-pl.o mailbox-htbl.o rpc-user.o  //旧实现

mailbox-pl实现简单一些:
1)
/android/bootloader/uboot-repo/bl30/src_ao/demos/amlogic/driver/mailbox/mailbox-pl.c
vMbInit(void)
--mailbox_htbl_init(&g_tbl_ao);  //命令回调表,决定收到mailbox命令该如何处理
--RegisterIrq(MAILBOX_AOCPU_REE_IRQ, 6, vMbHandleReeIsr); //REE侧中断处理函数
--RegisterIrq(MAILBOX_AOCPU_TEE_IRQ, 6, vMbHandleTeeIsr); //TEE侧中断处理函数

2)发送接口
xTransferMessageAsync(uint32_t ulChan, uint32_t ulCmd, void *data, size_t size)


3.ddr
ddr初始化工作在bootloader里,不在pm,pm负责suspend/resume的配置
1)suspend - 将DDR内存进入低功耗状态(自刷新模式)
1.while (0xfffffff != rd_reg(DMC_CHAN_STS)) //等待DDR空闲
2.wr_reg(DMC_REQ_CTRL, 0);  //暂停所有CPU核心对DDR的访问请求
3.进入DDR自刷新模式(DFI模式)
wr_reg(DMC_DRAM_ASR_CTRL, (1 << 18));
wr_reg(DMC_DRAM_SCFG, 2);
4.wr_reg(AM_DDR_PLL_CNTL0, (rd_reg(AM_DDR_PLL_CNTL0) & (~(0xf << 28))) | (1 << 29)); //关闭DDR PLL时钟

2)resume - 将DDR内存从低功耗状态恢复
1.pll_lock();  //恢复pll时钟
2.wr_reg(DMC_DRAM_SCFG, 4); //退出自刷新模式
3.恢复DDR正常工作状态
wr_reg(DMC_DRAM_APD_CTRL, apd_value); // 恢复APD设置
wr_reg(DMC_DRAM_ASR_CTRL, (0 << 18)); // 关闭自动挂起触发

4)PM电源控制

1)待机
/android/bootloader/uboot-repo/bl30/src_ao/demos/amlogic/n200/t5d/t5d_am30ah_v1/power.c
str_power_off(int shutdown_flag)
--printf("poweroff 5v\n");
--xGpioSetDir(GPIOD_4,GPIO_DIR_OUT);
--xGpioSetValue(GPIOD_4,GPIO_LEVEL_LOW);
/***set vdd_cpu val***/
--vPwmMesonSetVoltage(VDDCPU_VOLT,700); //设置cpu电压域
/***set vdd_ee val***/
--vPwmMesonSetVoltage(VDDEE_VOLT,770);  //设置ee电压域

2)开机 - 与待机相反
/android/bootloader/uboot-repo/bl30/src_ao/demos/amlogic/n200/t5d/t5d_am30ah_v1/power.c
str_power_on(int shutdown_flag)

5)PM的消息来源

触发PM工作的消息来源主要有两个

1)从AP端发送过来的mailbox消息,如下命令
MBX_CMD_SUSPEND/MBX_CMD_GET_WAKEUP_REASON/MBX_CMD_CLR_WAKEUP_REASON/MBX_CMD_CLR_WAKEUP_REASON

2)唤醒中断
1.eth
/android/bootloader/uboot-repo/bl30/src_ao/demos/amlogic/driver/eth/eth.c
eth_handler(void)
--STR_Wakeup_src_Queue_Send_FromISR(buf);
2.bt
/android/bootloader/uboot-repo/bl30/src_ao/demos/amlogic/n200/t5/t5_ak301_v1/btwake.c
Bt_IRQHandle(void)
--STR_Wakeup_src_Queue_Send_FromISR(buf);
3....

在这里插入图片描述

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐