view L1/cfile/l1_isr_glue.c @ 11:bf52986ae7f2

L1/cfile/l1_isr_glue.c: applying changes discovered in TCS211 L1 reconstruction
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 09 Jun 2016 06:37:40 +0000
parents 75a11d740a02
children
line wrap: on
line source

/*
 * This module contains the LISR and HISR glue functions for L1
 * which used to be in the dl1_com module in the Leonardo version.
 * The LoCosto source from which we got our L1 code no longer has a
 * dl1_com.c module, and the ISR glue functions in question have been
 * moved into csw-system/init_common/init.c - an incredibly messy C
 * module that is mostly devoted to LoCosto BSP initialization.
 *
 * The present C code has been extracted from LoCosto's init.c,
 * guided by the disassembly of dl1_com.obj from the Leonardo version.
 */

#include "config.h"
#include "sys_types.h"
#include "../../riviera/rv/general.h"
#include "../../nucleus/nucleus.h"

/* Include Files */
#include <ctype.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>

#include "l1_types.h"
#include "l1_confg.h"
#include "l1_const.h"

#if TESTMODE
  #include "l1tm_defty.h"
#endif // TESTMODE

#if (AUDIO_TASK == 1)
  #include "l1audio_const.h"
  #include "l1audio_cust.h"
  #include "l1audio_defty.h"
#endif // AUDIO_TASK

#if (L1_GTT == 1)
  #include "l1gtt_const.h"
  #include "l1gtt_defty.h"
#endif

#if (L1_MP3 == 1)
  #include "l1mp3_defty.h"
#endif

#if (L1_MIDI == 1)
  #include "l1midi_defty.h"
#endif

#if (L1_AAC == 1)
  #include "l1aac_defty.h"
#endif
#if (L1_DYN_DSP_DWNLD == 1)
  #include "l1_dyn_dwl_defty.h"
#endif

#if (TRACE_TYPE == 4)
  #include "l1_defty.h"
#endif

#include "../../bsp/armio.h"
#include "../../bsp/timer.h"

#include "../../bsp/iq.h"
#include "../../bsp/mem.h"
#include "../../bsp/clkm.h"
#include "../../bsp/inth.h"

/*
 * The function that sets up the HISRs has an assert() macro call in it.
 * The Leonardo version was built with the TMS470 compiler's C library
 * version of assert() in it, which is not very useful.  Here I am
 * pulling in some GPF/VSI headers so we get the more useful GPF/VSI
 * version of assert() instead.
 */
#include "../../gpf/inc/typedefs.h"
#include "../../gpf/inc/vsi.h"
#include "../../gpf/inc/cust_os.h"

/*
 * Timing monitor
 */
#if (TRACE_TYPE == 4)
  extern T_L1A_L1S_COM l1a_l1s_com;
  extern T_L1S_GLOBAL  l1s;
  UNSIGNED             max_cpu, fn_max_cpu;
  unsigned short       layer_1_sync_end_time;
  unsigned short       max_cpu_flag;
  #if (DSP >= 38)
  // DSP CPU load measurement trace variables
  UWORD32              dsp_max_cpu_load_trace_array[4];
  UWORD32              dsp_max_cpu_load_idle_frame;
  unsigned short       l1_dsp_cpu_load_trace_flag;
  #endif
#endif

#define	STACK_SECTION	__attribute__ ((section ("int.ram")))

#if (L1_EXT_AUDIO_MGT == 1)
  NU_HISR  EXT_AUDIO_MGT_hisr;
  char FAR ext_audio_mgt_hisr_stack[500] STACK_SECTION;
  extern void Cust_ext_audio_mgt_hisr(void);
#endif

#if ( (L1_MP3 == 1) || (L1_MIDI == 1) || (L1_AAC == 1) || (L1_DYN_DSP_DWNLD == 1) )   // equivalent to an API_HISR flag
  extern void api_hisr(void);
  char FAR API_HISR_stack[0x400] STACK_SECTION;
  NU_HISR apiHISR;
