19
+ − 1 /************* Revision Controle System Header *************
+ − 2 * GSM Layer 1 software
+ − 3 * L1_DYN_DWL_APIHISR.C
+ − 4 *
+ − 5 * Filename l1_dyn_dwl_apihisr.c
+ − 6 * Copyright 2004 (C) Texas Instruments
+ − 7 *
+ − 8 ************* Revision Controle System Header *************/
+ − 9
+ − 10 #include <stdio.h>
+ − 11 #include <string.h>
+ − 12 #include "nucleus.h"
+ − 13 #include "l1_confg.h"
+ − 14 #include "sys_types.h"
+ − 15 #include "l1_types.h"
+ − 16 #include "l1audio_cust.h"
+ − 17 #include "l1audio_defty.h"
+ − 18 #include "l1audio_const.h"
+ − 19 #include "l1_const.h"
+ − 20 #include "l1tm_defty.h"
+ − 21
+ − 22 #if (L1_GTT == 1)
+ − 23 #include "l1gtt_const.h"
+ − 24 #include "l1gtt_defty.h"
+ − 25 #endif
+ − 26
+ − 27 #if (L1_DYN_DSP_DWNLD == 1)
+ − 28 #include "l1_dyn_dwl_const.h"
+ − 29 #include "l1_dyn_dwl_signa.h"
+ − 30 #include "l1_dyn_dwl_defty.h"
+ − 31 #include "l1_dyn_dwl_msgty.h"
+ − 32 #include "l1_dyn_dwl_error.h"
+ − 33 #include "l1_dyn_dwl_proto.h"
+ − 34 #include "l1_api_hisr.h"
+ − 35 #endif
+ − 36 #if (L1_MP3 == 1)
+ − 37 #include "l1mp3_defty.h"
+ − 38 #endif //L1_MP3
+ − 39 #if (L1_MIDI == 1)
+ − 40 #include "l1midi_defty.h"
+ − 41 #endif
+ − 42
+ − 43 #include "l1_defty.h"
+ − 44 #include "cust_os.h"
25
+ − 45 /* #include "nu_main.h" */
19
+ − 46 #include "l1audio_signa.h"
+ − 47 #include "l1audio_cust.h"
+ − 48 #include "l1_varex.h"
+ − 49 #include "l1_macro.h"
+ − 50 #include "l1_api_hisr.h"
+ − 51 #include "l1_trace.h"
+ − 52
+ − 53 #if (L1_DYN_DSP_DWNLD == 1)
+ − 54
+ − 55 /* Dynamic Download NDB API */
+ − 56 T_DYN_DWNLD_MCU_DSP *dyn_dwl_ndb;
+ − 57
+ − 58 #if (CODE_VERSION == SIMULATION)
+ − 59 T_DYN_DWNLD_MCU_DSP dyn_dwl_ndb_sim;
+ − 60 UWORD16 dwnld_area_array[SIZE_DWNLD_AREA_SIMU];
+ − 61 #endif
+ − 62
+ − 63 enum states
+ − 64 {
+ − 65 RESET = 0,
+ − 66 WAIT_UNINSTALL = 1,
+ − 67 WAIT_DSP_END_BUFFER = 2,
+ − 68 WAIT_CRC = 3,
+ − 69 WAIT_INSTALL = 4
+ − 70 };
+ − 71 /*------------------------------------------------------------------------------------------------------------- */
+ − 72 /* l1_dyn_dwnld_copy_patch_process() */
+ − 73 /*------------------------------------------------------------------------------------------------------------- */
+ − 74 /* */
+ − 75 /* Parameters : BOOL new_patch: TRUE if the patch is copied from scratch, FALSE if it has been started so far */
+ − 76 /* */
+ − 77 /* Return : state in which must be stepped into */
+ − 78 /* */
+ − 79 /* Description : Performs the copy of the patch and computes next state of corresponding APIHISR state machine */
+ − 80 /* */
+ − 81 /*------------------------------------------------------------------------------------------------------------- */
+ − 82
+ − 83 UWORD8 l1_dyn_dwnld_copy_patch_process (BOOL new_patch)
+ − 84 {
+ − 85 BOOL still_words_to_be_copied;
+ − 86 UWORD16 tmp_dwnld_area_size;
+ − 87 UWORD8 return_state;
+ − 88 UWORD16 *p_src_mcu = NULL;
+ − 89 UWORD16 *p_dest_mcu = NULL;
+ − 90 UWORD16 *tmp_pointer = NULL;
+ − 91
+ − 92 UWORD16 tmp_patch_size = l1_apihisr.dyn_dwnld.tmp_patch_size;
+ − 93
+ − 94 /* Copy first N block of data */
+ − 95 still_words_to_be_copied = l1_init_pointers_and_copy_first_block_of_data(&(tmp_dwnld_area_size), &(tmp_patch_size), &(p_dest_mcu), &(p_src_mcu),new_patch);
+ − 96
+ − 97 /* Set download command */
+ − 98 dyn_dwl_ndb->d_api_dwl_download_ctrl = (API) C_DWL_DOWNLOAD_CTRL_DOWNLOAD;
+ − 99
+ − 100 #if (CODE_VERSION == SIMULATION)
+ − 101 l1_trigger_api_interrupt();
+ − 102 #endif
+ − 103
+ − 104 /* Check if there are still words to be copied after first API interrupt generation: if not */
+ − 105 /* the patch has been completely downloaded and MCU waits for CRC*/
+ − 106 if(still_words_to_be_copied == FALSE)
+ − 107 {
+ − 108 return_state = WAIT_CRC;
+ − 109 }
+ − 110
+ − 111 /* If not copy the patch: if download area is bigger than patch size copy until the end of the patch */
+ − 112 /* Else copy till the end of buffer download area and wait for DSP interrupt */
+ − 113 else
+ − 114 {
+ − 115 if (tmp_dwnld_area_size >= tmp_patch_size)
+ − 116 {
+ − 117 l1_copy_till_the_end_of_the_patch_and_update_write_pointer(tmp_patch_size,p_dest_mcu,p_src_mcu);
+ − 118 return_state = WAIT_CRC;
+ − 119 }
+ − 120 else
+ − 121 {
+ − 122 l1_copy_till_end_of_dwnld_area_and_update_write_pointer(tmp_dwnld_area_size,p_dest_mcu,&tmp_patch_size,&p_src_mcu);
+ − 123
+ − 124 /* Save source patch file pointerand temporary patch size*/
+ − 125 l1_apihisr.dyn_dwnld.running_source_pointer = (UWORD32) p_src_mcu;
+ − 126 l1_apihisr.dyn_dwnld.tmp_patch_size = tmp_patch_size;
+ − 127
+ − 128 /* Change state*/
+ − 129 return_state = WAIT_DSP_END_BUFFER;
+ − 130 }
+ − 131 }
+ − 132 return return_state;
+ − 133 }
+ − 134 /*-------------------------------------------------------------*/
+ − 135 /* l1_dyn_dwnld_apihisr() */
+ − 136 /*-------------------------------------------------------------*/
+ − 137 /* */
+ − 138 /* Parameters : none */
+ − 139 /* */
+ − 140 /* Return : n/a */
+ − 141 /* */
+ − 142 /* Description : implements Dynamic Download API HISR */
+ − 143 /* */
+ − 144 /*-------------------------------------------------------------*/
+ − 145
+ − 146 void l1_dyn_dwnld_apihisr()
+ − 147 {
+ − 148
+ − 149 UWORD8 *state = &l1_apihisr.dyn_dwnld.state;
+ − 150
+ − 151
+ − 152 /* Variables for copy process */
+ − 153
+ − 154 xSignalHeaderRec *conf_msg;
+ − 155 BOOL flag_error;
+ − 156
+ − 157 /* Dynamic Download error handler : check if critical error occured */
+ − 158 if( l1_dyn_dwnld_apihisr_error_handler() == TRUE )
+ − 159 {
+ − 160 /* Send notification to L1A */
+ − 161 conf_msg = os_alloc_sig(sizeof(T_API_L1_DYN_DWNLD_STOP));
+ − 162 DEBUGMSG(status,NU_ALLOC_ERR)
+ − 163 conf_msg->SignalCode = API_L1_DYN_DWNLD_STOP;
+ − 164 ((T_API_L1_DYN_DWNLD_STOP *) (conf_msg->SigP))->error = dyn_dwl_ndb->d_api_dwl_error_code;
+ − 165 dyn_dwl_ndb->d_api_dwl_error_code = C_DWL_ERR_RESET;
+ − 166 os_send_sig(conf_msg,L1C1_QUEUE);
+ − 167 DEBUGMSG(status,NU_SEND_QUEUE_ERR)
+ − 168
+ − 169 /* Branch state */
+ − 170 *state = RESET;
+ − 171 flag_error = TRUE;
+ − 172 return;
+ − 173 }
+ − 174 else
+ − 175 {
+ − 176 flag_error = FALSE;
+ − 177 }
+ − 178
+ − 179 /****************/
+ − 180 /*STATE MACHINE */
+ − 181 /****************/
+ − 182
+ − 183 while (1){
+ − 184 switch(*state)
+ − 185 {
+ − 186 /*********/
+ − 187 /* RESET */
+ − 188 /*********/
+ − 189 case RESET:
+ − 190 {
+ − 191 /* Check reset init command (if reset by DSP) / Restart in case dynamic download delayed */
+ − 192 if ( dyn_dwl_ndb->d_api_dwl_download_ctrl == (API) C_DWL_DOWNLOAD_CTRL_DSP_ACK ||
+ − 193 l1a_apihisr_com.dyn_dwnld.command.restart == TRUE)
+ − 194 {
+ − 195 if (flag_error == FALSE)
+ − 196 {
+ − 197
+ − 198 /* Send confirmation to L1A */
+ − 199 conf_msg = os_alloc_sig(0);
+ − 200 DEBUGMSG(status,NU_ALLOC_ERR)
+ − 201 conf_msg->SignalCode = API_L1_DYN_DWNLD_START_CON;
+ − 202 os_send_sig(conf_msg,L1C1_QUEUE);
+ − 203 DEBUGMSG(status,NU_SEND_QUEUE_ERR)
+ − 204
+ − 205 /* Store patch IDs to install counter in global API */
+ − 206 l1_apihisr.dyn_dwnld.patch_ids_counter = l1a_apihisr_com.dyn_dwnld.copy_parameters.num_of_elem;
+ − 207
+ − 208 /* Reset command */
+ − 209 l1a_apihisr_com.dyn_dwnld.command.restart = FALSE;
+ − 210
+ − 211 /* Test if number of uninstall elements is greater than zero */
+ − 212 if ( l1a_apihisr_com.dyn_dwnld.uninstall_parameters.num_of_elem > 0 )
+ − 213 {
+ − 214 /* Copy num of elem L1A-API variable counter into global uninstall counter */
+ − 215 l1_apihisr.dyn_dwnld.uninstall_counter = l1a_apihisr_com.dyn_dwnld.uninstall_parameters.num_of_elem;
+ − 216
+ − 217 l1_set_uninstall_parameters();
+ − 218
+ − 219 #if (CODE_VERSION == SIMULATION)
+ − 220 l1_trigger_api_interrupt();
+ − 221 #endif
+ − 222
+ − 223 /* Change state */
+ − 224 *state = WAIT_UNINSTALL;
+ − 225 }
+ − 226 else /* No elements to uninstall*/
+ − 227 {
+ − 228 /* Reset patch size */
+ − 229 l1_apihisr.dyn_dwnld.tmp_patch_size = 0;
+ − 230
+ − 231 /* Copy the patch and update current state*/
+ − 232 *state = l1_dyn_dwnld_copy_patch_process(TRUE);
+ − 233
+ − 234 }
+ − 235 }
+ − 236 }
+ − 237 return;
+ − 238 } /* end case RESET */
+ − 239 //omaps00090550 break;
+ − 240
+ − 241 /******************/
+ − 242 /* WAIT_UNINSTALL */
+ − 243 /******************/
+ − 244 case WAIT_UNINSTALL:
+ − 245 {
+ − 246 /* Check uninstall command (if reset by DSP) */
+ − 247 if ( dyn_dwl_ndb->d_api_dwl_download_ctrl == (API) C_DWL_DOWNLOAD_CTRL_DSP_ACK )
+ − 248 {
+ − 249 /* Decrement uninstall counter */
+ − 250 l1_apihisr.dyn_dwnld.uninstall_counter--;
+ − 251
+ − 252 /* Check uninstall counter: if it is 0 no more uninstall to perform*/
+ − 253 if ( l1_apihisr.dyn_dwnld.uninstall_counter == 0 )
+ − 254 {
+ − 255 /* Send confirmation to L1A */
+ − 256 conf_msg = os_alloc_sig(0);
+ − 257 DEBUGMSG(status,NU_ALLOC_ERR)
+ − 258 conf_msg->SignalCode = API_L1_DYN_DWNLD_UNINST_OK;
+ − 259 os_send_sig(conf_msg,L1C1_QUEUE);
+ − 260 DEBUGMSG(status,NU_SEND_QUEUE_ERR)
+ − 261
+ − 262 /* Reset patch size */
+ − 263 l1_apihisr.dyn_dwnld.tmp_patch_size = 0;
+ − 264
+ − 265 /* Copy the patch and update current state*/
+ − 266 *state = l1_dyn_dwnld_copy_patch_process(TRUE);
+ − 267 }
+ − 268 else /* there are some uninstall to perform */
+ − 269 {
+ − 270 l1_set_uninstall_parameters();
+ − 271
+ − 272 #if (CODE_VERSION == SIMULATION)
+ − 273 l1_trigger_api_interrupt();
+ − 274 #endif
+ − 275 }
+ − 276 }
+ − 277 return;
+ − 278 } /* end case WAIT_UNINSTALL */
+ − 279 //omaps00090550 break;
+ − 280
+ − 281 /***********************/
+ − 282 /* WAIT_DSP_END_BUFFER */
+ − 283 /***********************/
+ − 284 case WAIT_DSP_END_BUFFER:
+ − 285 {
+ − 286 if ( dyn_dwl_ndb->d_api_dwl_download_ctrl == (API) C_DWL_DOWNLOAD_CTRL_DSP_ACK )
+ − 287 {
+ − 288 /* Copy the patch and update current state*/
+ − 289 *state = l1_dyn_dwnld_copy_patch_process(FALSE);
+ − 290 }
+ − 291 return;
+ − 292 } /* end case WAIT_DSP_END_BUFFER */
+ − 293 //omaps00090550 break;
+ − 294
+ − 295 /************/
+ − 296 /* WAIT_CRC */
+ − 297 /************/
+ − 298 case WAIT_CRC:
+ − 299 {
+ − 300 /* Check if DSP install command is reset */
+ − 301 if (dyn_dwl_ndb->d_api_dwl_download_ctrl == (API) C_DWL_DOWNLOAD_CTRL_DSP_ACK )
+ − 302 {
+ − 303 /* Test if CRC is OK */
25
+ − 304 if ( dyn_dwl_ndb->d_api_dwl_crc != l1a_apihisr_com.dyn_dwnld.copy_parameters.crc[l1a_apihisr_com.dyn_dwnld.copy_parameters.num_of_elem-l1_apihisr.dyn_dwnld.patch_ids_counter]) /* CRC not OK */
19
+ − 305 {
+ − 306 /* Send notification to L1A */
+ − 307 conf_msg = os_alloc_sig(sizeof(T_API_L1_CRC_NOT_OK));
+ − 308 DEBUGMSG(status,NU_ALLOC_ERR)
+ − 309 conf_msg->SignalCode = API_L1_CRC_NOT_OK;
+ − 310 ((T_API_L1_CRC_NOT_OK *) (conf_msg->SigP))->patch_id = dyn_dwl_ndb->d_api_dwl_crc;
+ − 311 os_send_sig(conf_msg,L1C1_QUEUE);
+ − 312 DEBUGMSG(status,NU_SEND_QUEUE_ERR)
+ − 313
+ − 314 /* Change state */
+ − 315 *state = RESET;
+ − 316 }
+ − 317 else /* CRC OK */
+ − 318 {
+ − 319 conf_msg = os_alloc_sig(sizeof(T_API_L1_CRC_NOT_OK));
+ − 320 DEBUGMSG(status,NU_ALLOC_ERR)
+ − 321 conf_msg->SignalCode = API_L1_CRC_OK;
25
+ − 322 ((T_API_L1_CRC_NOT_OK *) (conf_msg->SigP))->patch_id = l1a_apihisr_com.dyn_dwnld.copy_parameters.crc[l1a_apihisr_com.dyn_dwnld.copy_parameters.num_of_elem-l1_apihisr.dyn_dwnld.patch_ids_counter];
19
+ − 323 os_send_sig(conf_msg,L1C1_QUEUE);
+ − 324 DEBUGMSG(status,NU_SEND_QUEUE_ERR)
+ − 325 *state = WAIT_INSTALL;
+ − 326
+ − 327 /* Set install parameters */
+ − 328
+ − 329 dyn_dwl_ndb->d_api_dwl_function_address[0] =
25
+ − 330 (API) (l1a_apihisr_com.dyn_dwnld.copy_parameters.address_to_install[l1a_apihisr_com.dyn_dwnld.copy_parameters.num_of_elem-l1_apihisr.dyn_dwnld.patch_ids_counter] & 0x0000FFFF);
19
+ − 331 dyn_dwl_ndb->d_api_dwl_function_address[1] =
25
+ − 332 (API) ((l1a_apihisr_com.dyn_dwnld.copy_parameters.address_to_install[l1a_apihisr_com.dyn_dwnld.copy_parameters.num_of_elem-l1_apihisr.dyn_dwnld.patch_ids_counter] >> 16) & 0x0000FFFF);
19
+ − 333
+ − 334 dyn_dwl_ndb->d_api_dwl_download_ctrl = (API) C_DWL_DOWNLOAD_CTRL_INSTALL;
+ − 335
+ − 336 #if (CODE_VERSION == SIMULATION)
+ − 337 l1_trigger_api_interrupt();
+ − 338 #endif
+ − 339 }
+ − 340 }
+ − 341 return;
+ − 342 } /* end case WAIT_CRC */
+ − 343 //omaps00090550 break;
+ − 344
+ − 345 /****************/
+ − 346 /* WAIT_INSTALL */
+ − 347 /****************/
+ − 348 case WAIT_INSTALL:
+ − 349 {
+ − 350 /* Check if DSP install command is reset */
+ − 351 if (dyn_dwl_ndb->d_api_dwl_download_ctrl == (API) C_DWL_DOWNLOAD_CTRL_DSP_ACK )
+ − 352 {
+ − 353 /* Decrement patch counter */
+ − 354 l1_apihisr.dyn_dwnld.patch_ids_counter--;
+ − 355
+ − 356 /* Test if patch counter is null */
+ − 357 if ( l1_apihisr.dyn_dwnld.patch_ids_counter == 0 )
+ − 358 {
+ − 359 /* Send notification to L1A */
+ − 360 conf_msg = os_alloc_sig(0);
+ − 361 DEBUGMSG(status,NU_ALLOC_ERR)
+ − 362 conf_msg->SignalCode = API_L1_DYN_DWNLD_FINISHED;
+ − 363 os_send_sig(conf_msg,L1C1_QUEUE);
+ − 364 DEBUGMSG(status,NU_SEND_QUEUE_ERR)
+ − 365 *state = RESET;
+ − 366 }
+ − 367 else
+ − 368 {
+ − 369 /* Reset patch size */
+ − 370 l1_apihisr.dyn_dwnld.tmp_patch_size = 0;
+ − 371
+ − 372 /* Copy the patch and update current state*/
+ − 373 *state = l1_dyn_dwnld_copy_patch_process(TRUE);
+ − 374 }
+ − 375 }
+ − 376 return;
+ − 377 } /* end case WAIT_INSTALL */
+ − 378 //omaps00090550 break;
+ − 379 } /* end switch */
+ − 380 } /* end while */
+ − 381 }
+ − 382
+ − 383 /*-------------------------------------------------------------*/
+ − 384 /* l1_dyn_dwnld_apihisr_error_handler() */
+ − 385 /*-------------------------------------------------------------*/
+ − 386 /* */
+ − 387 /* Parameters : error_code (OUT) error_code received from DSP */
+ − 388 /* */
+ − 389 /* Return : TRUE if errors signaled by DSP */
+ − 390 /* */
+ − 391 /*-------------------------------------------------------------*/
+ − 392 BOOL l1_dyn_dwnld_apihisr_error_handler()
+ − 393 {
+ − 394 BOOL critical;
+ − 395
+ − 396 /* Initialisation */
+ − 397 critical = FALSE;
+ − 398
+ − 399 if(dyn_dwl_ndb->d_api_dwl_error_code != 0)
+ − 400 {
+ − 401 critical = TRUE;
+ − 402 }
+ − 403
+ − 404 return critical;
+ − 405 }
+ − 406
+ − 407
+ − 408 #endif /* L1_DYN_DSP_DWNLD */
+ − 409