EtherNet/IP™ Adapter Example Application.
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <stdarg.h>
#include <api/EI_API.h>
#include <api/EI_API_def.h>
#include "appPerm.h"
#include <appPhyReset.h>
#include <osal.h>
#include <osal_error.h>
#include <hwal.h>
#include <board.h>
#include <kbTrace.h>
#include <CMN_board.h>
#include <CMN_os.h>
#include <CMN_app.h>
#include <CMN_CPU_api.h>
#include <drivers/CUST_drivers.h>
#include <appWebServer.h>
#include <app.h>
#include <appClass71.h>
#if defined(SOC_AM64X) || defined(SOC_AM243X)
extern PRUICSS_Handle prusshandle;
#else
Board_IDInfo boardInfo;
#endif
uint8_t EI_APP_aMacAddr_g[] = {0xc8, 0x3e, 0xa7, 0x00, 0x00, 0x59};
static uint16_t EI_APP_aExtendedStatus[255] = {0};
static EI_API_ADP_T* pAdp_s = NULL;
static EI_API_CIP_NODE_T* pCip_s = NULL;
uint8_t* EI_APP_getMacAddr (void);
static bool EI_APP_cipSetup(EI_API_CIP_NODE_T* pCipNode_p);
static bool EI_APP_cipCreateCallback(EI_API_CIP_NODE_T* pCipNode_p);
uint32_t EI_APP_globalError_g = 0;
static int EI_APP_cleanup()
{
int exit_code = 0;
{
exit_code = 1;
}
{
exit_code = 1;
}
return exit_code;
}
void EI_APP_adpInit(void)
{
uint32_t errCode = 0;
uint16_t vendorId = 806;
uint16_t deviceType = 0x002B;
uint16_t productCode = PRODUCT_CODE_OF_CONFIGURATION;
uint32_t serialNumber = 0x00000065;
const char productName[] = PRODUCT_NAME_OF_CONFIGURATION;
const char timeSyncProductDescription[] = TIMESYNC_PRODUCT_DESCRIPTION_OF_CONFIGURATION;
const char timeSyncManufactureID[] = TIMESYNC_MANUFACTURE_ID_OF_CONFIGURATION;
const char timeSyncRevisionData[] = TIMESYNC_REVISION_DATA_OF_CONFIGURATION;
EI_APP_PERM_read();
}
void EI_APP_cipGenerateContent(EI_API_CIP_NODE_T* pCipNode_p, uint16_t classId_p, uint16_t instanceId_p)
{
uint16_t i = 0;
uint16_t attribID = 0x300;
for (i = 0; i < 64; i++)
{
OSAL_MEMORY_memset(&attr, 0, sizeof(attr));
attribID++;
}
for (i = 0; i < 32; i++)
{
OSAL_MEMORY_memset(&attr, 0, sizeof(attr));
attribID++;
}
for (i = 0; i < 16; i++)
{
OSAL_MEMORY_memset(&attr, 0, sizeof(attr));
attribID++;
}
for (i = 0; i < 8; i++)
{
OSAL_MEMORY_memset(&attr, 0, sizeof(attr));
attribID++;
}
}
static bool EI_APP_cipSetup(EI_API_CIP_NODE_T* pCipNode_p)
{
uint32_t errCode = 0;
uint16_t i = 0;
uint16_t classId = 0x70;
uint16_t instanceId = 0x01;
EI_APP_cipGenerateContent(pCipNode_p, classId, instanceId);
for (i = 0x300; i < 0x305; i++)
{
{
OSAL_printf("Failed to add Class ID %#x, Instance ID %#x, Attribute ID %#x to Assembly Instance 0x64: Error code: 0x%08x\n", classId, instanceId, (uint16_t)i, errCode);
}
OSAL_printf("Failed to add Class ID %#x, Instance ID %#x, Attribute ID %#x to Assembly Instance 0x65: Error code: 0x%08x\n", classId, instanceId, (uint16_t)(8 + i), errCode);
}
}
return true;
}
static bool EI_APP_cipCreateCallback(EI_API_CIP_NODE_T* pCipNode_p)
{
uint8_t errorCnt = 0;
return true;
}
{
.extended_status_size=0,
.extended_status_arr=EI_APP_aExtendedStatus};
switch(serviceCode_p)
{
case 0x54:
break;
case 0x5b:
break;
case 0x4e:
break;
default:
OSAL_printf("unknown service code %x\r\n", serviceCode_p);
}
return ret_val;
}
{
bool result = 1;
EI_APP_PERM_init(pAdp_s);
#if defined(TIME_SYNC)
#endif
EI_APP_getMacAddr();
EI_APP_adpInit();
#if defined(QUICK_CONNECT)
#endif
EI_APP_stackInit(pParams_p);
EI_APP_cipCreateCallback(pCip_s);
EI_APP_cipSetup(pCip_s);
EI_APP_CLASS71_init(pCip_s);
OSAL_printf("EI_API_ADP_getMacAddr: %02x:%02x:%02x:%02x:%02x:%02x\r\n",
return result;
}
void EI_APP_run(void)
{
uint8_t attrValue = 0;
uint16_t attr;
for(attr = 0; attr < 5; attr++)
{
{
CUST_DRIVERS_LED_setIndustrialLeds(attrValue);
}
}
}
void EI_APP_mainTask(
void* pvTaskArg_p)
{
uint32_t err = OSAL_NO_ERROR;
int16_t resetServiceFlag = 0;
CMN_BOARD_init();
err = HWAL_init ();
if (err != OSAL_NO_ERROR)
{
goto laError;
}
if (false == EI_APP_init(pParams))
{
OSAL_printf("Fatal error: Application initialization failed\n");
return;
}
#if (defined CPU_LOAD_MONITOR) && (1==CPU_LOAD_MONITOR)
if (false == APP_startWebServerTask(&pParams->webServer))
{
OSAL_printf("Fatal error: Failed to start Webserver task. \n");
return;
}
CMN_CPU_API_startMonitor(&pParams->cpuLoad);
#endif
for (;;)
{
EI_APP_run();
resetServiceFlag = EI_APP_PERM_getResetRequired();
if (resetServiceFlag != -1)
{
break;
}
if(EI_APP_PERM_getConfigChanged())
{
EI_APP_PERM_write(false);
}
OSAL_SCHED_yield();
}
laError:
OSAL_printf("resetting device\n");
EI_APP_cleanup();
CUST_DRIVERS_deinit();
CMN_BOARD_deinit();
CMN_OS_deinit();
CMN_OS_reset();
CMN_APP_mainExit();
}
void EI_APP_stackErrorHandlerCb(
uint32_t i32uErrorCode_p,
uint8_t bFatal_p,
uint8_t i8uNumOfPara_p,
va_list argptr_p)
{
OSAL_printf("###### Stack Error: 0x%08x, %s ######\n", i32uErrorCode_p, bFatal_p == 0 ? "non fatal" : "fatal");
if (bFatal_p)
{
EI_APP_cleanup();
while(1);
}
}
void EI_APP_osErrorHandlerCb (
uint32_t errorCode_p,
bool fatal_p,
uint8_t paraCnt_p,
va_list argptr_p)
{
EI_APP_globalError_g = errorCode_p;
OSAL_printf ("\nError: 0x%8.8x, Fatal: %s", errorCode_p, fatal_p ? "yes" : "no");
if (fatal_p == true)
{
while(1);
}
}
{
uint32_t err;
err = APP_initPhyResetGpio ();
if (err != OSAL_NO_ERROR)
{
goto laError;
}
OSAL_MEMORY_memcpy (tParam.
ai8uMacAddr, EI_APP_aMacAddr_g, 6);
if (err)
{
goto laError;
}
OSAL_printf("+EI_API_ADP_pruicssStart\r\n");
OSAL_printf("-EI_API_ADP_pruicssStart\r\n");
return;
laError:
printf ("\nStack Init Error: 0x%8.8x", err);
return;
}
uint8_t* EI_APP_getMacAddr (void)
{
#ifndef _DEBUG_USE_KUNBUS_MAC_ADDRESS
static uint8_t mac_addr[6];
const uint32_t mac_address_upper_16_bits = *IDK_CTRLMMR0_MAC_ID1;
const uint32_t mac_address_lower_32_bits = *IDK_CTRLMMR0_MAC_ID0;
mac_addr[0] = (uint8_t) (mac_address_upper_16_bits >> 8);
mac_addr[1] = (uint8_t) (mac_address_upper_16_bits);
mac_addr[2] = (uint8_t) (mac_address_lower_32_bits >> 24);
mac_addr[3] = (uint8_t) (mac_address_lower_32_bits >> 16);
mac_addr[4] = (uint8_t) (mac_address_lower_32_bits >> 8);
mac_addr[5] = (uint8_t) (mac_address_lower_32_bits);
OSAL_MEMORY_memcpy(EI_APP_aMacAddr_g, mac_addr, 6);
return mac_addr;
#else
return EI_APP_aMacAddr_g;
#endif
}
ETHIP_API void EI_API_ADP_run(void)
Main run function.
Definition: EI_API_ADP_main.c:614
ETHIP_API uint32_t EI_API_ADP_delete(T *pAdp_p)
Delete an existing EtherNet/IP adapter.
Definition: EI_API_ADP_main.c:417
ETHIP_API void EI_API_ADP_pruicssStart(void)
Starts the PRU0 and PRU1 firmware on the PRU-ICSS block instance specified in EI_API_ADP_pruicssInit.
Definition: EI_API_ADP_main.c:201
ETHIP_API void EI_API_ADP_pruicssStop(void)
Stops the PRU0 and PRU1 firmware on the PRU-ICSS block instance specified in EI_API_ADP_pruicssInit.
Definition: EI_API_ADP_main.c:246
ETHIP_API uint32_t EI_API_ADP_pruicssInit(EIP_SLoadParameter *ptPara_p)
Load and initialize the EtherNet/IP firmware in the PRU.
Definition: EI_API_ADP_main.c:107
ETHIP_API uint32_t EI_API_ADP_setErrorHandlerFunc(EI_API_ADP_CBStackError callback_p)
Set the stack error handler function.
Definition: EI_API_ADP_main.c:827
ETHIP_API T * EI_API_ADP_new(uint8_t numInterfaces_p)
Create a new EtherNet/IP adapter.
Definition: EI_API_ADP_main.c:301
ETHIP_API uint32_t EI_API_ADP_init(T *pAdp_p, EI_API_ADP_SInit_t params_p)
Apply parameters.
Definition: EI_API_ADP_main.c:504
ETHIP_API uint32_t EI_API_ADP_setCmgrCb(EI_API_ADP_CBCmgr fuCallback_p)
Register callback function for ForwardOpen, LargeForwardOpen and ForwardClose.
Definition: EI_API_ADP_main.c:1818
ETHIP_API uint32_t EI_API_ADP_getMacAddr(T *pAdp_p, EI_API_ADP_SParam_t *pMacAddr_p)
Get the adapter MAC address (Instance Attribute ID: 3).
Definition: EI_API_ADP_main.c:5351
ETHIP_API uint32_t EI_API_ADP_setSerialNumber(T *pAdp_p, uint32_t serialNumber_p)
Set the adapter's unique Serial Number (Instance Attribute ID: 6).
Definition: EI_API_ADP_main.c:1600
ETHIP_API uint32_t EI_API_ADP_setRevision(T *pAdp_p, EI_API_ADP_SRevision_t revison_p)
Set the adapter Revision (Instance Attribute ID: 4).
Definition: EI_API_ADP_main.c:1463
ETHIP_API uint32_t EI_API_ADP_setProductCode(T *pAdp_p, uint16_t productCode_p)
Set the adapter Product Code (Instance Attribute ID: 3).
Definition: EI_API_ADP_main.c:1325
ETHIP_API uint32_t EI_API_ADP_setProductName(T *pAdp_p, const char *pProductName_p)
Set the adapter Product Name (Instance Attribute ID: 7).
Definition: EI_API_ADP_main.c:1735
ETHIP_API uint32_t EI_API_ADP_setVendorId(T *pAdp_p, uint16_t vendorId_p)
Set the adapter Vendor ID (Instance Attribute ID: 1).
Definition: EI_API_ADP_main.c:1059
ETHIP_API uint32_t EI_API_ADP_setDeviceType(T *pAdp_p, uint16_t deviceType_p)
Set the adapter Device Type (Instance Attribute ID: 2).
Definition: EI_API_ADP_main.c:1193
ETHIP_API uint32_t EI_API_ADP_setQuickConnectSupported(T *pAdp_p)
Enable QuickConnect support.
Definition: EI_API_ADP_main.c:4981
ETHIP_API uint32_t EI_API_ADP_setTimeSyncManufactureID(T *pAdp_p, const char *pManufactureID_p)
Set the ManufactureIdentity attribute of the Time Sync object of the adapter (Instance Attribute ID: ...
Definition: EI_API_ADP_main.c:2696
ETHIP_API uint32_t EI_API_ADP_setTimeSyncProductDescription(T *pAdp_p, const char *pProductDesc_p)
Set the Description member of the ProductDescription attribute of the Time Sync object of the adapter...
Definition: EI_API_ADP_main.c:2847
ETHIP_API uint32_t EI_API_ADP_setTimeSyncRevisionData(T *pAdp_p, const char *pRevisionData_p)
Set the RevisionData attribute of the Time Sync object of the adapter(Instance Attribute ID: 22).
Definition: EI_API_ADP_main.c:3018
ETHIP_API uint32_t EI_API_ADP_setTimeSyncSupported(T *pAdp_p)
Enable Time Sync Object support.
Definition: EI_API_ADP_main.c:1872
ETHIP_API uint32_t EI_API_CIP_addAssemblyMember(T *pCipNode_p, uint16_t assemblyInstanceId_p, uint16_t classId_p, uint16_t instanceId_p, uint16_t attributeId_p)
Add an member to an assembly member list.
Definition: EI_API_CIP_main.c:5483
ETHIP_API uint32_t EI_API_CIP_createAssembly(T *pCipNode_p, uint16_t assemblyInstanceId_p, EI_API_CIP_EAr_t accessRule_p)
Create a new assembly instance.
Definition: EI_API_CIP_main.c:5347
ETHIP_API uint32_t EI_API_CIP_getAttr_usint(T *pCipNode_p, uint16_t classId_p, uint16_t instanceId_p, uint16_t attrId_p, ei_api_cip_edt_usint *pValue_p)
Get attribute of type USINT.
Definition: EI_API_CIP_main.c:2923
ETHIP_API uint32_t EI_API_CIP_setAttr_usint(T *pCipNode_p, uint16_t classId_p, uint16_t instanceId_p, uint16_t attrId_p, ei_api_cip_edt_usint value_p)
Set attribute of type USINT.
Definition: EI_API_CIP_main.c:4331
void(* EI_API_CIP_CBService)(EI_API_CIP_NODE_T *pCipNode_p, uint16_t classId_p, uint16_t instanceId_p, uint16_t attrId_p, EI_API_CIP_ESc_t serviceCode_p, int16_t serviceFlag_p)
Function prototype for CIP service callback functions.
Definition: EI_API_def.h:306
ETHIP_API uint32_t EI_API_CIP_addClassService(T *pCipNode_p, uint16_t classId_p, EI_API_CIP_SService_t *pService_p)
Add service/s to the class.
Definition: EI_API_CIP_main.c:433
ETHIP_API uint32_t EI_API_CIP_createClass(T *pCipNode_p, uint16_t classId_p)
Create a CIP class.
Definition: EI_API_CIP_main.c:359
@ EI_API_CIP_eSC_RESET
Definition: EI_API_def.h:115
@ EI_API_CIP_eSC_GETATTRSINGLE
Definition: EI_API_def.h:116
@ EI_API_CIP_eSC_SETATTRSINGLE
Definition: EI_API_def.h:117
@ EI_API_CIP_eAR_GET_AND_SET
Definition: EI_API_def.h:131
@ EI_API_CIP_eAR_GET
Attribute is gettable.
Definition: EI_API_def.h:130
@ EI_API_CIP_eEDT_UDINT
Definition: EI_API_CIP.h:129
@ EI_API_CIP_eEDT_USINT
Definition: EI_API_CIP.h:127
@ EI_API_CIP_eEDT_ULINT
Definition: EI_API_CIP.h:130
@ EI_API_CIP_eEDT_UINT
Definition: EI_API_CIP.h:128
@ EI_API_CIP_eERR_OK
Definition: EI_API_CIP.h:52
ETHIP_API uint32_t EI_API_CIP_setInstanceServiceFunc(T *pCipNode_p, uint16_t classId_p, uint16_t instanceId_p, EI_API_CIP_SService_t *pService_p)
Add a callback function to an instance service.
Definition: EI_API_CIP_main.c:1308
ETHIP_API uint32_t EI_API_CIP_addInstanceService(T *pCipNode_p, uint16_t classId_p, uint16_t instanceId_p, EI_API_CIP_SService_t *pService_p)
Add one or more service/s to the class instance.
Definition: EI_API_CIP_main.c:1075
ETHIP_API uint32_t EI_API_CIP_createInstance(T *pCipNode_p, uint16_t classId_p, uint16_t instanceId_p)
Creates a CIP instance.
Definition: EI_API_CIP_main.c:904
ETHIP_API uint32_t EI_API_CIP_addInstanceAttr(T *pCipNode_p, uint16_t classId_p, uint16_t instanceId_p, EI_API_CIP_SAttr_t *pAttr_p)
Add an attribute to an instance.
Definition: EI_API_CIP_main.c:1455
ETHIP_API uint32_t EI_API_CIP_setInstanceAttr(T *pCipNode_p, uint16_t classId_p, uint16_t instanceId_p, EI_API_CIP_SAttr_t *pAttr_p)
Set instance attribute value only.
Definition: EI_API_CIP_main.c:2234
ETHIP_API uint32_t EI_API_CIP_NODE_delete(T *pCipNode_p)
Delete the CIP node specified by parameter pCipNode_p.
Definition: EI_API_CIP_main.c:147
ETHIP_API T * EI_API_CIP_NODE_new(void)
Create a new CIP node.
Definition: EI_API_CIP_main.c:68
OSAL_TASK_EPriority_t taskPrioPacket
Definition: app.h:60
OSAL_TASK_EPriority_t taskPrioStatistic
Definition: app.h:61
CUST_DRIVERS_SInit_t customDrivers
Definition: app.h:70
APP_SAdapter_t adapter
Definition: app.h:69
CUST_DRIVERS_SInitPruIcss_t pruIcss
Definition: CUST_drivers.h:117
CUST_PHY_SInit_t ethPhy
Definition: CUST_drivers.h:101
uint32_t instance
Definition: CUST_drivers.h:100
CUST_DRIVERS_SInitTimeSync_t timeSync
Definition: CUST_drivers.h:102
OSAL_TASK_EPriority_t taskPrioBackground
Definition: CUST_drivers.h:95
OSAL_TASK_EPriority_t taskPrioDelayRqTx
Definition: CUST_drivers.h:92
OSAL_TASK_EPriority_t taskPrioNRT
Definition: CUST_drivers.h:94
OSAL_TASK_EPriority_t taskPrioTxTimeStamp
Definition: CUST_drivers.h:93
OSAL_TASK_EPriority_t taskPrioPhyMdixTask
Definition: CUST_phy.h:56
uint32_t instance_1
Definition: CUST_phy.h:55
uint32_t instance_0
Definition: CUST_phy.h:54
uint8_t gen_status
Definition: EI_API_def.h:285
Definition: EI_API_def.h:283
OSAL_TASK_EPriority_t taskPrioPacket
Definition: EI_API_ADP.h:164
OSAL_TASK_EPriority_t taskPrioStatistic
Definition: EI_API_ADP.h:165
Definition: EI_API_ADP.h:163
uint8_t * data
Definition: EI_API_ADP.h:119
Definition: EI_API_ADP.h:117
uint8_t major
Definition: EI_API_ADP.h:133
uint8_t minor
Definition: EI_API_ADP.h:135
Definition: EI_API_ADP.h:132
EI_API_CIP_EEdt_t edt
Definition: EI_API_CIP.h:194
EI_API_CIP_EAr_t accessRule
Definition: EI_API_CIP.h:196
uint16_t id
Definition: EI_API_CIP.h:193
void * pvValue
Definition: EI_API_CIP.h:200
General attribute parameter collection.
Definition: EI_API_CIP.h:192
EI_API_CIP_ESc_t code
Definition: EI_API_CIP.h:181
EI_API_CIP_CBService callback
Definition: EI_API_CIP.h:184
uint16_t getAttrAllResponseCnt
Definition: EI_API_CIP.h:182
General service parameter collection.
Definition: EI_API_CIP.h:180
ETHPHY_ConfigPtr pEthPhyCfg[2]
Definition: EI_API_ADP.h:181
OSAL_TASK_EPriority_t taskPrioPhyMdixTask
Definition: EI_API_ADP.h:183
OSAL_TASK_EPriority_t taskPrioTsDelayRqTx
Definition: EI_API_ADP.h:184
OSAL_TASK_EPriority_t taskPrioBackground
Definition: EI_API_ADP.h:187
uint32_t pruIcssCfgId
Definition: EI_API_ADP.h:179
uint8_t ai8uMacAddr[EIP_MAC_ADDR_LEN]
Definition: EI_API_ADP.h:178
PRUICSS_ConfigPtr pPruIcssCfg
Definition: EI_API_ADP.h:180
OSAL_TASK_EPriority_t taskPrioNRT
Definition: EI_API_ADP.h:186
ETHPHY_Handle ethPhyHandle[2]
Definition: EI_API_ADP.h:182
OSAL_TASK_EPriority_t taskPrioTxTimeStamp
Definition: EI_API_ADP.h:185
Definition: EI_API_ADP.h:177
Definition: EI_API_def.h:293