Files
kunlun/dtest/bee_pmm_test/bee_pmm_test.c
2024-09-28 14:24:04 +08:00

425 lines
12 KiB
C
Executable File

#include "os_types.h"
#include "os_task.h"
#include "os_mem.h"
#include "dbg_io.h"
#include "iot_diag.h"
#include "iot_io.h"
//#include <stdlib.h>
#include "iot_system_api.h"
#include "iot_config.h"
//#include "iot_gptmr.h"
#include "iot_system.h"
//#include "os_mem.h"
//#include "cpu.h"
//#include "os_task.h"
#include "platform.h"
#include "encoding.h"
//#include "sec_glb.h"
//#include "ahb.h"
//#include "intc.h"
#include "bits.h"
#include "os_utils.h"
#include "iot_gpio_api.h"
#include "pmm_hw.h"
//#define NONSECURE
//#define HIBERNATE
//#define PUSH_BUTTON
//#define DEEP_SLEEP
#define SOFT_RESET
//#define FORCE
//#define IO_WKUP
static int32_t iot__platform_init()
{
/*platform intialization*/
platform_init();
//resource initializations;
// system_clock_init();
// system_uart_init();
dbg_uart_init();
// dbg_uart_stage1_init();
// iot_led_init();
return 0;
}
void user_task_1()
{
// power off bbl
#ifdef NONSECURE
power_off_bbl();
#endif
//PUSH_BUTTON test//////////////////////
#ifdef PUSH_BUTTON
uint8_t wakeup_from_pb_flag = 0; // push_button flag
if (wake_up_from_pb_check()) {
wakeup_from_pb_flag = 1;
}
if(wakeup_from_pb_flag) { // wake up from push_button
iot_printf("--------------------wake up from push button mode ------------------\n");
}//else {
os_delay(2000);
iot_printf("--------------------config to enter push button mode ------------------\n");
#ifdef FORCE
iot_printf("force enter into push_button low power mode\n");
os_delay(400);
enter_push_button_mode(1);
#else
iot_printf("auto enter into push_button low power mode\n");
os_delay(400);
enter_push_button_mode(0);
#endif
// }
#endif
//HIBERNATE test////////////////////////
#ifdef HIBERNATE
uint32_t rdata[3] = {0};
volatile uint8_t error = 0;
volatile uint8_t i;
uint8_t wakeup_from_hiber_flag = 0; // hibernate flag
uint32_t check_data[100]={0};
uint32_t pattern[2] = {0x66888866,0x66888866};
if (wake_up_from_hibernate_check()){
wakeup_from_hiber_flag = 1;
}
if(wakeup_from_hiber_flag) { // wake up from hibernate
iot_printf("--------------------wake up from hibernate mode ------------------\n");
//check saved pattern
low_power_mode_read_data(hibernate,rdata,2);
read_hiber_rtc_value(&rdata[2]);
iot_printf("hibernate mode : check saved pattern ana0 = %x, ana1 = %x,rtc = %x\n", rdata[0],rdata[1],rdata[2]);
if((rdata[0] != 0x66888866) || (rdata[1] != 0x66888866) || (rdata[2] != 0x66888866)) {
error++;
}
//check pmm mem can read and write
for(i=0; i<100; i++) { // access pmm mem
*(check_data+i) = i;
}
write_pmm_16k_ram(0,check_data,100);
for(i=0; i<100; i++) { // access pmm mem
*(check_data+i) = 0;
}
read_pmm_16k_ram(0,check_data,100);
for(i=0; i<100; i++) {
if(check_data[i] != i) error++;
}
//check if dtop register back to default value
rdata[0] = *(volatile uint32_t *)(0x03280000);
iot_printf("hibernate mode : check dtop reg 0x03280000 = %x\n", rdata[0]);
if (0x00080000 != rdata[0]){
error++;
}
//check if pmm register back to default value
rdata[0] = *(volatile uint32_t *)(0x05c0e8a0);
iot_printf("hibernate mode : check pmm reg 0x05c0e8a0 = %x\n", rdata[0]);
if (0 != rdata[0]){
error++;
}
if(error == 0)
iot_printf("wake up from hibernate mode and access pmm 16k ram successfully !\n");
else
iot_printf("wake up from hibernate mode and access pmm 16k ram failed !\n");
}//else {
os_delay(2000);
iot_printf("--------------------config to enter hibernate mode ------------------\n");
//change dtop register value for test
*(volatile uint32_t *)(0x03280000) = 0x6860; //this reg default value = 0x80000
rdata[0] = *(volatile uint32_t *)(0x03280000);
iot_printf("hibernate mode : write dtop reg 0x03280000 = %x\n", rdata[0]);
//change pmm register value for test
*(volatile uint32_t *)(0x05c0e8a0) = 0xAA55; //this reg default value = 0x0
rdata[0] = *(volatile uint32_t *)(0x05c0e8a0);
iot_printf("hibernate mode : write pmm reg 0x05c0e8a0 = %x\n", rdata[0]);
// save hiber pattern to pmm ana0 ana1 and clk domain
low_power_mode_save_data(hibernate,pattern,2);
save_hiber_rtc_value(pattern[0]);
#ifdef FORCE
#ifdef IO_WKUP
iot_printf("force enter into hibernate low power mode and wait for IO wakeup\n");
os_delay(400);
enter_hibernate_mode(io,0,1);
#else
iot_printf("force enter into hibernate low power mode and wait for time out wakeup\n");
os_delay(400);
//enter_hibernate_mode(timer,10000,1);
enter_low_power_mode(hibernate,80000,1);
#endif
#else
#ifdef IO_WKUP
iot_printf("auto enter into hibernate low power mode and wait for IO wakeup\n");
os_delay(400);
enter_hibernate_mode(io,0,0);
#else
iot_printf("auto enter into hibernate low power mode and wait for time out wakeup\n");
os_delay(400);
//enter_hibernate_mode(timer,5000,0);
enter_low_power_mode(hibernate,160000,0);
#endif
#endif
// }
#endif
//DEEP_SLEEP test////////////////////////
#ifdef DEEP_SLEEP
uint32_t rdata = 0;
volatile uint8_t error = 0;
volatile uint8_t i;
uint8_t wakeup_from_deep_slp_flag = 0; // deep_sleep flag
uint32_t pattern = 0x66888866;
uint32_t check_data[100]={0};
if (wake_up_from_deep_slp_check()) {
wakeup_from_deep_slp_flag = 1;
}
if (wakeup_from_deep_slp_flag){
iot_printf("--------------------wake up from deep sleep mode ------------------\n");
//check saved pattern
read_pmm_2k_ram(0,&rdata,1);
iot_printf("deep sleep mode : check saved pattern = %x\n", rdata);
if(0x66888866 != rdata) {
error++;
}
//check saved data in pmm mem 16k
for(i=0; i<100; i++) {
*(check_data+i) = 0;
}
read_pmm_16k_ram(0,check_data,100);
for(i=0; i<100; i++) {
if(check_data[i] != i) error++;
}
//check if dtop register back to default value
rdata = *(volatile uint32_t *)(0x03280000);
iot_printf("deep sleep mode : check 0x03280000 = %x\n", rdata);
if (0x00080000 != rdata){
error++;
}
if(error == 0) {
iot_printf("wake up from deep sleep mode and access pmm 16k ram successfully !\n");
}else
iot_printf("wake up from deep sleep mode and access pmm 16k ram failed !\n");
}//else {
os_delay(2000);
iot_printf("--------------------config to enter deep sleep mode ------------------\n");
//save data to pmm 16k ram
for(i=0; i<100; i++) { // access pmm mem
*(check_data+i) = i;
}
write_pmm_16k_ram(0,check_data,100);
//change dtop register value for test
*(volatile uint32_t *)(0x03280000) = 0x6860; //this reg default value = 0x80000
rdata = *(volatile uint32_t *)(0x03280000);
iot_printf("deep sleep mode : write 0x03280000 = %x\n", rdata);
// save deep sleep pattern to pmm 2k mem
//write_pmm_2k_ram(0,&pattern,1);
low_power_mode_save_data(deep_sleep,&pattern,1);
#ifdef FORCE
#ifdef IO_WKUP
iot_printf("force enter into deep sleep low power mode and wait for IO wakeup\n");
os_delay(400);
enter_deep_sleep_mode(io,0,0,1);
#else
iot_printf("force enter into deep sleep low power mode and wait for time out wakeup\n");
os_delay(400);
//enter_deep_sleep_mode(timer,10000,0,1);
enter_low_power_mode(deep_sleep,80000,1);
#endif
#else
#ifdef IO_WKUP
iot_printf("auto enter into deep sleep low power mode and wait for IO wakeup\n");
os_delay(400);
enter_deep_sleep_mode(io,1,0,0);
#else
iot_printf("auto enter into deep sleep low power mode and wait for time out wakeup\n");
os_delay(400);
//enter_deep_sleep_mode(timer,5000,0,0);
enter_low_power_mode(deep_sleep,160000,0);
#endif
#endif
// }
#endif
//soft reset test////////////////////////
#ifdef SOFT_RESET
uint32_t rdata = 0;
volatile uint8_t error = 0;
volatile uint8_t i;
uint8_t wakeup_from_soft_reset_flag = 0; // deep_sleep flag
uint32_t pattern = 0x66888866;
uint32_t check_data[100]={0};
if (wake_up_from_soft_reset_check()) {
wakeup_from_soft_reset_flag = 1;
}
if (wakeup_from_soft_reset_flag){
iot_printf("--------------------wake up from dtop soft reset mode ------------------\n");
//check saved data in pmm mem 16k
for(i=0; i<100; i++) {
*(check_data+i) = 0;
}
read_pmm_16k_ram(0,check_data,100);
for(i=0; i<100; i++) {
if(check_data[i] != i) error++;
}
//check if dtop register back to default value
rdata = *(volatile uint32_t *)(0x03280000);
iot_printf("soft reset mode : check 0x03280000 = %x\n", rdata);
if (0x00080000 != rdata){
error++;
}
if(error == 0) {
iot_printf("wake up from soft reset mode and access pmm 16k ram successfully !\n");
}else
iot_printf("wake up from soft reset mode and access pmm 16k ram failed !\n");
}
os_delay(2000);
iot_printf("--------------------config to trigger dtop soft reset ------------------\n");
//save data to pmm 16k ram
for(i=0; i<100; i++) { // access pmm mem
*(check_data+i) = i;
}
write_pmm_16k_ram(0,check_data,100);
//change dtop register value for test
*(volatile uint32_t *)(0x03280000) = 0x6860; //this reg default value = 0x80000
rdata = *(volatile uint32_t *)(0x03280000);
iot_printf("soft reset mode : write 0x03280000 = %x\n", rdata);
// save soft reset pattern to pmm 2k mem
write_pmm_2k_ram(0,&pattern,1);
iot_printf("trigger dtop soft reset\n");
os_delay(400);
trigger_dtop_soft_reset();
#endif
while(1)
{
iot_printf("user_task_1....\n");
os_delay(400);
}
}
int32_t iot__task_init()
{
os_task_h handle;
handle = os_create_task(user_task_1, NULL, 9);
//create the tasks;
if(handle != NULL) {
iot_printf("task 1 init successfully...\n");
}
return 0;
}
int32_t iot__module_init(void)
{
//platform intialization;
iot__platform_init();
//create all the tasks;
iot__task_init();
iot_printf("starting...\n");
return 0;
}
int32_t iot__task_start()
{
//start the tasks;
os_start_kernel();
return 0;
}
int32_t iot__module_start(void)
{
int32_t res = 0;
res = iot__task_start();
return res;
}
int main(void)
{
//module init;
iot__module_init();
//module start;
iot__module_start();
return 0;
}