/** 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); } }
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; }
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; } }