Files

94 lines
3.5 KiB
C

/*==========================================================================================================
Copyright (c) 2021, Quectel Wireless Solutions Co., Ltd. All rights reserved.
Quectel Wireless Solutions Proprietary and Confidential.
===========================================================================================================*/
#include <stdio.h>
#include <string.h>
#include "ql_rtos.h"
#include "ql_application.h"
#include "ql_type.h"
#include "ql_error.h"
#include "ql_func.h"
// 定义函数指针类型
typedef void (*ql_open_maping_init_func)(void);
typedef void (*cache_clean_memory_func)(void *addr, unsigned int size);
#define QUECTEL_APP1_ROM_STRAT 0x80615008 //app1 rom起始地址+8偏移地址
// 内核API映射函数启动地址
#define QUEC_STATIC_MAPPING_ADDR 0x7e47df14 //ql_static_mapping quec_staic_mapping 结构体地址;
#define VIRTUAL_FUNC_TBL_ADDR 0x7e47df24 //func_mapping virtual_func_tbl 结构体地址;
#define QL_OPEN_MAPING_INIT_ADDR 0x802ede2f //ql_open_maping_init 函数地址
#define CACHE_CLEAN_MEMORY_ADDR 0x7e68d085 //CacheCleanMemory 函数地址
void app1_start_test(void *APP1_ROM_STRAT)
{
boot_para quec_boottime_para = {0};
ql_open_entry* entry;
unsigned int app_ro_addr;
unsigned int tmp;
app_ro_addr = (unsigned int)(APP1_ROM_STRAT);
entry = (ql_open_entry*) (APP1_ROM_STRAT);
// 通过已知地址访问内核函数和变量
ql_static_mapping *static_mapping = (ql_static_mapping *)QUEC_STATIC_MAPPING_ADDR;
func_mapping *virtual_func_table = (func_mapping *)VIRTUAL_FUNC_TBL_ADDR;
ql_open_maping_init_func open_maping_init =(ql_open_maping_init_func )QL_OPEN_MAPING_INIT_ADDR;
cache_clean_memory_func cache_clean = (cache_clean_memory_func)CACHE_CLEAN_MEMORY_ADDR;
// 初始化内核API映射表
quec_boottime_para.static_maping = (ql_static_mapping *)QUEC_STATIC_MAPPING_ADDR;
quec_boottime_para.kernel_maping= (func_mapping *)VIRTUAL_FUNC_TBL_ADDR;
open_maping_init();
printf("func:%s,line:%d,boot: 0x%08x \r\n",__func__,__LINE__, entry->boot);
printf("func:%s,line:%d,kernel: 0x%08x \r\n",__func__,__LINE__, entry->kernel);
printf("func:%s,line:%d,main: 0x%08x \r\n",__func__,__LINE__, entry->main);
if(entry->data_load_addr && entry->data_ram_start && entry->data_ram_end) {
UINT32 *src = (UINT32 *)(entry->data_load_addr);
UINT32 *dst = (UINT32 *)entry->data_ram_start;
UINT32 len = entry->data_ram_end - entry->data_ram_start;
UINT32 i;
int result;
// 复制数据将flash RW段数据复制到RAM
for(i = 0; i < len; i += 4) {
*dst++ = *src++;
}
// 清除缓存
cache_clean((void *)dst, len);
// 重置指针
src = (UINT32 *)(entry->data_load_addr);
dst = (UINT32 *)entry->data_ram_start;
tmp = memcmp((void *)src, (void *)dst, len/4);
printf("memcmp result %s\r\n",(tmp==0)?"SUCCEED":"FAILED");
}
if(entry->boot)
{
entry->boot(&quec_boottime_para);
}
if(entry->kernel)
{
entry->kernel(NULL);
}
if(entry->main)
{
(entry->main)(NULL);
}
ql_rtos_task_delete(NULL);
}
void app1_start_test_task(void)
{
printf("app1_start_task\r\n");
app1_start_test(QUECTEL_APP1_ROM_STRAT);
}
//application_init(app1_start_task, "app1", 20, 0);