/*************************************************************************** * * Copyright 2015-2019 BES. * All rights reserved. All unpublished rights reserved. * * No part of this work may be used or reproduced in any form or by any * means, or stored in a database or retrieval system, without prior written * permission of BES. * * Use of this work is governed by a license granted by BES. * This work contains confidential and proprietary information of * BES. which is protected by copyright, trade secret, * trademark and other intellectual property rights. * ****************************************************************************/ #include "cmsis_os.h" #include "stdio.h" #include "string.h" #include "hal_timer.h" #include "hal_trace.h" #include "crc32.h" #include "resources.h" #ifdef MEDIA_PLAYER_SUPPORT typedef struct { UINT32 MARK; UINT16 ID; // resource id UINT16 count; // count of resource UINT32 total_size; // size include resource header, header list and data } ResourceHeader_t; typedef struct { UINT16 audio_id; // audio id UINT16 type; UINT32 size; UINT32 offset; } AudioHeader_t; typedef struct _AUDIO_List { struct _AUDIO_List *next; AudioHeader_t record; } AUDIO_List; #define AUDIO_TOOL_VERSION 0x6001 #define MAGIC_NUMBER 0xC0BA #define AUDIO_TOOL_RES_MARK 0xDDCCBBAA UINT16 gVersionNO = 0; UINT32 gReserver1 = 0; UINT32 gReserver2 = 0; ResourceHeader_t *gpResourceBase = NULL; // base address of resource data, will be set by boot monitor AUDIO_List *gpAudioList = NULL; AUDIO_List *gpAudioList_CN = NULL; uint8_t *gpAudioDataBase = NULL; uint8_t *gpAudioDataBase_CN = NULL; // uint8_t os_pool_audio_List[sizeof(AUDIO_List)*MAX_RECORD_NUM ] // __attribute__((section(".audioList"))); AUDIO_List os_pool_audio_List [MAX_RECORD_NUM]; //__attribute__((section(".audioList"))); // osPoolDef_t os_pool_def_audio_List = { MAX_RECORD_NUM, sizeof(AUDIO_List), // os_pool_audio_List };//osPoolDef(name, no, type) osPoolId AUDIO_ListPool_Id; AUDIO_List os_pool_audio_List_CN[MAX_RECORD_NUM]; UINT8 *aud_get_reouce(AUD_ID_ENUM id, UINT32 *leng, UINT16 *type) { AUDIO_List *list = gpAudioList; *leng = 0, *type = 0; while (list) { if (list->record.audio_id == id) { *leng = list->record.size; *type = list->record.type; return (UINT8 *)(gpAudioDataBase + list->record.offset); } list = list->next; } return 0; } UINT8 *aud_get_reouce_chinese(AUD_ID_ENUM id, UINT32 *leng, UINT16 *type) { AUDIO_List *list = gpAudioList_CN; *leng = 0, *type = 0; while (list) { if (list->record.audio_id == id) { *leng = list->record.size; *type = list->record.type; return (UINT8 *)(gpAudioDataBase_CN + list->record.offset); } list = list->next; } return 0; } /* --1.Version No&Magic No.<4> --2.CRC <4> --3.Reserver1 <4> total length = 5+6+7+... --4.Reserver2 <4> --5.ResourceHeader_t <8> --6.AUDIO_HEAD_LIST X count <16 x count> --7.file.. gpAudioDataBase.. offset --.... another resource */ void init_audio_resource(void *gResource) { uint32_t crc; uint32_t *pcrc; uint32_t data; UINT32 res_addr; ResourceHeader_t *pRes; data = *((UINT32 *)gResource); gVersionNO = 0xFFFF & (data >> 16); gReserver1 = *((UINT32 *)((uint32_t)gResource + 2 * sizeof(UINT32))); pcrc = (uint32_t *)((uint32_t)gResource + sizeof(UINT32)); /*crc*/ gpResourceBase = (ResourceHeader_t *)((uint32_t)gResource + 4 * sizeof(uint32_t)); /********************************************************/ crc = crc32(0, (uint8_t *)((uint32_t)gpResourceBase), gReserver1); TRACE(3, "%s, *pcrc: %x , crc: %x", __func__, *pcrc, crc); if (*pcrc != crc) return; res_addr = (uint32_t)gpResourceBase; pRes = (ResourceHeader_t *)gpResourceBase; while ((UINT32)pRes < (UINT32)gpResourceBase + gReserver1 && pRes->MARK == AUDIO_TOOL_RES_MARK) { if (pRes->ID == RES_ENGLISH_ID) { AUDIO_List *list; memset(os_pool_audio_List, 0, sizeof(AUDIO_List) * MAX_RECORD_NUM); memcpy((uint8_t *)os_pool_audio_List, (uint8_t *)((uint32_t)pRes + sizeof(ResourceHeader_t)), sizeof(AUDIO_List) * pRes->count); gpAudioList = (AUDIO_List *)os_pool_audio_List; list = gpAudioList; gpAudioDataBase = (uint8_t *)pRes + sizeof(ResourceHeader_t) + sizeof(AUDIO_List) * pRes->count; TRACE(3, "%s, english count: %d, leng: %d", __func__, pRes->count, pRes->total_size); for (int i = 1; i < pRes->count; i++) { list->next = &os_pool_audio_List[i]; list = list->next; } TRACE(2, "%s, english list: %p", __func__, list); } else if (pRes->ID == RES_CHINESE_ID) { AUDIO_List *list; TRACE(2, "%s, AUDIO_TOOL_RES_MARK: %d", __func__, pRes->count); memset(os_pool_audio_List_CN, 0, sizeof(AUDIO_List) * MAX_RECORD_NUM); memcpy((uint8_t *)os_pool_audio_List_CN, (uint8_t *)((uint32_t)pRes + sizeof(ResourceHeader_t)), sizeof(AUDIO_List) * pRes->count); gpAudioList_CN = (AUDIO_List *)os_pool_audio_List_CN; list = gpAudioList_CN; gpAudioDataBase_CN = (uint8_t *)pRes + sizeof(ResourceHeader_t) + sizeof(AUDIO_List) * pRes->count; TRACE(3, "%s, chinese count: %d, leng: %d", __func__, pRes->count, pRes->total_size); for (int i = 1; i < pRes->count; i++) { list->next = &os_pool_audio_List_CN[i]; list = list->next; } } TRACE(3, "%s, %x, pRes->total_size: %x", __func__, res_addr, pRes->total_size); res_addr += pRes->total_size; pRes = (ResourceHeader_t *)(res_addr); } TRACE(2, "%s, pRes add: %p", __func__, pRes); } #if 0 UINT8 BIN_FILE[] = { 0xba,0xc0,0x01,0x60,0x18,0x17,0x81,0x7a,0x90,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0xaa,0xbb,0xcc,0xdd,0x00,0xff,0x1c,0x00,0xc8,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x05,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x06,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x07,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x08,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x09,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x0a,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x0b,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x0c,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x0d,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x0e,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x0f,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x10,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x11,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x12,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x14,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x15,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x16,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x17,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x18,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x19,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x1a,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x1b,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0x34,0x34,0x34,0x35, 0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34, 0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36, 0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36, 0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35, 0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34, 0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34, 0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36, 0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35, 0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35, 0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34, 0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36, 0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36, 0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35, 0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34, 0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34, 0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0xaa,0xbb,0xcc,0xdd,0x01,0xff,0x1c,0x00, 0xc8,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x09,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x09,0x00,0x00,0x00, 0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x09,0x00,0x00,0x00, 0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x00,0x09,0x00,0x00,0x00, 0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x09,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x04,0x00,0x09,0x00,0x00,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x04,0x00,0x09,0x00,0x00,0x00, 0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x04,0x00,0x09,0x00,0x00,0x00, 0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x04,0x00,0x09,0x00,0x00,0x00, 0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x04,0x00,0x09,0x00,0x00,0x00, 0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x04,0x00,0x09,0x00,0x00,0x00, 0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x00,0x04,0x00,0x09,0x00,0x00,0x00, 0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x04,0x00,0x09,0x00,0x00,0x00, 0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x00,0x04,0x00,0x09,0x00,0x00,0x00, 0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x04,0x00,0x09,0x00,0x00,0x00, 0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x04,0x00,0x09,0x00,0x00,0x00, 0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x04,0x00,0x09,0x00,0x00,0x00, 0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x04,0x00,0x09,0x00,0x00,0x00, 0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x04,0x00,0x09,0x00,0x00,0x00, 0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x00,0x04,0x00,0x09,0x00,0x00,0x00, 0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x04,0x00,0x09,0x00,0x00,0x00, 0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x00,0x04,0x00,0x09,0x00,0x00,0x00, 0xbd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x00,0x04,0x00,0x09,0x00,0x00,0x00, 0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x00,0x04,0x00,0x09,0x00,0x00,0x00, 0xcf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x04,0x00,0x09,0x00,0x00,0x00, 0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x00,0x04,0x00,0x09,0x00,0x00,0x00, 0xe1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x00,0x04,0x00,0x09,0x00,0x00,0x00, 0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x04,0x00,0x09,0x00,0x00,0x00, 0xf3,0x00,0x00,0x00,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31, 0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31, 0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33, 0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32, 0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32, 0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31, 0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33, 0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33, 0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32, 0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31, 0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31, 0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33, 0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32, 0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32, 0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31, 0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33, }; void test_resource_load() { UINT32 leng; UINT16 type; UINT8* data; init_audio_resource(BIN_FILE); data = aud_get_reouce(AUD_ID_BT_CALL_REFUSE, &leng, &type); TRACE(6,"====english_audio, leng = %d, type = %d, data[0] = %x, data[1]= %x, data[2]= %x, data[3]= %x", leng, type, data[0], data[1], data[2], data[3]); data = aud_get_reouce_chinese(AUD_ID_BT_CLEAR_SUCCESS, &leng, &type); TRACE(6,"====chinese_audio, leng = %d, type = %d, data[0] = %x, data[1]= %x, data[2]= %x, data[3]= %x", leng,type, data[0], data[1], data[2], data[3]); }; #endif #endif const char *aud_id_str[] = { "[POWER_ON]", "[POWER_OFF]", "[LANGUAGE_SWITCH]", "[NUM_0]", "[NUM_1]", "[NUM_2]", "[NUM_3]", "[NUM_4]", "[NUM_5]", "[NUM_6]", "[NUM_7]", "[NUM_8]", "[NUM_9]", "[BT_PAIR_ENABLE]", "[BT_PAIRING]", "[BT_PAIRING_SUC]", "[BT_PAIRING_FAIL]", "[BT_CALL_REFUSE]", "[BT_CALL_OVER]", "[BT_CALL_ANSWER]", "[BT_CALL_HUNG_UP]", "[BT_CALL_INCOMING_CALL]", "[BT_CALL_INCOMING_NUMBER]", "[BT_CHARGE_PLEASE]", "[BT_CHARGE_FINISH]", "[BT_CLEAR_SUCCESS]", "[BT_CLEAR_FAIL]", "[BT_CONNECTED]", "[BT_DIS_CONNECT]", "[BT_WARNING]", "[BT_ALEXA_START]", "[FIND_MY_BUDS]", "[TILE FIND]", "[BT_ALEXA_STOP]", "[BT_GSOUND_MIC_OPEN]", "[BT_GSOUND_MIC_CLOSE]", "[BT_GSOUND_NC]", "[BT_MUTE]", "[RING_WARNING]", #ifdef __INTERACTION__ "[BT_FINDME]", #endif }; const char *aud_id2str(UINT16 aud_id) { const char *str = NULL; if (aud_id >= 0 && aud_id < MAX_RECORD_NUM) { str = aud_id_str[aud_id]; } else { str = "[UNKNOWN]"; } return str; }