#endif // (L1_MP3 == 1) || (L1_MIDI == 1) || (L1_DYN_DSP_DWNLD == 1)

#if (FF_L1_IT_DSP_USF == 1) || (FF_L1_IT_DSP_DTX == 1)
  char FAR API_MODEM_HISR_stack[0x400] STACK_SECTION; // stack size to be tuned
  NU_HISR api_modemHISR;
#endif // FF_L1_IT_DSP_USF

/*
 * HISR stack and semaphore needed by L1
 */
#if (OP_L1_STANDALONE == 0)
  #define LAYER_1_SYNC_STACK_SIZE	4000	/* matching Leonardo version */
  unsigned char layer_1_sync_stack[LAYER_1_SYNC_STACK_SIZE] STACK_SECTION;
#else
  #if TESTMODE
    char FAR layer_1_sync_stack[2600 /*3600*/];   // Frame interrupt task stack for EVA3
  #else
    char FAR layer_1_sync_stack[1600 /* 2600 */];   // Frame interrupt task stack for EVA3
  #endif
#endif   /* OP_L1_STANDALONE */

NU_HISR  layer_1_sync_HISR;    // Frame interrupt task stack for EVA3

/* forward declaration */
void layer_1_sync_HISR_entry (void);

/*
 * l1_create_HISR
 *
 * Create L1 HISR.  This function is called from l1_pei.
 *
 * Apparently this function was originally called l1_create_ISR(),
 * as that is how it appears in the Leonardo dl1_com.obj module.
 * The LoCosto version originally had an l1_create_ISR() wrapper
 * that simply calls l1_create_HISR(), but I plan on changing
 * l1_pei to call l1_create_HISR() instead. -- Space Falcon
 */
void l1_create_HISR (void)
{
  STATUS status;

  #if (OP_L1_STANDALONE == 0)
    // Fill the entire stack with the pattern 0xFE
    memset (layer_1_sync_stack, 0xFE, LAYER_1_SYNC_STACK_SIZE);
  #endif

  status = NU_Create_HISR (&layer_1_sync_HISR,
                           "L1_HISR",
                           layer_1_sync_HISR_entry,
  #if (OP_L1_STANDALONE == 0)
                           0,
                           layer_1_sync_stack,
                           LAYER_1_SYNC_STACK_SIZE);
  #else
                           0,
                           layer_1_sync_stack,
                           sizeof(layer_1_sync_stack));
  #endif

  #if (L1_EXT_AUDIO_MGT)
    // Create HISR for Ext MIDI activity
    //==================================
    status += NU_Create_HISR(&EXT_AUDIO_MGT_hisr,
                             "H_EXT_AUDIO_MGT",
                             Cust_ext_audio_mgt_hisr,
                             1,
                             ext_audio_mgt_hisr_stack,
                             sizeof(ext_audio_mgt_hisr_stack));
  #endif

  #if ( (L1_MP3 == 1) || (L1_MIDI == 1) || (L1_AAC == 1) || (L1_DYN_DSP_DWNLD == 1) )    // equivalent to an API_HISR flag
    status += NU_Create_HISR(&apiHISR,
                             "API_HISR",
                             api_hisr,
                             1,
                             API_HISR_stack,
                             sizeof(API_HISR_stack));
  #endif // (L1_MP3 == 1) || (L1_MIDI == 1) || (L1_AAC == 1) || (L1_DYN_DSP_DWNLD == 1)

  #if (FF_L1_IT_DSP_USF == 1) || (FF_L1_IT_DSP_DTX == 1) // equivalent to an API_MODEM_HISR flag
    // Create HISR for USF  DSP interrupt !!!!. This HISR needs
    // to have the highest priority since the USF status needs
    // to be known before the next block starts.
    //========================================================
    status += NU_Create_HISR(&api_modemHISR,
                             "MODEM",
                             api_modem_hisr,
                             0,
                             API_MODEM_HISR_stack,
                             sizeof(API_MODEM_HISR_stack));
  #endif

  assert (status == 0);
}

