FreeCalypso > hg > freecalypso-citrine
diff L1/dyn_dwl_cfile/l1_dyn_dwl_async.c @ 0:75a11d740a02
initial import of gsm-fw from freecalypso-sw rev 1033:5ab737ac3ad7
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 09 Jun 2016 00:02:41 +0000 |
parents | |
children | dfc7b0bc468a |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/L1/dyn_dwl_cfile/l1_dyn_dwl_async.c Thu Jun 09 00:02:41 2016 +0000 @@ -0,0 +1,719 @@ +/************* Revision Controle System Header ************* + * GSM Layer 1 software + * L1_DYN_DWL_ASYNC.C + * + * Filename l1_dyn_dwl_async.c + * Copyright 2004 (C) Texas Instruments + * + ************* Revision Controle System Header *************/ +#include <stdio.h> +#include <string.h> +#include "config.h" +#include "l1_confg.h" +#include "sys_types.h" +#include "../../riviera/rv/rv_general.h" +#include "../../nucleus/nucleus.h" +#include "l1_types.h" +#include "../../gpf/inc/cust_os.h" +#include "l1audio_signa.h" +#include "l1audio_const.h" +#include "l1audio_cust.h" +#include "l1audio_defty.h" +#include "l1_const.h" +#include "l1tm_defty.h" +#if (L1_GTT == 1) + #include "l1gtt_const.h" + #include "l1gtt_defty.h" +#endif +#if (L1_DYN_DSP_DWNLD==1) + #include "l1_dyn_dwl_defty.h" + #include "l1_dyn_dwl_msgty.h" + #include "l1_dyn_dwl_const.h" + #include "l1_dyn_dwl_signa.h" + #include "l1_dyn_dwl_error.h" + #include "l1_dyn_dwl_proto.h" +#endif +#if (L1_MP3 == 1) + #include "l1mp3_defty.h" +#endif //L1_MP3 +#if (L1_MIDI == 1) + #include "l1midi_defty.h" +#endif +#if (L1_AAC == 1) + #include "l1aac_defty.h" +#endif //L1_AAC + +#include "l1_defty.h" +#include "l1_varex.h" +#include "l1_trace.h" +/* #include "sys_dma.h" */ + + +#if (L1_DYN_DSP_DWNLD == 1) +#if(CODE_VERSION == SIMULATION) + extern VOID trace_fct_simu_dyn_dwnld(CHAR *fct_name); +#endif // CODE_VERSION == SIMULATION + + + +extern UWORD32 dyn_dwnld_address_vect[]; +extern const UWORD8 *dyn_dwnld_copy_MCU_vect[]; +extern UWORD16 dyn_dwnld_crc_vect[]; +extern UWORD16 size_vect[]; + +/*---------------------------------------------------------------------------------------------------------*/ +/* l1_patch_id2string */ +/*---------------------------------------------------------------------------------------------------------*/ +/* */ +/* Parameters : patch identificator "patch_id", string vector "vector" which identifies the patch */ +/* */ +/* Return : Fills the string vector containing the patch id by reference */ +/* */ +/* */ +/* Description : Links the patch ID number to its string value */ +/* */ +/* */ +/*---------------------------------------------------------------------------------------------------------*/ + +#if 0 +void l1_patch_id2string(UWORD16 patch_id, char* vect) +{ + + switch(patch_id) + { + +#if ((CODE_VERSION == SIMULATION) || (((CHIPSET == 12) || (CHIPSET == 15)))) + case MP3_PATCH: + { + vect[0] = 'M'; + vect[1] = 'P'; + vect[2] = '3'; + vect[3] = '\0'; + } + break; +#endif + case MMS_PATCH: + { + vect[0] = 'M'; + vect[1] = 'M'; + vect[2] = 'S'; + vect[3] = '\0'; + } + break; + +#if ((CODE_VERSION == SIMULATION) || (((CHIPSET == 12) || (CHIPSET == 15)))) + case E2_PATCH: + { + vect[0] = 'E'; + vect[1] = '2'; + vect[2] = ' '; + vect[3] = '\0'; + } + break; +#endif + case TTY_PATCH: + { + vect[0] = 'T'; + vect[1] = 'T'; + vect[2] = 'Y'; + vect[3] = '\0'; + } + break; + case SPEECH_ACOUSTIC_PATCH: + { + vect[0] = 'A'; + vect[1] = 'N'; + vect[2] = 'R'; + vect[3] = '\0'; + } + break; +#if ((CODE_VERSION == SIMULATION) || (CHIPSET == 12) || (CHIPSET == 15)) + case AAC_PATCH: + { + vect[0] = 'A'; + vect[1] = 'A'; + vect[2] = 'C'; + vect[3] = '\0'; + } + break; +#endif +#if ((CODE_VERSION == SIMULATION) || (CHIPSET == 12) || (CHIPSET == 15)) + case PCM_EXTRACTION_PATCH: + { + vect[0] = 'P'; + vect[1] = 'C'; + vect[2] = 'M'; + vect[3] = '\0'; + } + break; +#endif + + } +} +#endif + +/*----------------------------------------------------------------------------------------*/ +/* l1_dynamic_download_manager */ +/*----------------------------------------------------------------------------------------*/ +/* */ +/* Parameters : Signal Code of the message, delay flag */ +/* */ +/* Return : True if the primitives triggers a dynamic download and sets all the */ +/* parameters to perform a dynamic download, false otherwise */ +/* */ +/* Description : Implements the dynamic download manager algorithm */ +/* */ +/* */ +/*----------------------------------------------------------------------------------------*/ + + +BOOL l1_dynamic_download_manager(UWORD32 SignalCode, BOOL delay_flag) +{ + + UWORD16 temp_patch_array[MAX_NUM_OF_PATCH_IDS]; + UWORD16 temp_num_patch; + UWORD16 num_of_patch_id_to_dwnld; + UWORD16 num_of_uninstall_elem; + UWORD16 i; + UWORD16 patch_id_uninstall_vect[MAX_NUM_OF_PATCH_IDS]; + UWORD16 patch_id; + UWORD16 temp_patch_id[MAX_NUM_OF_PATCH_IDS]= {0}; //omaps00090550 + BOOL return_flag = FALSE; + + // Primitive is processed only if it triggers a dynamic download or there is a delay + if(delay_flag == TRUE || l1_does_the_incoming_primitive_trigger_dynamic_dwnld(SignalCode, FALSE) == TRUE) + { + + //---------------------------------------------------------------------- + // Compute which patch ids (passed by reference) and the number of patches to install + //---------------------------------------------------------------------- + + temp_num_patch= l1_lookup_primitive_patch_matrix(SignalCode,temp_patch_array); + i=0; + num_of_patch_id_to_dwnld = 0; + + //-------------------------------------------- + // Check if there is any patch that still must be installed + //-------------------------------------------- + + while(i < temp_num_patch) + { + if(l1_is_patch_already_installed(temp_patch_array[i]) == FALSE) + { + l1a.dyn_dwnld.next_patch_id[num_of_patch_id_to_dwnld++] = temp_patch_array[i]; + } + i++; + } + + //-------------------------- + // Manage patch incompatibilities + //-------------------------- + + // if there's at least one patch that must be installed + if(num_of_patch_id_to_dwnld!=0) + { + return_flag = TRUE; + // Check if already installed patches are compatible or not and retrieve number of patches to uninstall and their ids + if(l1_manage_patch_incompatibilty(num_of_patch_id_to_dwnld,&(num_of_uninstall_elem),patch_id_uninstall_vect)) + { + // Set L1A-API HISR variable: no elements to uninstall + l1a_apihisr_com.dyn_dwnld.uninstall_parameters.num_of_elem=0; + + // Trace number of elements to uninstall +#if ((TRACE_TYPE == 1) || (TRACE_TYPE == 4) || (TRACE_TYPE == 5)) + if((trace_info.current_config->l1_dyn_trace) & (1<<L1_DYN_TRACE_DYN_DWNLD)) + { + char string[18]; + sprintf(string,"No UNINSTALL: \r\n"); +#if(CODE_VERSION == SIMULATION) + trace_fct_simu_dyn_dwnld(string); +#else + rvt_send_trace_cpy((T_RVT_BUFFER)string,trace_info.l1_trace_user_id,strlen(string),RVT_ASCII_FORMAT); +#endif // CODE_VERSION == SIMULATION + } +#endif // (TRACE_TYPE == 1) || (TRACE_TYPE == 4) + } + else + { + UWORD16 element,j,index_counter; + + // Set uninstall elements number and their address + l1a_apihisr_com.dyn_dwnld.uninstall_parameters.num_of_elem=num_of_uninstall_elem; + + // Trace number of elements to uninstall +#if ((TRACE_TYPE == 1) || (TRACE_TYPE == 4) || (TRACE_TYPE == 5)) + if((trace_info.current_config->l1_dyn_trace) & (1<<L1_DYN_TRACE_DYN_DWNLD)) + { + char str[20]; + sprintf(str,"UNINST_NUM: %d |\r\n", l1a_apihisr_com.dyn_dwnld.uninstall_parameters.num_of_elem); +#if(CODE_VERSION == SIMULATION) + trace_fct_simu_dyn_dwnld(str); +#else + rvt_send_trace_cpy((T_RVT_BUFFER)str,trace_info.l1_trace_user_id,strlen(str),RVT_ASCII_FORMAT); +#endif // CODE_VERSION == SIMULATION + } +#endif // (TRACE_TYPE == 1) || (TRACE_TYPE == 4) + + // For all patches to uninstall... + for(i=0;i<num_of_uninstall_elem;i++) + { + element=patch_id_uninstall_vect[i]; + + // Trace IDs of elements to uninstall +#if ((TRACE_TYPE == 1) || (TRACE_TYPE == 4) || (TRACE_TYPE == 5)) + if((trace_info.current_config->l1_dyn_trace) & (1<<L1_DYN_TRACE_DYN_DWNLD)) + { + char str[16]; + sprintf(str,"UNINST_ID: %d \r\n", element); +#if(CODE_VERSION == SIMULATION) + trace_fct_simu_dyn_dwnld(str); +#else + rvt_send_trace_cpy((T_RVT_BUFFER)str,trace_info.l1_trace_user_id,strlen(str),RVT_ASCII_FORMAT); +#endif // CODE_VERSION == SIMULATION + } +#endif // (TRACE_TYPE == 1) || (TRACE_TYPE == 4) + + // Set uninstall function address + l1a_apihisr_com.dyn_dwnld.uninstall_parameters.address[i]=dyn_dwnld_address_vect[element]; + } + + index_counter = 0; + for(i=0; i<l1a.dyn_dwnld.num_patches_installed;i++) + { + for(j=0;j<num_of_uninstall_elem;j++) + { + if(l1a.dyn_dwnld.patch_id[i] == patch_id_uninstall_vect[j]) + { + l1a.dyn_dwnld.patch_id[i] = 0xFFFF; //omaps00090550 ; + break; + } + } + if(j == num_of_uninstall_elem) + { + temp_patch_id[index_counter++]=l1a.dyn_dwnld.patch_id[i]; + } + } + // Reset global variables used by dynamic download + l1a.dyn_dwnld.num_patches_installed-=num_of_uninstall_elem; + for(i=0;i<l1a.dyn_dwnld.num_patches_installed;i++) + l1a.dyn_dwnld.patch_id[i] = temp_patch_id[i]; + } + + //----------------------------------------- + // Update L1A-L1APIHISR communication structure + //----------------------------------------- + + l1a_apihisr_com.dyn_dwnld.copy_parameters.num_of_elem=num_of_patch_id_to_dwnld; + l1a.dyn_dwnld.num_of_elem_to_copy = num_of_patch_id_to_dwnld; + + // Trace number of elements to download +#if ((TRACE_TYPE == 1) || (TRACE_TYPE == 4) || (TRACE_TYPE == 5)) + if((trace_info.current_config->l1_dyn_trace) & (1<<L1_DYN_TRACE_DYN_DWNLD)) + { + char str[18]; + sprintf(str,"DWNLD_NUM: %d \r\n", num_of_patch_id_to_dwnld); +#if(CODE_VERSION == SIMULATION) + trace_fct_simu_dyn_dwnld(str); +#else + rvt_send_trace_cpy((T_RVT_BUFFER)str,trace_info.l1_trace_user_id,strlen(str),RVT_ASCII_FORMAT); +#endif // CODE_VERSION == SIMULATION + } +#endif // (TRACE_TYPE == 1) || (TRACE_TYPE == 4) + + // For all patches that must be downloaded... + for (i=0;i<num_of_patch_id_to_dwnld;i++) + { + patch_id=l1a.dyn_dwnld.next_patch_id[i]; + +#if ((TRACE_TYPE == 1) || (TRACE_TYPE == 4) || (TRACE_TYPE == 5)) + if((trace_info.current_config->l1_dyn_trace) & (1<<L1_DYN_TRACE_DYN_DWNLD)) + { + char str[22]; + sprintf(str,"DWNLD_ID: %d \r\n", patch_id); + +#if(CODE_VERSION == SIMULATION) + trace_fct_simu_dyn_dwnld(str); +#else + rvt_send_trace_cpy((T_RVT_BUFFER)str,trace_info.l1_trace_user_id,strlen(str),RVT_ASCII_FORMAT); +#endif // CODE_VERSION == SIMULATION + } +#endif // (TRACE_TYPE == 1) || (TRACE_TYPE == 4) + + // Set patch IDs addresses: copy source address and install address + l1a_apihisr_com.dyn_dwnld.copy_parameters.start_MCU_copy_address[i] = + (UWORD32) dyn_dwnld_copy_MCU_vect[patch_id]; + l1a_apihisr_com.dyn_dwnld.copy_parameters.address_to_install[i] = + dyn_dwnld_address_vect[patch_id]; + l1a_apihisr_com.dyn_dwnld.copy_parameters.crc[i] = + dyn_dwnld_crc_vect[patch_id]; + l1a_apihisr_com.dyn_dwnld.copy_parameters.size_array[i] = + size_vect[patch_id]; + } + + //----------------------------------------- + // Set semaphores to lock involved state machines + //----------------------------------------- + + if(delay_flag == FALSE) + // Tell other state machines that they have to stay in steady state waiting for dynamic download activity to be completed + + l1_set_semaphores_for_all_state_machines_involved(num_of_patch_id_to_dwnld,l1a.dyn_dwnld.next_patch_id); + else + + // Update the already set semaphores if it is the case + + l1_update_semaphores_for_all_state_machines(num_of_patch_id_to_dwnld); + } + } + return return_flag; +} + +/*----------------------------------------------------------------------------------------*/ +/* l1a_dyn_dwnld_set_process */ +/*----------------------------------------------------------------------------------------*/ +/* */ +/* Parameters : Signal Code of the message, delay flag */ +/* */ +/* Return : True if the primitives triggers a dynamic download and sets all the */ +/* parameters to perform a dynamic download, false otherwise */ +/* */ +/* Description : Implements the dynamic download manager algorithm */ +/* */ +/* */ +/*----------------------------------------------------------------------------------------*/ +void l1a_dyn_dwnld_set_process(void) +{ + +#if ((TRACE_TYPE == 1) || (TRACE_TYPE == 4)) + // Disable trace DSP upon Dynamic Download activation + l1_disable_dsp_trace(); +#endif + + // Reset API variables + l1_dyn_dwnld_reset_api(); + + // In case E2 is running, dynamic download must use a different area as E2 samples use trace DSP buffer + // area which is used as well for dynamic download + + if ((l1a.dyn_dwnld.melody0_E2_flag_activated == TRUE) || (l1a.dyn_dwnld.melody1_E2_flag_activated == TRUE)) + + // Set download parameters: size and start download address of API area and number of patches to download + { + l1a_apihisr_com.dyn_dwnld.copy_parameters.start_of_dwnld_area= START_API_DWNLD_AREA_DURING_E2; + l1a_apihisr_com.dyn_dwnld.copy_parameters.size_of_dwnld_area= SIZE_API_DWNLD_AREA_DURING_E2; + } + else + { + l1a_apihisr_com.dyn_dwnld.copy_parameters.start_of_dwnld_area=START_API_DWNLD_AREA; + l1a_apihisr_com.dyn_dwnld.copy_parameters.size_of_dwnld_area=SIZE_API_DWNLD_AREA; + } + + // Dynamic download HISR can be activated + l1_apihisr.dyn_dwnld.running=TRUE; + + // Tell the L1S to start the DSP background task + l1a_l1s_com.dyn_dwnld_task.start=TRUE; +} + + +/*-------------------------------------------------------*/ +/* l1a_dyn_dsp_dwnld_process() */ +/*-------------------------------------------------------*/ +/* */ +/* Description: */ +/* ------------ */ +/* This function is a state machine which handles the */ +/* dynamic download feature. */ +/* */ +/* Starting messages: */ +/* */ +/* Result messages (input): */ +/* */ +/* */ +/* Result messages (output): */ +/* */ +/* Reset messages (input): none */ +/* */ +/* Stop message (input): */ +/* */ +/* Stop message (output): */ +/* */ +/* Rem: */ +/* ---- */ +/* */ +/*-------------------------------------------------------*/ + +void l1a_dyn_dsp_dwnld_process(xSignalHeaderRec *msg) +{ + enum states + { + RESET=0, + WAIT_INIT, + WAIT_RESULT, + WAIT_STOP + }; + + UWORD8 *state =&l1a.dyn_dwnld.state; + UWORD32 SignalCode=msg->SignalCode; + UWORD16 i; + UWORD16 delay_patch_array[MAX_NUM_OF_PATCH_IDS]; + UWORD16 delay_num_patch; + UWORD32 delay_primitive; + + while(1) + { + switch(*state) + { + // ********* + // * RESET * + // ********* + case RESET: + { + // Reset intra L1 variables: L1A-L1S interface, L1A-API interface, global API HISR variables + l1_dyn_dwnld_reset(); + + // Change state + *state = WAIT_INIT; + } + break; + + // ****************** + // * WAIT START REQ * + // ****************** + case WAIT_INIT: + { + + // *----------------------------* + // * Dynamic download manager * + // *----------------------------* + + + /* Run the dynamic download manager */ + if (l1_dynamic_download_manager(SignalCode, FALSE) == TRUE) + { + + /* Initialisation of dynamic download process */ + l1a_dyn_dwnld_set_process(); + + // Change state + *state=WAIT_RESULT; + + } + return; + } +//omaps00090550 break; + + // *************** + // * WAIT_RESULT * + // *************** + + case WAIT_RESULT: + { + if (l1_does_the_incoming_primitive_trigger_dynamic_dwnld(SignalCode,TRUE) == TRUE) + { + if (l1_push_Primitive(SignalCode) == TRUE) + { + delay_num_patch = l1_lookup_primitive_patch_matrix(SignalCode,delay_patch_array); + + // Tell other state machines that they have to stay in steady state waiting for dynamic download activity to be completed + l1_set_semaphores_for_all_state_machines_involved(delay_num_patch, delay_patch_array); + } + else + { +#if ((TRACE_TYPE == 1) || (TRACE_TYPE == 4) || (TRACE_TYPE == 5)) + if((trace_info.current_config->l1_dyn_trace) & (1<<L1_DYN_TRACE_DYN_DWNLD)) + { + char str[16]; + sprintf(str,"Fifo ovflw:\r\n"); +#if(CODE_VERSION == SIMULATION) + trace_fct_simu_dyn_dwnld(str); +#else + rvt_send_trace_cpy((T_RVT_BUFFER)str,trace_info.l1_trace_user_id,strlen(str),RVT_ASCII_FORMAT); +#endif // CODE_VERSION == SIMULATION + } +#endif // (TRACE_TYPE == 1) || (TRACE_TYPE == 4) + } + } + switch(SignalCode) + { + + // *----------------------------------------------------------------------------------* + // * CRC reported is not OK or an error has been reported; Restart patch from scratch * + // *----------------------------------------------------------------------------------* + case API_L1_CRC_NOT_OK: + { +#if ((TRACE_TYPE == 1) || (TRACE_TYPE == 4) || (TRACE_TYPE == 5)) + // Trace + if((trace_info.current_config->l1_dyn_trace) & (1<<L1_DYN_TRACE_DYN_DWNLD)) + { + char str[18]; + sprintf(str,"CRC NOK: %4x \r\n",((T_API_L1_CRC_NOT_OK *)(msg->SigP))->patch_id); +#if(CODE_VERSION == SIMULATION) + trace_fct_simu_dyn_dwnld(str); +#else + rvt_send_trace_cpy((T_RVT_BUFFER)str,trace_info.l1_trace_user_id,strlen(str),RVT_ASCII_FORMAT); +#endif // CODE_VERSION == SIMULATION + } +#endif // (TRACE_TYPE == 1) || (TRACE_TYPE == 4) + + // Set recovery flag to TRUE; + l1a_l1s_com.recovery_flag = TRUE; + *state = RESET; + } + break; + case API_L1_DYN_DWNLD_STOP: + { +#if ((TRACE_TYPE == 1) || (TRACE_TYPE == 4) || (TRACE_TYPE == 5)) + if((trace_info.current_config->l1_dyn_trace) & (1<<L1_DYN_TRACE_DYN_DWNLD)) + { + char str[15]; + sprintf(str,"DSP Error \r\n"); +#if(CODE_VERSION == SIMULATION) + trace_fct_simu_dyn_dwnld(str); +#else + rvt_send_trace_cpy((T_RVT_BUFFER)str,trace_info.l1_trace_user_id,strlen(str),RVT_ASCII_FORMAT); +#endif // CODE_VERSION == SIMULATION + } +#endif // (TRACE_TYPE == 1) || (TRACE_TYPE == 4) + + // Set recovery flag to TRUE; + l1a_l1s_com.recovery_flag = TRUE; + *state = RESET; + } + break; + + // *-------------------------------------------------------------* + // * Dynamic download finished: all patches have been downloaded * + // *-------------------------------------------------------------* + case API_L1_CRC_OK: + { +#if ((TRACE_TYPE == 1) || (TRACE_TYPE == 4) || (TRACE_TYPE == 5)) + // Trace + if((trace_info.current_config->l1_dyn_trace) & (1<<L1_DYN_TRACE_DYN_DWNLD)) + { + char str[18]; + sprintf(str,"CRC OK: %4x \r\n",((T_API_L1_CRC_NOT_OK *)(msg->SigP))->patch_id); +#if(CODE_VERSION == SIMULATION) + trace_fct_simu_dyn_dwnld(str); +#else + rvt_send_trace_cpy((T_RVT_BUFFER)str,trace_info.l1_trace_user_id,strlen(str),RVT_ASCII_FORMAT); +#endif // CODE_VERSION == SIMULATION + } +#endif // (TRACE_TYPE == 1) || (TRACE_TYPE == 4) + } + break; + case API_L1_DYN_DWNLD_FINISHED: + { + + // Store currently installed patch + for (i=0;i<l1a.dyn_dwnld.num_of_elem_to_copy;i++) + { + l1a.dyn_dwnld.patch_id[l1a.dyn_dwnld.num_patches_installed+i]=l1a.dyn_dwnld.next_patch_id[i]; + } + + // Update the counter of the patch currently installed and reset sempahores + l1a.dyn_dwnld.num_patches_installed+=l1a.dyn_dwnld.num_of_elem_to_copy; + l1_reset_semaphores(); + + // Reset number of element to copy in the next phase + l1a.dyn_dwnld.num_of_elem_to_copy = 0; + + // Reset next patch ID global variables + for(i=0;i<MAX_NUM_OF_PATCH_IDS;i++) + l1a.dyn_dwnld.next_patch_id[i] = 0xFFFF; //omaps00090550 ; + +#if ((TRACE_TYPE == 1) || (TRACE_TYPE == 4) || (TRACE_TYPE == 5)) + // Trace + if((trace_info.current_config->l1_dyn_trace) & (1<<L1_DYN_TRACE_DYN_DWNLD)) + { + char str[26]; + sprintf(str,"Patch dwnld finished \r\n"); +#if(CODE_VERSION == SIMULATION) + trace_fct_simu_dyn_dwnld(str); +#else + rvt_send_trace_cpy((T_RVT_BUFFER)str,trace_info.l1_trace_user_id,strlen(str),RVT_ASCII_FORMAT); +#endif // CODE_VERSION == SIMULATION + } +#endif // (TRACE_TYPE == 1) || (TRACE_TYPE == 4) + + // Check if there is any pending primitive waiting to be de-queued + { + UWORD32 remaining_primitive_flag=0; + UWORD32 process_continue_flag=1; + UWORD32 delay_primitive_processed_flag=0; + + remaining_primitive_flag = (l1_check_Fifo_Primitive()>0); + + while(remaining_primitive_flag && process_continue_flag) + { + l1_pop_Primitive(&(delay_primitive)); + if (l1_dynamic_download_manager(delay_primitive, TRUE) == TRUE) + { + process_continue_flag=0; + delay_primitive_processed_flag=1; + // If yes set the restart command at apihisr level + l1a_apihisr_com.dyn_dwnld.command.restart = TRUE; + + /********** WORKAROUND *************/ +#if 1 //(OP_RIV_AUDIO == 1) + { + // WARNING: temporary until os_activate_hisr() is declared in L3 functions + extern NU_HISR apiHISR; + NU_Activate_HISR(&apiHISR); + } +#else + os_activate_hisr(API_HISR); +#endif // OP_RIV_AUDIO == 1 + /********** WORKAROUND *************/ + *state = WAIT_RESULT; + } + remaining_primitive_flag = (l1_check_Fifo_Primitive()>0); + } + + // else stop the DSP background task as no other patch must be downloaded + if(delay_primitive_processed_flag == 0) + { +#if ((TRACE_TYPE == 1) || (TRACE_TYPE == 4)) + // Enable trace DSP upon Dynamic Download deactivation + l1_enable_dsp_trace(); + //Trace_dsp_dump(); +#endif // omaps00090550 #14-D removal + l1a_l1s_com.dyn_dwnld_task.stop=TRUE; + *state = WAIT_STOP; + } + } + } + break; + } // switch(SignalCode) + return; + } +//omaps00090550 break; // case WAIT_RESULT + case WAIT_STOP: + { + /* In case of a primitive which triggers a dynamic download arrives we must start over */ + if (l1_does_the_incoming_primitive_trigger_dynamic_dwnld(SignalCode,TRUE) == TRUE) + { + /* Run the dynamic download manager */ + if (l1_dynamic_download_manager(SignalCode, FALSE) == TRUE) + { + /* Initialisation of dynamic download process */ + l1a_dyn_dwnld_set_process(); + + // Change state + *state=WAIT_RESULT; + } + } + else if (SignalCode == L1_DYN_DWNLD_STOP_CON) + { + // DYN DWNLD HISR must be deactivated + l1_apihisr.dyn_dwnld.running=FALSE; + // Change state + *state=RESET; + } + return; + } +//omaps00090550 break; + } + } +} +#endif // L1_DYN_DSP_DWNLD