/*========================================================================================================== 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 #include #include #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 #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