/*
 * The versions of TP_FrameIntHandler() and layer_1_sync_HISR_entry()
 * in the TCS211 dl1_com.obj module contain CPU load measurement
 * code.  TI changed things for LoCosto, so we have to revert their
 * changes and restore the TCS211 way.
 */

#if (TRACE_TYPE == 4)
  #define TIMER_RESET_VALUE (0xFFFF)
  #define TICKS_PER_TDMA    (1875)
#endif

/*-------------------------------------------------------*/
/* TP_FrameIntHandler() Low Interrupt service routine    */
/*-------------------------------------------------------*/
/* Parameters :                                          */
/* Return     :                                          */
/* Functionality :  activate Hisr on each frame interrupt*/
/*-------------------------------------------------------*/
void TP_FrameIntHandler(void)
{

  #if (OP_L1_STANDALONE == 1)

    #if (TRACE_TYPE==1)
       if (trace_info.current_config->l1_dyn_trace & 1<<L1_DYN_TRACE_L1S_CPU_LOAD)
       {
         TM_ResetTimer (2, 0xFFFF, 1, 0);
         TM_StartTimer (2);
       }
    #endif

    #if (TRACE_TYPE==6)
       TM_ResetTimer (2, 0xFFFF, 1, 0);
       TM_StartTimer (2);
    #endif

    #if (TRACE_TYPE==7)   /* CPU_LOAD */
       l1_cpu_load_start();
    #endif

  #else

    #if (TRACE_TYPE == 4) && (TI_NUC_MONITOR != 1)
              TM_ResetTimer (2, TIMER_RESET_VALUE, 1, 0);
              TM_StartTimer (2);
    #endif

    #if (TI_NUC_MONITOR == 1)
       /* Copy LISR buffer in Log buffer each end of HISR */
       ti_nuc_monitor_tdma_action();
    #endif

    #if WCP_PROF == 1
       prf_LogFNSwitch(l1s.actual_time.fn_mod42432);
    #endif

  #endif   /* OP_L1_STANDALONE */

  NU_Activate_HISR(&layer_1_sync_HISR);   /* Activate HISR interrupt */

  #if (OP_L1_STANDALONE == 0)
    #if (WCP_PROF == 1)
      #if (PRF_CALIBRATION == 1)
      NU_Activate_HISR(&prf_CalibrationHISR);
      #endif
    #endif
  #endif

}

/*
 * layer_1_sync_HISR_entry
 *
 * HISR associated to layer 1 sync.
 */

void layer_1_sync_HISR_entry (void)
{
  /* automatic var for the CPU load measurement code below */
  #if (TRACE_TYPE == 4)
    unsigned long cpu;
  #endif

  // Call Synchronous Layer1
  hisr();

  /*
   * FreeCalypso: the following code has been reconstructed from
   * the disassembly of the TCS211 binary object; it was found to be
   * similar to the Trace_L1S_CPU_load() function in l1_trace.c
   * which appears to have been only for (TRACE_TYPE == 1) originally.
   */
  #if (TRACE_TYPE == 4)
    layer_1_sync_end_time = TIMER_RESET_VALUE - TM_ReadTimer(2);

    cpu = (100 * layer_1_sync_end_time) / TICKS_PER_TDMA;
    if (cpu > max_cpu)
    {
      max_cpu=cpu;
      fn_max_cpu=l1s.actual_time.fn;
      max_cpu_flag = 1;
      /*
       * TCS211 object has this bogus code here:

       if (some non-understood condition) {
         static int i;
         i++;	// static var never used anywhere
         max_cpu_flag = 1;
       }

       * Because this bogus code does not change the result,
       * I decided not to bother with reconstructing it.
       */
    }

    if (((l1s.actual_time.fn%1326) == 0) && (max_cpu_flag == 0))
      max_cpu = 0;
  #endif
}