EtherNet/IP™ Adapter  2.01.00
App.c

EtherNet/IP™ Adapter Example Application.

Author
KUNBUS GmbH
Date
2021-06-09
#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 <CUST_PHY_base.h>
#include "AppPerm.h"
#include <kernel/dpl/TaskP.h>
#include <drivers/pinmux.h>
#include <drivers/pruicss.h>
#include <drivers/sciclient/include/sciclient_pm.h>
#include <appPhyReset.h>
#include "FreeRTOS.h"
#include "task.h"
#include <osal.h>
#include <osal_error.h>
#include <hwal.h>
#include <pru.h>
#include <pru_EthernetIP.h>
#include <Board.h>
#include <kbTrace.h>
#include <App.h>
#include <AppClass71.h>
#if defined(SOC_AM64X) || defined(SOC_AM243X)
#include "ti_drivers_config.h"
#include "ti_drivers_open_close.h"
#include "ti_board_config.h"
#include "ti_board_open_close.h"
#endif
#if defined(SOC_AM64X) || defined(SOC_AM243X)
//Board_IDInfo_v2 boardInfo;
extern PRUICSS_Handle prusshandle;
//int _vectors = 0;
#else
Board_IDInfo boardInfo;
#endif
// Global variables and pointers used in this example.
// has to stay, used in lib_eip_lwip_ip :-(
uint8_t EI_APP_aMacAddr_g[] = {0xc8, 0x3e, 0xa7, 0x00, 0x00, 0x59};
// Static variables and pointers used in this example.
static StackType_t EI_APP_aTaskStackMainStack_s[EI_APP_STACK_MAIN_TASK_STACK_SIZE] __attribute__((aligned(32), section(".threadstack"))) = {0};
static char aOutStream_s[0x200] = {0};
static EI_API_ADP_T* pAdp_s = NULL;
static EI_API_CIP_NODE_T* pCip_s = NULL;
// Function prototypes.
static 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;
uint8_t EI_APP_pruLogicalInstance_g = CONFIG_PRU_ICSS1;
static int EI_APP_cleanup()
{
int exit_code = 0;
// Try to delete the CIP node.
{
// Fail.
exit_code = 1;
}
// Try to delete the ADP.
if (EI_API_ADP_delete(pAdp_s))
{
// Fail.
exit_code = 1;
}
// Try to deinitialize the IDK board (unexport the GPIO pins).
if (IDK_deInit())
{
// Fail
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;
errCode = EI_API_ADP_setVendorId(pAdp_s, vendorId);
errCode = EI_API_ADP_setDeviceType(pAdp_s, deviceType);
errCode = EI_API_ADP_setProductCode(pAdp_s, productCode);
revision.major = 0x01;
revision.minor = 0x04;
errCode = EI_API_ADP_setRevision(pAdp_s, revision);
errCode = EI_API_ADP_setSerialNumber(pAdp_s, serialNumber);
errCode = EI_API_ADP_setProductName(pAdp_s, productName);
errCode = EI_API_ADP_setTimeSyncManufactureID(pAdp_s, timeSyncManufactureID);
errCode = EI_API_ADP_setTimeSyncRevisionData(pAdp_s, timeSyncRevisionData);
errCode = EI_API_ADP_setTimeSyncProductDescription(pAdp_s, timeSyncProductDescription);
// apply permanent saved data.
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;
EI_API_CIP_createClass(pCip_s, classId_p);
service.getAttrAllResponseCnt = 0;
service.callback = NULL;
EI_API_CIP_addClassService(pCip_s, classId_p, &service);
EI_API_CIP_addClassService(pCip_s, classId_p, &service);
EI_API_CIP_createInstance(pCip_s, classId_p, instanceId_p);
EI_API_CIP_addInstanceService(pCip_s, classId_p, instanceId_p, &service);
EI_API_CIP_addInstanceService(pCip_s, classId_p, instanceId_p, &service);
uint16_t attribID = 0x300;
// 64 USINT (uint8_t).
for (i = 0; i < 64; i++)
{
memset(&attr, 0, sizeof(attr));
attr.id = attribID;
attr.pvValue = &i;
EI_API_CIP_addInstanceAttr(pCip_s, classId_p, instanceId_p, &attr);
EI_API_CIP_setInstanceAttr(pCip_s, classId_p, instanceId_p, &attr);
attribID++;
}
// 32 UINT (uint16_t).
for (i = 0; i < 32; i++)
{
memset(&attr, 0, sizeof(attr));
attr.id = attribID;
attr.pvValue = &i;
EI_API_CIP_addInstanceAttr(pCip_s, classId_p, instanceId_p, &attr);
EI_API_CIP_setInstanceAttr(pCip_s, classId_p, instanceId_p, &attr);
attribID++;
}
// 16 UDINT (uint32_t).
for (i = 0; i < 16; i++)
{
memset(&attr, 0, sizeof(attr));
attr.id = attribID;
attr.pvValue = &i;
EI_API_CIP_addInstanceAttr(pCip_s, classId_p, instanceId_p, &attr);
EI_API_CIP_setInstanceAttr(pCip_s, classId_p, instanceId_p, &attr);
attribID++;
}
// 8 ULINT (uint64_t).
for (i = 0; i < 8; i++)
{
memset(&attr, 0, sizeof(attr));
attr.id = attribID;
attr.pvValue = &i;
EI_API_CIP_addInstanceAttr(pCip_s, classId_p, instanceId_p, &attr);
EI_API_CIP_setInstanceAttr(pCip_s, classId_p, instanceId_p, &attr);
attribID++;
}
}
void EI_APP_cipGenerateContent2(EI_API_CIP_NODE_T* pCipNode_p, uint16_t classId_p, uint16_t instanceId_p, uint8_t linkAddr_p)
{
uint16_t i = 0;
EI_API_CIP_createRoutableInstance(pCip_s, classId_p, instanceId_p, linkAddr_p);
EI_API_CIP_addRoutableInstanceService(pCip_s, classId_p, instanceId_p, &service, linkAddr_p);
EI_API_CIP_addRoutableInstanceService(pCip_s, classId_p, instanceId_p, &service, linkAddr_p);
uint16_t attribID = 0x300;
// 64 USINT (uint8_t).
for (i = 0; i < 64; i++)
{
memset(&attr, 0, sizeof(attr));
attr.id = attribID;
attr.pvValue = &i;
EI_API_CIP_addRoutableInstanceAttr(pCip_s, classId_p, instanceId_p, &attr, linkAddr_p);
EI_API_CIP_setRoutableInstanceAttrFunc(pCip_s, classId_p, instanceId_p, &attr, linkAddr_p);
attribID++;
}
// 32 UINT (uint16_t).
for (i = 0; i < 32; i++)
{
memset(&attr, 0, sizeof(attr));
attr.id = attribID;
attr.pvValue = &i;
EI_API_CIP_addRoutableInstanceAttr(pCip_s, classId_p, instanceId_p, &attr, linkAddr_p);
EI_API_CIP_setRoutableInstanceAttrFunc(pCip_s, classId_p, instanceId_p, &attr, linkAddr_p);
attribID++;
}
// 16 UDINT (uint32_t).
for (i = 0; i < 16; i++)
{
memset(&attr, 0, sizeof(attr));
attr.id = attribID;
attr.pvValue = &i;
EI_API_CIP_addRoutableInstanceAttr(pCip_s, classId_p, instanceId_p, &attr, linkAddr_p);
EI_API_CIP_setRoutableInstanceAttrFunc(pCip_s, classId_p, instanceId_p, &attr, linkAddr_p);
attribID++;
}
// 8 ULINT (uint64_t).
for (i = 0; i < 8; i++)
{
memset(&attr, 0, sizeof(attr));
attr.id = attribID;
attr.pvValue = &i;
EI_API_CIP_addRoutableInstanceAttr(pCip_s, classId_p, instanceId_p, &attr, linkAddr_p);
EI_API_CIP_setRoutableInstanceAttrFunc(pCip_s, classId_p, instanceId_p, &attr, linkAddr_p);
attribID++;
}
}
uint32_t EI_APP_CLASS70_GetAttr2Inst1_Link1_cb(EI_API_CIP_NODE_T* pCipNode_p, uint16_t classId_p, uint16_t instanceId_p, uint16_t attrId_p, uint16_t* len_p, void* pvValue_p, uint16_t linkAddress) {
/*USINT val*/
*len_p = sizeof(uint8_t);
//value to be returned as get attr response
*(uint8_t*)pvValue_p = 13;
}
uint32_t EI_APP_CLASS70_SetAttr2Inst1_Link1_cb(EI_API_CIP_NODE_T* pCipNode_p,
uint16_t classId_p, uint16_t instanceId_p, uint16_t attrId_p, uint16_t len_p, void* pvValue_p, uint16_t linkAddress) {
uint8_t data=*((uint8_t*)pvValue_p);
}
uint32_t EI_APP_CFGASSEM_cb(EI_API_CIP_NODE_T* pCipNode_p, uint16_t o2t_p, uint16_t t2o_p, uint16_t cfg_inst_p,
const uint8_t* const cfg_data, uint16_t cfg_data_size,uint16_t linkaddr) {
}
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;
uint16_t instanceId2 = 0x01;
uint8_t linkAddress = 1;
// Create new class 0x70 with read and write service and several attributes.
EI_APP_cipGenerateContent(pCipNode_p, classId, instanceId);
// Create instance of 0x70 CIP Routing Cylic IO messaging.
EI_APP_cipGenerateContent2(pCipNode_p, classId, instanceId, linkAddress);
instanceId2 = 0x01;
errCode = EI_API_CIP_createAssembly(pCipNode_p, 0xfe, EI_API_CIP_eAR_GET); // Input-only. (O2T)
errCode = EI_API_CIP_createAssembly(pCipNode_p, 0xff, EI_API_CIP_eAR_GET); // Listen-only.
errCode = EI_API_CIP_createAssembly(pCipNode_p, 0x64, EI_API_CIP_eAR_GET_AND_SET);//T2O
errCode = EI_API_CIP_createAssembly(pCipNode_p, 0x65, EI_API_CIP_eAR_GET_AND_SET);//O2T
errCode= EI_API_CIP_createCfgAssembly(pCipNode_p, 0x5b, EI_APP_CFGASSEM_cb);//CFG ASSEMBLY
errCode = EI_API_CIP_createRoutingAssembly(pCipNode_p, 0xfe, EI_API_CIP_eAR_GET, linkAddress); // Input-only. (O2T)
errCode = EI_API_CIP_createRoutingAssembly(pCipNode_p, 0xff, EI_API_CIP_eAR_GET, linkAddress); // Listen-only.
errCode = EI_API_CIP_createRoutingAssembly(pCipNode_p, 3, EI_API_CIP_eAR_GET_AND_SET, linkAddress);//T2O
errCode = EI_API_CIP_createRoutingAssembly(pCipNode_p, 1, EI_API_CIP_eAR_GET_AND_SET, linkAddress);//O2T
errCode = EI_API_CIP_addRoutingAssemblyMember(pCipNode_p, 3, classId, instanceId2, 0x300, linkAddress);
errCode = EI_API_CIP_addRoutingAssemblyMember(pCipNode_p, 1, classId, instanceId2, 0x308, linkAddress);
errCode = EI_API_CIP_addRoutingAssemblyMember(pCipNode_p, 3, classId, instanceId2, 0x301, linkAddress);
errCode = EI_API_CIP_addRoutingAssemblyMember(pCipNode_p, 1, classId, instanceId2, 0x309, linkAddress);
errCode = EI_API_CIP_addRoutingAssemblyMember(pCipNode_p, 3, classId, instanceId2, 0x302, linkAddress);
errCode = EI_API_CIP_addRoutingAssemblyMember(pCipNode_p, 1, classId, instanceId2, 0x310, linkAddress);
errCode = EI_API_CIP_addRoutingAssemblyMember(pCipNode_p, 3, classId, instanceId2, 0x303, linkAddress);
errCode = EI_API_CIP_addRoutingAssemblyMember(pCipNode_p, 1, classId, instanceId2, 0x311, linkAddress);
errCode = EI_API_CIP_addRoutingAssemblyMember(pCipNode_p, 3, classId, instanceId2, 0x304, linkAddress);
errCode = EI_API_CIP_addRoutingAssemblyMember(pCipNode_p, 1, classId, instanceId2, 0x312, linkAddress);
for (i = 0x300; i < 0x305; i++)
{
errCode = EI_API_CIP_addAssemblyMember(pCipNode_p, 0x64, classId, instanceId, i);
if (errCode != EI_API_CIP_eERR_OK)
{
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);
}
errCode = EI_API_CIP_addAssemblyMember(pCipNode_p, 0x65, classId, instanceId, (uint16_t)(8 + i));
if (errCode != EI_API_CIP_eERR_OK) {
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);
}
}
//Cip routing functions
const uint8_t maxlinkaddr=8;
uint8_t linkaddr=0;
errCode= EI_API_CIP_setRoutingMaxLinkAddr(pCipNode_p,maxlinkaddr);
if (errCode != EI_API_CIP_eERR_OK) {
OSAL_printf("Failed to set Max link addr\n");
}
errCode= EI_API_CIP_getRoutingMaxLinkAddr(pCipNode_p,&linkaddr);
if ((errCode != EI_API_CIP_eERR_OK) || (linkaddr!=maxlinkaddr)) {
OSAL_printf("Failed to get Max link addr\n");
}
const uint8_t routablePorts[]= {
11,7,3
};
errCode=EI_API_CIP_setRoutingRoutablePorts(pCipNode_p,routablePorts,sizeof(routablePorts)/sizeof(uint8_t));
if (errCode != EI_API_CIP_eERR_OK) {
OSAL_printf("Failed to set Routable Ports\n");
}
instanceId = 6;
/*creating routable instance 1 which is connected to link addr 1 in the 0x70 class*/
errCode = EI_API_CIP_createRoutableInstance(pCipNode_p, classId, instanceId, linkAddress);
if (errCode != EI_API_CIP_eERR_OK) {
OSAL_printf("Failed to create Routable Instance\n");
}
EI_API_CIP_SService_t service = {0};
// set class instance
errCode = EI_API_CIP_addRoutableInstanceService(pCipNode_p, classId, instanceId, &service, linkAddress);
if (errCode != EI_API_CIP_eERR_OK) {
OSAL_printf("Failed to create Routable Instance\n");
}
errCode = EI_API_CIP_addRoutableInstanceService(pCipNode_p, classId, instanceId, &service, linkAddress);
if (errCode != EI_API_CIP_eERR_OK) {
OSAL_printf("Failed to create Routable Instance\n");
}
EI_API_CIP_SAttr_t attr = {0};
const uint16_t attr2_val = 2;
attr.id = 2;
attr.get_callback_routed = EI_APP_CLASS70_GetAttr2Inst1_Link1_cb;
attr.set_callback_routed = EI_APP_CLASS70_SetAttr2Inst1_Link1_cb;
attr.pvValue = &attr2_val;
errCode = EI_API_CIP_addRoutableInstanceAttr(pCipNode_p, classId, instanceId, &attr, linkAddress);
if (errCode != EI_API_CIP_eERR_OK) {
OSAL_printf("Failed to add Routable Instance Attr\n");
}
errCode = EI_API_CIP_setRoutableInstanceAttrFunc(pCipNode_p, classId, instanceId, &attr, linkAddress);
if (errCode != EI_API_CIP_eERR_OK) {
OSAL_printf("Failed to set Routable Instance attr func\n");
}
return true;
}
static bool EI_APP_cipCreateCallback(EI_API_CIP_NODE_T* pCipNode_p)
{
uint8_t errorCnt = 0; // Variable to check sum up return errors.
// Your callback function which stores your data when triggered.
EI_API_CIP_CBService ptr_my_config_cb = EI_APP_PERM_configCb;
// Register callbacks for Set_Attribute_Single service.
EI_API_CIP_SService_t srvc = { EI_API_CIP_eSC_SETATTRSINGLE, 0, NULL, ptr_my_config_cb };
EI_API_CIP_setInstanceServiceFunc(pCipNode_p, 0x00F5, 0x0001, &srvc);
EI_API_CIP_setInstanceServiceFunc(pCipNode_p, 0x00F6, 0x0001, &srvc);
EI_API_CIP_setInstanceServiceFunc(pCipNode_p, 0x00F6, 0x0002, &srvc);
EI_API_CIP_setInstanceServiceFunc(pCipNode_p, 0x0043, 0x0001, &srvc);
EI_API_CIP_setInstanceServiceFunc(pCipNode_p, 0x0048, 0x0001, &srvc);
// Add callback for Reset service of class ID 0x01.
EI_API_CIP_SService_t srvcReset = { EI_API_CIP_eSC_RESET, 0, NULL, EI_APP_PERM_reset };
if (EI_API_CIP_setInstanceServiceFunc(pCipNode_p, 0x01, 0x01, &srvcReset) != EI_API_CIP_eERR_OK) errorCnt++;
return true;
}
void EI_APP_CmgrCb(uint32_t serviceCode_p, EI_API_ADP_UCmgrInfo_u cmgrInfo)
{
switch(serviceCode_p)
{
case 0x54:
// OSAL_printf("Forward open Connection Serial Number: 0x%04x\r\n", cmgrInfo.forwardOpenInfo.conSerialNum);
break;
case 0x5b:
// OSAL_printf("Large forward open Connection Serial Number: 0x%04x\r\n", cmgrInfo.forwardOpenInfo.conSerialNum);
break;
case 0x4e:
// OSAL_printf("Forward close Connection Serial Number: 0x%04x\r\n", cmgrInfo.forwardCloseInfo.conSerialNum);
break;
default:
printf("unknown service code");
}
}
bool EI_APP_init(void)
{
bool result = 1;
// Initialize adapter for 1 (one) interface.
pAdp_s = EI_API_ADP_new(1);
// Init module for permanent data.
EI_APP_PERM_init(pAdp_s);
#if defined(TIME_SYNC)
#endif
// Setup error handler for the EtherNet/IP stack.
EI_API_ADP_setErrorHandlerFunc(EI_APP_stackErrorHandlerCb);
EI_APP_getMacAddr();
// Initialize data for the adapter.
EI_APP_adpInit();
#if defined(QUICK_CONNECT)
// Enable QuickConnect
#endif
EI_APP_stackInit(EI_APP_pruLogicalInstance_g);
// Create a CIP node.
pCip_s = EI_API_CIP_NODE_new();
// Create callbacks for changed values.
EI_APP_cipCreateCallback(pCip_s);
// Create callback for ForwardOpen, LargeForwardOpen and ForwardClose.
EI_API_ADP_setCmgrCb(EI_APP_CmgrCb);
// Create vendor specific classes.
EI_APP_cipSetup(pCip_s);
IDK_init();
EI_APP_CLASS71_init(pCip_s);
// Finally apply.
EI_API_ADP_init(pAdp_s);
EI_API_ADP_getMacAddr(pAdp_s, &macAddr);
OSAL_printf("EI_API_ADP_getMacAddr: %02x:%02x:%02x:%02x:%02x:%02x\r\n",
macAddr.data[0],
macAddr.data[1],
macAddr.data[2],
macAddr.data[3],
macAddr.data[4],
macAddr.data[5]);
return result;
}
void EI_APP_run(void)
{
uint32_t errCode = EI_API_CIP_eERR_OK;
uint8_t attrValue = 0;
uint16_t attr;
// Mirror I/O data
for(attr = 0; attr < 5; attr++)
{
errCode = EI_API_CIP_getAttr_usint(pCip_s, 0x0070, 0x0001, attr + 0x0308, &attrValue);
if (attr == 0 && errCode == EI_API_CIP_eERR_OK)
{
IDK_setIndustrialLeds(attrValue);
}
EI_API_CIP_setAttr_usint(pCip_s, 0x0070, 0x0001, attr + 0x0300, attrValue);
}
//EI_APP_CLASS71_run();
}
void EI_APP_mainTask(
void* pvTaskArg_p)
{
uint32_t err;
Board_init();
Drivers_open();
Board_driversOpen();
OSAL_registerPrintOut(NULL, EI_APP_osPrintfCb);
err = HWAL_init ();
if (err != OSAL_NO_ERROR)
{
goto laError;
}
CUST_PHY_CBregisterLibDetect(CUST_PHY_detect, NULL);
int16_t resetServiceFlag;
if (false == EI_APP_init())
{
OSAL_printf("Fatal error: application initialization failed\n");
return;
}
for (;;)
{
EI_APP_run();
resetServiceFlag = EI_APP_PERM_getResetRequired();
if (resetServiceFlag != -1)
{
break;
}
if(EI_APP_PERM_getConfigChanged())
{
EI_APP_PERM_write();
}
OSAL_SCHED_yield();
}
laError:
EI_APP_cleanup();
PRU_EIP_stop();
Board_driversClose();
Drivers_close();
Board_deinit();
System_deinit();
Sciclient_pmDeviceReset(0xFFFFFFFFU);
}
int main(
int argc,
char* argv[])
{
uint32_t err;
System_init ();
OSAL_registerErrorHandler (EI_APP_osErrorHandlerCb);
#if defined(QUICK_CONNECT)
OSAL_printfSuppress(true);
#endif
err = OSAL_init ();
if (err != OSAL_NO_ERROR)
{
goto laError;
}
TaskP_Object appThreadHandle;
TaskP_Params appThreadParam;
TaskP_Params_init(&appThreadParam);
appThreadParam.name = "main_task";
appThreadParam.stackSize = EI_APP_STACK_MAIN_TASK_STACK_SIZE_BYTE;
appThreadParam.stack = (uint8_t*)EI_APP_aTaskStackMainStack_s;
appThreadParam.priority = TaskP_PRIORITY_LOWEST+4;
appThreadParam.taskMain = (TaskP_FxnMain)EI_APP_mainTask;
appThreadParam.args = (void*)&EI_APP_pruLogicalInstance_g;
err = TaskP_construct(&appThreadHandle, &appThreadParam);
if (SystemP_SUCCESS != err)
{
OSAL_printf("Error setting create thread of %s (%ld)\r\n", appThreadParam.name, err);
OSAL_error(__FILE__, __LINE__, OSAL_STACK_INIT_ERROR, true, 0);
}
OSAL_startOs ();
return (0);
//-------------------------------------------------------------------------------------------------
laError:
return (-1);
}
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)
{
// TODO: handle the app_cleanup return codes.
EI_APP_cleanup();
// TODO: Return an appropriate exit code in this case.
exit(255);
}
}
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)
{
exit (1);
}
}
void EI_APP_osPrintfCb(void* pContext_p, const char* __restrict pFormat_p, va_list argptr_p)
{
/* @cppcheck_justify{unusedVariable} false-positive: variable is used */
//cppcheck-suppress unusedVariable
int32_t transferOK;
/* @cppcheck_justify{unusedVariable} false-positive: variable is used */
//cppcheck-suppress unusedVariable
UART_Transaction transaction;
OSALUNREF_PARM(pContext_p);
UART_Transaction_init(&transaction);
memset(aOutStream_s, 0, sizeof(aOutStream_s));
(void)vsnprintf(aOutStream_s, sizeof(aOutStream_s), pFormat_p, argptr_p);
transaction.count = strlen(aOutStream_s);
transaction.buf = (void *)aOutStream_s;
transaction.args = NULL;
transferOK = UART_write(gUartHandle[CONFIG_UART_CONSOLE], &transaction);
(void)transferOK;
}
//*************************************************************************************************
void EI_APP_stackInit (uint8_t pruInstance_p)
{
uint32_t err;
err = APP_initPhyResetGpio ();
if (err != OSAL_NO_ERROR)
{
goto laError;
}
memset (&tParam, 0, sizeof (EIP_SLoadParameter));
memmove (tParam.ai8uMacAddr, EI_APP_aMacAddr_g, 6);
err = EI_API_ADP_loadMac (&tParam, pruInstance_p);
if (err)
{
goto laError;
}
OSAL_printf("+EI_API_ADP_startFirmware\r\n");
OSAL_printf("-EI_API_ADP_startFirmware\r\n");
return;
//-------------------------------------------------------------------------------------------------
laError:
printf ("\nStack Init Error: 0x%8.8x", err);
return;
}
//*************************************************************************************************
//| Function:
//|
//-------------------------------------------------------------------------------------------------
static 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);
// EI_APP_aMacAddr_g is directly used in lwip
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:543
ETHIP_API uint32_t EI_API_ADP_delete(T *pAdp_p)
Delete an existing EtherNet/IP adapter.
Definition: EI_API_ADP_main.c:351
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:756
ETHIP_API T * EI_API_ADP_new(uint8_t numInterfaces_p)
Create a new EtherNet/IP adapter.
Definition: EI_API_ADP_main.c:235
ETHIP_API uint32_t EI_API_ADP_loadMac(EIP_SLoadParameter *ptPara_p, uint8_t pruInstance)
Load and initialize EthernetIP firmware in PRU.
Definition: EI_API_ADP_main.c:104
ETHIP_API void EI_API_ADP_startFirmware(void)
Enable PRU firmware.
Definition: EI_API_ADP_main.c:180
ETHIP_API uint32_t EI_API_ADP_init(T *pAdp_p)
Apply parameters.
Definition: EI_API_ADP_main.c:438
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:1758
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:5291
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:1540
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:1403
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:1265
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:1675
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:999
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:1133
ETHIP_API uint32_t EI_API_ADP_setQuickConnectSupported(T *pAdp_p)
Enable QuickConnect support.
Definition: EI_API_ADP_main.c:4921
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:2636
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:2787
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:2958
ETHIP_API uint32_t EI_API_ADP_setTimeSyncSupported(T *pAdp_p)
Enable Time Sync Object support.
Definition: EI_API_ADP_main.c:1812
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:5494
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:5355
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:2924
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:4337
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:296
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:436
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:362
@ 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_eERR_CB_NO_ERROR
Definition: EI_API_def.h:143
@ 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:1309
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:1078
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:907
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:1456
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:2235
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:149
ETHIP_API T * EI_API_CIP_NODE_new(void)
Create a new CIP node.
Definition: EI_API_CIP_main.c:69
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_CBGetAttr_CIPRouting get_callback_routed
Definition: EI_API_CIP.h:202
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
EI_API_CIP_CBSetAttr_CIPRouting set_callback_routed
Definition: EI_API_CIP.h:205
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
uint8_t ai8uMacAddr[EIP_MAC_ADDR_LEN]
Definition: EI_API_ADP.h:168
Definition: EI_API_ADP.h:167
Definition: EI_API_def.h:283