#include "project.h"
#include "ecSlvSimple.h"
#if (defined DPRAM_REMOTE) && (DPRAM_REMOTE==1)
#include <DPR_Api.h>
#if (defined DPRIMPL_SHAREDRAM) && (DPRIMPL_SHAREDRAM==1)
#include <dprLib_sharedMemory.h>
#endif
#elif (defined FBTL_REMOTE) && (FBTL_REMOTE==1)
#if (defined FBTLIMPL_LINEUART) && (1==FBTLIMPL_LINEUART)
#include "sysLib_lineUart.h"
#else
#include "sysLib_sharedMemory.h"
#endif
#include <FBTL_api.h>
#endif
#include <osal.h>
#include <ESL_os.h>
#include <ESL_BOARD_config.h>
#include <ESL_version.h>
#include <ecSlvApi.h>
#if (defined OSAL_FREERTOS)
#define FrameProc ECAT_FrameProcAPP
#include <industrial_comms/ethercat_slave/icss_fwhal/firmware/g_v1.3/ecat_frame_handler_bin.h>
#undef FrameProc
#define HostProc ECAT_HostProcAPP
#include <industrial_comms/ethercat_slave/icss_fwhal/firmware/g_v1.3/ecat_host_interface_bin.h>
#undef HostProc
#if (defined INCLUDE_MDIO_MANUAL_MODE_WORKAROUND) && (!defined SOC_AM263X)
#define PRUFirmware PRUMDIOFirmwareECATAPP
#include <industrial_comms/ethercat_slave/icss_fwhal/firmware/g_v1.3/mdio_fw_bin.h>
#undef PRUFirmware
#endif
#endif
#define TIESC_HW 0
#define PRU_200MHZ 1
#define THREAD_IDLE_TIMEOUT (100U)
static OSAL_PJumpBuf_t farJumpBuf_g;
{
if (!pApplicationInstance)
{
goto Exit;
}
#if (defined OSAL_FREERTOS)
#if !(defined FBTL_REMOTE) && !(defined DPRAM_REMOTE)
error = EC_API_SLV_stackInsertPruFirmware((uint32_t*)ECAT_FrameProcAPP, sizeof(ECAT_FrameProcAPP),
(uint32_t*)ECAT_HostProcAPP, sizeof(ECAT_HostProcAPP));
{
OSAL_printf("%s:%d Error code: 0x%08x\r\n", __func__, __LINE__, error);
OSAL_error(__func__, __LINE__, OSAL_STACK_INIT_ERROR, true, 0);
}
#if (defined INCLUDE_MDIO_MANUAL_MODE_WORKAROUND) && (!defined SOC_AM263X)
error = EC_API_SLV_stackInsertMdioManualFirmware((uint32_t*)PRUMDIOFirmwareECATAPP, sizeof(PRUMDIOFirmwareECATAPP));
{
OSAL_printf("%s:%d Error code: 0x%08x\r\n", __func__, __LINE__, error);
OSAL_error(__func__, __LINE__, OSAL_STACK_INIT_ERROR, true, 0);
}
#endif
#endif
#endif
{
OSAL_printf("%s:%d Error code: 0x%08x\r\n", __func__, __LINE__, error);
OSAL_error(__func__, __LINE__, OSAL_STACK_INIT_ERROR, true, 0);
}
ESL_dumpVersions();
for(;;)
{
{
OSAL_SCHED_yield();
}
else
{
OSAL_SCHED_sleep(10);
}
}
Exit:
ESL_OS_taskLeave();
return;
}
{
uint32_t retVal = OSAL_eERR_NOERROR;
if (!applicationInstance)
{
OSAL_error(__func__, __LINE__, OSAL_eERR_EINVAL, true, 1, "Application instance missing!!!\r\n");
}
if (OSAL_eERR_NOERROR != retVal)
{
OSAL_error(__func__, __LINE__, retVal, true, 1, "OS Board init error\r\n");
}
OSAL_registerPrintOut(NULL, ESL_OS_printf);
retVal = EC_SLV_APP_remoteInit(applicationInstance);
if (!(OSAL_CONTAINER_LOCALIMPLEMENTATION == retVal || OSAL_eERR_NOERROR == retVal))
{
OSAL_error(__func__, __LINE__, OSAL_eERR_EINVAL, true, 1, "Fatal error remote API init!!!\r\n");
return;
}
if (0 == retVal)
{
EC_API_SLV_prepareTasks(KBECSLV_PRIO_PDI, KBECSLV_PRIO_LED, KBECSLV_PRIO_SYNC0, KBECSLV_PRIO_SYNC1, KBECSLV_PRIO_EOE);
,applicationInstance
,OSAL_TASK_ePRIO_Normal
,(uint8_t*)EC_SLV_APP_applLoopTaskStack_g
,APPLLOOP_TASK_SIZE_BYTE
,0
,"Appl_LoopTask");
{
OSAL_printf("Error return start Loop Task\r\n");
OSAL_error(__func__, __LINE__, OSAL_STACK_INIT_ERROR, true, 0);
}
for (;;)
{
OSAL_SCHED_sleep(1000);
}
}
else
{
for (;;)
{
for (;;)
{
OSAL_printf("long jmp restart\r\n");
OSAL_SCHED_sleep(1000);
}
}
}
}
int main(int argc, char *argv[])
{
static
uint32_t selectedPruInstance = ~0;
static
uint32_t error = OSAL_eERR_NOERROR;
ESL_OS_init();
#if !(defined FBTL_REMOTE)
selectedPruInstance = ESL_DEFAULT_PRUICSS;
#endif
if (1 < argc)
{
char* inst = argv[1];
selectedPruInstance = strtoul(inst, NULL, 0);
}
#if (defined OSAL_TIRTOS)
if (0x1000 == argc)
{
PRUICSS_pruDisable(NULL, 0);
PRUICSS_pruDisable(NULL, 1);
PRUICSS_registerIrqHandler(NULL, 0, 0, 0, 0, NULL);
}
#endif
OSAL_init();
#if (defined OSAL_FREERTOS)
TaskP_Params_init(&applicationInstance.mainThreadParam);
applicationInstance.mainThreadParam.name = "mainThread";
applicationInstance.mainThreadParam.stackSize = MAIN_TASK_SIZE_BYTE;
applicationInstance.mainThreadParam.stack = (uint8_t*)EC_SLV_APP_mainTaskStack_g;
applicationInstance.mainThreadParam.priority = (TaskP_PRIORITY_HIGHEST-1);
applicationInstance.mainThreadParam.args = (void*)&applicationInstance;
,&applicationInstance.mainThreadParam);
if (SystemP_SUCCESS != error)
{
OSAL_printf("Error setting create thread of %s (%ld)\r\n", applicationInstance.mainThreadParam.name, error);
OSAL_error(__func__, __LINE__, OSAL_STACK_INIT_ERROR, true, 0);
}
#elif (defined OSAL_FREERTOS_JACINTO)
TaskP_Params_init(&applicationInstance.mainThreadParam);
applicationInstance.mainThreadParam.name = (uint8_t*)"mainThread";
applicationInstance.mainThreadParam.stacksize = MAIN_TASK_SIZE_BYTE;
applicationInstance.mainThreadParam.stack = (uint8_t*)EC_SLV_APP_mainTaskStack_g;
applicationInstance.mainThreadParam.priority = (configMAX_PRIORITIES-1);
applicationInstance.mainThreadParam.arg0 = (void*)&applicationInstance;
{
OSAL_printf("Error setting create thread of %s (%ld)\r\n", applicationInstance.mainThreadParam.name, error);
OSAL_error(__func__, __LINE__, OSAL_STACK_INIT_ERROR, true, 0);
}
#else
OSAL_TASK_ePRIO_Normal,
(uint8_t*)EC_SLV_APP_mainTaskStack_g,
MAIN_TASK_SIZE_BYTE, 0, "MainTask");
{
OSAL_error(__func__, __LINE__, OSAL_STACK_INIT_ERROR, true, 0);
error = OSAL_STACK_INIT_ERROR;
}
#endif
OSAL_startOs();
OSAL_error(__func__, __LINE__, OSAL_eERR_EINVAL, true, 1, "Not reachable by design!!!\r\n");
return error;
}
{
uint32_t retVal = OSAL_CONTAINER_LOCALIMPLEMENTATION;
if (!pApplicationInstance_p)
{
goto Exit;
}
#if (defined DPRAM_REMOTE) && (DPRAM_REMOTE==1)
retVal = DPRLIB_init(pApplicationInstance_p->
gpioHandle,
false);
#elif (defined FBTL_REMOTE) && (FBTL_REMOTE==1)
#if (defined FBTLIMPL_LINEUART) && (FBTLIMPL_LINEUART==1)
retVal = SYSLIB_createLibInstanceLine( FBTL_LINE_UART_NAME,
FBTL_MAX_ASYNC_LEN, FBTL_MAX_ASYNC_LEN,
FBTL_MAX_PD_LEN, FBTL_MAX_PD_LEN
#if (defined FBTLTRACECALLS) && (FBTLTRACECALLS==1)
,true
#else
,false
#endif
);
#else
retVal = SYSLIB_createLibInstance(FBTLSHARED_MEM_NAME, FBTLSHARED_MEM_SIZE, false,
FBTL_MAX_ASYNC_LEN, FBTL_MAX_ASYNC_LEN, FBTL_MAX_PD_LEN, FBTL_MAX_PD_LEN
#if (defined FBTLTRACECALLS) && (FBTLTRACECALLS==1)
,true
#else
,false
#endif
);
#endif
#else
OSALUNREF_PARM(pApplicationInstance_p);
retVal = OSAL_CONTAINER_LOCALIMPLEMENTATION;
#endif
if (OSAL_CONTAINER_LOCALIMPLEMENTATION == retVal)
{
OSAL_printf("\r\nLocal Implementation\r\n");
}
#if (defined DPRAM_REMOTE) && (DPRAM_REMOTE==1)
else if (0 == retVal)
{
OSAL_printf("\r\nDPRAM usage\r\n");
retVal = EC_API_SLV_DPR_configuration(dprRamBase(), dprRamSize());
if (0 != retVal)
{
OSAL_printf("%s:%d Error code: 0x%08x\r\n", __func__, __LINE__, retVal);
OSAL_error(__func__, __LINE__, OSAL_STACK_INIT_ERROR, true, 0);
return retVal;
}
}
#elif (defined FBTL_REMOTE) && (FBTL_REMOTE==1)
else if (0 == retVal)
{
retVal = EC_API_SLV_FBTL_configuration(pApplicationInstance_p->
remoteHandle);
if (0 != retVal)
{
OSAL_printf("%s:%d Error code: 0x%08x\r\n", __func__, __LINE__, retVal);
OSAL_error(__func__, __LINE__, OSAL_STACK_INIT_ERROR, true, 0);
return retVal;
}
}
#endif
Exit:
if (OSAL_eERR_NOERROR != retVal && OSAL_CONTAINER_LOCALIMPLEMENTATION != retVal)
{
OSAL_printf("%s:%d::> err ret = 0x%x\r\n", __func__, __LINE__, retVal);
}
return retVal;
}
void EC_API_SLV_mainLoopCyclic(void)
Trigger stack mainloop.
Definition: ecSlvApiStub.c:1410
EC_API_SLV_EEsmState_t EC_API_SLV_getState(void)
This is the function to read the EtherCAT Slave state machine.
Definition: ecSlvApiStub.c:1024
uint32_t EC_API_SLV_stackInit(void)
This is the function to initialize Stack backend.
Definition: ecSlvApiStub.c:490
@ EC_API_eERR_NONE
Definition: ecSlvApi_Error.h:66
@ EC_API_SLV_eESM_init
Init State.
Definition: ecSlvApi.h:92
void EC_SLV_APP_initBoardFunctions(EC_SLV_APP_Sapplication_t *pAppInstance_p)
Initialize board related functions.
Definition: ecSlvSimple.c:1951
void EC_SLV_APP_mainTask(void *pArg_p)
Main routine.
Definition: EtherCAT_Slave_Simple.c:226
void EC_SLV_APP_registerStacklessBoardFunctions(EC_SLV_APP_Sapplication_t *pAppInstance_p)
Register board related functions, which do not use stack handle.
Definition: ecSlvSimple.c:2015
void EC_SLV_APP_loopTask(void *pArg_p)
Application Loop Task.
Definition: EtherCAT_Slave_Simple.c:126
void EC_SLV_APP_applicationInit(EC_SLV_APP_Sapplication_t *pAppInstance_p)
Initialize application.
Definition: ecSlvSimple.c:2426
void EC_API_SLV_prepareTasks(OSAL_TASK_EPriority_t pdiTaskPrio_p, OSAL_TASK_EPriority_t statusLEDTaskPrio_p, OSAL_TASK_EPriority_t sync0TaskPrio_p, OSAL_TASK_EPriority_t sync1TaskPrio_p, OSAL_TASK_EPriority_t eoeTaskPrio_p)
Prepare internal task priorities.
Definition: ecSlvApiStub.c:448
uint32_t EC_API_SLV_load(OSAL_PJumpBuf_t *pExceptionPoint_p, OSAL_ERR_CBHandler_t cbErrHandler_p, uint32_t pruSelect_p)
Initialize stack environment (OSAL and HWAL) after load.
Definition: ecSlvApiStub.c:366
void * mainThreadHandle
Definition: ecSlvSimple.h:67
void * loopThreadHandle
Definition: ecSlvSimple.h:69
void * gpioHandle
Definition: ecSlvSimple.h:72
void * remoteHandle
Definition: ecSlvSimple.h:73
uint32_t selectedPruInstance
Definition: ecSlvSimple.h:57
Definition: ecSlvSimple.h:56