Files
banban/ql-kernel/threadx/init/quec_init.c
T

156 lines
5.9 KiB
C

/*==========================================================================================================
Copyright (c) 2021, Quectel Wireless Solutions Co., Ltd. All rights reserved.
Quectel Wireless Solutions Proprietary and Confidential.
===========================================================================================================*/
/*==========================================================================================================
EDIT HISTORY FOR MODULE
This section contains comments describing changes made to the module.
Notice that changes are listed in reverse chronological order.
WHEN WHO WHAT, WHERE, WHY
------------ ------- -------------------------------------------------------------------------------
09/04/2022 Pony.Ma 此文件服务内核加载APP,进行APP的 RO/RW/BSS的加载和初始化
09/04/2022 Sharon.li 在内核跳转APP之前,进行用户fs的挂载和初始化
===========================================================================================================*/
/*ASR 头文件*/
#include "global_types.h"
#include "utilities.h"
#include "ptable.h"
#include "csw_mem.h"
#include "main.h"
#include "LzmaLib.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ql_ocpu_api.h"
#include "ql_appinit.h"
#include "quec_fs.h"
#include "quec_spi_nor.h"
#include "lfs_cache.h"
#include "loadTable.h"
#include "quec_init.h"
/*----------- External include files -----------------------------------------*/
#if defined(__arm)
#include <locale.h>
#endif
#ifdef QUECTEL_OPEN_CPU
#define QUEC_OPEN_APP_BACKUP 1 /*APP备份功能 0:关闭,1:开启 */
int quec_app_backup_enable = QUEC_OPEN_APP_BACKUP;
#ifdef QUEC_NORFLASH_ERASE_OPTIMIZE
//用户补擦区域数组,默认开启customer_fs分区补擦,分区名字符串长度必须小于16
const char USER_ERASE_RECORD_AREA[2][16]={"customer_fs", {0}};
#endif
/***********************************************************************
*
* Name:
*
* Description: 将app镜像拷贝到执行位置,如果是ramapp则将正ro+rw拷贝到ram_addr
* 若是xipapp则只会将 rw拷贝到ram_addr
*
* Parameters: app_name app分区名;ram_addr appram地址
*
* Returns:
*
* Notes:
*
***********************************************************************/
extern int copy_customer_app_from_flash_to_psram(char *app_name,unsigned int ram_addr);
#ifdef QUEC_APP_FULL_FOTA
extern BOOL IsFullfota_app(void);
#endif
void ql_boot(void);
void ql_app_start_prepare(void)
{
#ifdef QUEC_APP_FULL_FOTA
if(!IsFullfota_app())
#endif
{
if(copy_customer_app_from_flash_to_psram("customer_app",(unsigned int)QUECTEL_OPEN_CPU_ENTRY)){
//uart_printf("file:%s,function:%s,line:%d\r\n", __FILE__,__func__,__LINE__);
ASSERT(0);
}
ql_boot();
}
}
void ql_boot(void)
{
ql_boot_2("customer_app",(unsigned int)QUECTEL_OPEN_CPU_ENTRY);
}
void ql_kernel(void)
{
_ptentry* partition_entrance = NULL;
partition_entrance = ptable_find_entry("customer_fs");
quec_app_log("0x%x , 0x%x",partition_entrance->vstart,partition_entrance->vstart & 0x80000000);
//挂载文件系统
#ifdef EXTERNAL_SPI_NORFLASH_FS
if(partition_entrance->vstart >= 0x90000000){
extern int quec_get_extflash_select_port(void);
int port=quec_get_extflash_select_port();
quec_app_log("SPI FS ADDR:0X%08x SIZE:0x%x",partition_entrance->start,partition_entrance->size);
qextfs_init(U_DISK_SYM, "customer_fs",0,port, partition_entrance->start, partition_entrance->size);
}
else
#endif
{
qfs_init(U_DISK_SYM, "customer_fs", 0);
}
#ifdef QUECTEL_OPEN_CPU //增加open项目在fs中配置audio参数文件功能
#ifndef NO_AUDIO
extern void ql_update_audio_parameters(void);
ql_update_audio_parameters();
#if defined(ASR_PLATFORM_CRANELR) || defined(ASR_PLATFORM_CRANELRH)
#include "AudioHAL.h"
#if defined (__QUECTEL_PROJECT_EC600KCN_LC__) || defined(__QUECTEL_PROJECT_EC600KCN_CC__) || defined (__QUECTEL_PROJECT_EC600KCN_MC__)\
|| defined(__QUECTEL_PROJECT_EC600KCN_LK__)|| defined(__QUECTEL_PROJECT_EC600KCN_CK__) || defined(__QUECTEL_PROJECT_EG600AKCN_91LC__)\
|| defined(__QUECTEL_PROJECT_EG600AKCN_11LC__)|| defined(__QUECTEL_PROJECT_EG600AKCN_11LG__)
AudioHAL_AifSetDevicePort(AUDIOHAL_PORT_SSP2);
#elif defined(__QUECTEL_PROJECT_EC800KCN_LC__) || defined(__QUECTEL_PROJECT_EC800KCN_CC__) || defined(__QUECTEL_PROJECT_EG800KCN_GC__)\
|| defined(__QUECTEL_PROJECT_EG800KEU_CC__)|| defined (__QUECTEL_PROJECT_EC800KCN_MD__) || defined(__QUECTEL_PROJECT_EC800KCN_MC__)\
|| defined (__QUECTEL_PROJECT_EG800KLA_LC__) || defined (__QUECTEL_PROJECT_EG800KEU_LC__)|| defined (__QUECTEL_PROJECT_EG800KLA_CC__)\
|| defined (__QUECTEL_PROJECT_EC800KCN_LK__)|| defined (__QUECTEL_PROJECT_EC800KCN_CK__)|| defined (__QUECTEL_PROJECT_EG915KEU_LA__) \
|| defined (__QUECTEL_PROJECT_EG800AKCN_91LC__)|| defined (__QUECTEL_PROJECT_EG915KEU_LC__) || defined (__QUECTEL_PROJECT_EG915KEU_LG__)\
|| defined (__QUECTEL_PROJECT_EG800AKEU_11LC__)|| defined (__QUECTEL_PROJECT_EG800AKEU_11LG__)|| defined (__QUECTEL_PROJECT_EG800AKLA_11LC__)\
|| defined (__QUECTEL_PROJECT_EG800AKCN_11LN__)|| defined (__QUECTEL_PROJECT_EG915KLA_LC__)|| defined (__QUECTEL_PROJECT_EG915KLA_LA__)\
|| defined (__QUECTEL_PROJECT_EG800AKLA_11LG__)
AudioHAL_AifSetDevicePort(AUDIOHAL_PORT_SSP1);
#endif
quec_app_log("used audio port %d",AudioHAL_AifGetDevicePort());
#endif
#endif
#endif
#ifdef QUEC_APP_FULL_FOTA
if(!IsFullfota_app())
#endif
ql_kernel_2("customer_app",(unsigned int)QUECTEL_OPEN_CPU_ENTRY);
}
void ql_main(void * argv)
{
ql_main_2("customer_app",(unsigned int)QUECTEL_OPEN_CPU_ENTRY);
quec_rtos_task_delete_ex(NULL);
}
#endif