Exemplo n.º 1
0
/** ESC and CPU related HW init
 *
 * @param[in]   arg     = esc_cfg provided by the application
 */
void ESC_init (const esc_cfg_t * config)
{
   eep_config_t ecat_config;

   ESC_reset();

   scu_configure_ethercat_signals(&port_control);

   /* read config from emulated EEPROM */
   memset(&ecat_config, 0, sizeof(eep_config_t));
   EEP_read (0, (uint8_t *) &ecat_config, sizeof(eep_config_t));

   ESC_enable();

   /* words 0x0-0x3 */
   ecat0->EEP_DATA[0U] = ecat_config.dword[0U];
   ecat0->EEP_DATA[1U] = ecat_config.dword[1U];
   ecat0->EEP_CONT_STAT |= (uint16_t)(BIT(10)); /* ESI EEPROM Reload */

   /* words 0x4-0x7 */
   ecat0->EEP_DATA[0U] = ecat_config.dword[2U];
   ecat0->EEP_DATA[1U] = ecat_config.dword[3U];
   ecat0->EEP_CONT_STAT |= (uint16_t)(BIT(10)); /* ESI EEPROM Reload */

   while (ecat0->EEP_CONT_STAT & BIT(12)) /* ESI EEPROM loading status */
   {
     /* Wait until the EEPROM_Loaded signal is active */
   }

   /* Configure CPU interrupts */
   if(config->use_interrupt != 0)
   {
//      ecat_isr_sem = sem_create(0);
//      task_spawn ("soes_isr", isr_run, 9, 2048, NULL);

      use_all_interrupts = 0;
      ecat0->AL_EVENT_MASK = 0;
      ecat0->AL_EVENT_MASK = (ESCREG_ALEVENT_SMCHANGE |
                              ESCREG_ALEVENT_EEP |
                              ESCREG_ALEVENT_CONTROL |
                              ESCREG_ALEVENT_SM0 |
                              ESCREG_ALEVENT_SM1);

      int_connect (IRQ_ECAT0_SR0, ecat_isr, NULL);
      int_enable (IRQ_ECAT0_SR0);

//      /* Activate for running external sync IRQ */
//      scu_put_peripheral_in_reset (SCU_PERIPHERAL_ERU1);
//      scu_ungate_clock_to_peripheral (SCU_PERIPHERAL_ERU1);
//      scu_release_peripheral_from_reset (SCU_PERIPHERAL_ERU1);
//
//      eru_configure(&cfg);
//      /* Let the stack decide when to enable */
//      int_disable(cfg.irq);
   }
}
Exemplo n.º 2
0
void fastintConnect(int intVector, PFNCT isr, int arg, char* name)
{
    OS_CPU_SR  cpu_sr;

	if (intVector >= MAX_ISR_COUNT)
        return;

    OS_ENTER_CRITICAL();
	VIC->intselect |= (1<<intVector);
	int_connect(&intVecTable[intVector], isr, arg, name);
    OS_EXIT_CRITICAL();

    return;
}
Exemplo n.º 3
0
void WPL_IntConnect(WP_U32 wpid, WPL_IntVector vector,
                    WPL_IntHandler *function,
                    WPL_IntHandlerCallback *wddi_callback)
{
   WP_U32 i;
   WP_U32 mask;

   switch (vector)
   {
   case WPL_IntServiceQueues:
   {
      mask = WPL_INT_IC_IR_SERVICE;
      for (i = 0; mask > 0; i++, mask >>= 1)
      {
         if (mask & 0x1)
         {
            if(wds_bsp_ver >= WPL_BSP_MULTI_WINPATH_VERSION)
               int_connect(IV_SEI_BASE + i, (WPL_callback_handler *)WPL_service_callback_handler_wpid);
            else
               int_connect(IV_SEI_BASE + i, WPL_service_callback_handler);
            wddi_callback_ptrs[vector] = wddi_callback;
         }
      }
      break;
   }
   case WPL_IntOverrunQueues:
   {
      mask = WPL_INT_IC_IR_OVERRUN;
      for (i = 0; mask > 0; i++, mask >>= 1)
      {
         if (mask & 0x1)
         {
            if(wds_bsp_ver >= WPL_BSP_MULTI_WINPATH_VERSION)
               int_connect(IV_SEI_BASE + i, (WPL_callback_handler *)WPL_overrun_callback_handler_wpid);
            else
               int_connect(IV_SEI_BASE + i, WPL_overrun_callback_handler);
            wddi_callback_ptrs[vector] = wddi_callback;
         }
      }
      break;
   }
   case WPL_BusError:
   {
      mask = WPL_INT_IC_IR_BUSERROR;
      for (i = 0; mask > 0; i++, mask >>= 1)
      {
         if (mask & 0x1)
         {
            if(wds_bsp_ver >= WPL_BSP_MULTI_WINPATH_VERSION)
               int_connect(IV_SYI_BASE + i, (WPL_callback_handler *)WPL_bus_error_callback_handler_wpid);
            else
               int_connect(IV_SYI_BASE + i, WPL_bus_error_callback_handler);
            wddi_callback_ptrs[vector] = wddi_callback;
         }
      }
      break;
   }
   case WPL_SgmiiAn:
   {
      mask = WPL_INT_IC_IR_SGMIIAN;
      for (i = 0; mask > 0; i++, mask >>= 1)
      {
         if (mask & 0x1)
         {
            if(wds_bsp_ver >= WPL_BSP_MULTI_WINPATH_VERSION)
               int_connect(IV_SEI_BASE + i, (WPL_callback_handler *)WPL_sgmii_an_callback_handler_wpid);
            else
               int_connect(IV_SEI_BASE + i, WPL_sgmii_an_callback_handler);
            wddi_callback_ptrs[vector] = wddi_callback;
         }
      }
      break;
   }
  case WPL_Eint3Ufe4:
   {
      mask = WPL_INT_IC_IR_EINT3;
      for (i = 0; mask > 0; i++, mask >>= 1)
      {
         if (mask & 0x1)
         {
            if(wds_bsp_ver >= WPL_BSP_MULTI_WINPATH_VERSION)
               int_connect(IV_SYI_BASE + i, (WPL_callback_handler *)WPL_eint3_callback_handler_wpid);
            else
               int_connect(IV_SYI_BASE + i, WPL_eint3_callback_handler);
            wddi_callback_ptrs[vector] = wddi_callback;
         }
      }
      break;
   }
   case WPL_SerdesInterrupt:
   {
      mask = WPL_INT_IC_IR_SERDES;
      for (i = 0; mask > 0; i++, mask >>= 1)
      {
         if (mask & 0x1)
         {
            if(wds_bsp_ver >= WPL_BSP_MULTI_WINPATH_VERSION)
               int_connect(IV_SEI_BASE + i, (WPL_callback_handler *)WPL_serdes_interrupt_callback_handler_wpid);
            else
               int_connect(IV_SEI_BASE + i, WPL_serdes_interrupt_callback_handler);
            wddi_callback_ptrs[vector] = wddi_callback;
         }
      }
      break;
   }

   default:
      break;
   }
}