forked from xuos/xiuos
This commit is contained in:
commit
c85fc70551
|
@ -16,3 +16,6 @@
|
|||
[submodule "Ubiquitous/Nuttx_Fusion_XiUOS/apps"]
|
||||
path = Ubiquitous/Nuttx_Fusion_XiUOS/apps
|
||||
url = https://code.gitlink.org.cn/wgzAIIT/incubator-nuttx-apps.git
|
||||
[submodule "APP_Framework/Applications/webnet/WebNet_XiUOS"]
|
||||
path = APP_Framework/Applications/webnet/WebNet_XiUOS
|
||||
url = https://gitlink.org.cn/xuos/WebNet_XiUOS.git
|
||||
|
|
|
@ -19,4 +19,5 @@ menu "Applications"
|
|||
source "$APP_DIR/Applications/knowing_app/Kconfig"
|
||||
source "$APP_DIR/Applications/sensor_app/Kconfig"
|
||||
source "$APP_DIR/Applications/embedded_database_app/Kconfig"
|
||||
source "$APP_DIR/Applications/webnet/Kconfig"
|
||||
endmenu
|
||||
|
|
|
@ -0,0 +1,92 @@
|
|||
menuconfig APP_USING_WEBNET
|
||||
bool "WebNet: A lightweight, customizable, embeddable Web Server for RT-Thread"
|
||||
default n
|
||||
if APP_USING_WEBNET
|
||||
|
||||
config PKG_WEBNET_PATH
|
||||
string
|
||||
default "/packages/iot/webnet"
|
||||
|
||||
config WEBNET_PORT
|
||||
int "Server listen port"
|
||||
default 80
|
||||
range 0 65535
|
||||
|
||||
config WEBNET_CONN_MAX
|
||||
int "Maximum number of server connections"
|
||||
default 16
|
||||
range 1 100
|
||||
|
||||
config WEBNET_ROOT
|
||||
string "Server root directory"
|
||||
default "/webnet"
|
||||
|
||||
menu "Select supported modules"
|
||||
|
||||
config WEBNET_USING_LOG
|
||||
bool "LOG: Enable output log support"
|
||||
default n
|
||||
|
||||
config WEBNET_USING_AUTH
|
||||
bool "AUTH: Enable basic HTTP authentication support"
|
||||
default n
|
||||
|
||||
config WEBNET_USING_CGI
|
||||
bool "CGI: Enable Common Gateway Interface support"
|
||||
default n
|
||||
|
||||
config WEBNET_USING_ASP
|
||||
bool "ASP: Enable Active Server Pages support"
|
||||
default n
|
||||
|
||||
config WEBNET_USING_SSI
|
||||
bool "SSI: Enable Server Side Includes support"
|
||||
default n
|
||||
|
||||
config WEBNET_USING_INDEX
|
||||
bool "INDEX: Enable list all the file in the directory support"
|
||||
default n
|
||||
|
||||
config WEBNET_USING_ALIAS
|
||||
bool "ALIAS: Enable alias support"
|
||||
default n
|
||||
|
||||
config WEBNET_USING_DAV
|
||||
bool "DAV: Enable Web-based Distributed Authoring and Versioning support"
|
||||
default n
|
||||
|
||||
config WEBNET_USING_UPLOAD
|
||||
bool "UPLOAD: Enable upload file support"
|
||||
default n
|
||||
|
||||
config WEBNET_USING_GZIP
|
||||
bool "GZIP: Enable compressed file support by GZIP"
|
||||
default n
|
||||
|
||||
config WEBNET_CACHE_LEVEL
|
||||
int "CACHE: Configure cache level(0:disable 1:use Last-Modified 2:use Cache-Control)"
|
||||
default 0
|
||||
range 0 2
|
||||
|
||||
if WEBNET_CACHE_LEVEL = 2
|
||||
|
||||
config WEBNET_CACHE_MAX_AGE
|
||||
int "Cache-Control time in seconds"
|
||||
default 1800
|
||||
|
||||
endif
|
||||
|
||||
endmenu
|
||||
|
||||
config WEBNET_USING_SAMPLES
|
||||
bool "Enable webnet samples"
|
||||
default n
|
||||
select WEBNET_USING_ASP
|
||||
select WEBNET_USING_AUTH
|
||||
select WEBNET_USING_CGI
|
||||
select WEBNET_USING_INDEX
|
||||
select WEBNET_USING_ALIAS
|
||||
select WEBNET_USING_SSI
|
||||
select WEBNET_USING_UPLOAD
|
||||
endif
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
import os
|
||||
Import('RTT_ROOT')
|
||||
from building import *
|
||||
|
||||
cwd = GetCurrentDir()
|
||||
objs = []
|
||||
list = os.listdir(cwd)
|
||||
|
||||
for d in list:
|
||||
path = os.path.join(cwd, d)
|
||||
if os.path.isfile(os.path.join(path, 'SConscript')):
|
||||
objs = objs + SConscript(os.path.join(path, 'SConscript'))
|
||||
|
||||
Return('objs')
|
|
@ -0,0 +1 @@
|
|||
Subproject commit d7ac9f271158d1f8ed1ebaddcb8c2ce4b0927d19
|
|
@ -0,0 +1,18 @@
|
|||
import os
|
||||
Import('RTT_ROOT')
|
||||
from building import *
|
||||
SOURCES = []
|
||||
SOURCES = ['adapter_4g.c'] + SOURCES
|
||||
objs = []
|
||||
cwd = GetCurrentDir()
|
||||
path = [cwd]
|
||||
group = DefineGroup('4g', SOURCES, depend = [], CPPPATH = [cwd])
|
||||
objs = objs + group
|
||||
list = os.listdir(cwd)
|
||||
|
||||
for d in list:
|
||||
path = os.path.join(cwd, d)
|
||||
if os.path.isfile(os.path.join(path, 'SConscript')):
|
||||
objs = objs + SConscript(os.path.join(path, 'SConscript'))
|
||||
|
||||
Return('objs')
|
|
@ -111,3 +111,6 @@ int Adapter4GTest(void)
|
|||
return 0;
|
||||
}
|
||||
// SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_PARAM_NUM(0)|SHELL_CMD_DISABLE_RETURN, Adapter4GTest, Adapter4GTest, show adapter 4G information);
|
||||
#ifdef ADD_RTTHREAD_FETURES
|
||||
MSH_CMD_EXPORT(Adapter4GTestRTThread,a 4G adpter sample);
|
||||
#endif
|
|
@ -39,5 +39,31 @@ if ADD_NUTTX_FETURES
|
|||
endif
|
||||
|
||||
if ADD_RTTHREAD_FETURES
|
||||
config ADAPTER_EC200T_PWRKEY
|
||||
int "EC200T PWRKEY pin number"
|
||||
default "97"
|
||||
config ADAPTER_EC200T_PIN_DRIVER
|
||||
string "EC200T device pin driver path"
|
||||
default "/dev/pin_dev"
|
||||
|
||||
config ADAPTER_EC200T_DRIVER_EXTUART
|
||||
bool "Using extra uart to support 4G"
|
||||
default n
|
||||
|
||||
config ADAPTER_EC200T_DRIVER
|
||||
string "EC200T device uart driver path"
|
||||
default "/dev/usart8"
|
||||
depends on !ADAPTER_EC200T_DRIVER_EXTUART
|
||||
|
||||
if ADAPTER_EC200T_DRIVER_EXTUART
|
||||
config ADAPTER_EC200T_DRIVER
|
||||
string "EC200T device extra uart driver path"
|
||||
default "/dev/extuart_dev5"
|
||||
|
||||
config ADAPTER_EC200T_DRIVER_EXT_PORT
|
||||
int "if EC200T device using extuart, choose port"
|
||||
default "5"
|
||||
endif
|
||||
|
||||
|
||||
endif
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
from building import *
|
||||
import os
|
||||
|
||||
cwd = GetCurrentDir()
|
||||
src = []
|
||||
if GetDepend(['ADAPTER_EC200T']):
|
||||
src += ['ec200t.c']
|
||||
group = DefineGroup('connection 4g ec200t', src, depend = [], CPPPATH = [cwd])
|
||||
|
||||
Return('group')
|
|
@ -40,9 +40,12 @@
|
|||
|
||||
#ifdef ADD_NUTTX_FETURES
|
||||
static void Ec200tPowerSet(void){ return; }
|
||||
#else
|
||||
static void Ec200tPowerSet(void)
|
||||
{
|
||||
#else
|
||||
#ifdef ADD_RTTHREAD_FETURES
|
||||
static void Ec200tPowerSet(void){ return; }
|
||||
#else
|
||||
static void Ec200tPowerSet(void)
|
||||
{
|
||||
int pin_fd;
|
||||
pin_fd = PrivOpen(ADAPTER_EC200T_PIN_DRIVER, O_RDWR);
|
||||
if (pin_fd < 0) {
|
||||
|
@ -73,7 +76,8 @@ static void Ec200tPowerSet(void)
|
|||
PrivClose(pin_fd);
|
||||
|
||||
PrivTaskDelay(10000);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
static int Ec200tOpen(struct Adapter *adapter)
|
||||
|
@ -148,6 +152,9 @@ out:
|
|||
#ifdef ADD_NUTTX_FETURES
|
||||
static int Ec200tIoctl(struct Adapter *adapter, int cmd, void *args){ return 0;}
|
||||
#else
|
||||
#ifdef ADD_RTTHREAD_FETURES
|
||||
static int Ec200tIoctl(struct Adapter *adapter, int cmd, void *args){ return 0;}
|
||||
#else
|
||||
static int Ec200tIoctl(struct Adapter *adapter, int cmd, void *args)
|
||||
{
|
||||
if (OPE_INT != cmd) {
|
||||
|
@ -175,12 +182,14 @@ static int Ec200tIoctl(struct Adapter *adapter, int cmd, void *args)
|
|||
ioctl_cfg.ioctl_driver_type = SERIAL_TYPE;
|
||||
ioctl_cfg.args = &serial_cfg;
|
||||
PrivIoctl(adapter->fd, OPE_INT, &ioctl_cfg);
|
||||
|
||||
|
||||
Ec200tPowerSet();
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
static int Ec200tConnect(struct Adapter *adapter, enum NetRoleType net_role, const char *ip, const char *port, enum IpType ip_type)
|
||||
{
|
||||
|
|
|
@ -178,7 +178,6 @@ int ATOrderSend(ATAgentType agent, uint32_t timeout_s, ATReplyType reply, const
|
|||
}
|
||||
|
||||
__out:
|
||||
// agent->reply = NULL;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -306,7 +305,6 @@ int EntmRecv(ATAgentType agent, char *rev_buffer, int buffer_len, int timeout_s)
|
|||
}
|
||||
PrivMutexObtain(&agent->lock);
|
||||
|
||||
|
||||
printf("EntmRecv once len %d.\n", agent->entm_recv_len);
|
||||
|
||||
memcpy(rev_buffer, agent->entm_recv_buf, agent->entm_recv_len);
|
||||
|
@ -335,29 +333,24 @@ static int GetCompleteATReply(ATAgentType agent)
|
|||
|
||||
PrivMutexAbandon(&agent->lock);
|
||||
|
||||
while (1)
|
||||
{
|
||||
while (1) {
|
||||
PrivRead(agent->fd, &ch, 1);
|
||||
#ifdef CONNECTION_FRAMEWORK_DEBUG
|
||||
if(ch != 0){
|
||||
if(ch != 0) {
|
||||
printf(" %c (0x%x)\n", ch, ch);
|
||||
}
|
||||
#endif
|
||||
|
||||
PrivMutexObtain(&agent->lock);
|
||||
if (agent->receive_mode == ENTM_MODE)
|
||||
{
|
||||
if (agent->entm_recv_len < ENTM_RECV_MAX)
|
||||
{
|
||||
if (agent->receive_mode == ENTM_MODE) {
|
||||
if (agent->entm_recv_len < ENTM_RECV_MAX) {
|
||||
agent->entm_recv_buf[agent->entm_recv_len] = ch;
|
||||
agent->entm_recv_len++;
|
||||
|
||||
if(agent->entm_recv_len < agent->read_len){
|
||||
if(agent->entm_recv_len < agent->read_len) {
|
||||
PrivMutexAbandon(&agent->lock);
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
printf("ENTM_MODE recv %d Bytes done.\n",agent->entm_recv_len);
|
||||
agent->receive_mode = DEFAULT_MODE;
|
||||
PrivSemaphoreAbandon(&agent->entm_rx_notice);
|
||||
|
@ -367,12 +360,9 @@ static int GetCompleteATReply(ATAgentType agent)
|
|||
printf("entm_recv_buf is_full ...\n");
|
||||
}
|
||||
}
|
||||
else if (agent->receive_mode == AT_MODE)
|
||||
{
|
||||
if (read_len < agent->maintain_max)
|
||||
{
|
||||
if(ch != 0) ///< if the char is null then do not save it to the buff
|
||||
{
|
||||
else if (agent->receive_mode == AT_MODE) {
|
||||
if (read_len < agent->maintain_max) {
|
||||
if(ch != 0) { ///< if the char is null then do not save it to the buff
|
||||
agent->maintain_buffer[read_len] = ch;
|
||||
read_len++;
|
||||
agent->maintain_len = read_len;
|
||||
|
@ -386,7 +376,7 @@ static int GetCompleteATReply(ATAgentType agent)
|
|||
if (((ch == '\n') && (last_ch == '\r') && (agent->reply_lr_end)) ||
|
||||
((ch == agent->reply_end_char) && (agent->reply_end_char) &&
|
||||
(last_ch == agent->reply_end_last_char) && (agent->reply_end_last_char)) ||
|
||||
((read_len == agent->reply_char_num) && (agent->reply_char_num))){
|
||||
((read_len == agent->reply_char_num) && (agent->reply_char_num))) {
|
||||
if (is_full) {
|
||||
printf("read line failed. The line data length is out of buffer size(%d)!", agent->maintain_max);
|
||||
memset(agent->maintain_buffer, 0x00, agent->maintain_max);
|
||||
|
@ -446,11 +436,13 @@ int DeleteATAgent(ATAgentType agent)
|
|||
PrivMutexDelete(&agent->lock);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef ADD_XIZI_FETURES
|
||||
if (agent->entm_rx_notice) {
|
||||
printf("delete agent entm_rx_notice = %d\n",agent->entm_rx_notice);
|
||||
PrivSemaphoreDelete(&agent->entm_rx_notice);
|
||||
}
|
||||
#else
|
||||
#endif
|
||||
#ifdef ADD_XIZI_FETURES
|
||||
if (agent->rsp_sem) {
|
||||
printf("delete agent rsp_sem = %d\n",agent->rsp_sem);
|
||||
|
@ -471,10 +463,9 @@ static void *ATAgentReceiveProcess(void *param)
|
|||
const struct at_urc *urc;
|
||||
|
||||
while (1) {
|
||||
if (GetCompleteATReply(agent) > 0)
|
||||
{
|
||||
if (GetCompleteATReply(agent) > 0) {
|
||||
PrivMutexObtain(&agent->lock);
|
||||
if (agent->reply != NULL){
|
||||
if (agent->reply != NULL) {
|
||||
ATReplyType reply = agent->reply;
|
||||
|
||||
agent->maintain_buffer[agent->maintain_len] = '\0';
|
||||
|
@ -513,13 +504,13 @@ static int ATAgentInit(ATAgentType agent)
|
|||
printf("ATAgentInit create entm sem error\n");
|
||||
goto __out;
|
||||
}
|
||||
printf("create entm_rx_notice_sem %d\n ",agent->entm_rx_notice);
|
||||
|
||||
result = PrivSemaphoreCreate(&agent->rsp_sem, 0, 0);
|
||||
if (result < 0) {
|
||||
printf("ATAgentInit create rsp sem error\n");
|
||||
goto __out;
|
||||
}
|
||||
printf("create rsp_sem %d\n ",agent->rsp_sem);
|
||||
|
||||
if(PrivMutexCreate(&agent->lock, 0) < 0) {
|
||||
printf("AdapterFrameworkInit mutex create failed.\n");
|
||||
goto __out;
|
||||
|
@ -539,7 +530,7 @@ static int ATAgentInit(ATAgentType agent)
|
|||
#endif
|
||||
|
||||
PrivTaskCreate(&agent->at_handler, &attr, ATAgentReceiveProcess, agent);
|
||||
printf("create agent->at_handler = %d\n",agent->at_handler);
|
||||
|
||||
return result;
|
||||
|
||||
__out:
|
||||
|
|
|
@ -74,7 +74,11 @@ struct ATAgent
|
|||
char entm_recv_buf[ENTM_RECV_MAX];
|
||||
uint32 entm_recv_len;
|
||||
enum ReceiveMode receive_mode;
|
||||
#ifdef ADD_XIZI_FETURES
|
||||
int entm_rx_notice;
|
||||
#else
|
||||
sem_t entm_rx_notice;
|
||||
#endif
|
||||
};
|
||||
typedef struct ATAgent *ATAgentType;
|
||||
|
||||
|
|
|
@ -2,7 +2,8 @@ import os
|
|||
Import('RTT_ROOT')
|
||||
from building import *
|
||||
SOURCES = []
|
||||
SOURCES = ['adapter_bluetooth.c'] + SOURCES
|
||||
if GetDepend(['CONNECTION_ADAPTER_BLUETOOTH']):
|
||||
SOURCES = ['adapter_bluetooth.c'] + SOURCES
|
||||
objs = []
|
||||
cwd = GetCurrentDir()
|
||||
path = [cwd]
|
||||
|
|
|
@ -90,12 +90,15 @@ int AdapterBlueToothTest(void)
|
|||
|
||||
#ifdef ADAPTER_HC08
|
||||
AdapterDeviceOpen(adapter);
|
||||
|
||||
//if bluetooth master and slave have already match, no need to AdapterDeviceControl and AdapterDeviceConnect
|
||||
AdapterDeviceControl(adapter, OPE_INT, &baud_rate);
|
||||
//AdapterDeviceConnect(adapter, adapter->net_role, NULL, NULL, 0);
|
||||
|
||||
len = strlen(bluetooth_msg);
|
||||
|
||||
while (1) {
|
||||
AdapterDeviceRecv(adapter, bluetooth_recv_msg, 128);
|
||||
AdapterDeviceRecv(adapter, bluetooth_recv_msg, 8);
|
||||
printf("bluetooth_recv_msg %s\n", bluetooth_recv_msg);
|
||||
AdapterDeviceSend(adapter, bluetooth_msg, len);
|
||||
printf("send %s after recv\n", bluetooth_msg);
|
||||
|
@ -111,5 +114,5 @@ int AdapterBlueToothTest(void)
|
|||
MSH_CMD_EXPORT(AdapterBlueToothTest,a bt adpter sample);
|
||||
#endif
|
||||
#ifdef ADD_XIZI_FETURES
|
||||
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_PARAM_NUM(0)|SHELL_CMD_DISABLE_RETURN, AdapterWifiTest, AdapterWifiTest, show adapter wifi information);
|
||||
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_PARAM_NUM(0)|SHELL_CMD_DISABLE_RETURN, AdapterBlueToothTest, AdapterBlueToothTest, show adapter bluetooth information);
|
||||
#endif
|
|
@ -37,6 +37,12 @@
|
|||
#define HC08_SET_ADDR_CMD "AT+ADDR=%s"
|
||||
#define HC08_GET_NAME_CMD "AT+NAME=%s"
|
||||
#define HC08_SET_NAME_CMD "AT+NAME=?"
|
||||
#define HC08_GET_LUUID_CMD "AT+LUUID=?"
|
||||
#define HC08_SET_LUUID_CMD "AT+LUUID=%u"
|
||||
#define HC08_GET_SUUID_CMD "AT+SUUID=?"
|
||||
#define HC08_SET_SUUID_CMD "AT+SUUID=%u"
|
||||
#define HC08_GET_TUUID_CMD "AT+TUUID=?"
|
||||
#define HC08_SET_TUUID_CMD "AT+TUUID=%u"
|
||||
|
||||
#define HC08_OK_RESP "OK"
|
||||
|
||||
|
@ -60,6 +66,12 @@ enum Hc08AtCmd
|
|||
HC08_AT_CMD_GET_ADDR,
|
||||
HC08_AT_CMD_SET_NAME,
|
||||
HC08_AT_CMD_GET_NAME,
|
||||
HC08_AT_CMD_SET_LUUID,
|
||||
HC08_AT_CMD_GET_LUUID,
|
||||
HC08_AT_CMD_SET_SUUID,
|
||||
HC08_AT_CMD_GET_SUUID,
|
||||
HC08_AT_CMD_SET_TUUID,
|
||||
HC08_AT_CMD_GET_TUUID,
|
||||
HC08_AT_CMD_END,
|
||||
};
|
||||
|
||||
|
@ -85,7 +97,7 @@ static int Hc08AtConfigure(ATAgentType agent, enum Hc08AtCmd hc08_at_cmd, void *
|
|||
{
|
||||
const char *result_buf;
|
||||
char *connectable, *role;
|
||||
unsigned int baudrate;
|
||||
unsigned int baudrate, luuid;
|
||||
char reply_ok_flag = 1;
|
||||
char cmd_str[HC08_CMD_STR_DEFAULT_SIZE] = {0};
|
||||
|
||||
|
@ -166,6 +178,18 @@ static int Hc08AtConfigure(ATAgentType agent, enum Hc08AtCmd hc08_at_cmd, void *
|
|||
ATOrderSend(agent, REPLY_TIME_OUT, reply, HC08_GET_NAME_CMD);
|
||||
reply_ok_flag = 0;
|
||||
break;
|
||||
case HC08_AT_CMD_GET_LUUID:
|
||||
AtSetReplyCharNum(agent, 13);
|
||||
ATOrderSend(agent, REPLY_TIME_OUT, reply, HC08_GET_LUUID_CMD);
|
||||
reply_ok_flag = 0;
|
||||
break;
|
||||
case HC08_AT_CMD_SET_LUUID:
|
||||
luuid = *(unsigned int *)param;
|
||||
sprintf(cmd_str, HC08_SET_LUUID_CMD, luuid);
|
||||
AtSetReplyCharNum(agent, 13);
|
||||
ATOrderSend(agent, REPLY_TIME_OUT, reply, cmd_str);
|
||||
reply_ok_flag = 0;
|
||||
break;
|
||||
default:
|
||||
printf("hc08 do not support no.%d cmd\n", hc08_at_cmd);
|
||||
DeleteATReply(reply);
|
||||
|
@ -205,10 +229,29 @@ static int Hc08Open(struct Adapter *adapter)
|
|||
return -1;
|
||||
}
|
||||
|
||||
struct SerialDataCfg serial_cfg;
|
||||
memset(&serial_cfg, 0 ,sizeof(struct SerialDataCfg));
|
||||
serial_cfg.serial_baud_rate = 9600;
|
||||
serial_cfg.serial_data_bits = DATA_BITS_8;
|
||||
serial_cfg.serial_stop_bits = STOP_BITS_1;
|
||||
serial_cfg.serial_buffer_size = SERIAL_RB_BUFSZ;
|
||||
serial_cfg.serial_parity_mode = PARITY_NONE;
|
||||
serial_cfg.serial_bit_order = STOP_BITS_1;
|
||||
serial_cfg.serial_invert_mode = NRZ_NORMAL;
|
||||
#ifdef ADAPTER_HC08_DRIVER_EXT_PORT
|
||||
serial_cfg.ext_uart_no = ADAPTER_HC08_DRIVER_EXT_PORT;
|
||||
serial_cfg.port_configure = PORT_CFG_INIT;
|
||||
#endif
|
||||
|
||||
struct PrivIoctlCfg ioctl_cfg;
|
||||
ioctl_cfg.ioctl_driver_type = SERIAL_TYPE;
|
||||
ioctl_cfg.args = &serial_cfg;
|
||||
PrivIoctl(adapter->fd, OPE_INT, &ioctl_cfg);
|
||||
|
||||
//step2: init AT agent
|
||||
if (!adapter->agent) {
|
||||
char *agent_name = "bluetooth_uart_client";
|
||||
printf("InitATAgent agent_name %s fd %u\n", agent_name, adapter->fd);
|
||||
|
||||
if (0 != InitATAgent(agent_name, adapter->fd, 512)) {
|
||||
printf("at agent init failed !\n");
|
||||
return -1;
|
||||
|
@ -274,8 +317,8 @@ static int Hc08Ioctl(struct Adapter *adapter, int cmd, void *args)
|
|||
return -1;
|
||||
}
|
||||
|
||||
char hc08_baudrate[HC08_RESP_DEFAULT_SIZE] = {0};
|
||||
uint32_t baud_rate = *((uint32_t *)args);
|
||||
uint32_t luuid;
|
||||
|
||||
struct SerialDataCfg serial_cfg;
|
||||
memset(&serial_cfg, 0 ,sizeof(struct SerialDataCfg));
|
||||
|
@ -291,6 +334,8 @@ static int Hc08Ioctl(struct Adapter *adapter, int cmd, void *args)
|
|||
serial_cfg.port_configure = PORT_CFG_INIT;
|
||||
#endif
|
||||
|
||||
serial_cfg.serial_timeout = -1;
|
||||
|
||||
struct PrivIoctlCfg ioctl_cfg;
|
||||
ioctl_cfg.ioctl_driver_type = SERIAL_TYPE;
|
||||
ioctl_cfg.args = &serial_cfg;
|
||||
|
@ -306,11 +351,29 @@ static int Hc08Ioctl(struct Adapter *adapter, int cmd, void *args)
|
|||
return -1;
|
||||
}
|
||||
|
||||
PrivTaskDelay(200);
|
||||
//Step3 : clear hc08 configure
|
||||
if (MASTER == adapter->net_role) {
|
||||
PrivTaskDelay(300);
|
||||
if (Hc08AtConfigure(adapter->agent, HC08_AT_CMD_CLEAR, NULL, NULL) < 0) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
PrivTaskDelay(500);
|
||||
|
||||
//Step3 : show hc08 device info, hc08_get send "AT+RX" response device info
|
||||
char device_info[HC08_RESP_DEFAULT_SIZE * 2] = {0};
|
||||
if (Hc08AtConfigure(adapter->agent, HC08_AT_CMD_GET_DEVICE_INFO, NULL, device_info) < 0) {
|
||||
// char device_info[HC08_RESP_DEFAULT_SIZE * 2] = {0};
|
||||
// if (Hc08AtConfigure(adapter->agent, HC08_AT_CMD_GET_DEVICE_INFO, NULL, device_info) < 0) {
|
||||
// return -1;
|
||||
// }
|
||||
|
||||
//Step4 : set LUUID、SUUID、TUUID, slave and master need to have same uuid param
|
||||
luuid = 1234;
|
||||
if (Hc08AtConfigure(adapter->agent, HC08_AT_CMD_SET_LUUID, &luuid, NULL) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (Hc08AtConfigure(adapter->agent, HC08_AT_CMD_GET_LUUID, NULL, NULL) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
import os
|
||||
Import('RTT_ROOT')
|
||||
from building import *
|
||||
SOURCES = []
|
||||
if GetDepend(['CONNECTION_ADAPTER_ETHERNET']):
|
||||
SOURCES = ['adapter_ethernet.c'] + SOURCES
|
||||
objs = []
|
||||
cwd = GetCurrentDir()
|
||||
path = [cwd]
|
||||
group = DefineGroup('ethernet', SOURCES, depend = [], CPPPATH = [cwd])
|
||||
objs = objs + group
|
||||
list = os.listdir(cwd)
|
||||
|
||||
for d in list:
|
||||
path = os.path.join(cwd, d)
|
||||
if os.path.isfile(os.path.join(path, 'SConscript')):
|
||||
objs = objs + SConscript(os.path.join(path, 'SConscript'))
|
||||
|
||||
Return('objs')
|
|
@ -97,28 +97,33 @@ int AdapterEthernetTest(void)
|
|||
|
||||
AdapterDeviceSetUp(adapter);
|
||||
|
||||
const char *ip = "10.10.100.50";
|
||||
const char *port = "12345";
|
||||
const char *ip = "192.168.131.26";
|
||||
const char *port = "9999";
|
||||
enum NetRoleType net_role = CLIENT;//SERVER
|
||||
enum IpType ip_type = IPV4;
|
||||
AdapterDeviceConnect(adapter, net_role, ip, port, ip_type);
|
||||
|
||||
printf("ready to test data transfer\n");
|
||||
|
||||
PrivTaskDelay(2000);
|
||||
len = strlen(ethernet_msg);
|
||||
for (i = 0;i < 10; i ++) {
|
||||
printf("AdapterEthernetTest send %s\n", ethernet_msg);
|
||||
AdapterDeviceSend(adapter, ethernet_msg, len);
|
||||
PrivTaskDelay(4000);
|
||||
}
|
||||
|
||||
|
||||
while (1) {
|
||||
AdapterDeviceRecv(adapter, ethernet_recv_msg, 128);
|
||||
printf("AdapterEthernetTest recv %s\n", ethernet_recv_msg);
|
||||
memset(ethernet_recv_msg, 0, 128);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
#ifdef ADD_RTTHREAD_FETURES
|
||||
MSH_CMD_EXPORT(AdapterEthernetTest,a ethernet adpter sample);
|
||||
#elif definded ADD_XIZI_FETURES
|
||||
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_PARAM_NUM(0)|SHELL_CMD_DISABLE_RETURN, AdapterEthernetTest, AdapterEthernetTest, show adapter ethernet information);
|
||||
#endif
|
||||
|
|
|
@ -29,5 +29,7 @@ if ADD_NUTTX_FETURES
|
|||
endif
|
||||
|
||||
if ADD_RTTHREAD_FETURES
|
||||
|
||||
config ADAPTER_HFA21_DRIVER
|
||||
string "HFA21 device uart driver path"
|
||||
default "/dev/uart3"
|
||||
endif
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
from building import *
|
||||
import os
|
||||
|
||||
cwd = GetCurrentDir()
|
||||
src = []
|
||||
if GetDepend(['ADAPTER_HFA21_ETHERNET']):
|
||||
src += ['hfa21_ethernet.c']
|
||||
group = DefineGroup('connection ethernet hfa21', src, depend = [], CPPPATH = [cwd])
|
||||
|
||||
Return('group')
|
|
@ -72,7 +72,7 @@ static int Hfa21EthernetOpen(struct Adapter *adapter)
|
|||
/*step2: init AT agent*/
|
||||
if (!adapter->agent) {
|
||||
char *agent_name = "ethernet_uart_client";
|
||||
if (EOK != InitATAgent(agent_name, adapter->fd, 512)) {
|
||||
if (0 != InitATAgent(agent_name, adapter->fd, 512)) {
|
||||
printf("at agent init failed !\n");
|
||||
return -1;
|
||||
}
|
||||
|
@ -168,19 +168,20 @@ static int Hfa21EthernetSetUp(struct Adapter *adapter)
|
|||
|
||||
Hfa21EthernetInitAtCmd(adapter->agent);
|
||||
|
||||
/*Step3 : FEPHY enable phy function*/
|
||||
/*Step3 : FEPHY enable phy function*/
|
||||
ret = AtCmdConfigAndCheck(adapter->agent, HFA21_ETHERNET_AT_FEPHY_CMD, HFA21_ETHERNET_OK_REPLY);
|
||||
if (ret < 0) {
|
||||
goto __exit;
|
||||
}
|
||||
|
||||
PrivTaskDelay(2000);
|
||||
/*Step4 : FVEW disable WANN function, ethernet work at LANN mode*/
|
||||
ret = AtCmdConfigAndCheck(adapter->agent, HFA21_ETHERNET_AT_DISABLE_WANN_CMD, HFA21_ETHERNET_OK_REPLY);
|
||||
if (ret < 0) {
|
||||
goto __exit;
|
||||
}
|
||||
|
||||
/*Step5 : RELD enable F-AT cmd*/
|
||||
PrivTaskDelay(2000);
|
||||
ret = AtCmdConfigAndCheck(adapter->agent, HFA21_ETHERNET_AT_RELD_CMD, HFA21_ETHERNET_OK_REPLY);
|
||||
if (ret < 0) {
|
||||
goto __exit;
|
||||
|
@ -195,13 +196,13 @@ static int Hfa21EthernetSetUp(struct Adapter *adapter)
|
|||
if (ret < 0) {
|
||||
goto __exit;
|
||||
}
|
||||
|
||||
PrivTaskDelay(2000);
|
||||
/*Step7 : AT+WANN check if get ip、netmask、gateway*/
|
||||
ret = AtCmdConfigAndCheck(adapter->agent, HFA21_ETHERNET_AT_WANN_CMD, HFA21_ETHERNET_OK_REPLY);
|
||||
if (ret < 0) {
|
||||
goto __exit;
|
||||
}
|
||||
|
||||
PrivTaskDelay(2000);
|
||||
/*Step8 : AT+Z reboot hfa21 device*/
|
||||
ret = AtCmdConfigAndCheck(adapter->agent, HFA21_ETHERNET_AT_REBOOT_CMD, HFA21_ETHERNET_OK_REPLY);
|
||||
if (ret < 0) {
|
||||
|
@ -209,7 +210,6 @@ static int Hfa21EthernetSetUp(struct Adapter *adapter)
|
|||
}
|
||||
|
||||
PrivTaskDelay(10000);
|
||||
|
||||
return ret;
|
||||
|
||||
__exit:
|
||||
|
@ -365,6 +365,7 @@ static int Hfa21EthernetConnect(struct Adapter *adapter, enum NetRoleType net_ro
|
|||
}
|
||||
|
||||
adapter->net_role = net_role;
|
||||
PrivTaskDelay(2000);
|
||||
|
||||
/*Step3 : AT+Z reboot hfa21 device*/
|
||||
ret = AtCmdConfigAndCheck(adapter->agent, HFA21_ETHERNET_AT_REBOOT_CMD, HFA21_ETHERNET_OK_REPLY);
|
||||
|
|
|
@ -5,3 +5,11 @@ config CONNECTION_ADAPTER_ETHERCAT
|
|||
if CONNECTION_ADAPTER_ETHERCAT
|
||||
source "$APP_DIR/Framework/connection/industrial_ethernet/ethercat/Kconfig"
|
||||
endif
|
||||
|
||||
menuconfig POWERLINK_MN
|
||||
bool "Using powerlink MN"
|
||||
default n
|
||||
|
||||
menuconfig POWERLINK_CN
|
||||
bool "Using powerlink CN"
|
||||
default n
|
||||
|
|
|
@ -1,3 +1,55 @@
|
|||
include $(KERNEL_ROOT)/.config
|
||||
|
||||
all: COMPILER
|
||||
|
||||
CUR_DIR := $(shell pwd)
|
||||
OPLK_ROOT := $(CUR_DIR)/openPOWERLINK
|
||||
LIBOPLKMN := $(OPLK_ROOT)/stack/lib/xiuos/arm/liboplkmn.a
|
||||
LIBOPLKCN := $(OPLK_ROOT)/stack/lib/xiuos/arm/liboplkcn.a
|
||||
LIBOPLK_BUILD_DIR := $(OPLK_ROOT)/stack/build/xiuos
|
||||
OPLK_DEMO_MN_CONSOLE := $(OPLK_ROOT)/bin/xiuos/arm/demo_mn_console/libdemo_mn_console.a
|
||||
OPLK_DEMO_CN_CONSOLE := $(OPLK_ROOT)/bin/xiuos/arm/demo_cn_console/libdemo_cn_console.a
|
||||
OPLK_DEMO_MN_CONSOLE_BUILD_DIR := $(OPLK_ROOT)/apps/demo_mn_console/build/xiuos
|
||||
OPLK_DEMO_CN_CONSOLE_BUILD_DIR := $(OPLK_ROOT)/apps/demo_cn_console/build/xiuos
|
||||
OPLK_TOOLCHAIN := $(OPLK_ROOT)/cmake/toolchain-xiuos-arm-none-eabi-gnu.cmake
|
||||
|
||||
define oplk_build
|
||||
cd $(1) && \
|
||||
find . ! -name '.' ! -name '.gitignore' -exec rm -rf {} + && \
|
||||
cmake -DCMAKE_TOOLCHAIN_FILE=$(OPLK_TOOLCHAIN) ../.. && \
|
||||
cmake --build . --target install
|
||||
endef
|
||||
|
||||
.PHONY: $(LIBOPLKMN) $(LIBOPLKCN)
|
||||
$(LIBOPLKMN) $(LIBOPLKCN)&:
|
||||
$(call oplk_build,$(LIBOPLK_BUILD_DIR))
|
||||
$(LIBOPLKMN):
|
||||
$(call oplk_build,$(LIBOPLK_BUILD_DIR))
|
||||
$(LIBOPLKCN):
|
||||
$(call oplk_build,$(LIBOPLK_BUILD_DIR))
|
||||
|
||||
.PHONY: $(OPLK_DEMO_MN_CONSOLE)
|
||||
$(OPLK_DEMO_MN_CONSOLE): ${LIBOPLKMN}
|
||||
$(call oplk_build,$(OPLK_DEMO_MN_CONSOLE_BUILD_DIR))
|
||||
|
||||
.PHONY: $(OPLK_DEMO_CN_CONSOLE)
|
||||
$(OPLK_DEMO_CN_CONSOLE): ${LIBOPLKCN}
|
||||
$(call oplk_build,$(OPLK_DEMO_CN_CONSOLE_BUILD_DIR))
|
||||
|
||||
LIBOPLKMN := $(LIBOPLKMN:$(CUR_DIR)/%=%)
|
||||
LIBOPLKCN := $(LIBOPLKCN:$(CUR_DIR)/%=%)
|
||||
OPLK_DEMO_MN_CONSOLE := $(OPLK_DEMO_MN_CONSOLE:$(CUR_DIR)/%=%)
|
||||
OPLK_DEMO_CN_CONSOLE := $(OPLK_DEMO_CN_CONSOLE:$(CUR_DIR)/%=%)
|
||||
|
||||
SRC_FILES := powerlink_demo.c
|
||||
ifeq ($(CONFIG_POWERLINK_MN)_$(CONFIG_POWERLINK_CN),y_)
|
||||
SRC_FILES += $(OPLK_DEMO_MN_CONSOLE) $(LIBOPLKMN)
|
||||
else ifeq ($(CONFIG_POWERLINK_MN)_$(CONFIG_POWERLINK_CN),_y)
|
||||
SRC_FILES += $(OPLK_DEMO_CN_CONSOLE) $(LIBOPLKCN)
|
||||
else ifeq ($(CONFIG_POWERLINK_MN)_$(CONFIG_POWERLINK_CN),y_y)
|
||||
$(error CONFIG_POWERLINK_MN and CONFIG_POWERLINK_CN cannot be enabled simultaneously due to name conflict)
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_CONNECTION_ADAPTER_ETHERCAT),y)
|
||||
SRC_DIR += ethercat
|
||||
endif
|
||||
|
|
8
APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/.gitignore
vendored
Normal file
8
APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/.gitignore
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
.gitreview
|
||||
.metadata/
|
||||
.settings
|
||||
.project
|
||||
.cproject
|
||||
*~
|
||||
*.orig
|
||||
*.bak
|
|
@ -0,0 +1,89 @@
|
|||
################################################################################
|
||||
#
|
||||
# \file .travis.yml
|
||||
#
|
||||
# \brief Configuration file for Travis continuous integration
|
||||
#
|
||||
# Copyright (c) 2017, B&R Industrial Automation GmbH
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the copyright holders nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
################################################################################
|
||||
language: c
|
||||
|
||||
compiler:
|
||||
- gcc
|
||||
- clang
|
||||
|
||||
env:
|
||||
global:
|
||||
- GIT_COMMIT=$TRAVIS_COMMIT
|
||||
- VERA_ROOT=/home/travis/build/OpenAutomationTechnologies/openPOWERLINK_V2/tools/checkstyle/.vera++/
|
||||
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- libpcap-dev
|
||||
- cmake-data
|
||||
- cmake
|
||||
- qtbase5-dev
|
||||
- libtcl8.5
|
||||
- vera++
|
||||
|
||||
before_install:
|
||||
# Execute commit message guidelines check
|
||||
- chmod +x tools/checkstyle/checkcommit.sh
|
||||
- ./tools/checkstyle/checkcommit.sh
|
||||
|
||||
before_script:
|
||||
# Print build info that binary is compiled with
|
||||
- echo $TRAVIS_COMMIT
|
||||
- echo $TRAVIS_COMMIT_MESSAGE
|
||||
- echo $TRAVIS_COMMIT_RANGE
|
||||
- echo $TRAVIS_TAG
|
||||
- echo $TRAVIS_BRANCH
|
||||
- echo $TRAVIS_BUILD_NUMBER
|
||||
- echo $TRAVIS_REPO_SLUG
|
||||
|
||||
# Run vera++ coding guidelines check
|
||||
- cp -r /usr/lib/vera++ tools/checkstyle/.vera++
|
||||
- cp /usr/bin/vera++ tools/checkstyle/.vera++/vera++
|
||||
- chmod +x tools/checkstyle/checkoplkstyle.sh
|
||||
- ./tools/checkstyle/checkoplkstyle.sh
|
||||
|
||||
script:
|
||||
- cd drivers/linux/drv_kernelmod_edrv/build/
|
||||
- cmake ..
|
||||
- cd ../../../../stack/build/linux
|
||||
- cmake ../..
|
||||
- make install
|
||||
- cd ../../../apps/demo_mn_console/build/linux
|
||||
- cmake ../..
|
||||
- make install
|
||||
- cd ../../../demo_mn_qt/build/linux
|
||||
- cmake ../..
|
||||
- make install
|
||||
- cd ../../../demo_cn_console/build/linux
|
||||
- cmake ../..
|
||||
- make install
|
|
@ -0,0 +1,120 @@
|
|||
################################################################################
|
||||
#
|
||||
# Altera Cyclone V ARM configuration options for openPOWERLINK stack
|
||||
#
|
||||
# Copyright (c) 2014, B&R Industrial Automation GmbH
|
||||
# Copyright (c) 2015, Kalycito Infotech Private Limited
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the copyright holders nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
################################################################################
|
||||
|
||||
################################################################################
|
||||
# Handle includes
|
||||
SET(CMAKE_MODULE_PATH "${OPLK_BASE_DIR}/cmake" ${CMAKE_MODULE_PATH})
|
||||
INCLUDE(setalteraarmboardconfig)
|
||||
INCLUDE(listdir)
|
||||
INCLUDE(geneclipsefilelist)
|
||||
INCLUDE(geneclipseincludelist)
|
||||
INCLUDE(geneclipseflaglist)
|
||||
INCLUDE(geneclipselibrarylist)
|
||||
|
||||
################################################################################
|
||||
# Path to the hardware library folder of your board example
|
||||
SET(CFG_HW_LIB_PATH ${OPLK_BASE_DIR}/hardware/lib/${SYSTEM_NAME_DIR}/${SYSTEM_PROCESSOR_DIR}
|
||||
CACHE PATH "Path to the hardware library folder")
|
||||
|
||||
SET(CPU_INST_NAME HOST)
|
||||
# Get subdirectories (board/demo)
|
||||
LIST_SUBDIRECTORIES(HW_BOARD_DEMOS ${CFG_HW_LIB_PATH} 2)
|
||||
|
||||
SET(CFG_HW_LIB altera-c5soc/mn-soc-shmem-gpio CACHE STRING
|
||||
"Subfolder of hardware board demo")
|
||||
SET_PROPERTY(CACHE CFG_HW_LIB PROPERTY STRINGS ${HW_BOARD_DEMOS})
|
||||
|
||||
SET(CFG_HW_LIB_DIR ${CFG_HW_LIB_PATH}/${CFG_HW_LIB})
|
||||
|
||||
################################################################################
|
||||
# Include board specific settings file
|
||||
# TODO Only source the options set during hardware build
|
||||
SET_BOARD_CONFIGURATION(${CFG_HW_LIB_DIR})
|
||||
################################################################################
|
||||
# Get the driver binary and fpga bitstream files for booting from SD card
|
||||
IF (DEFINED CFG_${CPU_INST_NAME}_BOOT_FROM_SDCARD AND CFG_${CPU_INST_NAME}_BOOT_FROM_SDCARD)
|
||||
SET(CFG_DRV_BLD_PATH ${OPLK_BASE_DIR}/drivers/altera-nios2/drv_daemon/build
|
||||
CACHE STRING "openPOWERLINK driver build path")
|
||||
SET(CFG_DRV_BIN ${CFG_DRV_BLD_PATH}/drv_daemon.bin
|
||||
CACHE STRING "openPOWERLINK driver executable")
|
||||
SET(CFG_FPGA_RBF ${CFG_DRV_BLD_PATH}/fpga.rbf
|
||||
CACHE STRING "Cylone V FPGA configuration(rbf) file")
|
||||
ELSE()
|
||||
UNSET(CFG_DRV_BLD_PATH CACHE)
|
||||
UNSET(CFG_DRV_BIN CACHE)
|
||||
UNSET(CFG_FPGA_RBF CACHE)
|
||||
ENDIF ()
|
||||
|
||||
# Set variables
|
||||
SET(ARCH_EXE_SUFFIX ".axf")
|
||||
SET(ARCH_INSTALL_POSTFIX ${CFG_DEMO_BOARD_NAME}/${CFG_DEMO_NAME})
|
||||
SET(ALT_TOOLS_DIR ${TOOLS_DIR}/altera-arm)
|
||||
|
||||
################################################################################
|
||||
# Stack configuration
|
||||
SET(CFG_BUILD_KERNEL_STACK "PCP Daemon Shared Memory Interface"
|
||||
CACHE STRING "Configure how to build the kernel stack")
|
||||
|
||||
SET(KernelStackBuildTypes
|
||||
"PCP Daemon Shared Memory Interface;None"
|
||||
CACHE INTERNAL
|
||||
"List of possible kernel stack build types")
|
||||
|
||||
SET_PROPERTY(CACHE CFG_BUILD_KERNEL_STACK
|
||||
PROPERTY STRINGS ${KernelStackBuildTypes})
|
||||
|
||||
IF (CFG_BUILD_KERNEL_STACK STREQUAL "Link to Application")
|
||||
|
||||
SET(CFG_KERNEL_STACK_DIRECTLINK ON CACHE INTERNAL
|
||||
"Link kernel stack directly into application (Single process solution)")
|
||||
UNSET(CFG_KERNEL_STACK_PCP_HOSTIF_MODULE CACHE)
|
||||
UNSET(CFG_KERNEL_DUALPROCSHM CACHE)
|
||||
|
||||
ELSEIF (CFG_BUILD_KERNEL_STACK STREQUAL "PCP Daemon Host-Interface")
|
||||
|
||||
SET(CFG_KERNEL_STACK_PCP_HOSTIF_MODULE ON CACHE INTERNAL
|
||||
"Build kernel stack as PCP daemon (dual processor)")
|
||||
UNSET(CFG_KERNEL_STACK_DIRECTLINK CACHE)
|
||||
UNSET(CFG_KERNEL_DUALPROCSHM CACHE)
|
||||
|
||||
ELSEIF (CFG_BUILD_KERNEL_STACK STREQUAL "PCP Daemon Shared Memory Interface")
|
||||
|
||||
SET(CFG_KERNEL_DUALPROCSHM ON CACHE INTERNAL
|
||||
"Build kernel stack as PCP daemon (dual processor)")
|
||||
UNSET(CFG_KERNEL_STACK_DIRECTLINK CACHE)
|
||||
UNSET(CFG_KERNEL_STACK_PCP_HOSTIF_MODULE CACHE)
|
||||
|
||||
ELSEIF (CFG_BUILD_KERNEL_STACK STREQUAL "None")
|
||||
UNSET(CFG_KERNEL_STACK_PCP_HOSTIF_MODULE CACHE)
|
||||
UNSET(CFG_KERNEL_STACK_DIRECTLINK CACHE)
|
||||
UNSET(CFG_KERNEL_DUALPROCSHM CACHE)
|
||||
|
||||
ENDIF (CFG_BUILD_KERNEL_STACK STREQUAL "Link to Application")
|
|
@ -0,0 +1,98 @@
|
|||
################################################################################
|
||||
#
|
||||
# Linux configuration options for openPOWERLINK demo applications
|
||||
#
|
||||
# Copyright (c) 2014, B&R Industrial Automation GmbH
|
||||
# Copyright (c) 2016, kalycito Infotech Private Limited
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the copyright holders nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
################################################################################
|
||||
|
||||
SET(CFG_BUILD_KERNEL_STACK "Link to Application"
|
||||
CACHE STRING "Configure how to build the kernel stack")
|
||||
|
||||
SET(KernelStackBuildTypes
|
||||
"Link to Application;Linux Userspace Daemon;Linux Kernel Module;Kernel stack on PCIe card;Kernel stack on Zynq PCP;None"
|
||||
CACHE INTERNAL
|
||||
"List of possible kernel stack build types")
|
||||
|
||||
SET_PROPERTY(CACHE CFG_BUILD_KERNEL_STACK
|
||||
PROPERTY STRINGS ${KernelStackBuildTypes})
|
||||
|
||||
IF (CFG_BUILD_KERNEL_STACK STREQUAL "Link to Application")
|
||||
|
||||
SET (CFG_KERNEL_STACK_DIRECTLINK ON CACHE INTERNAL
|
||||
"Link kernel stack directly into application (Single process solution)")
|
||||
UNSET (CFG_KERNEL_STACK_USERSPACE_DAEMON CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_KERNEL_MODULE CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_PCIE_INTF CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_ZYNQ_INTF CACHE)
|
||||
|
||||
ELSEIF (CFG_BUILD_KERNEL_STACK STREQUAL "Linux Userspace Daemon")
|
||||
|
||||
SET (CFG_KERNEL_STACK_USERSPACE_DAEMON ON CACHE INTERNAL
|
||||
"Build kernel stack as Linux userspace daemon")
|
||||
UNSET (CFG_KERNEL_STACK_DIRECTLINK CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_KERNEL_MODULE CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_PCIE_INTF CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_ZYNQ_INTF CACHE)
|
||||
|
||||
ELSEIF (CFG_BUILD_KERNEL_STACK STREQUAL "Linux Kernel Module")
|
||||
|
||||
SET (CFG_KERNEL_STACK_KERNEL_MODULE ON CACHE INTERNAL
|
||||
"Build kernel stack as Linux kernelspace module")
|
||||
UNSET (CFG_KERNEL_STACK_USERSPACE_DAEMON CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_DIRECTLINK CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_PCIE_INTF CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_ZYNQ_INTF CACHE)
|
||||
|
||||
ELSEIF (CFG_BUILD_KERNEL_STACK STREQUAL "Kernel stack on PCIe card")
|
||||
|
||||
SET (CFG_KERNEL_STACK_PCIE_INTF ON CACHE INTERNAL
|
||||
"Build kernel stack on an external PCIe device")
|
||||
UNSET (CFG_KERNEL_STACK_USERSPACE_DAEMON CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_DIRECTLINK CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_KERNEL_MODULE CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_ZYNQ_INTF CACHE)
|
||||
|
||||
ELSEIF (CFG_BUILD_KERNEL_STACK STREQUAL "Kernel stack on Zynq PCP")
|
||||
|
||||
SET (CFG_KERNEL_STACK_ZYNQ_INTF ON CACHE INTERNAL
|
||||
"Build kernel stack on an external zynq PCP device")
|
||||
UNSET (CFG_KERNEL_STACK_USERSPACE_DAEMON CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_DIRECTLINK CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_KERNEL_MODULE CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_PCIE_INTF CACHE)
|
||||
|
||||
ELSEIF (CFG_BUILD_KERNEL_STACK STREQUAL "None")
|
||||
UNSET (CFG_KERNEL_STACK_USERSPACE_DAEMON CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_KERNEL_MODULE CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_DIRECTLINK CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_PCIE_INTF CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_ZYNQ_INTF CACHE)
|
||||
|
||||
ENDIF (CFG_BUILD_KERNEL_STACK STREQUAL "Link to Application")
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,93 @@
|
|||
################################################################################
|
||||
#
|
||||
# Microblaze ISE configuration options for openPOWERLINK stack
|
||||
#
|
||||
# Copyright (c) 2014, B&R Industrial Automation GmbH
|
||||
# Copyright (c) 2016, Kalycito Infotech Private Limited
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the copyright holders nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
################################################################################
|
||||
|
||||
################################################################################
|
||||
# Handle includes
|
||||
SET(CMAKE_MODULE_PATH "${OPLK_BASE_DIR}/cmake" ${CMAKE_MODULE_PATH})
|
||||
INCLUDE(geneclipsefilelist)
|
||||
INCLUDE(geneclipseincludelist)
|
||||
INCLUDE(setmicroblazeiseboardconfig)
|
||||
INCLUDE(listdir)
|
||||
|
||||
################################################################################
|
||||
# Path to the hardware library folder of your board example
|
||||
SET(CFG_HW_LIB_PATH ${OPLK_BASE_DIR}/hardware/lib/${SYSTEM_NAME_DIR}/${SYSTEM_PROCESSOR_DIR}
|
||||
CACHE PATH "Path to the hardware library folder")
|
||||
|
||||
# Get subdirectories (board/demo)
|
||||
LIST_SUBDIRECTORIES(HW_BOARD_DEMOS ${CFG_HW_LIB_PATH} 2)
|
||||
|
||||
SET(CFG_HW_LIB avnet-s6plkeb/cn-single-gpio CACHE STRING
|
||||
"Subfolder of hardware board demo")
|
||||
SET_PROPERTY(CACHE CFG_HW_LIB PROPERTY STRINGS ${HW_BOARD_DEMOS})
|
||||
|
||||
SET(CFG_HW_LIB_DIR ${CFG_HW_LIB_PATH}/${CFG_HW_LIB})
|
||||
|
||||
################################################################################
|
||||
# Include board specific settings file
|
||||
SET_BOARD_CONFIGURATION(${CFG_HW_LIB_DIR})
|
||||
|
||||
################################################################################
|
||||
# Set variables
|
||||
SET(ARCH_EXE_SUFFIX ".elf")
|
||||
SET(ARCH_INSTALL_POSTFIX ${CFG_DEMO_BOARD_NAME}/${CFG_DEMO_NAME})
|
||||
SET(XIL_TOOLS_DIR ${TOOLS_DIR}/xilinx-microblaze)
|
||||
|
||||
################################################################################
|
||||
# Stack configuration
|
||||
SET(CFG_BUILD_KERNEL_STACK "Link to Application"
|
||||
CACHE STRING "Configure how to build the kernel stack")
|
||||
|
||||
SET(KernelStackBuildTypes
|
||||
"Link to Application;PCP Daemon Host-Interface;None"
|
||||
CACHE INTERNAL
|
||||
"List of possible kernel stack build types")
|
||||
|
||||
SET_PROPERTY(CACHE CFG_BUILD_KERNEL_STACK
|
||||
PROPERTY STRINGS ${KernelStackBuildTypes})
|
||||
|
||||
IF (CFG_BUILD_KERNEL_STACK STREQUAL "Link to Application")
|
||||
|
||||
SET(CFG_KERNEL_STACK_DIRECTLINK ON CACHE INTERNAL
|
||||
"Link kernel stack directly into application (Single process solution)")
|
||||
UNSET(CFG_KERNEL_STACK_PCP_HOSTIF_MODULE CACHE)
|
||||
|
||||
ELSEIF (CFG_BUILD_KERNEL_STACK STREQUAL "PCP Daemon Host-Interface")
|
||||
|
||||
SET(CFG_KERNEL_STACK_PCP_HOSTIF_MODULE ON CACHE INTERNAL
|
||||
"Build kernel stack as PCP daemon (dual processor)")
|
||||
UNSET(CFG_KERNEL_STACK_DIRECTLINK CACHE)
|
||||
|
||||
ELSEIF (CFG_BUILD_KERNEL_STACK STREQUAL "None")
|
||||
UNSET(CFG_KERNEL_STACK_PCP_HOSTIF_MODULE CACHE)
|
||||
UNSET(CFG_KERNEL_STACK_DIRECTLINK CACHE)
|
||||
|
||||
ENDIF (CFG_BUILD_KERNEL_STACK STREQUAL "Link to Application")
|
|
@ -0,0 +1,72 @@
|
|||
################################################################################
|
||||
#
|
||||
# Windows configuration options for openPOWERLINK stack
|
||||
#
|
||||
# Copyright (c) 2015, Kalycito Infotech Private Limited
|
||||
# Copyright (c) 2014, B&R Industrial Automation GmbH
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the copyright holders nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
################################################################################
|
||||
|
||||
SET (CFG_BUILD_KERNEL_STACK "Link to Application"
|
||||
CACHE STRING "Configure how to build the kernel stack")
|
||||
|
||||
SET (KernelStackBuildTypes
|
||||
"Link to Application;Kernel stack on PCIe card;Windows Kernel Module;None"
|
||||
CACHE INTERNAL
|
||||
"List of possible kernel stack build types")
|
||||
|
||||
SET_PROPERTY(CACHE CFG_BUILD_KERNEL_STACK
|
||||
PROPERTY STRINGS ${KernelStackBuildTypes})
|
||||
|
||||
IF (CFG_BUILD_KERNEL_STACK STREQUAL "Link to Application")
|
||||
|
||||
SET (CFG_KERNEL_STACK_DIRECTLINK ON CACHE INTERNAL
|
||||
"Link kernel stack directly into application (Single process solution)")
|
||||
UNSET (CFG_KERNEL_STACK_USERSPACE_DAEMON CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_PCIE CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_KERNEL_MODULE CACHE)
|
||||
|
||||
ELSEIF (CFG_BUILD_KERNEL_STACK STREQUAL "Kernel stack on PCIe card")
|
||||
SET (CFG_KERNEL_STACK_PCIE ON CACHE INTERNAL
|
||||
"Build kernel stack on PCIe card")
|
||||
UNSET (CFG_KERNEL_STACK_USERSPACE_DAEMON CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_DIRECTLINK CACHE)
|
||||
|
||||
ELSEIF (CFG_BUILD_KERNEL_STACK STREQUAL "Windows Kernel Module")
|
||||
|
||||
SET (CFG_KERNEL_STACK_KERNEL_MODULE ON CACHE INTERNAL
|
||||
"Build kernel stack as Windows kernelspace driver")
|
||||
UNSET (CFG_KERNEL_STACK_USERSPACE_DAEMON CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_DIRECTLINK CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_PCIE CACHE)
|
||||
|
||||
ELSEIF (CFG_BUILD_KERNEL_STACK STREQUAL "None")
|
||||
UNSET (CFG_KERNEL_STACK_DIRECTLINK CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_USERSPACE_DAEMON CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_PCIE CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_KERNEL_MODULE CACHE)
|
||||
|
||||
ENDIF ()
|
||||
|
|
@ -0,0 +1,98 @@
|
|||
################################################################################
|
||||
#
|
||||
# XiUOS configuration options for openPOWERLINK demo applications
|
||||
#
|
||||
# Copyright (c) 2014, B&R Industrial Automation GmbH
|
||||
# Copyright (c) 2016, kalycito Infotech Private Limited
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the copyright holders nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
################################################################################
|
||||
|
||||
SET(CFG_BUILD_KERNEL_STACK "Link to Application"
|
||||
CACHE STRING "Configure how to build the kernel stack")
|
||||
|
||||
SET(KernelStackBuildTypes
|
||||
"Link to Application;Linux Userspace Daemon;Linux Kernel Module;Kernel stack on PCIe card;Kernel stack on Zynq PCP;None"
|
||||
CACHE INTERNAL
|
||||
"List of possible kernel stack build types")
|
||||
|
||||
SET_PROPERTY(CACHE CFG_BUILD_KERNEL_STACK
|
||||
PROPERTY STRINGS ${KernelStackBuildTypes})
|
||||
|
||||
IF (CFG_BUILD_KERNEL_STACK STREQUAL "Link to Application")
|
||||
|
||||
SET (CFG_KERNEL_STACK_DIRECTLINK ON CACHE INTERNAL
|
||||
"Link kernel stack directly into application (Single process solution)")
|
||||
UNSET (CFG_KERNEL_STACK_USERSPACE_DAEMON CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_KERNEL_MODULE CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_PCIE_INTF CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_ZYNQ_INTF CACHE)
|
||||
|
||||
ELSEIF (CFG_BUILD_KERNEL_STACK STREQUAL "Linux Userspace Daemon")
|
||||
|
||||
SET (CFG_KERNEL_STACK_USERSPACE_DAEMON ON CACHE INTERNAL
|
||||
"Build kernel stack as Linux userspace daemon")
|
||||
UNSET (CFG_KERNEL_STACK_DIRECTLINK CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_KERNEL_MODULE CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_PCIE_INTF CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_ZYNQ_INTF CACHE)
|
||||
|
||||
ELSEIF (CFG_BUILD_KERNEL_STACK STREQUAL "Linux Kernel Module")
|
||||
|
||||
SET (CFG_KERNEL_STACK_KERNEL_MODULE ON CACHE INTERNAL
|
||||
"Build kernel stack as Linux kernelspace module")
|
||||
UNSET (CFG_KERNEL_STACK_USERSPACE_DAEMON CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_DIRECTLINK CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_PCIE_INTF CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_ZYNQ_INTF CACHE)
|
||||
|
||||
ELSEIF (CFG_BUILD_KERNEL_STACK STREQUAL "Kernel stack on PCIe card")
|
||||
|
||||
SET (CFG_KERNEL_STACK_PCIE_INTF ON CACHE INTERNAL
|
||||
"Build kernel stack on an external PCIe device")
|
||||
UNSET (CFG_KERNEL_STACK_USERSPACE_DAEMON CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_DIRECTLINK CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_KERNEL_MODULE CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_ZYNQ_INTF CACHE)
|
||||
|
||||
ELSEIF (CFG_BUILD_KERNEL_STACK STREQUAL "Kernel stack on Zynq PCP")
|
||||
|
||||
SET (CFG_KERNEL_STACK_ZYNQ_INTF ON CACHE INTERNAL
|
||||
"Build kernel stack on an external zynq PCP device")
|
||||
UNSET (CFG_KERNEL_STACK_USERSPACE_DAEMON CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_DIRECTLINK CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_KERNEL_MODULE CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_PCIE_INTF CACHE)
|
||||
|
||||
ELSEIF (CFG_BUILD_KERNEL_STACK STREQUAL "None")
|
||||
UNSET (CFG_KERNEL_STACK_USERSPACE_DAEMON CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_KERNEL_MODULE CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_DIRECTLINK CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_PCIE_INTF CACHE)
|
||||
UNSET (CFG_KERNEL_STACK_ZYNQ_INTF CACHE)
|
||||
|
||||
ENDIF (CFG_BUILD_KERNEL_STACK STREQUAL "Link to Application")
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,123 @@
|
|||
################################################################################
|
||||
#
|
||||
# CMake script for finding the openPOWERLINK library
|
||||
#
|
||||
# Copyright (c) 2014, B&R Industrial Automation GmbH
|
||||
# Copyright (c) 2016, Kalycito Infotech Private Limited
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the copyright holders nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
################################################################################
|
||||
|
||||
MACRO(FIND_OPLK_LIBRARY OPLK_NODE_TYPE)
|
||||
|
||||
UNSET(OPLKLIB CACHE)
|
||||
UNSET(OPLKLIB_DEBUG CACHE)
|
||||
|
||||
IF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||
|
||||
IF(CFG_KERNEL_STACK_DIRECTLINK)
|
||||
SET(OPLKLIB_NAME oplk${OPLK_NODE_TYPE})
|
||||
ELSEIF (CFG_KERNEL_STACK_USERSPACE_DAEMON)
|
||||
SET(OPLKLIB_NAME oplk${OPLK_NODE_TYPE}app-userintf)
|
||||
ELSEIF (CFG_KERNEL_STACK_KERNEL_MODULE)
|
||||
SET(OPLKLIB_NAME oplk${OPLK_NODE_TYPE}app-kernelintf)
|
||||
ELSEIF ((CFG_KERNEL_STACK_PCIE_INTF) OR (CFG_KERNEL_STACK_ZYNQ_INTF))
|
||||
SET(OPLKLIB_NAME oplk${OPLK_NODE_TYPE}app-kernelpcp)
|
||||
ENDIF (CFG_KERNEL_STACK_DIRECTLINK)
|
||||
|
||||
ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
||||
|
||||
IF(CFG_KERNEL_STACK_DIRECTLINK)
|
||||
SET(OPLKLIB_NAME oplk${OPLK_NODE_TYPE})
|
||||
ELSEIF (CFG_KERNEL_STACK_PCIE)
|
||||
SET(OPLKLIB_NAME oplk${OPLK_NODE_TYPE}app-pcieintf)
|
||||
ELSEIF (CFG_KERNEL_STACK_KERNEL_MODULE)
|
||||
SET(OPLKLIB_NAME oplk${OPLK_NODE_TYPE}app-kernelintf)
|
||||
ENDIF (CFG_KERNEL_STACK_DIRECTLINK)
|
||||
|
||||
ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "XiUOS")
|
||||
SET(OPLKLIB_NAME oplk${OPLK_NODE_TYPE})
|
||||
|
||||
ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Generic" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "Microblazeise")
|
||||
IF (CFG_KERNEL_STACK_DIRECTLINK)
|
||||
SET(OPLKLIB_NAME oplk${OPLK_NODE_TYPE})
|
||||
ELSEIF (CFG_KERNEL_STACK_PCP_HOSTIF_MODULE)
|
||||
SET(OPLKLIB_NAME oplk${OPLK_NODE_TYPE}app-hostif)
|
||||
ENDIF (CFG_KERNEL_STACK_DIRECTLINK)
|
||||
|
||||
ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "Generic" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "alterac5arm")
|
||||
IF (CFG_KERNEL_STACK_DIRECTLINK)
|
||||
SET(OPLKLIB_NAME oplk${OPLK_NODE_TYPE})
|
||||
ELSEIF (CFG_KERNEL_STACK_PCP_HOSTIF_MODULE)
|
||||
SET(OPLKLIB_NAME oplk${OPLK_NODE_TYPE}app-hostif)
|
||||
ELSEIF(CFG_KERNEL_DUALPROCSHM)
|
||||
SET(OPLKLIB_NAME oplk${OPLK_NODE_TYPE}app-dualprocshm)
|
||||
ELSE()
|
||||
MESSAGE("No configuration selected for ${CMAKE_SYSTEM_PROCESSOR}!!")
|
||||
ENDIF (CFG_KERNEL_STACK_DIRECTLINK)
|
||||
|
||||
ELSE ()
|
||||
|
||||
MESSAGE(FATAL_ERROR "Unsupported CMAKE_SYSTEM_NAME ${CMAKE_SYSTEM_NAME} or CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR}")
|
||||
|
||||
ENDIF()
|
||||
|
||||
SET(OPLKLIB_DEBUG_NAME "${OPLKLIB_NAME}_d")
|
||||
|
||||
# Set oplk library directory
|
||||
SET(OPLKLIB_DIR ${OPLK_BASE_DIR}/stack/lib/${SYSTEM_NAME_DIR}/${SYSTEM_PROCESSOR_DIR})
|
||||
|
||||
IF((CMAKE_GENERATOR MATCHES "Visual Studio") OR (CMAKE_BUILD_TYPE STREQUAL "Release"))
|
||||
# Search for release library
|
||||
UNSET(OPLKLIB CACHE)
|
||||
MESSAGE(STATUS "Searching for LIBRARY ${OPLKLIB_NAME} in ${OPLKLIB_DIR}")
|
||||
FIND_LIBRARY(OPLKLIB NAME ${OPLKLIB_NAME}
|
||||
HINTS ${OPLKLIB_DIR} ${OPLKLIB_DIR}/${CFG_DEMO_BOARD_NAME}/${CFG_DEMO_NAME})
|
||||
|
||||
IF(CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
||||
|
||||
UNSET(OPLKDLL CACHE)
|
||||
FIND_PROGRAM(OPLKDLL NAME ${OPLKLIB_NAME}.dll
|
||||
HINTS ${OPLKLIB_DIR})
|
||||
|
||||
ENDIF(CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
||||
ENDIF()
|
||||
|
||||
IF((CMAKE_GENERATOR MATCHES "Visual Studio") OR (CMAKE_BUILD_TYPE STREQUAL "Debug"))
|
||||
# Search for debug library
|
||||
UNSET(OPLKLIB_DEBUG CACHE)
|
||||
MESSAGE(STATUS "Searching for LIBRARY ${OPLKLIB_DEBUG_NAME} in ${OPLKLIB_DIR}")
|
||||
FIND_LIBRARY(OPLKLIB_DEBUG NAME ${OPLKLIB_DEBUG_NAME}
|
||||
HINTS ${OPLKLIB_DIR} ${OPLKLIB_DIR}/${CFG_DEMO_BOARD_NAME}/${CFG_DEMO_NAME})
|
||||
|
||||
IF(CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
||||
|
||||
UNSET(OPLKDLL_DEBUG CACHE)
|
||||
FIND_PROGRAM(OPLKDLL_DEBUG NAME ${OPLKLIB_DEBUG_NAME}.dll
|
||||
HINTS ${OPLKLIB_DIR})
|
||||
|
||||
ENDIF(CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
||||
ENDIF()
|
||||
|
||||
ENDMACRO(FIND_OPLK_LIBRARY)
|
|
@ -0,0 +1,46 @@
|
|||
################################################################################
|
||||
#
|
||||
# CMake file for the firmware manager module.
|
||||
#
|
||||
# Copyright (c) 2017, B&R Industrial Automation GmbH
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the copyright holders nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
################################################################################
|
||||
|
||||
################################################################################
|
||||
# Setup module directory
|
||||
|
||||
SET(FIRMWARE_MANAGER_SOURCE_DIR ${COMMON_SOURCE_DIR}/firmwaremanager)
|
||||
|
||||
################################################################################
|
||||
# Setup module sources
|
||||
|
||||
SET(FIRMWARE_MANAGER_SOURCES
|
||||
${FIRMWARE_MANAGER_SOURCE_DIR}/firmwarestore-file.c
|
||||
${FIRMWARE_MANAGER_SOURCE_DIR}/firmwareinfodecode-ascii.c
|
||||
${FIRMWARE_MANAGER_SOURCE_DIR}/firmwareinfo.c
|
||||
${FIRMWARE_MANAGER_SOURCE_DIR}/firmwareupdate.c
|
||||
${FIRMWARE_MANAGER_SOURCE_DIR}/firmwarecheck.c
|
||||
${FIRMWARE_MANAGER_SOURCE_DIR}/firmwaremanager.c
|
||||
)
|
|
@ -0,0 +1,41 @@
|
|||
################################################################################
|
||||
#
|
||||
# CMake script for linking with the openPOWERLINK library
|
||||
#
|
||||
# Copyright (c) 2015, B&R Industrial Automation GmbH
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the copyright holders nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
################################################################################
|
||||
|
||||
MACRO(OPLK_LINK_LIBRARIES EXECUTABLE_NAME)
|
||||
IF(CMAKE_GENERATOR MATCHES "Visual Studio")
|
||||
TARGET_LINK_LIBRARIES(${EXECUTABLE_NAME} optimized ${OPLKLIB} debug ${OPLKLIB_DEBUG})
|
||||
ELSE()
|
||||
IF(${CMAKE_BUILD_TYPE} STREQUAL "Debug")
|
||||
TARGET_LINK_LIBRARIES(${EXECUTABLE_NAME} debug ${OPLKLIB_DEBUG})
|
||||
ELSE ()
|
||||
TARGET_LINK_LIBRARIES(${EXECUTABLE_NAME} optimized ${OPLKLIB})
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
ENDMACRO(OPLK_LINK_LIBRARIES)
|
|
@ -0,0 +1,105 @@
|
|||
################################################################################
|
||||
#
|
||||
# Generic CMake options openPOWERLINK demo applications
|
||||
#
|
||||
# Copyright (c) 2016, B&R Industrial Automation GmbH
|
||||
# Copyright (c) 2016, Kalycito Infotech Private Limited
|
||||
# Copyright (c) 2020, AIIT XUOS Lab
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the copyright holders nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
################################################################################
|
||||
|
||||
MESSAGE(STATUS "CMAKE_SYSTEM_NAME is ${CMAKE_SYSTEM_NAME}")
|
||||
MESSAGE(STATUS "CMAKE_SYSTEM_PROCESSOR is ${CMAKE_SYSTEM_PROCESSOR}")
|
||||
|
||||
################################################################################
|
||||
# Set global directories
|
||||
################################################################################
|
||||
SET(OPLK_BASE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../..)
|
||||
SET(DEMO_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
|
||||
SET(DEMO_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include)
|
||||
SET(COMMON_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../common/src)
|
||||
SET(OPENCONFIG_PROJ_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../common/openCONFIGURATOR_projects)
|
||||
SET(CONTRIB_SOURCE_DIR ${OPLK_BASE_DIR}/contrib)
|
||||
SET(OPLK_INCLUDE_DIR ${OPLK_BASE_DIR}/stack/include)
|
||||
SET(TOOLS_DIR ${OPLK_BASE_DIR}/tools)
|
||||
SET(BOARDS_DIR ${OPLK_BASE_DIR}/hardware/boards)
|
||||
SET(OBJDICT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../common/objdicts)
|
||||
|
||||
################################################################################
|
||||
# Include CMake Modules
|
||||
################################################################################
|
||||
SET(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../common/cmake ${CMAKE_MODULE_PATH})
|
||||
|
||||
# include standard cmake modules
|
||||
INCLUDE(CMakeDependentOption)
|
||||
|
||||
# include project specific modules
|
||||
INCLUDE(findoplklib)
|
||||
INCLUDE(linkoplklib)
|
||||
|
||||
################################################################################
|
||||
# Set options
|
||||
################################################################################
|
||||
|
||||
STRING(TOLOWER "${CMAKE_SYSTEM_NAME}" SYSTEM_NAME_DIR)
|
||||
STRING(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" SYSTEM_PROCESSOR_DIR)
|
||||
|
||||
IF(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
|
||||
SET(CMAKE_INSTALL_PREFIX
|
||||
${OPLK_BASE_DIR}/bin/${SYSTEM_NAME_DIR}/${SYSTEM_PROCESSOR_DIR} CACHE PATH "openPOWERLINK apps install prefix" FORCE
|
||||
)
|
||||
ENDIF()
|
||||
|
||||
SET(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE INTERNAL "Available Build Configurations" FORCE)
|
||||
|
||||
IF(NOT CMAKE_GENERATOR MATCHES "Visual Studio")
|
||||
IF(NOT CMAKE_BUILD_TYPE)
|
||||
SET(CMAKE_BUILD_TYPE Release CACHE STRING
|
||||
"Choose the type of build, options are: None Debug Release"
|
||||
FORCE)
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
SET(CFG_DEBUG_LVL "0xC0000000L" CACHE STRING "Debug Level for debug output")
|
||||
|
||||
# set global include directories
|
||||
INCLUDE_DIRECTORIES (
|
||||
${OPLK_INCLUDE_DIR}
|
||||
${CONTRIB_SOURCE_DIR}
|
||||
${COMMON_SOURCE_DIR}
|
||||
${OBJDICT_DIR}
|
||||
)
|
||||
|
||||
IF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||
INCLUDE(configure-linux)
|
||||
ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
||||
INCLUDE(configure-windows)
|
||||
ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "XiUOS")
|
||||
INCLUDE(configure-xiuos)
|
||||
ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Generic" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "Microblazeise")
|
||||
INCLUDE(configure-microblazeise)
|
||||
ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Generic" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "alterac5arm")
|
||||
INCLUDE(configure-c5socarm)
|
||||
ENDIF()
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,218 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file obdpi.c
|
||||
|
||||
\brief Process image setup function for CiA302-4
|
||||
|
||||
This file contains the implementation of the process image setup functions
|
||||
for the CiA profile 302-4.
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2017, B&R Industrial Automation GmbH
|
||||
Copyright (c) 2013, SYSTEC electronic GmbH
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include "obdpi.h"
|
||||
|
||||
//============================================================================//
|
||||
// G L O B A L D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// module global vars
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// global function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
#define PI_SUBINDEX_COUNT 252
|
||||
|
||||
#ifndef tabentries
|
||||
#define tabentries(aVar_p) (sizeof(aVar_p) / sizeof(*(aVar_p)))
|
||||
#endif
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local types
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Structure describing the object linking for the process image
|
||||
|
||||
This structure describes the object index range and its data type that shall be
|
||||
linked into the process image.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
UINT objIndexStart; ///< Start index of a range
|
||||
UINT objIndexEnd; ///< End index of a range
|
||||
size_t offsetPI; ///< Starting offset within the process image
|
||||
BOOL fOutputPI; ///< Describes whether the objects are linked into an output process image
|
||||
tObdSize entrySize; ///< Size in Bytes of a single entry in the process image
|
||||
UINT subindexCountPerIndex; ///< Number of subindexes for each index
|
||||
} tProcessImageLink;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local vars
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
tProcessImageLink processImageLink_l[] =
|
||||
{
|
||||
// IndexStart IndexEnd OffsetPI OutputPI EntrySize SubindexCount
|
||||
{ 0xA000, 0xA00F, 0, FALSE, 1, PI_SUBINDEX_COUNT },
|
||||
{ 0xA040, 0xA04F, 0, FALSE, 1, PI_SUBINDEX_COUNT },
|
||||
{ 0xA0C0, 0xA0C7, 0, FALSE, 2, PI_SUBINDEX_COUNT },
|
||||
{ 0xA100, 0xA107, 0, FALSE, 2, PI_SUBINDEX_COUNT },
|
||||
{ 0xA1C0, 0xA1C3, 0, FALSE, 4, PI_SUBINDEX_COUNT },
|
||||
{ 0xA200, 0xA203, 0, FALSE, 4, PI_SUBINDEX_COUNT },
|
||||
{ 0xA240, 0xA247, 0, FALSE, 4, PI_SUBINDEX_COUNT },
|
||||
{ 0xA400, 0xA401, 0, FALSE, 8, PI_SUBINDEX_COUNT },
|
||||
{ 0xA440, 0xA441, 0, FALSE, 8, PI_SUBINDEX_COUNT },
|
||||
{ 0xA480, 0xA48F, 0, TRUE, 1, PI_SUBINDEX_COUNT },
|
||||
{ 0xA4C0, 0xA4CF, 0, TRUE, 1, PI_SUBINDEX_COUNT },
|
||||
{ 0xA540, 0xA547, 0, TRUE, 2, PI_SUBINDEX_COUNT },
|
||||
{ 0xA580, 0xA587, 0, TRUE, 2, PI_SUBINDEX_COUNT },
|
||||
{ 0xA640, 0xA643, 0, TRUE, 4, PI_SUBINDEX_COUNT },
|
||||
{ 0xA680, 0xA683, 0, TRUE, 4, PI_SUBINDEX_COUNT },
|
||||
{ 0xA6C0, 0xA6C7, 0, TRUE, 4, PI_SUBINDEX_COUNT },
|
||||
{ 0xA880, 0xA881, 0, TRUE, 8, PI_SUBINDEX_COUNT },
|
||||
{ 0xA8C0, 0xA8C1, 0, TRUE, 8, PI_SUBINDEX_COUNT }
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
static UINT linkProcessImageRange(UINT objIndexStart_p, UINT objIndexEnd_p,
|
||||
size_t offsetPI_p, BOOL fOutputPI_p, tObdSize entrySize_p,
|
||||
UINT subindexCountPerIndex_p);
|
||||
|
||||
//============================================================================//
|
||||
// P U B L I C F U N C T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Setup process image
|
||||
|
||||
The function sets up a process image according to the CiA profile 302-4.
|
||||
|
||||
\return The function returns the number of the index that failed to link or 0,
|
||||
if no error occurred.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
UINT obdpi_setupProcessImage(void)
|
||||
{
|
||||
UINT errorIndex = 0;
|
||||
size_t i;
|
||||
tProcessImageLink* pLink;
|
||||
|
||||
pLink = processImageLink_l;
|
||||
|
||||
for (i = 0; i < tabentries(processImageLink_l); i++, pLink++)
|
||||
{
|
||||
errorIndex = linkProcessImageRange(pLink->objIndexStart, pLink->objIndexEnd,
|
||||
pLink->offsetPI, pLink->fOutputPI,
|
||||
pLink->entrySize, pLink->subindexCountPerIndex);
|
||||
if (errorIndex != 0)
|
||||
break;
|
||||
}
|
||||
|
||||
return errorIndex;
|
||||
}
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E F U N C T I O N S //
|
||||
//============================================================================//
|
||||
/// \name Private Functions
|
||||
/// \{
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Link process image range
|
||||
|
||||
The function links a range of variables to the object dictionary.
|
||||
|
||||
\param objIndexStart_p Start index of range to link.
|
||||
\param objIndexEnd_p End index of range to link.
|
||||
\param offsetPI_p Offset of range in the process image.
|
||||
\param fOutputPI_p Determines if input image or output image should
|
||||
be used: TRUE = output image, FALSE = imput image
|
||||
\param entrySize_p The size of one process variable.
|
||||
\param subindexCountPerIndex_p Number of subindexes per index to be linked.
|
||||
|
||||
\return The function returns the number of the index that failed to link or 0,
|
||||
if no error occurred.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static UINT linkProcessImageRange(UINT objIndexStart_p, UINT objIndexEnd_p,
|
||||
size_t offsetPI_p, BOOL fOutputPI_p,
|
||||
tObdSize entrySize_p, UINT subindexCountPerIndex_p)
|
||||
{
|
||||
tOplkError ret = kErrorOk;
|
||||
UINT errorIndex = 0;
|
||||
UINT varEntries;
|
||||
|
||||
for (; objIndexStart_p <= objIndexEnd_p; objIndexStart_p++,
|
||||
offsetPI_p += entrySize_p * subindexCountPerIndex_p)
|
||||
{
|
||||
varEntries = subindexCountPerIndex_p;
|
||||
ret = oplk_linkProcessImageObject(objIndexStart_p, 1, offsetPI_p,
|
||||
fOutputPI_p, entrySize_p, &varEntries);
|
||||
if (((ret == kErrorOk) && (varEntries < subindexCountPerIndex_p)) ||
|
||||
(ret == kErrorApiPISizeExceeded))
|
||||
{
|
||||
errorIndex = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if (ret != kErrorOk)
|
||||
{
|
||||
errorIndex = objIndexStart_p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return errorIndex;
|
||||
}
|
||||
|
||||
/// \}
|
|
@ -0,0 +1,71 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file obdpi.h
|
||||
|
||||
\brief Process image setup function for CiA302-4
|
||||
|
||||
This file contains the definition of the process image setup functions
|
||||
for the CiA profile 302-4.
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2016, B&R Industrial Automation GmbH
|
||||
Copyright (c) 2013, SYSTEC electronic GmbH
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef _INC_obdpi_H_
|
||||
#define _INC_obdpi_H_
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include <oplk/oplk.h>
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// typedef
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
UINT obdpi_setupProcessImage(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _INC_obdpi_H_ */
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
After Width: | Height: | Size: 4.2 KiB |
Binary file not shown.
After Width: | Height: | Size: 30 KiB |
|
@ -0,0 +1,506 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file objdicts/CiA401_CN/objdict.h
|
||||
|
||||
\brief Object dictionary according to CiA401
|
||||
|
||||
This file contains the object dictionary definition for the CANopen CiA401
|
||||
device profile.
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2016, B&R Industrial Automation GmbH
|
||||
Copyright (c) 2013, SYSTEC electronic GmbH
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
|
||||
#define OBD_DEFINE_MACRO
|
||||
#include <obdcreate/obdmacro.h>
|
||||
#undef OBD_DEFINE_MACRO
|
||||
#include <limits.h>
|
||||
|
||||
OBD_BEGIN()
|
||||
/*************************************************************************
|
||||
* Communication Profile Area (0x1000 - 0x1FFF)
|
||||
*************************************************************************/
|
||||
OBD_BEGIN_PART_GENERIC()
|
||||
|
||||
// Object 1000h: NMT_DeviceType_U32
|
||||
OBD_BEGIN_INDEX_RAM(0x1000, 0x01, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1000, 0x00, kObdTypeUInt32, kObdAccR, tObdUnsigned32, NMT_DeviceType_U32, 0x000F0191)
|
||||
OBD_END_INDEX(0x1000)
|
||||
|
||||
// Object 1001h: ERR_ErrorRegister_U8
|
||||
OBD_BEGIN_INDEX_RAM(0x1001, 0x01, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1001, 0x00, kObdTypeUInt8, kObdAccR, tObdUnsigned8, ERR_ErrorRegister_U8, 0x00)
|
||||
OBD_END_INDEX(0x1001)
|
||||
|
||||
/*
|
||||
// Object 1003h: ERR_History_ADOM
|
||||
OBD_RAM_INDEX_RAM_VARARRAY_NOINIT(0x1003, 10, FALSE, tObdDomain, kObdAccR, tObdDomain, ERR_History_ADOM)
|
||||
*/
|
||||
|
||||
// Object 1006h: NMT_CycleLen_U32 in [us]
|
||||
OBD_BEGIN_INDEX_RAM(0x1006, 0x01, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR_RG(0x1006, 0x00, kObdTypeUInt32, kObdAccSGRW, tObdUnsigned32, NMT_CycleLen_U32, 0x00000000, 400, UINT_MAX) // in [us]
|
||||
OBD_END_INDEX(0x1006)
|
||||
|
||||
// Object 1008h: NMT_ManufactDevName_VS
|
||||
OBD_BEGIN_INDEX_RAM(0x1008, 0x01, FALSE)
|
||||
OBD_SUBINDEX_RAM_VSTRING(0x1008, 0x00, kObdAccR, device_name, OBD_MAX_STRING_SIZE, "openPOWERLINK device")
|
||||
OBD_END_INDEX(0x1008)
|
||||
|
||||
// Object 1009h: NMT_ManufactHwVers_VS
|
||||
OBD_BEGIN_INDEX_RAM(0x1009, 0x01, FALSE)
|
||||
OBD_SUBINDEX_RAM_VSTRING(0x1009, 0x00, kObdAccR, hardware_version, OBD_MAX_STRING_SIZE, "1.00")
|
||||
OBD_END_INDEX(0x1009)
|
||||
|
||||
// Object 100Ah: NMT_ManufactSwVers_VS
|
||||
OBD_BEGIN_INDEX_RAM(0x100A, 0x01, FALSE)
|
||||
OBD_SUBINDEX_RAM_VSTRING(0x100A, 0x00, kObdAccR, software_version, OBD_MAX_STRING_SIZE, PLK_PRODUCT_NAME" "PLK_PRODUCT_VERSION)
|
||||
OBD_END_INDEX(0x100A)
|
||||
|
||||
#if defined(CONFIG_APP_STORE_RESTORE)
|
||||
// Object 1010h: NMT_StoreParam_REC
|
||||
OBD_BEGIN_INDEX_RAM(0x1010, 0x05, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1010, 0x00, kObdTypeUInt8, kObdAccConst, tObdUnsigned8, NumberOfEntries, 0x04)
|
||||
OBD_SUBINDEX_RAM_VAR_NOINIT(0x1010, 0x01, kObdTypeUInt32, kObdAccRW, tObdUnsigned32, AllParam_U32)
|
||||
OBD_SUBINDEX_RAM_VAR_NOINIT(0x1010, 0x02, kObdTypeUInt32, kObdAccRW, tObdUnsigned32, CommunicationParam_U32)
|
||||
OBD_SUBINDEX_RAM_VAR_NOINIT(0x1010, 0x03, kObdTypeUInt32, kObdAccRW, tObdUnsigned32, ApplicationParam_U32)
|
||||
OBD_SUBINDEX_RAM_VAR_NOINIT(0x1010, 0x04, kObdTypeUInt32, kObdAccRW, tObdUnsigned32, ManufacturerParam_04h_U32)
|
||||
OBD_END_INDEX(0x1010)
|
||||
|
||||
// Object 1011h: NMT_RestoreDefParam_REC
|
||||
OBD_BEGIN_INDEX_RAM(0x1011, 0x05, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1011, 0x00, kObdTypeUInt8, kObdAccConst, tObdUnsigned8, NumberOfEntries, 0x04)
|
||||
OBD_SUBINDEX_RAM_VAR_NOINIT(0x1011, 0x01, kObdTypeUInt32, kObdAccRW, tObdUnsigned32, AllParam_U32)
|
||||
OBD_SUBINDEX_RAM_VAR_NOINIT(0x1011, 0x02, kObdTypeUInt32, kObdAccRW, tObdUnsigned32, CommunicationParam_U32)
|
||||
OBD_SUBINDEX_RAM_VAR_NOINIT(0x1011, 0x03, kObdTypeUInt32, kObdAccRW, tObdUnsigned32, ApplicationParam_U32)
|
||||
OBD_SUBINDEX_RAM_VAR_NOINIT(0x1011, 0x04, kObdTypeUInt32, kObdAccRW, tObdUnsigned32, ManufacturerParam_04h_U32)
|
||||
OBD_END_INDEX(0x1011)
|
||||
#endif
|
||||
|
||||
// Object 1018h: NMT_IdentityObject_REC
|
||||
OBD_BEGIN_INDEX_RAM(0x1018, 0x05, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1018, 0x00, kObdTypeUInt8, kObdAccConst, tObdUnsigned8, NumberOfEntries, 0x04)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1018, 0x01, kObdTypeUInt32, kObdAccR, tObdUnsigned32, VendorId_U32, 0x00000000)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1018, 0x02, kObdTypeUInt32, kObdAccR, tObdUnsigned32, ProductCode_U32, 0x00000000)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1018, 0x03, kObdTypeUInt32, kObdAccR, tObdUnsigned32, RevisionNo_U32, PLK_DEFINED_OBJ1018_VERSION)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1018, 0x04, kObdTypeUInt32, kObdAccR, tObdUnsigned32, SerialNo_U32, 0x00000000)
|
||||
OBD_END_INDEX(0x1018)
|
||||
|
||||
// Object 1020h: CFM_VerifyConfiguration_REC
|
||||
OBD_BEGIN_INDEX_RAM(0x1020, 0x03, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1020, 0x00, kObdTypeUInt8, kObdAccConst, tObdUnsigned8, NumberOfEntries, 0x02)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1020, 0x01, kObdTypeUInt32, kObdAccSRW, tObdUnsigned32, ConfDate_U32, 0x00000000)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1020, 0x02, kObdTypeUInt32, kObdAccSRW, tObdUnsigned32, ConfTime_U32, 0x00000000)
|
||||
// OBD_SUBINDEX_RAM_VAR(0x1020, 0x03, kObdTypeUInt32, kObdAccSRW, tObdUnsigned32, ConfId_U32, 0x00000000)
|
||||
// OBD_SUBINDEX_RAM_VAR(0x1020, 0x04, kObdTypeBool, kObdAccR, tObdBoolean, VerifyConfInvalid_BOOL, 0x01)
|
||||
OBD_END_INDEX(0x1020)
|
||||
|
||||
// Object 1030h: NMT_InterfaceGroup_Xh_REC
|
||||
OBD_BEGIN_INDEX_RAM(0x1030, 0x0A, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1030, 0x00, kObdTypeUInt8, kObdAccConst, tObdUnsigned8, NumberOfEntries, 0x09)
|
||||
OBD_SUBINDEX_RAM_VAR_RG(0x1030, 0x01, kObdTypeUInt16, kObdAccR, tObdUnsigned16, InterfaceIndex_U16, 0x01, 0x00, 0x0A)
|
||||
OBD_SUBINDEX_RAM_VSTRING(0x1030, 0x02, kObdAccR, InterfaceDescription_VSTR, 0x20, "Interface 1")
|
||||
OBD_SUBINDEX_RAM_VAR(0x1030, 0x03, kObdTypeUInt8, kObdAccR, tObdUnsigned8, InterfaceType_U8, 0x06)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1030, 0x04, kObdTypeUInt16, kObdAccR, tObdUnsigned16, InterfaceMtu_U16, 1518)
|
||||
OBD_SUBINDEX_RAM_OSTRING(0x1030, 0x05, kObdAccR, InterfacePhysAddress_OSTR, 0x06)
|
||||
OBD_SUBINDEX_RAM_VSTRING(0x1030, 0x06, kObdAccR, InterfaceName_VSTR, 0x20, "Interface 1")
|
||||
OBD_SUBINDEX_RAM_VAR_RG(0x1030, 0x07, kObdTypeUInt8, kObdAccR, tObdUnsigned8, InterfaceOperStatus_U8, 0x01, 0x00, 0x01)
|
||||
OBD_SUBINDEX_RAM_VAR_RG(0x1030, 0x08, kObdTypeUInt8, kObdAccGRW, tObdUnsigned8, InterfaceAdminState_U8, 0x01, 0x00, 0x01)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1030, 0x09, kObdTypeBool, kObdAccRW, tObdBoolean, Valid_BOOL, 0x01)
|
||||
OBD_END_INDEX(0x1030)
|
||||
|
||||
#if (defined(CONFIG_DLL_PRES_CHAINING_CN) && (NMT_MAX_NODE_ID > 0))
|
||||
// Object 1050h: NMT_RelativeLatencyDiff_AU32
|
||||
OBD_RAM_INDEX_RAM_ARRAY(0x1050, NMT_MAX_NODE_ID, FALSE, kObdTypeUInt32, kObdAccR, tObdUnsigned32, NMT_RelativeLatencyDiff_AU32, 0)
|
||||
#endif
|
||||
|
||||
// Object 1300h: SDO_SequLayerTimeout_U32 in [ms]
|
||||
OBD_BEGIN_INDEX_RAM(0x1300, 0x01, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR_RG(0x1300, 0x00, kObdTypeUInt32, kObdAccSGRW, tObdUnsigned32, SDO_SequLayerTimeout_U32, 15000, 100, 0xFFFFFFFF)
|
||||
OBD_END_INDEX(0x1300)
|
||||
|
||||
// Object 1400h: PDO_RxCommParam_00h_REC
|
||||
OBD_BEGIN_INDEX_RAM(0x1400, 0x03, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1400, 0x00, kObdTypeUInt8, kObdAccConst, tObdUnsigned8, NumberOfEntries, 0x02)
|
||||
OBD_SUBINDEX_RAM_VAR_RG(0x1400, 0x01, kObdTypeUInt8, kObdAccSGRW, tObdUnsigned8, NodeID_U8, 0, 0, 254)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1400, 0x02, kObdTypeUInt8, kObdAccSRW, tObdUnsigned8, MappingVersion_U8, 0x00)
|
||||
OBD_END_INDEX(0x1400)
|
||||
|
||||
// Object 1401h: PDO_RxCommParam_01h_REC
|
||||
OBD_BEGIN_INDEX_RAM(0x1401, 0x03, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1401, 0x00, kObdTypeUInt8, kObdAccConst, tObdUnsigned8, NumberOfEntries, 0x02)
|
||||
OBD_SUBINDEX_RAM_VAR_RG(0x1401, 0x01, kObdTypeUInt8, kObdAccSGRW, tObdUnsigned8, NodeID_U8, 0, 0, 254)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1401, 0x02, kObdTypeUInt8, kObdAccSRW, tObdUnsigned8, MappingVersion_U8, 0x00)
|
||||
OBD_END_INDEX(0x1401)
|
||||
|
||||
// Object 1402h: PDO_RxCommParam_02h_REC
|
||||
OBD_BEGIN_INDEX_RAM(0x1402, 0x03, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1402, 0x00, kObdTypeUInt8, kObdAccConst, tObdUnsigned8, NumberOfEntries, 0x02)
|
||||
OBD_SUBINDEX_RAM_VAR_RG(0x1402, 0x01, kObdTypeUInt8, kObdAccSGRW, tObdUnsigned8, NodeID_U8, 0, 0, 254)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1402, 0x02, kObdTypeUInt8, kObdAccSRW, tObdUnsigned8, MappingVersion_U8, 0x00)
|
||||
OBD_END_INDEX(0x1402)
|
||||
|
||||
// Object 1600h: PDO_RxMappParam_00h_AU64
|
||||
OBD_BEGIN_INDEX_RAM(0x1600, 0x1A, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1600, 0x00, kObdTypeUInt8, kObdAccSRW, tObdUnsigned8, NumberOfEntries, 0x00)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1600, 0x01, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1600, 0x02, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1600, 0x03, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1600, 0x04, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1600, 0x05, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1600, 0x06, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1600, 0x07, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1600, 0x08, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1600, 0x09, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1600, 0x0A, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1600, 0x0B, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1600, 0x0C, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1600, 0x0D, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1600, 0x0E, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1600, 0x0F, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1600, 0x10, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1600, 0x11, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1600, 0x12, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1600, 0x13, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1600, 0x14, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1600, 0x15, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1600, 0x16, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1600, 0x17, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1600, 0x18, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1600, 0x19, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_END_INDEX(0x1600)
|
||||
|
||||
// Object 1601h: PDO_RxMappParam_01h_AU64
|
||||
OBD_BEGIN_INDEX_RAM(0x1601, 0x1A, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1601, 0x00, kObdTypeUInt8, kObdAccSRW, tObdUnsigned8, NumberOfEntries, 0x00)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1601, 0x01, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1601, 0x02, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1601, 0x03, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1601, 0x04, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1601, 0x05, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1601, 0x06, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1601, 0x07, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1601, 0x08, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1601, 0x09, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1601, 0x0A, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1601, 0x0B, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1601, 0x0C, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1601, 0x0D, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1601, 0x0E, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1601, 0x0F, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1601, 0x10, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1601, 0x11, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1601, 0x12, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1601, 0x13, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1601, 0x14, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1601, 0x15, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1601, 0x16, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1601, 0x17, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1601, 0x18, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1601, 0x19, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_END_INDEX(0x1601)
|
||||
|
||||
// Object 1602h: PDO_RxMappParam_02h_AU64
|
||||
OBD_BEGIN_INDEX_RAM(0x1602, 0x1A, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1602, 0x00, kObdTypeUInt8, kObdAccSRW, tObdUnsigned8, NumberOfEntries, 0x00)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1602, 0x01, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1602, 0x02, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1602, 0x03, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1602, 0x04, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1602, 0x05, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1602, 0x06, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1602, 0x07, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1602, 0x08, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1602, 0x09, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1602, 0x0A, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1602, 0x0B, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1602, 0x0C, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1602, 0x0D, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1602, 0x0E, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1602, 0x0F, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1602, 0x10, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1602, 0x11, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1602, 0x12, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1602, 0x13, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1602, 0x14, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1602, 0x15, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1602, 0x16, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1602, 0x17, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1602, 0x18, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1602, 0x19, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_END_INDEX(0x1602)
|
||||
|
||||
// Object 1800h: PDO_TxCommParam_00h_REC
|
||||
OBD_BEGIN_INDEX_RAM(0x1800, 0x03, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1800, 0x00, kObdTypeUInt8, kObdAccConst, tObdUnsigned8, NumberOfEntries, 0x02)
|
||||
OBD_SUBINDEX_RAM_VAR_RG(0x1800, 0x01, kObdTypeUInt8, kObdAccSGRW, tObdUnsigned8, NodeID_U8, 0, 0, 254)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1800, 0x02, kObdTypeUInt8, kObdAccSRW, tObdUnsigned8, MappingVersion_U8, 0x00)
|
||||
OBD_END_INDEX(0x1800)
|
||||
|
||||
// Object 1A00h: PDO_TxMappParam_00h_AU64
|
||||
OBD_BEGIN_INDEX_RAM(0x1A00, 0x1A, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1A00, 0x00, kObdTypeUInt8, kObdAccSRW, tObdUnsigned8, NumberOfEntries, 0x00)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1A00, 0x01, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1A00, 0x02, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1A00, 0x03, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1A00, 0x04, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1A00, 0x05, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1A00, 0x06, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1A00, 0x07, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1A00, 0x08, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1A00, 0x09, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1A00, 0x0A, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1A00, 0x0B, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1A00, 0x0C, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1A00, 0x0D, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1A00, 0x0E, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1A00, 0x0F, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1A00, 0x10, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1A00, 0x11, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1A00, 0x12, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1A00, 0x13, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1A00, 0x14, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1A00, 0x15, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1A00, 0x16, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1A00, 0x17, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1A00, 0x18, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1A00, 0x19, kObdTypeUInt64, kObdAccSRW, tObdUnsigned64, ObjectMapping, 0x0000000000000000LL)
|
||||
OBD_END_INDEX(0x1A00)
|
||||
|
||||
// Object 1C0Bh: DLL_CNLossSoC_REC
|
||||
OBD_BEGIN_INDEX_RAM(0x1C0B, 0x04, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1C0B, 0x00, kObdTypeUInt8, kObdAccConst, tObdUnsigned8, NumberOfEntries, 3)
|
||||
OBD_SUBINDEX_RAM_USERDEF_NOINIT(0x1C0B, 0x01, kObdTypeUInt32, kObdAccRW, tObdUnsigned32, CumulativeCnt_U32)
|
||||
OBD_SUBINDEX_RAM_USERDEF(0x1C0B, 0x02, kObdTypeUInt32, kObdAccR, tObdUnsigned32, ThresholdCnt_U32, 0)
|
||||
OBD_SUBINDEX_RAM_USERDEF(0x1C0B, 0x03, kObdTypeUInt32, kObdAccSRW, tObdUnsigned32, Threshold_U32, 15)
|
||||
OBD_END_INDEX(0x1C0B)
|
||||
|
||||
// Object 1C0Dh: DLL_CNLossPReq_REC
|
||||
OBD_BEGIN_INDEX_RAM(0x1C0D, 0x04, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1C0D, 0x00, kObdTypeUInt8, kObdAccConst, tObdUnsigned8, NumberOfEntries, 3)
|
||||
OBD_SUBINDEX_RAM_USERDEF_NOINIT(0x1C0D, 0x01, kObdTypeUInt32, kObdAccRW, tObdUnsigned32, CumulativeCnt_U32)
|
||||
OBD_SUBINDEX_RAM_USERDEF(0x1C0D, 0x02, kObdTypeUInt32, kObdAccR, tObdUnsigned32, ThresholdCnt_U32, 0)
|
||||
OBD_SUBINDEX_RAM_USERDEF(0x1C0D, 0x03, kObdTypeUInt32, kObdAccSRW, tObdUnsigned32, Threshold_U32, 15)
|
||||
OBD_END_INDEX(0x1C0D)
|
||||
|
||||
// Object 1C0Fh: DLL_CNCRCError_REC
|
||||
OBD_BEGIN_INDEX_RAM(0x1C0F, 0x04, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1C0F, 0x00, kObdTypeUInt8, kObdAccConst, tObdUnsigned8, NumberOfEntries, 3)
|
||||
OBD_SUBINDEX_RAM_USERDEF_NOINIT(0x1C0F, 0x01, kObdTypeUInt32, kObdAccRW, tObdUnsigned32, CumulativeCnt_U32)
|
||||
OBD_SUBINDEX_RAM_USERDEF(0x1C0F, 0x02, kObdTypeUInt32, kObdAccR, tObdUnsigned32, ThresholdCnt_U32, 0)
|
||||
OBD_SUBINDEX_RAM_USERDEF(0x1C0F, 0x03, kObdTypeUInt32, kObdAccSRW, tObdUnsigned32, Threshold_U32, 15)
|
||||
OBD_END_INDEX(0x1C0F)
|
||||
|
||||
// Object 1C14h: DLL_LossOfSocTolerance_U32 in [ns]
|
||||
OBD_BEGIN_INDEX_RAM(0x1C14, 0x01, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1C14, 0x00, kObdTypeUInt32, kObdAccSRW, tObdUnsigned32, LossOfSocTolerance, 100000)
|
||||
OBD_END_INDEX(0x1C14)
|
||||
|
||||
#if defined(CONFIG_INCLUDE_IP)
|
||||
// Object 1E40h: NWL_IpAddrTable_0h_REC
|
||||
OBD_BEGIN_INDEX_RAM(0x1E40, 0x06, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1E40, 0x00, kObdTypeUInt8, kObdAccConst, tObdUnsigned8, NumberOfEntries, 0x05)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1E40, 0x01, kObdTypeUInt16, kObdAccR, tObdUnsigned16, IfIndex_U16, 0x01)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1E40, 0x02, kObdTypeUInt32, kObdAccR, tObdUnsigned32, Addr_IPAD, 0xC0A86401)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1E40, 0x03, kObdTypeUInt32, kObdAccR, tObdUnsigned32, NetMask_IPAD, 0xFFFFFF00)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1E40, 0x04, kObdTypeUInt16, kObdAccR, tObdUnsigned16, ReasmMaxSize_U16, 50000)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1E40, 0x05, kObdTypeUInt32, kObdAccSRW, tObdUnsigned32, DefaultGateway_IPAD, 0xC0A864FE)
|
||||
OBD_END_INDEX(0x1E40)
|
||||
|
||||
// Object 1E4Ah: NWL_IpGroup_REC
|
||||
OBD_BEGIN_INDEX_RAM(0x1E4A, 0x06, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1E4A, 0x00, kObdTypeUInt8, kObdAccConst, tObdUnsigned8, NumberOfEntries, 0x03)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1E4A, 0x01, kObdTypeBool, kObdAccSRW, tObdBoolean, Forwarding_BOOL, 0x00)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1E4A, 0x02, kObdTypeUInt16, kObdAccSRW, tObdUnsigned16, DefaultTTL_U16, 64)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1E4A, 0x03, kObdTypeUInt32, kObdAccR, tObdUnsigned32, ForwardDatagrams_U32, 0x00000000)
|
||||
OBD_END_INDEX(0x1E4A)
|
||||
#endif
|
||||
|
||||
#if NMT_MAX_NODE_ID > 0
|
||||
// Object 1F81h: NMT_NodeAssignment_AU32
|
||||
OBD_RAM_INDEX_RAM_ARRAY_ALT(0x1F81, NMT_MAX_NODE_ID, FALSE, kObdTypeUInt32, kObdAccSRW, tObdUnsigned32, NMT_NodeAssignment_AU32, 0)
|
||||
#endif
|
||||
|
||||
// Object 1F82h: NMT_FeatureFlags_U32
|
||||
OBD_BEGIN_INDEX_RAM(0x1F82, 0x01, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1F82, 0x00, kObdTypeUInt32, kObdAccR, tObdUnsigned32, NMT_FeatureFlags_U32, PLK_DEF_FEATURE_FLAGS)
|
||||
OBD_END_INDEX(0x1F82)
|
||||
|
||||
// Object 1F83h: NMT_EPLVersion_U8
|
||||
OBD_BEGIN_INDEX_RAM(0x1F83, 0x01, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1F83, 0x00, kObdTypeUInt8, kObdAccConst, tObdUnsigned8, NMT_EPLVersion_U8, 0x20)
|
||||
OBD_END_INDEX(0x1F83)
|
||||
|
||||
// Object 1F8Ch: NMT_CurrNMTState_U8
|
||||
OBD_BEGIN_INDEX_RAM(0x1F8C, 0x01, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1F8C, 0x00, kObdTypeUInt8, kObdAccR, tObdUnsigned8, NMT_CurrNMTState_U8, 0x1C)
|
||||
OBD_END_INDEX(0x1F8C)
|
||||
|
||||
#if NMT_MAX_NODE_ID > 0
|
||||
// Object 1F8Dh: NMT_PResPayloadLimitList_AU16
|
||||
OBD_RAM_INDEX_RAM_ARRAY_ALT(0x1F8D, NMT_MAX_NODE_ID, FALSE, kObdTypeUInt16, kObdAccSRW, tObdUnsigned16, NMT_PResPayloadLimitList_AU16, 36)
|
||||
#endif
|
||||
|
||||
// Object 1F93h: NMT_EPLNodeID_REC
|
||||
OBD_BEGIN_INDEX_RAM(0x1F93, 0x03, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1F93, 0x00, kObdTypeUInt8, kObdAccConst, tObdUnsigned8, NumberOfEntries, 0x02)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1F93, 0x01, kObdTypeUInt8, kObdAccR, tObdUnsigned8, NodeID_U8, 0)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1F93, 0x02, kObdTypeBool, kObdAccR, tObdBoolean, NodeIDByHW_BOOL, 0x00)
|
||||
OBD_END_INDEX(0x1F93)
|
||||
|
||||
// Object 1F98h: NMT_CycleTiming_REC
|
||||
#if !defined(CONFIG_DLL_PRES_CHAINING_CN)
|
||||
OBD_BEGIN_INDEX_RAM(0x1F98, 0x0A, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1F98, 0x00, kObdTypeUInt8, kObdAccConst, tObdUnsigned8, NumberOfEntries, 0x09)
|
||||
#else
|
||||
OBD_BEGIN_INDEX_RAM(0x1F98, 0x0F, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1F98, 0x00, kObdTypeUInt8, kObdAccConst, tObdUnsigned8, NumberOfEntries, 0x0E)
|
||||
#endif
|
||||
OBD_SUBINDEX_RAM_VAR(0x1F98, 0x01, kObdTypeUInt16, kObdAccR, tObdUnsigned16, IsochrTxMaxPayload_U16, 0)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1F98, 0x02, kObdTypeUInt16, kObdAccR, tObdUnsigned16, IsochrRxMaxPayload_U16, 0)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1F98, 0x03, kObdTypeUInt32, kObdAccR, tObdUnsigned32, PResMaxLatency_U32, 0) // in [ns]
|
||||
OBD_SUBINDEX_RAM_VAR_RG(0x1F98, 0x04, kObdTypeUInt16, kObdAccSGRW, tObdUnsigned16, PReqActPayloadLimit_U16, 36, 36, C_DLL_ISOCHR_MAX_PAYL)
|
||||
OBD_SUBINDEX_RAM_VAR_RG(0x1F98, 0x05, kObdTypeUInt16, kObdAccSGRW, tObdUnsigned16, PResActPayloadLimit_U16, 36, 36, C_DLL_ISOCHR_MAX_PAYL)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1F98, 0x06, kObdTypeUInt32, kObdAccR, tObdUnsigned32, ASndMaxLatency_U32, 0) // in [ns]
|
||||
OBD_SUBINDEX_RAM_VAR(0x1F98, 0x07, kObdTypeUInt8, kObdAccSRW, tObdUnsigned8, MultiplCycleCnt_U8, 0x00)
|
||||
OBD_SUBINDEX_RAM_VAR_RG(0x1F98, 0x08, kObdTypeUInt16, kObdAccSGRW, tObdUnsigned16, AsyncMTU_U16, C_DLL_MIN_ASYNC_MTU, C_DLL_MIN_ASYNC_MTU, C_DLL_MAX_ASYNC_MTU)
|
||||
OBD_SUBINDEX_RAM_VAR_RG(0x1F98, 0x09, kObdTypeUInt16, kObdAccSRW, tObdUnsigned16, Prescaler_U16, 2, 0, 1000)
|
||||
#if defined(CONFIG_DLL_PRES_CHAINING_CN)
|
||||
OBD_SUBINDEX_RAM_VAR_RG(0x1F98, 0x0A, kObdTypeUInt8, kObdAccGR, tObdUnsigned8, PResMode_U8, 0x00, 0x00, 0x01)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1F98, 0x0B, kObdTypeUInt32, kObdAccR, tObdUnsigned32, PResTimeFirst_U32, 0) // in [ns]
|
||||
OBD_SUBINDEX_RAM_VAR(0x1F98, 0x0C, kObdTypeUInt32, kObdAccR, tObdUnsigned32, PResTimeSecond_U32, 0) // in [ns]
|
||||
OBD_SUBINDEX_RAM_VAR(0x1F98, 0x0D, kObdTypeUInt32, kObdAccR, tObdUnsigned32, SyncMNDelayFirst_U32, 0) // in [ns]
|
||||
OBD_SUBINDEX_RAM_VAR(0x1F98, 0x0E, kObdTypeUInt32, kObdAccR, tObdUnsigned32, SyncMNDelaySecond_U32, 0) // in [ns]
|
||||
#endif
|
||||
OBD_END_INDEX(0x1F98)
|
||||
|
||||
// Object 1F99h: NMT_CNBasicEthernetTimeout_U32 in [us]
|
||||
OBD_BEGIN_INDEX_RAM(0x1F99, 0x01, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1F99, 0x00, kObdTypeUInt32, kObdAccSRW, tObdUnsigned32, NMT_CNBasicEthernetTimeout_U32, 5000000) // in [us]
|
||||
OBD_END_INDEX(0x1F99)
|
||||
|
||||
#if defined(CONFIG_INCLUDE_IP)
|
||||
// Object 1F9Ah: NMT_HostName_VSTR
|
||||
OBD_BEGIN_INDEX_RAM(0x1F9A, 0x01, FALSE)
|
||||
OBD_SUBINDEX_RAM_VSTRING(0x1F9A, 0x00, kObdAccSRW, NMT_HostName_VSTR, 34, "")
|
||||
OBD_END_INDEX(0x1F9A)
|
||||
#endif
|
||||
|
||||
#if NMT_MAX_NODE_ID > 0
|
||||
// Object 1F9Bh: NMT_MultiplCycleAssign_AU8
|
||||
OBD_RAM_INDEX_RAM_ARRAY_ALT(0x1F9B, NMT_MAX_NODE_ID, FALSE, kObdTypeUInt8, kObdAccSRW, tObdUnsigned8, NMT_MultiplCycleAssign_AU8, 0)
|
||||
#endif
|
||||
|
||||
// Object 1F9Eh: NMT_ResetCmd_U8
|
||||
OBD_BEGIN_INDEX_RAM(0x1F9E, 0x01, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x1F9E, 0x00, kObdTypeUInt8, kObdAccRW, tObdUnsigned8, NMT_ResetCmd_U8, 0xFF)
|
||||
OBD_END_INDEX(0x1F9E)
|
||||
|
||||
OBD_END_PART()
|
||||
|
||||
/*************************************************************************
|
||||
* Manufacturer Specific Profile Area (0x2000 - 0x5FFF)
|
||||
*************************************************************************/
|
||||
OBD_BEGIN_PART_MANUFACTURER()
|
||||
|
||||
OBD_END_PART()
|
||||
|
||||
/*************************************************************************
|
||||
* Standardised Device Profile Area (0x6000 - 0x9FFF)
|
||||
*************************************************************************/
|
||||
OBD_BEGIN_PART_DEVICE()
|
||||
|
||||
// DigitalInput_00h_AU8
|
||||
OBD_BEGIN_INDEX_RAM(0x6000, 0x05, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x6000, 0x00, kObdTypeUInt8, kObdAccConst, tObdUnsigned8, NumberOfEntries, 0x04)
|
||||
OBD_SUBINDEX_RAM_USERDEF(0x6000, 0x01, kObdTypeUInt8, kObdAccVPR, tObdUnsigned8, DigitalInput, 0x00)
|
||||
OBD_SUBINDEX_RAM_USERDEF(0x6000, 0x02, kObdTypeUInt8, kObdAccVPR, tObdUnsigned8, DigitalInput, 0x00)
|
||||
OBD_SUBINDEX_RAM_USERDEF(0x6000, 0x03, kObdTypeUInt8, kObdAccVPR, tObdUnsigned8, DigitalInput, 0x00)
|
||||
OBD_SUBINDEX_RAM_USERDEF(0x6000, 0x04, kObdTypeUInt8, kObdAccVPR, tObdUnsigned8, DigitalInput, 0x00)
|
||||
OBD_END_INDEX(0x6000)
|
||||
|
||||
// DigitalOutput_00h_AU8
|
||||
OBD_BEGIN_INDEX_RAM(0x6200, 0x05, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x6200, 0x00, kObdTypeUInt8, kObdAccConst, tObdUnsigned8, NumberOfEntries, 0x04)
|
||||
OBD_SUBINDEX_RAM_USERDEF(0x6200, 0x01, kObdTypeUInt8, kObdAccVPRW, tObdUnsigned8, DigitalOutput, 0x00)
|
||||
OBD_SUBINDEX_RAM_USERDEF(0x6200, 0x02, kObdTypeUInt8, kObdAccVPRW, tObdUnsigned8, DigitalOutput, 0x00)
|
||||
OBD_SUBINDEX_RAM_USERDEF(0x6200, 0x03, kObdTypeUInt8, kObdAccVPRW, tObdUnsigned8, DigitalOutput, 0x00)
|
||||
OBD_SUBINDEX_RAM_USERDEF(0x6200, 0x04, kObdTypeUInt8, kObdAccVPRW, tObdUnsigned8, DigitalOutput, 0x00)
|
||||
OBD_END_INDEX(0x6200)
|
||||
|
||||
// AnalogueInput_00h_AI8
|
||||
OBD_BEGIN_INDEX_RAM(0x6400, 0x05, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x6400, 0x00, kObdTypeUInt8, kObdAccConst, tObdUnsigned8, NumberOfEntries, 0x04)
|
||||
OBD_SUBINDEX_RAM_USERDEF(0x6400, 0x01, kObdTypeInt8, kObdAccVPR, tObdInteger8, AnalogueInput, 0x00)
|
||||
OBD_SUBINDEX_RAM_USERDEF(0x6400, 0x02, kObdTypeInt8, kObdAccVPR, tObdInteger8, AnalogueInput, 0x00)
|
||||
OBD_SUBINDEX_RAM_USERDEF(0x6400, 0x03, kObdTypeInt8, kObdAccVPR, tObdInteger8, AnalogueInput, 0x00)
|
||||
OBD_SUBINDEX_RAM_USERDEF(0x6400, 0x04, kObdTypeInt8, kObdAccVPR, tObdInteger8, AnalogueInput, 0x00)
|
||||
OBD_END_INDEX(0x6400)
|
||||
|
||||
// AnalogueInput_00h_AI16
|
||||
OBD_BEGIN_INDEX_RAM(0x6401, 0x03, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x6401, 0x00, kObdTypeUInt8, kObdAccConst, tObdUnsigned8, NumberOfEntries, 0x02)
|
||||
OBD_SUBINDEX_RAM_USERDEF(0x6401, 0x01, kObdTypeInt16, kObdAccVPR, tObdInteger16, AnalogueInput, 0x0000)
|
||||
OBD_SUBINDEX_RAM_USERDEF(0x6401, 0x02, kObdTypeInt16, kObdAccVPR, tObdInteger16, AnalogueInput, 0x0000)
|
||||
OBD_END_INDEX(0x6401)
|
||||
|
||||
// AnalogueInput_00h_AI32
|
||||
OBD_BEGIN_INDEX_RAM(0x6402, 0x02, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x6402, 0x00, kObdTypeUInt8, kObdAccConst, tObdUnsigned8, NumberOfEntries, 0x01)
|
||||
OBD_SUBINDEX_RAM_USERDEF(0x6402, 0x01, kObdTypeInt32, kObdAccVPR, tObdInteger32, AnalogueInput, 0x00000000)
|
||||
OBD_END_INDEX(0x6402)
|
||||
|
||||
// AnalogueOutput_00h_AI8
|
||||
OBD_BEGIN_INDEX_RAM(0x6410, 0x05, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x6410, 0x00, kObdTypeUInt8, kObdAccConst, tObdUnsigned8, NumberOfEntries, 0x04)
|
||||
OBD_SUBINDEX_RAM_USERDEF(0x6410, 0x01, kObdTypeInt8, kObdAccVPRW, tObdInteger8, AnalogueOutput, 0x00)
|
||||
OBD_SUBINDEX_RAM_USERDEF(0x6410, 0x02, kObdTypeInt8, kObdAccVPRW, tObdInteger8, AnalogueOutput, 0x00)
|
||||
OBD_SUBINDEX_RAM_USERDEF(0x6410, 0x03, kObdTypeInt8, kObdAccVPRW, tObdInteger8, AnalogueOutput, 0x00)
|
||||
OBD_SUBINDEX_RAM_USERDEF(0x6410, 0x04, kObdTypeInt8, kObdAccVPRW, tObdInteger8, AnalogueOutput, 0x00)
|
||||
OBD_END_INDEX(0x6410)
|
||||
|
||||
// AnalogueOutput_00h_AI16
|
||||
OBD_BEGIN_INDEX_RAM(0x6411, 0x03, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x6411, 0x00, kObdTypeUInt8, kObdAccConst, tObdUnsigned8, NumberOfEntries, 0x02)
|
||||
OBD_SUBINDEX_RAM_USERDEF(0x6411, 0x01, kObdTypeInt16, kObdAccVPRW, tObdInteger16, AnalogueOutput, 0x0000)
|
||||
OBD_SUBINDEX_RAM_USERDEF(0x6411, 0x02, kObdTypeInt16, kObdAccVPRW, tObdInteger16, AnalogueOutput, 0x0000)
|
||||
OBD_END_INDEX(0x6411)
|
||||
|
||||
// AnalogueOutput_00h_AI32
|
||||
OBD_BEGIN_INDEX_RAM(0x6412, 0x02, FALSE)
|
||||
OBD_SUBINDEX_RAM_VAR(0x6412, 0x00, kObdTypeUInt8, kObdAccConst, tObdUnsigned8, NumberOfEntries, 0x01)
|
||||
OBD_SUBINDEX_RAM_USERDEF(0x6412, 0x01, kObdTypeInt32, kObdAccVPRW, tObdInteger32, AnalogueOutput, 0x00000000)
|
||||
OBD_END_INDEX(0x6412)
|
||||
|
||||
OBD_END_PART()
|
||||
|
||||
OBD_END()
|
||||
|
||||
#define OBD_UNDEFINE_MACRO
|
||||
#include <obdcreate/obdmacro.h>
|
||||
#undef OBD_UNDEFINE_MACRO
|
|
@ -0,0 +1,47 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<openCONFIGURATORProject xmlns="http://sourceforge.net/projects/openconf/configuration" xmlns:ns2="http://ethernet-powerlink.org/POWERLINK" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://sourceforge.net/projects/openconf/configuration openCONFIGURATOR.xsd">
|
||||
<Generator vendor="Kalycito Infotech Private Limited & B&R Industrial Automation GmbH" toolName="Ethernet POWERLINK openCONFIGURATOR" toolVersion="2.2.1" createdBy="Priyadharshini" createdOn="2018-06-07T17:16:06.918+05:30" modifiedBy="Priyadharshini" modifiedOn="2018-06-11T16:04:52.706+05:30" />
|
||||
<ProjectConfiguration activeAutoGenerationSetting="custom" activePathSetting="default">
|
||||
<PathSettings id="default">
|
||||
<Path id="CONFIG_TEXT" path="output" />
|
||||
<Path id="CONFIG_BINARY" path="output" />
|
||||
<Path id="CONFIG_CHAR_ARRAY" path="output" />
|
||||
<Path id="XML_PROCESS_IMAGE" path="output" />
|
||||
<Path id="C_PROCESS_IMAGE" path="output" />
|
||||
<Path id="CSHARP_PROCESS_IMAGE" path="output" />
|
||||
</PathSettings>
|
||||
<AutoGenerationSettings id="all">
|
||||
<Setting name="GENERATE_MN_MAPPING_FOR_NODES" value="" enabled="true" />
|
||||
</AutoGenerationSettings>
|
||||
<AutoGenerationSettings id="none" />
|
||||
<AutoGenerationSettings id="custom">
|
||||
<Setting name="GENERATE_MN_MAPPING_FOR_NODES" value="1;32;110" enabled="true" />
|
||||
</AutoGenerationSettings>
|
||||
</ProjectConfiguration>
|
||||
<NetworkConfiguration lossOfSocTolerance="50000000">
|
||||
<NodeCollection>
|
||||
<MN name="openPOWERLINK_MN" nodeID="240" pathToXDC="deviceConfiguration/00000000_POWERLINK_CiA302-4_MN.xdc" isAsyncOnly="false" isType1Router="false" isType2Router="false" transmitsPRes="false" />
|
||||
<CN name="CN_1" nodeID="1" pathToXDC="deviceConfiguration/00000000_POWERLINK_CiA401_CN_1.xdc" isMultiplexed="false" isChained="false" isMandatory="false" autostartNode="true" resetInOperational="false" verifyAppSwVersion="false" autoAppSwUpdateAllowed="false" isAsyncOnly="false" isType1Router="false" isType2Router="false">
|
||||
<ForcedObjects>
|
||||
<Object index="1F8D" subindex="F0" />
|
||||
<Object index="1F98" subindex="05" />
|
||||
<Object index="1F98" subindex="04" />
|
||||
</ForcedObjects>
|
||||
</CN>
|
||||
<CN nodeID="32" name="CN_2" pathToXDC="deviceConfiguration/00000000_POWERLINK_CiA401_CN_32.xdc" forcedMultiplexedCycle="0" isMultiplexed="false" isChained="false" isAsyncOnly="false" isType1Router="false" isType2Router="false" isMandatory="false" autostartNode="true" resetInOperational="false" verifyAppSwVersion="false" autoAppSwUpdateAllowed="false" verifyDeviceType="true" verifyVendorId="false" verifyRevisionNumber="false" verifyProductCode="false" verifySerialNumber="false" enabled="true">
|
||||
<ForcedObjects>
|
||||
<Object index="1F8D" subindex="F0" />
|
||||
<Object index="1F98" subindex="05" />
|
||||
<Object index="1F98" subindex="04" />
|
||||
</ForcedObjects>
|
||||
</CN>
|
||||
<CN nodeID="110" name="CN_3" pathToXDC="deviceConfiguration/00000000_POWERLINK_CiA401_CN_110.xdc" forcedMultiplexedCycle="0" isMultiplexed="false" isChained="false" isAsyncOnly="false" isType1Router="false" isType2Router="false" isMandatory="false" autostartNode="true" resetInOperational="false" verifyAppSwVersion="false" autoAppSwUpdateAllowed="false" verifyDeviceType="true" verifyVendorId="false" verifyRevisionNumber="false" verifyProductCode="false" verifySerialNumber="false" enabled="true">
|
||||
<ForcedObjects>
|
||||
<Object index="1F8D" subindex="F0" />
|
||||
<Object index="1F98" subindex="05" />
|
||||
<Object index="1F98" subindex="04" />
|
||||
</ForcedObjects>
|
||||
</CN>
|
||||
</NodeCollection>
|
||||
</NetworkConfiguration>
|
||||
</openCONFIGURATORProject>
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,45 @@
|
|||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
/// <summary>
|
||||
/// This file was autogenerated by openCONFIGURATOR-2.2.1_release on 11-Jun-2018 16:04:51
|
||||
/// Project: Demo_3CN
|
||||
/// Application process for openPOWERLINK_MN(240)
|
||||
/// </summary>
|
||||
|
||||
namespace openPOWERLINK
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Struct : ProcessImage Out
|
||||
/// </summary>
|
||||
[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 4)]
|
||||
public struct AppProcessImageOut
|
||||
{
|
||||
[FieldOffset(0)]
|
||||
public byte CN1_DigitalInput_00h_AU8_DigitalInput;
|
||||
[FieldOffset(1)]
|
||||
public byte CN32_DigitalInput_00h_AU8_DigitalInput;
|
||||
[FieldOffset(2)]
|
||||
public byte CN110_DigitalInput_00h_AU8_DigitalInput;
|
||||
[FieldOffset(3)]
|
||||
public byte PADDING_VAR_1;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Struct : ProcessImage In
|
||||
/// </summary>
|
||||
[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 4)]
|
||||
public struct AppProcessImageIn
|
||||
{
|
||||
[FieldOffset(0)]
|
||||
public byte CN1_DigitalOutput_00h_AU8_DigitalOutput;
|
||||
[FieldOffset(1)]
|
||||
public byte CN32_DigitalOutput_00h_AU8_DigitalOutput;
|
||||
[FieldOffset(2)]
|
||||
public byte CN110_DigitalOutput_00h_AU8_DigitalOutput;
|
||||
[FieldOffset(3)]
|
||||
public byte PADDING_VAR_1;
|
||||
}
|
||||
|
||||
}
|
Binary file not shown.
|
@ -0,0 +1,114 @@
|
|||
////
|
||||
//// This file was autogenerated by openCONFIGURATOR-2.2.1_release on 11-Jun-2018 16:04:51
|
||||
//// Project: Demo_3CN
|
||||
//// NodeCount: 3
|
||||
////
|
||||
00000031
|
||||
//// NodeId Assignment
|
||||
1F81 01 00000004 00000007
|
||||
//// NodeId Assignment
|
||||
1F81 20 00000004 00000007
|
||||
//// NodeId Assignment
|
||||
1F81 6E 00000004 00000007
|
||||
|
||||
1600 00 00000001 00
|
||||
1601 00 00000001 00
|
||||
1602 00 00000001 00
|
||||
1A00 00 00000001 00
|
||||
1A01 00 00000001 00
|
||||
1A02 00 00000001 00
|
||||
1006 00 00000004 0000C350
|
||||
1C02 03 00000004 00000028
|
||||
1C09 01 00000004 00000028
|
||||
1C09 20 00000004 00000028
|
||||
1C09 6E 00000004 00000028
|
||||
1C14 00 00000004 02FAF080
|
||||
1F26 01 00000004 00003124
|
||||
1F26 20 00000004 00003124
|
||||
1F26 6E 00000004 00003124
|
||||
1F27 01 00000004 03735955
|
||||
1F27 20 00000004 03735955
|
||||
1F27 6E 00000004 03735955
|
||||
1F8A 02 00000004 0007A120
|
||||
1F92 01 00000004 00030D40
|
||||
1F92 20 00000004 00030D40
|
||||
1F92 6E 00000004 00030D40
|
||||
1400 01 00000001 01
|
||||
1401 01 00000001 20
|
||||
1402 01 00000001 6E
|
||||
1600 01 00000008 000800000001A4C0
|
||||
1601 01 00000008 000800000002A4C0
|
||||
1602 01 00000008 000800000003A4C0
|
||||
1800 01 00000001 01
|
||||
1801 01 00000001 20
|
||||
1802 01 00000001 6E
|
||||
1A00 01 00000008 000800000001A040
|
||||
1A01 01 00000008 000800000002A040
|
||||
1A02 01 00000008 000800000003A040
|
||||
1600 00 00000001 01
|
||||
1601 00 00000001 01
|
||||
1602 00 00000001 01
|
||||
1A00 00 00000001 01
|
||||
1A01 00 00000001 01
|
||||
1A02 00 00000001 01
|
||||
|
||||
////Configuration Data for CN: CN_1(1)
|
||||
1F22 01 00000096
|
||||
0000000E
|
||||
1600 00 00000001 00
|
||||
1A00 00 00000001 00
|
||||
1006 00 00000004 0000C350
|
||||
1020 01 00000004 00003124
|
||||
1020 02 00000004 03735955
|
||||
1C0B 03 00000004 00000050
|
||||
1C0D 03 00000004 00000050
|
||||
1C14 00 00000004 02FAF080
|
||||
1F98 04 00000002 0024
|
||||
1F98 05 00000002 0024
|
||||
1600 01 00000008 0008000000016200
|
||||
1A00 01 00000008 0008000000016000
|
||||
1600 00 00000001 01
|
||||
1A00 00 00000001 01
|
||||
|
||||
////Configuration Data for CN: CN_2(32)
|
||||
1F22 20 00000096
|
||||
0000000E
|
||||
1600 00 00000001 00
|
||||
1A00 00 00000001 00
|
||||
1006 00 00000004 0000C350
|
||||
1020 01 00000004 00003124
|
||||
1020 02 00000004 03735955
|
||||
1C0B 03 00000004 00000050
|
||||
1C0D 03 00000004 00000050
|
||||
1C14 00 00000004 02FAF080
|
||||
1F98 04 00000002 0024
|
||||
1F98 05 00000002 0024
|
||||
1600 01 00000008 0008000000016200
|
||||
1A00 01 00000008 0008000000016000
|
||||
1600 00 00000001 01
|
||||
1A00 00 00000001 01
|
||||
|
||||
////Configuration Data for CN: CN_3(110)
|
||||
1F22 6E 00000096
|
||||
0000000E
|
||||
1600 00 00000001 00
|
||||
1A00 00 00000001 00
|
||||
1006 00 00000004 0000C350
|
||||
1020 01 00000004 00003124
|
||||
1020 02 00000004 03735955
|
||||
1C0B 03 00000004 00000050
|
||||
1C0D 03 00000004 00000050
|
||||
1C14 00 00000004 02FAF080
|
||||
1F98 04 00000002 0024
|
||||
1F98 05 00000002 0024
|
||||
1600 01 00000008 0008000000016200
|
||||
1A00 01 00000008 0008000000016000
|
||||
1600 00 00000001 01
|
||||
1A00 00 00000001 01
|
||||
|
||||
//// NodeId Reassignment
|
||||
1F81 01 00000004 80000007
|
||||
//// NodeId Reassignment
|
||||
1F81 20 00000004 80000007
|
||||
//// NodeId Reassignment
|
||||
1F81 6E 00000004 80000007
|
|
@ -0,0 +1,60 @@
|
|||
0x31, 0x00, 0x00, 0x00, 0x81, 0x1F, 0x01, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x81,
|
||||
0x1F, 0x20, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x81, 0x1F, 0x6E, 0x04, 0x00, 0x00,
|
||||
0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x16, 0x00,
|
||||
0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x16, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00,
|
||||
0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1A, 0x00,
|
||||
0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x50, 0xC3, 0x00, 0x00,
|
||||
0x02, 0x1C, 0x03, 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x09, 0x1C, 0x01, 0x04, 0x00,
|
||||
0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x09, 0x1C, 0x20, 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00,
|
||||
0x00, 0x09, 0x1C, 0x6E, 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x14, 0x1C, 0x00, 0x04,
|
||||
0x00, 0x00, 0x00, 0x80, 0xF0, 0xFA, 0x02, 0x26, 0x1F, 0x01, 0x04, 0x00, 0x00, 0x00, 0x24, 0x31,
|
||||
0x00, 0x00, 0x26, 0x1F, 0x20, 0x04, 0x00, 0x00, 0x00, 0x24, 0x31, 0x00, 0x00, 0x26, 0x1F, 0x6E,
|
||||
0x04, 0x00, 0x00, 0x00, 0x24, 0x31, 0x00, 0x00, 0x27, 0x1F, 0x01, 0x04, 0x00, 0x00, 0x00, 0x55,
|
||||
0x59, 0x73, 0x03, 0x27, 0x1F, 0x20, 0x04, 0x00, 0x00, 0x00, 0x55, 0x59, 0x73, 0x03, 0x27, 0x1F,
|
||||
0x6E, 0x04, 0x00, 0x00, 0x00, 0x55, 0x59, 0x73, 0x03, 0x8A, 0x1F, 0x02, 0x04, 0x00, 0x00, 0x00,
|
||||
0x20, 0xA1, 0x07, 0x00, 0x92, 0x1F, 0x01, 0x04, 0x00, 0x00, 0x00, 0x40, 0x0D, 0x03, 0x00, 0x92,
|
||||
0x1F, 0x20, 0x04, 0x00, 0x00, 0x00, 0x40, 0x0D, 0x03, 0x00, 0x92, 0x1F, 0x6E, 0x04, 0x00, 0x00,
|
||||
0x00, 0x40, 0x0D, 0x03, 0x00, 0x00, 0x14, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x14, 0x01,
|
||||
0x01, 0x00, 0x00, 0x00, 0x20, 0x02, 0x14, 0x01, 0x01, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x16, 0x01,
|
||||
0x08, 0x00, 0x00, 0x00, 0xC0, 0xA4, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x16, 0x01, 0x08,
|
||||
0x00, 0x00, 0x00, 0xC0, 0xA4, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x16, 0x01, 0x08, 0x00,
|
||||
0x00, 0x00, 0xC0, 0xA4, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x01, 0x01, 0x00, 0x00,
|
||||
0x00, 0x01, 0x01, 0x18, 0x01, 0x01, 0x00, 0x00, 0x00, 0x20, 0x02, 0x18, 0x01, 0x01, 0x00, 0x00,
|
||||
0x00, 0x6E, 0x00, 0x1A, 0x01, 0x08, 0x00, 0x00, 0x00, 0x40, 0xA0, 0x01, 0x00, 0x00, 0x00, 0x08,
|
||||
0x00, 0x01, 0x1A, 0x01, 0x08, 0x00, 0x00, 0x00, 0x40, 0xA0, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00,
|
||||
0x02, 0x1A, 0x01, 0x08, 0x00, 0x00, 0x00, 0x40, 0xA0, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
|
||||
0x16, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x16, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02,
|
||||
0x16, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01,
|
||||
0x1A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x1A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x22,
|
||||
0x1F, 0x01, 0x96, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x1A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x10, 0x00, 0x04, 0x00, 0x00,
|
||||
0x00, 0x50, 0xC3, 0x00, 0x00, 0x20, 0x10, 0x01, 0x04, 0x00, 0x00, 0x00, 0x24, 0x31, 0x00, 0x00,
|
||||
0x20, 0x10, 0x02, 0x04, 0x00, 0x00, 0x00, 0x55, 0x59, 0x73, 0x03, 0x0B, 0x1C, 0x03, 0x04, 0x00,
|
||||
0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x0D, 0x1C, 0x03, 0x04, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00,
|
||||
0x00, 0x14, 0x1C, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0xF0, 0xFA, 0x02, 0x98, 0x1F, 0x04, 0x02,
|
||||
0x00, 0x00, 0x00, 0x24, 0x00, 0x98, 0x1F, 0x05, 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x16,
|
||||
0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x62, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1A, 0x01,
|
||||
0x08, 0x00, 0x00, 0x00, 0x00, 0x60, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x16, 0x00, 0x01,
|
||||
0x00, 0x00, 0x00, 0x01, 0x00, 0x1A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x22, 0x1F, 0x20, 0x96,
|
||||
0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x1A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x50, 0xC3,
|
||||
0x00, 0x00, 0x20, 0x10, 0x01, 0x04, 0x00, 0x00, 0x00, 0x24, 0x31, 0x00, 0x00, 0x20, 0x10, 0x02,
|
||||
0x04, 0x00, 0x00, 0x00, 0x55, 0x59, 0x73, 0x03, 0x0B, 0x1C, 0x03, 0x04, 0x00, 0x00, 0x00, 0x50,
|
||||
0x00, 0x00, 0x00, 0x0D, 0x1C, 0x03, 0x04, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x14, 0x1C,
|
||||
0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0xF0, 0xFA, 0x02, 0x98, 0x1F, 0x04, 0x02, 0x00, 0x00, 0x00,
|
||||
0x24, 0x00, 0x98, 0x1F, 0x05, 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x16, 0x01, 0x08, 0x00,
|
||||
0x00, 0x00, 0x00, 0x62, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1A, 0x01, 0x08, 0x00, 0x00,
|
||||
0x00, 0x00, 0x60, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x16, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||
0x01, 0x00, 0x1A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x22, 0x1F, 0x6E, 0x96, 0x00, 0x00, 0x00,
|
||||
0x0E, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x01,
|
||||
0x00, 0x00, 0x00, 0x00, 0x06, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x50, 0xC3, 0x00, 0x00, 0x20,
|
||||
0x10, 0x01, 0x04, 0x00, 0x00, 0x00, 0x24, 0x31, 0x00, 0x00, 0x20, 0x10, 0x02, 0x04, 0x00, 0x00,
|
||||
0x00, 0x55, 0x59, 0x73, 0x03, 0x0B, 0x1C, 0x03, 0x04, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00,
|
||||
0x0D, 0x1C, 0x03, 0x04, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x14, 0x1C, 0x00, 0x04, 0x00,
|
||||
0x00, 0x00, 0x80, 0xF0, 0xFA, 0x02, 0x98, 0x1F, 0x04, 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x98,
|
||||
0x1F, 0x05, 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x16, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00,
|
||||
0x62, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1A, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x60,
|
||||
0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x16, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1A,
|
||||
0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x81, 0x1F, 0x01, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
|
||||
0x80, 0x81, 0x1F, 0x20, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x80, 0x81, 0x1F, 0x6E, 0x04,
|
||||
0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x80
|
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
* This file was autogenerated by openCONFIGURATOR-2.2.1_release on 11-Jun-2018 16:04:51
|
||||
* Project: Demo_3CN
|
||||
* Application process for openPOWERLINK_MN(240)
|
||||
*/
|
||||
#ifndef XAP_h
|
||||
#define XAP_h
|
||||
|
||||
#define COMPUTED_PI_OUT_SIZE 4
|
||||
typedef struct
|
||||
{
|
||||
unsigned CN1_DigitalInput_00h_AU8_DigitalInput:8;
|
||||
unsigned CN32_DigitalInput_00h_AU8_DigitalInput:8;
|
||||
unsigned CN110_DigitalInput_00h_AU8_DigitalInput:8;
|
||||
unsigned PADDING_VAR_1:8;
|
||||
} PI_OUT;
|
||||
|
||||
#define COMPUTED_PI_IN_SIZE 4
|
||||
typedef struct
|
||||
{
|
||||
unsigned CN1_DigitalOutput_00h_AU8_DigitalOutput:8;
|
||||
unsigned CN32_DigitalOutput_00h_AU8_DigitalOutput:8;
|
||||
unsigned CN110_DigitalOutput_00h_AU8_DigitalOutput:8;
|
||||
unsigned PADDING_VAR_1:8;
|
||||
} PI_IN;
|
||||
|
||||
#endif
|
|
@ -0,0 +1,16 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- This file was autogenerated by openCONFIGURATOR-2.2.1_release on 11-Jun-2018 16:04:51 -->
|
||||
<!-- Project: Demo_3CN -->
|
||||
<!-- Application process for openPOWERLINK_MN(240) -->
|
||||
<ApplicationProcess xmlns="http://ethernet-powerlink.org/POWERLINK/PI">
|
||||
<ProcessImage type="output" size="3">
|
||||
<Channel Name="CN1.DigitalInput.00h.AU8.DigitalInput" dataType="Unsigned8" dataSize="8" PIOffset="0x0000"/>
|
||||
<Channel Name="CN32.DigitalInput.00h.AU8.DigitalInput" dataType="Unsigned8" dataSize="8" PIOffset="0x0001"/>
|
||||
<Channel Name="CN110.DigitalInput.00h.AU8.DigitalInput" dataType="Unsigned8" dataSize="8" PIOffset="0x0002"/>
|
||||
</ProcessImage>
|
||||
<ProcessImage type="input" size="3">
|
||||
<Channel Name="CN1.DigitalOutput.00h.AU8.DigitalOutput" dataType="Unsigned8" dataSize="8" PIOffset="0x0000"/>
|
||||
<Channel Name="CN32.DigitalOutput.00h.AU8.DigitalOutput" dataType="Unsigned8" dataSize="8" PIOffset="0x0001"/>
|
||||
<Channel Name="CN110.DigitalOutput.00h.AU8.DigitalOutput" dataType="Unsigned8" dataSize="8" PIOffset="0x0002"/>
|
||||
</ProcessImage>
|
||||
</ApplicationProcess>
|
|
@ -0,0 +1,45 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<openCONFIGURATORProject xmlns="http://sourceforge.net/projects/openconf/configuration" xmlns:ns2="http://ethernet-powerlink.org/POWERLINK" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://sourceforge.net/projects/openconf/configuration openCONFIGURATOR.xsd">
|
||||
<Generator vendor="Kalycito Infotech Private Limited & B&R Industrial Automation GmbH" toolName="Ethernet POWERLINK openCONFIGURATOR" toolVersion="2.2.1" createdBy="Priyadharshini" createdOn="2018-06-08T18:29:49.694+05:30" modifiedBy="Priyadharshini" modifiedOn="2018-09-06T14:40:34.446+05:30" />
|
||||
<ProjectConfiguration activeAutoGenerationSetting="all" activePathSetting="default">
|
||||
<PathSettings id="default">
|
||||
<Path id="CONFIG_TEXT" path="output" />
|
||||
<Path id="CONFIG_BINARY" path="output" />
|
||||
<Path id="CONFIG_CHAR_ARRAY" path="output" />
|
||||
<Path id="XML_PROCESS_IMAGE" path="output" />
|
||||
<Path id="C_PROCESS_IMAGE" path="output" />
|
||||
<Path id="CSHARP_PROCESS_IMAGE" path="output" />
|
||||
</PathSettings>
|
||||
<AutoGenerationSettings id="all">
|
||||
<Setting name="GENERATE_MN_MAPPING_FOR_NODES" value="" enabled="true" />
|
||||
</AutoGenerationSettings>
|
||||
<AutoGenerationSettings id="none" />
|
||||
<AutoGenerationSettings id="custom" />
|
||||
</ProjectConfiguration>
|
||||
<NetworkConfiguration lossOfSocTolerance="50000000">
|
||||
<NodeCollection>
|
||||
<MN name="openPOWERLINK_MN" nodeID="240" pathToXDC="deviceConfiguration/00000000_POWERLINK_CiA302-4_MN.xdc" isAsyncOnly="false" isType1Router="false" isType2Router="false" transmitsPRes="false" />
|
||||
<RMN nodeID="243" name="RMN 3" pathToXDC="deviceConfiguration/00000000_POWERLINK_CiA302-4_MN_243.xdc" isAsyncOnly="false" isType1Router="false" isType2Router="false" />
|
||||
<RMN nodeID="242" name="RMN 2" pathToXDC="deviceConfiguration/00000000_POWERLINK_CiA302-4_MN_242.xdc" isAsyncOnly="false" isType1Router="false" isType2Router="false" />
|
||||
<RMN nodeID="241" name="RMN 1" pathToXDC="deviceConfiguration/00000000_POWERLINK_CiA302-4_MN_241.xdc" isAsyncOnly="false" isType1Router="false" isType2Router="false" />
|
||||
<CN nodeID="1" name="CN_1" pathToXDC="deviceConfiguration/00000000_POWERLINK_CiA401_CN_1.xdc" forcedMultiplexedCycle="0" isMultiplexed="false" isChained="false" isAsyncOnly="false" isType1Router="false" isType2Router="false" isMandatory="false" autostartNode="true" resetInOperational="false" verifyAppSwVersion="false" autoAppSwUpdateAllowed="false" verifyDeviceType="true" verifyVendorId="false" verifyRevisionNumber="false" verifyProductCode="false" verifySerialNumber="false" enabled="true">
|
||||
<ForcedObjects>
|
||||
<Object index="1F98" subindex="05" />
|
||||
<Object index="1F98" subindex="04" />
|
||||
</ForcedObjects>
|
||||
</CN>
|
||||
<CN nodeID="32" name="CN_2" pathToXDC="deviceConfiguration/00000000_POWERLINK_CiA401_CN_32.xdc" forcedMultiplexedCycle="0" isMultiplexed="false" isChained="false" isAsyncOnly="false" isType1Router="false" isType2Router="false" isMandatory="false" autostartNode="true" resetInOperational="false" verifyAppSwVersion="false" autoAppSwUpdateAllowed="false" verifyDeviceType="true" verifyVendorId="false" verifyRevisionNumber="false" verifyProductCode="false" verifySerialNumber="false" enabled="true">
|
||||
<ForcedObjects>
|
||||
<Object index="1F98" subindex="05" />
|
||||
<Object index="1F98" subindex="04" />
|
||||
</ForcedObjects>
|
||||
</CN>
|
||||
<CN nodeID="110" name="CN_3" pathToXDC="deviceConfiguration/00000000_POWERLINK_CiA401_CN_110.xdc" forcedMultiplexedCycle="0" isMultiplexed="false" isChained="false" isAsyncOnly="false" isType1Router="false" isType2Router="false" isMandatory="false" autostartNode="true" resetInOperational="false" verifyAppSwVersion="false" autoAppSwUpdateAllowed="false" verifyDeviceType="true" verifyVendorId="false" verifyRevisionNumber="false" verifyProductCode="false" verifySerialNumber="false" enabled="true">
|
||||
<ForcedObjects>
|
||||
<Object index="1F98" subindex="05" />
|
||||
<Object index="1F98" subindex="04" />
|
||||
</ForcedObjects>
|
||||
</CN>
|
||||
</NodeCollection>
|
||||
</NetworkConfiguration>
|
||||
</openCONFIGURATORProject>
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,45 @@
|
|||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
/// <summary>
|
||||
/// This file was autogenerated by openCONFIGURATOR-2.2.1_release on 06-Sep-2018 14:40:27
|
||||
/// Project: Demo_RMN_3CN
|
||||
/// Application process for openPOWERLINK_MN(240)
|
||||
/// </summary>
|
||||
|
||||
namespace openPOWERLINK
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Struct : ProcessImage Out
|
||||
/// </summary>
|
||||
[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 4)]
|
||||
public struct AppProcessImageOut
|
||||
{
|
||||
[FieldOffset(0)]
|
||||
public byte CN1_DigitalInput_00h_AU8_DigitalInput;
|
||||
[FieldOffset(1)]
|
||||
public byte CN32_DigitalInput_00h_AU8_DigitalInput;
|
||||
[FieldOffset(2)]
|
||||
public byte CN110_DigitalInput_00h_AU8_DigitalInput;
|
||||
[FieldOffset(3)]
|
||||
public byte PADDING_VAR_1;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Struct : ProcessImage In
|
||||
/// </summary>
|
||||
[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 4)]
|
||||
public struct AppProcessImageIn
|
||||
{
|
||||
[FieldOffset(0)]
|
||||
public byte CN1_DigitalOutput_00h_AU8_DigitalOutput;
|
||||
[FieldOffset(1)]
|
||||
public byte CN32_DigitalOutput_00h_AU8_DigitalOutput;
|
||||
[FieldOffset(2)]
|
||||
public byte CN110_DigitalOutput_00h_AU8_DigitalOutput;
|
||||
[FieldOffset(3)]
|
||||
public byte PADDING_VAR_1;
|
||||
}
|
||||
|
||||
}
|
Binary file not shown.
|
@ -0,0 +1,331 @@
|
|||
////
|
||||
//// This file was autogenerated by openCONFIGURATOR-2.2.1_release on 06-Sep-2018 14:40:27
|
||||
//// Project: Demo_RMN_3CN
|
||||
//// NodeCount: 6
|
||||
////
|
||||
00000041
|
||||
//// NodeId Assignment
|
||||
1F81 01 00000004 00000007
|
||||
//// NodeId Assignment
|
||||
1F81 20 00000004 00000007
|
||||
//// NodeId Assignment
|
||||
1F81 6E 00000004 00000007
|
||||
//// NodeId Assignment
|
||||
1F81 F1 00000004 00000003
|
||||
//// NodeId Assignment
|
||||
1F81 F2 00000004 00000003
|
||||
//// NodeId Assignment
|
||||
1F81 F3 00000004 00000003
|
||||
|
||||
1600 00 00000001 00
|
||||
1601 00 00000001 00
|
||||
1602 00 00000001 00
|
||||
1A00 00 00000001 00
|
||||
1A01 00 00000001 00
|
||||
1A02 00 00000001 00
|
||||
1006 00 00000004 0000C350
|
||||
1C02 01 00000004 00000028
|
||||
1C02 03 00000004 00000028
|
||||
1C09 01 00000004 00000028
|
||||
1C09 20 00000004 00000028
|
||||
1C09 6E 00000004 00000028
|
||||
1C14 00 00000004 02FAF080
|
||||
1F26 01 00000004 0000317B
|
||||
1F26 20 00000004 0000317B
|
||||
1F26 6E 00000004 0000317B
|
||||
1F26 F1 00000004 0000317B
|
||||
1F26 F2 00000004 0000317B
|
||||
1F26 F3 00000004 0000317B
|
||||
1F27 01 00000004 03261416
|
||||
1F27 20 00000004 03261416
|
||||
1F27 6E 00000004 03261416
|
||||
1F27 F1 00000004 03261416
|
||||
1F27 F2 00000004 03261416
|
||||
1F27 F3 00000004 03261416
|
||||
1F80 00 00000004 00004800
|
||||
1F92 01 00000004 00030D40
|
||||
1F92 20 00000004 00030D40
|
||||
1F92 6E 00000004 00030D40
|
||||
1F92 F1 00000004 00006978
|
||||
1F92 F2 00000004 00006978
|
||||
1F92 F3 00000004 00006978
|
||||
1400 01 00000001 01
|
||||
1401 01 00000001 20
|
||||
1402 01 00000001 6E
|
||||
1600 01 00000008 000800000001A4C0
|
||||
1601 01 00000008 000800000002A4C0
|
||||
1602 01 00000008 000800000003A4C0
|
||||
1800 01 00000001 01
|
||||
1801 01 00000001 20
|
||||
1802 01 00000001 6E
|
||||
1A00 01 00000008 000800000001A040
|
||||
1A01 01 00000008 000800000002A040
|
||||
1A02 01 00000008 000800000003A040
|
||||
1600 00 00000001 01
|
||||
1601 00 00000001 01
|
||||
1602 00 00000001 01
|
||||
1A00 00 00000001 01
|
||||
1A01 00 00000001 01
|
||||
1A02 00 00000001 01
|
||||
|
||||
////Configuration Data for CN: CN_1(1)
|
||||
1F22 01 00000096
|
||||
0000000E
|
||||
1600 00 00000001 00
|
||||
1A00 00 00000001 00
|
||||
1006 00 00000004 0000C350
|
||||
1020 01 00000004 0000317B
|
||||
1020 02 00000004 03261416
|
||||
1C0B 03 00000004 00000050
|
||||
1C0D 03 00000004 00000050
|
||||
1C14 00 00000004 02FAF080
|
||||
1F98 04 00000002 0024
|
||||
1F98 05 00000002 0024
|
||||
1600 01 00000008 0008000000016200
|
||||
1A00 01 00000008 0008000000016000
|
||||
1600 00 00000001 01
|
||||
1A00 00 00000001 01
|
||||
|
||||
////Configuration Data for CN: CN_2(32)
|
||||
1F22 20 00000096
|
||||
0000000E
|
||||
1600 00 00000001 00
|
||||
1A00 00 00000001 00
|
||||
1006 00 00000004 0000C350
|
||||
1020 01 00000004 0000317B
|
||||
1020 02 00000004 03261416
|
||||
1C0B 03 00000004 00000050
|
||||
1C0D 03 00000004 00000050
|
||||
1C14 00 00000004 02FAF080
|
||||
1F98 04 00000002 0024
|
||||
1F98 05 00000002 0024
|
||||
1600 01 00000008 0008000000016200
|
||||
1A00 01 00000008 0008000000016000
|
||||
1600 00 00000001 01
|
||||
1A00 00 00000001 01
|
||||
|
||||
////Configuration Data for CN: CN_3(110)
|
||||
1F22 6E 00000096
|
||||
0000000E
|
||||
1600 00 00000001 00
|
||||
1A00 00 00000001 00
|
||||
1006 00 00000004 0000C350
|
||||
1020 01 00000004 0000317B
|
||||
1020 02 00000004 03261416
|
||||
1C0B 03 00000004 00000050
|
||||
1C0D 03 00000004 00000050
|
||||
1C14 00 00000004 02FAF080
|
||||
1F98 04 00000002 0024
|
||||
1F98 05 00000002 0024
|
||||
1600 01 00000008 0008000000016200
|
||||
1A00 01 00000008 0008000000016000
|
||||
1600 00 00000001 01
|
||||
1A00 00 00000001 01
|
||||
|
||||
////Configuration Data for RMN: RMN 1(241)
|
||||
1F22 F1 0000029B
|
||||
0000003F
|
||||
1F81 01 00000004 00000007
|
||||
1F81 20 00000004 00000007
|
||||
1F81 6E 00000004 00000007
|
||||
1F81 F1 00000004 00000003
|
||||
1F81 F2 00000004 00000003
|
||||
1F81 F3 00000004 00000003
|
||||
1600 00 00000001 00
|
||||
1601 00 00000001 00
|
||||
1602 00 00000001 00
|
||||
1A00 00 00000001 00
|
||||
1A01 00 00000001 00
|
||||
1A02 00 00000001 00
|
||||
1006 00 00000004 0000C350
|
||||
1020 01 00000004 0000317B
|
||||
1020 02 00000004 03261416
|
||||
1C02 01 00000004 00000028
|
||||
1C02 03 00000004 00000028
|
||||
1C09 01 00000004 00000028
|
||||
1C09 20 00000004 00000028
|
||||
1C09 6E 00000004 00000028
|
||||
1C0B 03 00000004 00000050
|
||||
1C0D 03 00000004 00000050
|
||||
1C14 00 00000004 02FAF080
|
||||
1F26 01 00000004 0000317B
|
||||
1F26 20 00000004 0000317B
|
||||
1F26 6E 00000004 0000317B
|
||||
1F26 F1 00000004 0000317B
|
||||
1F26 F2 00000004 0000317B
|
||||
1F26 F3 00000004 0000317B
|
||||
1F27 01 00000004 03261416
|
||||
1F27 20 00000004 03261416
|
||||
1F27 6E 00000004 03261416
|
||||
1F27 F1 00000004 03261416
|
||||
1F27 F2 00000004 03261416
|
||||
1F27 F3 00000004 03261416
|
||||
1F80 00 00000004 00004800
|
||||
1F92 01 00000004 00030D40
|
||||
1F92 20 00000004 00030D40
|
||||
1F92 6E 00000004 00030D40
|
||||
1F92 F1 00000004 00006978
|
||||
1F92 F2 00000004 00006978
|
||||
1F92 F3 00000004 00006978
|
||||
1400 01 00000001 01
|
||||
1401 01 00000001 20
|
||||
1402 01 00000001 6E
|
||||
1600 01 00000008 000800000001A4C0
|
||||
1601 01 00000008 000800000002A4C0
|
||||
1602 01 00000008 000800000003A4C0
|
||||
1800 01 00000001 01
|
||||
1801 01 00000001 20
|
||||
1802 01 00000001 6E
|
||||
1A00 01 00000008 000800000001A040
|
||||
1A01 01 00000008 000800000002A040
|
||||
1A02 01 00000008 000800000003A040
|
||||
1600 00 00000001 01
|
||||
1601 00 00000001 01
|
||||
1602 00 00000001 01
|
||||
1A00 00 00000001 01
|
||||
1A01 00 00000001 01
|
||||
1A02 00 00000001 01
|
||||
1F81 01 00000004 80000007
|
||||
1F81 20 00000004 80000007
|
||||
1F81 6E 00000004 80000007
|
||||
|
||||
////Configuration Data for RMN: RMN 2(242)
|
||||
1F22 F2 0000029B
|
||||
0000003F
|
||||
1F81 01 00000004 00000007
|
||||
1F81 20 00000004 00000007
|
||||
1F81 6E 00000004 00000007
|
||||
1F81 F1 00000004 00000003
|
||||
1F81 F2 00000004 00000003
|
||||
1F81 F3 00000004 00000003
|
||||
1600 00 00000001 00
|
||||
1601 00 00000001 00
|
||||
1602 00 00000001 00
|
||||
1A00 00 00000001 00
|
||||
1A01 00 00000001 00
|
||||
1A02 00 00000001 00
|
||||
1006 00 00000004 0000C350
|
||||
1020 01 00000004 0000317B
|
||||
1020 02 00000004 03261416
|
||||
1C02 01 00000004 00000028
|
||||
1C02 03 00000004 00000028
|
||||
1C09 01 00000004 00000028
|
||||
1C09 20 00000004 00000028
|
||||
1C09 6E 00000004 00000028
|
||||
1C0B 03 00000004 00000050
|
||||
1C0D 03 00000004 00000050
|
||||
1C14 00 00000004 02FAF080
|
||||
1F26 01 00000004 0000317B
|
||||
1F26 20 00000004 0000317B
|
||||
1F26 6E 00000004 0000317B
|
||||
1F26 F1 00000004 0000317B
|
||||
1F26 F2 00000004 0000317B
|
||||
1F26 F3 00000004 0000317B
|
||||
1F27 01 00000004 03261416
|
||||
1F27 20 00000004 03261416
|
||||
1F27 6E 00000004 03261416
|
||||
1F27 F1 00000004 03261416
|
||||
1F27 F2 00000004 03261416
|
||||
1F27 F3 00000004 03261416
|
||||
1F80 00 00000004 00004800
|
||||
1F92 01 00000004 00030D40
|
||||
1F92 20 00000004 00030D40
|
||||
1F92 6E 00000004 00030D40
|
||||
1F92 F1 00000004 00006978
|
||||
1F92 F2 00000004 00006978
|
||||
1F92 F3 00000004 00006978
|
||||
1400 01 00000001 01
|
||||
1401 01 00000001 20
|
||||
1402 01 00000001 6E
|
||||
1600 01 00000008 000800000001A4C0
|
||||
1601 01 00000008 000800000002A4C0
|
||||
1602 01 00000008 000800000003A4C0
|
||||
1800 01 00000001 01
|
||||
1801 01 00000001 20
|
||||
1802 01 00000001 6E
|
||||
1A00 01 00000008 000800000001A040
|
||||
1A01 01 00000008 000800000002A040
|
||||
1A02 01 00000008 000800000003A040
|
||||
1600 00 00000001 01
|
||||
1601 00 00000001 01
|
||||
1602 00 00000001 01
|
||||
1A00 00 00000001 01
|
||||
1A01 00 00000001 01
|
||||
1A02 00 00000001 01
|
||||
1F81 01 00000004 80000007
|
||||
1F81 20 00000004 80000007
|
||||
1F81 6E 00000004 80000007
|
||||
|
||||
////Configuration Data for RMN: RMN 3(243)
|
||||
1F22 F3 0000029B
|
||||
0000003F
|
||||
1F81 01 00000004 00000007
|
||||
1F81 20 00000004 00000007
|
||||
1F81 6E 00000004 00000007
|
||||
1F81 F1 00000004 00000003
|
||||
1F81 F2 00000004 00000003
|
||||
1F81 F3 00000004 00000003
|
||||
1600 00 00000001 00
|
||||
1601 00 00000001 00
|
||||
1602 00 00000001 00
|
||||
1A00 00 00000001 00
|
||||
1A01 00 00000001 00
|
||||
1A02 00 00000001 00
|
||||
1006 00 00000004 0000C350
|
||||
1020 01 00000004 0000317B
|
||||
1020 02 00000004 03261416
|
||||
1C02 01 00000004 00000028
|
||||
1C02 03 00000004 00000028
|
||||
1C09 01 00000004 00000028
|
||||
1C09 20 00000004 00000028
|
||||
1C09 6E 00000004 00000028
|
||||
1C0B 03 00000004 00000050
|
||||
1C0D 03 00000004 00000050
|
||||
1C14 00 00000004 02FAF080
|
||||
1F26 01 00000004 0000317B
|
||||
1F26 20 00000004 0000317B
|
||||
1F26 6E 00000004 0000317B
|
||||
1F26 F1 00000004 0000317B
|
||||
1F26 F2 00000004 0000317B
|
||||
1F26 F3 00000004 0000317B
|
||||
1F27 01 00000004 03261416
|
||||
1F27 20 00000004 03261416
|
||||
1F27 6E 00000004 03261416
|
||||
1F27 F1 00000004 03261416
|
||||
1F27 F2 00000004 03261416
|
||||
1F27 F3 00000004 03261416
|
||||
1F80 00 00000004 00004800
|
||||
1F92 01 00000004 00030D40
|
||||
1F92 20 00000004 00030D40
|
||||
1F92 6E 00000004 00030D40
|
||||
1F92 F1 00000004 00006978
|
||||
1F92 F2 00000004 00006978
|
||||
1F92 F3 00000004 00006978
|
||||
1400 01 00000001 01
|
||||
1401 01 00000001 20
|
||||
1402 01 00000001 6E
|
||||
1600 01 00000008 000800000001A4C0
|
||||
1601 01 00000008 000800000002A4C0
|
||||
1602 01 00000008 000800000003A4C0
|
||||
1800 01 00000001 01
|
||||
1801 01 00000001 20
|
||||
1802 01 00000001 6E
|
||||
1A00 01 00000008 000800000001A040
|
||||
1A01 01 00000008 000800000002A040
|
||||
1A02 01 00000008 000800000003A040
|
||||
1600 00 00000001 01
|
||||
1601 00 00000001 01
|
||||
1602 00 00000001 01
|
||||
1A00 00 00000001 01
|
||||
1A01 00 00000001 01
|
||||
1A02 00 00000001 01
|
||||
1F81 01 00000004 80000007
|
||||
1F81 20 00000004 80000007
|
||||
1F81 6E 00000004 80000007
|
||||
|
||||
//// NodeId Reassignment
|
||||
1F81 01 00000004 80000007
|
||||
//// NodeId Reassignment
|
||||
1F81 20 00000004 80000007
|
||||
//// NodeId Reassignment
|
||||
1F81 6E 00000004 80000007
|
|
@ -0,0 +1,195 @@
|
|||
0x41, 0x00, 0x00, 0x00, 0x81, 0x1F, 0x01, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x81,
|
||||
0x1F, 0x20, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x81, 0x1F, 0x6E, 0x04, 0x00, 0x00,
|
||||
0x00, 0x07, 0x00, 0x00, 0x00, 0x81, 0x1F, 0xF1, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
|
||||
0x81, 0x1F, 0xF2, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x81, 0x1F, 0xF3, 0x04, 0x00,
|
||||
0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x16,
|
||||
0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x16, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A,
|
||||
0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1A,
|
||||
0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x50, 0xC3, 0x00,
|
||||
0x00, 0x02, 0x1C, 0x01, 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x02, 0x1C, 0x03, 0x04,
|
||||
0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x09, 0x1C, 0x01, 0x04, 0x00, 0x00, 0x00, 0x28, 0x00,
|
||||
0x00, 0x00, 0x09, 0x1C, 0x20, 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x09, 0x1C, 0x6E,
|
||||
0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x14, 0x1C, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80,
|
||||
0xF0, 0xFA, 0x02, 0x26, 0x1F, 0x01, 0x04, 0x00, 0x00, 0x00, 0x7B, 0x31, 0x00, 0x00, 0x26, 0x1F,
|
||||
0x20, 0x04, 0x00, 0x00, 0x00, 0x7B, 0x31, 0x00, 0x00, 0x26, 0x1F, 0x6E, 0x04, 0x00, 0x00, 0x00,
|
||||
0x7B, 0x31, 0x00, 0x00, 0x26, 0x1F, 0xF1, 0x04, 0x00, 0x00, 0x00, 0x7B, 0x31, 0x00, 0x00, 0x26,
|
||||
0x1F, 0xF2, 0x04, 0x00, 0x00, 0x00, 0x7B, 0x31, 0x00, 0x00, 0x26, 0x1F, 0xF3, 0x04, 0x00, 0x00,
|
||||
0x00, 0x7B, 0x31, 0x00, 0x00, 0x27, 0x1F, 0x01, 0x04, 0x00, 0x00, 0x00, 0x16, 0x14, 0x26, 0x03,
|
||||
0x27, 0x1F, 0x20, 0x04, 0x00, 0x00, 0x00, 0x16, 0x14, 0x26, 0x03, 0x27, 0x1F, 0x6E, 0x04, 0x00,
|
||||
0x00, 0x00, 0x16, 0x14, 0x26, 0x03, 0x27, 0x1F, 0xF1, 0x04, 0x00, 0x00, 0x00, 0x16, 0x14, 0x26,
|
||||
0x03, 0x27, 0x1F, 0xF2, 0x04, 0x00, 0x00, 0x00, 0x16, 0x14, 0x26, 0x03, 0x27, 0x1F, 0xF3, 0x04,
|
||||
0x00, 0x00, 0x00, 0x16, 0x14, 0x26, 0x03, 0x80, 0x1F, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x48,
|
||||
0x00, 0x00, 0x92, 0x1F, 0x01, 0x04, 0x00, 0x00, 0x00, 0x40, 0x0D, 0x03, 0x00, 0x92, 0x1F, 0x20,
|
||||
0x04, 0x00, 0x00, 0x00, 0x40, 0x0D, 0x03, 0x00, 0x92, 0x1F, 0x6E, 0x04, 0x00, 0x00, 0x00, 0x40,
|
||||
0x0D, 0x03, 0x00, 0x92, 0x1F, 0xF1, 0x04, 0x00, 0x00, 0x00, 0x78, 0x69, 0x00, 0x00, 0x92, 0x1F,
|
||||
0xF2, 0x04, 0x00, 0x00, 0x00, 0x78, 0x69, 0x00, 0x00, 0x92, 0x1F, 0xF3, 0x04, 0x00, 0x00, 0x00,
|
||||
0x78, 0x69, 0x00, 0x00, 0x00, 0x14, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x14, 0x01, 0x01,
|
||||
0x00, 0x00, 0x00, 0x20, 0x02, 0x14, 0x01, 0x01, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x16, 0x01, 0x08,
|
||||
0x00, 0x00, 0x00, 0xC0, 0xA4, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x16, 0x01, 0x08, 0x00,
|
||||
0x00, 0x00, 0xC0, 0xA4, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x16, 0x01, 0x08, 0x00, 0x00,
|
||||
0x00, 0xC0, 0xA4, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x01, 0x01, 0x00, 0x00, 0x00,
|
||||
0x01, 0x01, 0x18, 0x01, 0x01, 0x00, 0x00, 0x00, 0x20, 0x02, 0x18, 0x01, 0x01, 0x00, 0x00, 0x00,
|
||||
0x6E, 0x00, 0x1A, 0x01, 0x08, 0x00, 0x00, 0x00, 0x40, 0xA0, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00,
|
||||
0x01, 0x1A, 0x01, 0x08, 0x00, 0x00, 0x00, 0x40, 0xA0, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02,
|
||||
0x1A, 0x01, 0x08, 0x00, 0x00, 0x00, 0x40, 0xA0, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x16,
|
||||
0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x16, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x16,
|
||||
0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x1A,
|
||||
0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x1A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x22, 0x1F,
|
||||
0x01, 0x96, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x1A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00,
|
||||
0x50, 0xC3, 0x00, 0x00, 0x20, 0x10, 0x01, 0x04, 0x00, 0x00, 0x00, 0x7B, 0x31, 0x00, 0x00, 0x20,
|
||||
0x10, 0x02, 0x04, 0x00, 0x00, 0x00, 0x16, 0x14, 0x26, 0x03, 0x0B, 0x1C, 0x03, 0x04, 0x00, 0x00,
|
||||
0x00, 0x50, 0x00, 0x00, 0x00, 0x0D, 0x1C, 0x03, 0x04, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00,
|
||||
0x14, 0x1C, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0xF0, 0xFA, 0x02, 0x98, 0x1F, 0x04, 0x02, 0x00,
|
||||
0x00, 0x00, 0x24, 0x00, 0x98, 0x1F, 0x05, 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x16, 0x01,
|
||||
0x08, 0x00, 0x00, 0x00, 0x00, 0x62, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1A, 0x01, 0x08,
|
||||
0x00, 0x00, 0x00, 0x00, 0x60, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x16, 0x00, 0x01, 0x00,
|
||||
0x00, 0x00, 0x01, 0x00, 0x1A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x22, 0x1F, 0x20, 0x96, 0x00,
|
||||
0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A,
|
||||
0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x50, 0xC3, 0x00,
|
||||
0x00, 0x20, 0x10, 0x01, 0x04, 0x00, 0x00, 0x00, 0x7B, 0x31, 0x00, 0x00, 0x20, 0x10, 0x02, 0x04,
|
||||
0x00, 0x00, 0x00, 0x16, 0x14, 0x26, 0x03, 0x0B, 0x1C, 0x03, 0x04, 0x00, 0x00, 0x00, 0x50, 0x00,
|
||||
0x00, 0x00, 0x0D, 0x1C, 0x03, 0x04, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x14, 0x1C, 0x00,
|
||||
0x04, 0x00, 0x00, 0x00, 0x80, 0xF0, 0xFA, 0x02, 0x98, 0x1F, 0x04, 0x02, 0x00, 0x00, 0x00, 0x24,
|
||||
0x00, 0x98, 0x1F, 0x05, 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x16, 0x01, 0x08, 0x00, 0x00,
|
||||
0x00, 0x00, 0x62, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1A, 0x01, 0x08, 0x00, 0x00, 0x00,
|
||||
0x00, 0x60, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x16, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
|
||||
0x00, 0x1A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x22, 0x1F, 0x6E, 0x96, 0x00, 0x00, 0x00, 0x0E,
|
||||
0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x01, 0x00,
|
||||
0x00, 0x00, 0x00, 0x06, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x50, 0xC3, 0x00, 0x00, 0x20, 0x10,
|
||||
0x01, 0x04, 0x00, 0x00, 0x00, 0x7B, 0x31, 0x00, 0x00, 0x20, 0x10, 0x02, 0x04, 0x00, 0x00, 0x00,
|
||||
0x16, 0x14, 0x26, 0x03, 0x0B, 0x1C, 0x03, 0x04, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x0D,
|
||||
0x1C, 0x03, 0x04, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x14, 0x1C, 0x00, 0x04, 0x00, 0x00,
|
||||
0x00, 0x80, 0xF0, 0xFA, 0x02, 0x98, 0x1F, 0x04, 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x98, 0x1F,
|
||||
0x05, 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x16, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x62,
|
||||
0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1A, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x60, 0x01,
|
||||
0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x16, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1A, 0x00,
|
||||
0x01, 0x00, 0x00, 0x00, 0x01, 0x22, 0x1F, 0xF1, 0x9B, 0x02, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00,
|
||||
0x81, 0x1F, 0x01, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x81, 0x1F, 0x20, 0x04, 0x00,
|
||||
0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x81, 0x1F, 0x6E, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
|
||||
0x00, 0x81, 0x1F, 0xF1, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x81, 0x1F, 0xF2, 0x04,
|
||||
0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x81, 0x1F, 0xF3, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00,
|
||||
0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x16, 0x00, 0x01, 0x00, 0x00,
|
||||
0x00, 0x00, 0x02, 0x16, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x01, 0x00, 0x00,
|
||||
0x00, 0x00, 0x01, 0x1A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1A, 0x00, 0x01, 0x00, 0x00,
|
||||
0x00, 0x00, 0x06, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x50, 0xC3, 0x00, 0x00, 0x20, 0x10, 0x01,
|
||||
0x04, 0x00, 0x00, 0x00, 0x7B, 0x31, 0x00, 0x00, 0x20, 0x10, 0x02, 0x04, 0x00, 0x00, 0x00, 0x16,
|
||||
0x14, 0x26, 0x03, 0x02, 0x1C, 0x01, 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x02, 0x1C,
|
||||
0x03, 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x09, 0x1C, 0x01, 0x04, 0x00, 0x00, 0x00,
|
||||
0x28, 0x00, 0x00, 0x00, 0x09, 0x1C, 0x20, 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x09,
|
||||
0x1C, 0x6E, 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x0B, 0x1C, 0x03, 0x04, 0x00, 0x00,
|
||||
0x00, 0x50, 0x00, 0x00, 0x00, 0x0D, 0x1C, 0x03, 0x04, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00,
|
||||
0x14, 0x1C, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0xF0, 0xFA, 0x02, 0x26, 0x1F, 0x01, 0x04, 0x00,
|
||||
0x00, 0x00, 0x7B, 0x31, 0x00, 0x00, 0x26, 0x1F, 0x20, 0x04, 0x00, 0x00, 0x00, 0x7B, 0x31, 0x00,
|
||||
0x00, 0x26, 0x1F, 0x6E, 0x04, 0x00, 0x00, 0x00, 0x7B, 0x31, 0x00, 0x00, 0x26, 0x1F, 0xF1, 0x04,
|
||||
0x00, 0x00, 0x00, 0x7B, 0x31, 0x00, 0x00, 0x26, 0x1F, 0xF2, 0x04, 0x00, 0x00, 0x00, 0x7B, 0x31,
|
||||
0x00, 0x00, 0x26, 0x1F, 0xF3, 0x04, 0x00, 0x00, 0x00, 0x7B, 0x31, 0x00, 0x00, 0x27, 0x1F, 0x01,
|
||||
0x04, 0x00, 0x00, 0x00, 0x16, 0x14, 0x26, 0x03, 0x27, 0x1F, 0x20, 0x04, 0x00, 0x00, 0x00, 0x16,
|
||||
0x14, 0x26, 0x03, 0x27, 0x1F, 0x6E, 0x04, 0x00, 0x00, 0x00, 0x16, 0x14, 0x26, 0x03, 0x27, 0x1F,
|
||||
0xF1, 0x04, 0x00, 0x00, 0x00, 0x16, 0x14, 0x26, 0x03, 0x27, 0x1F, 0xF2, 0x04, 0x00, 0x00, 0x00,
|
||||
0x16, 0x14, 0x26, 0x03, 0x27, 0x1F, 0xF3, 0x04, 0x00, 0x00, 0x00, 0x16, 0x14, 0x26, 0x03, 0x80,
|
||||
0x1F, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x92, 0x1F, 0x01, 0x04, 0x00, 0x00,
|
||||
0x00, 0x40, 0x0D, 0x03, 0x00, 0x92, 0x1F, 0x20, 0x04, 0x00, 0x00, 0x00, 0x40, 0x0D, 0x03, 0x00,
|
||||
0x92, 0x1F, 0x6E, 0x04, 0x00, 0x00, 0x00, 0x40, 0x0D, 0x03, 0x00, 0x92, 0x1F, 0xF1, 0x04, 0x00,
|
||||
0x00, 0x00, 0x78, 0x69, 0x00, 0x00, 0x92, 0x1F, 0xF2, 0x04, 0x00, 0x00, 0x00, 0x78, 0x69, 0x00,
|
||||
0x00, 0x92, 0x1F, 0xF3, 0x04, 0x00, 0x00, 0x00, 0x78, 0x69, 0x00, 0x00, 0x00, 0x14, 0x01, 0x01,
|
||||
0x00, 0x00, 0x00, 0x01, 0x01, 0x14, 0x01, 0x01, 0x00, 0x00, 0x00, 0x20, 0x02, 0x14, 0x01, 0x01,
|
||||
0x00, 0x00, 0x00, 0x6E, 0x00, 0x16, 0x01, 0x08, 0x00, 0x00, 0x00, 0xC0, 0xA4, 0x01, 0x00, 0x00,
|
||||
0x00, 0x08, 0x00, 0x01, 0x16, 0x01, 0x08, 0x00, 0x00, 0x00, 0xC0, 0xA4, 0x02, 0x00, 0x00, 0x00,
|
||||
0x08, 0x00, 0x02, 0x16, 0x01, 0x08, 0x00, 0x00, 0x00, 0xC0, 0xA4, 0x03, 0x00, 0x00, 0x00, 0x08,
|
||||
0x00, 0x00, 0x18, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x18, 0x01, 0x01, 0x00, 0x00, 0x00,
|
||||
0x20, 0x02, 0x18, 0x01, 0x01, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x1A, 0x01, 0x08, 0x00, 0x00, 0x00,
|
||||
0x40, 0xA0, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x1A, 0x01, 0x08, 0x00, 0x00, 0x00, 0x40,
|
||||
0xA0, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x1A, 0x01, 0x08, 0x00, 0x00, 0x00, 0x40, 0xA0,
|
||||
0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x16, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x16,
|
||||
0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x16, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1A,
|
||||
0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x1A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x1A,
|
||||
0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x81, 0x1F, 0x01, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
|
||||
0x80, 0x81, 0x1F, 0x20, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x80, 0x81, 0x1F, 0x6E, 0x04,
|
||||
0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x80, 0x22, 0x1F, 0xF2, 0x9B, 0x02, 0x00, 0x00, 0x3F, 0x00,
|
||||
0x00, 0x00, 0x81, 0x1F, 0x01, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x81, 0x1F, 0x20,
|
||||
0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x81, 0x1F, 0x6E, 0x04, 0x00, 0x00, 0x00, 0x07,
|
||||
0x00, 0x00, 0x00, 0x81, 0x1F, 0xF1, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x81, 0x1F,
|
||||
0xF2, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x81, 0x1F, 0xF3, 0x04, 0x00, 0x00, 0x00,
|
||||
0x03, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x16, 0x00, 0x01,
|
||||
0x00, 0x00, 0x00, 0x00, 0x02, 0x16, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x01,
|
||||
0x00, 0x00, 0x00, 0x00, 0x01, 0x1A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1A, 0x00, 0x01,
|
||||
0x00, 0x00, 0x00, 0x00, 0x06, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x50, 0xC3, 0x00, 0x00, 0x20,
|
||||
0x10, 0x01, 0x04, 0x00, 0x00, 0x00, 0x7B, 0x31, 0x00, 0x00, 0x20, 0x10, 0x02, 0x04, 0x00, 0x00,
|
||||
0x00, 0x16, 0x14, 0x26, 0x03, 0x02, 0x1C, 0x01, 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00,
|
||||
0x02, 0x1C, 0x03, 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x09, 0x1C, 0x01, 0x04, 0x00,
|
||||
0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x09, 0x1C, 0x20, 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00,
|
||||
0x00, 0x09, 0x1C, 0x6E, 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x0B, 0x1C, 0x03, 0x04,
|
||||
0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x0D, 0x1C, 0x03, 0x04, 0x00, 0x00, 0x00, 0x50, 0x00,
|
||||
0x00, 0x00, 0x14, 0x1C, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0xF0, 0xFA, 0x02, 0x26, 0x1F, 0x01,
|
||||
0x04, 0x00, 0x00, 0x00, 0x7B, 0x31, 0x00, 0x00, 0x26, 0x1F, 0x20, 0x04, 0x00, 0x00, 0x00, 0x7B,
|
||||
0x31, 0x00, 0x00, 0x26, 0x1F, 0x6E, 0x04, 0x00, 0x00, 0x00, 0x7B, 0x31, 0x00, 0x00, 0x26, 0x1F,
|
||||
0xF1, 0x04, 0x00, 0x00, 0x00, 0x7B, 0x31, 0x00, 0x00, 0x26, 0x1F, 0xF2, 0x04, 0x00, 0x00, 0x00,
|
||||
0x7B, 0x31, 0x00, 0x00, 0x26, 0x1F, 0xF3, 0x04, 0x00, 0x00, 0x00, 0x7B, 0x31, 0x00, 0x00, 0x27,
|
||||
0x1F, 0x01, 0x04, 0x00, 0x00, 0x00, 0x16, 0x14, 0x26, 0x03, 0x27, 0x1F, 0x20, 0x04, 0x00, 0x00,
|
||||
0x00, 0x16, 0x14, 0x26, 0x03, 0x27, 0x1F, 0x6E, 0x04, 0x00, 0x00, 0x00, 0x16, 0x14, 0x26, 0x03,
|
||||
0x27, 0x1F, 0xF1, 0x04, 0x00, 0x00, 0x00, 0x16, 0x14, 0x26, 0x03, 0x27, 0x1F, 0xF2, 0x04, 0x00,
|
||||
0x00, 0x00, 0x16, 0x14, 0x26, 0x03, 0x27, 0x1F, 0xF3, 0x04, 0x00, 0x00, 0x00, 0x16, 0x14, 0x26,
|
||||
0x03, 0x80, 0x1F, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x92, 0x1F, 0x01, 0x04,
|
||||
0x00, 0x00, 0x00, 0x40, 0x0D, 0x03, 0x00, 0x92, 0x1F, 0x20, 0x04, 0x00, 0x00, 0x00, 0x40, 0x0D,
|
||||
0x03, 0x00, 0x92, 0x1F, 0x6E, 0x04, 0x00, 0x00, 0x00, 0x40, 0x0D, 0x03, 0x00, 0x92, 0x1F, 0xF1,
|
||||
0x04, 0x00, 0x00, 0x00, 0x78, 0x69, 0x00, 0x00, 0x92, 0x1F, 0xF2, 0x04, 0x00, 0x00, 0x00, 0x78,
|
||||
0x69, 0x00, 0x00, 0x92, 0x1F, 0xF3, 0x04, 0x00, 0x00, 0x00, 0x78, 0x69, 0x00, 0x00, 0x00, 0x14,
|
||||
0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x14, 0x01, 0x01, 0x00, 0x00, 0x00, 0x20, 0x02, 0x14,
|
||||
0x01, 0x01, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x16, 0x01, 0x08, 0x00, 0x00, 0x00, 0xC0, 0xA4, 0x01,
|
||||
0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x16, 0x01, 0x08, 0x00, 0x00, 0x00, 0xC0, 0xA4, 0x02, 0x00,
|
||||
0x00, 0x00, 0x08, 0x00, 0x02, 0x16, 0x01, 0x08, 0x00, 0x00, 0x00, 0xC0, 0xA4, 0x03, 0x00, 0x00,
|
||||
0x00, 0x08, 0x00, 0x00, 0x18, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x18, 0x01, 0x01, 0x00,
|
||||
0x00, 0x00, 0x20, 0x02, 0x18, 0x01, 0x01, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x1A, 0x01, 0x08, 0x00,
|
||||
0x00, 0x00, 0x40, 0xA0, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x1A, 0x01, 0x08, 0x00, 0x00,
|
||||
0x00, 0x40, 0xA0, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x1A, 0x01, 0x08, 0x00, 0x00, 0x00,
|
||||
0x40, 0xA0, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x16, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
|
||||
0x01, 0x16, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x16, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
|
||||
0x00, 0x1A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x1A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
|
||||
0x02, 0x1A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x81, 0x1F, 0x01, 0x04, 0x00, 0x00, 0x00, 0x07,
|
||||
0x00, 0x00, 0x80, 0x81, 0x1F, 0x20, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x80, 0x81, 0x1F,
|
||||
0x6E, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x80, 0x22, 0x1F, 0xF3, 0x9B, 0x02, 0x00, 0x00,
|
||||
0x3F, 0x00, 0x00, 0x00, 0x81, 0x1F, 0x01, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x81,
|
||||
0x1F, 0x20, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x81, 0x1F, 0x6E, 0x04, 0x00, 0x00,
|
||||
0x00, 0x07, 0x00, 0x00, 0x00, 0x81, 0x1F, 0xF1, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
|
||||
0x81, 0x1F, 0xF2, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x81, 0x1F, 0xF3, 0x04, 0x00,
|
||||
0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x16,
|
||||
0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x16, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A,
|
||||
0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1A,
|
||||
0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x50, 0xC3, 0x00,
|
||||
0x00, 0x20, 0x10, 0x01, 0x04, 0x00, 0x00, 0x00, 0x7B, 0x31, 0x00, 0x00, 0x20, 0x10, 0x02, 0x04,
|
||||
0x00, 0x00, 0x00, 0x16, 0x14, 0x26, 0x03, 0x02, 0x1C, 0x01, 0x04, 0x00, 0x00, 0x00, 0x28, 0x00,
|
||||
0x00, 0x00, 0x02, 0x1C, 0x03, 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x09, 0x1C, 0x01,
|
||||
0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x09, 0x1C, 0x20, 0x04, 0x00, 0x00, 0x00, 0x28,
|
||||
0x00, 0x00, 0x00, 0x09, 0x1C, 0x6E, 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x0B, 0x1C,
|
||||
0x03, 0x04, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x0D, 0x1C, 0x03, 0x04, 0x00, 0x00, 0x00,
|
||||
0x50, 0x00, 0x00, 0x00, 0x14, 0x1C, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0xF0, 0xFA, 0x02, 0x26,
|
||||
0x1F, 0x01, 0x04, 0x00, 0x00, 0x00, 0x7B, 0x31, 0x00, 0x00, 0x26, 0x1F, 0x20, 0x04, 0x00, 0x00,
|
||||
0x00, 0x7B, 0x31, 0x00, 0x00, 0x26, 0x1F, 0x6E, 0x04, 0x00, 0x00, 0x00, 0x7B, 0x31, 0x00, 0x00,
|
||||
0x26, 0x1F, 0xF1, 0x04, 0x00, 0x00, 0x00, 0x7B, 0x31, 0x00, 0x00, 0x26, 0x1F, 0xF2, 0x04, 0x00,
|
||||
0x00, 0x00, 0x7B, 0x31, 0x00, 0x00, 0x26, 0x1F, 0xF3, 0x04, 0x00, 0x00, 0x00, 0x7B, 0x31, 0x00,
|
||||
0x00, 0x27, 0x1F, 0x01, 0x04, 0x00, 0x00, 0x00, 0x16, 0x14, 0x26, 0x03, 0x27, 0x1F, 0x20, 0x04,
|
||||
0x00, 0x00, 0x00, 0x16, 0x14, 0x26, 0x03, 0x27, 0x1F, 0x6E, 0x04, 0x00, 0x00, 0x00, 0x16, 0x14,
|
||||
0x26, 0x03, 0x27, 0x1F, 0xF1, 0x04, 0x00, 0x00, 0x00, 0x16, 0x14, 0x26, 0x03, 0x27, 0x1F, 0xF2,
|
||||
0x04, 0x00, 0x00, 0x00, 0x16, 0x14, 0x26, 0x03, 0x27, 0x1F, 0xF3, 0x04, 0x00, 0x00, 0x00, 0x16,
|
||||
0x14, 0x26, 0x03, 0x80, 0x1F, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x92, 0x1F,
|
||||
0x01, 0x04, 0x00, 0x00, 0x00, 0x40, 0x0D, 0x03, 0x00, 0x92, 0x1F, 0x20, 0x04, 0x00, 0x00, 0x00,
|
||||
0x40, 0x0D, 0x03, 0x00, 0x92, 0x1F, 0x6E, 0x04, 0x00, 0x00, 0x00, 0x40, 0x0D, 0x03, 0x00, 0x92,
|
||||
0x1F, 0xF1, 0x04, 0x00, 0x00, 0x00, 0x78, 0x69, 0x00, 0x00, 0x92, 0x1F, 0xF2, 0x04, 0x00, 0x00,
|
||||
0x00, 0x78, 0x69, 0x00, 0x00, 0x92, 0x1F, 0xF3, 0x04, 0x00, 0x00, 0x00, 0x78, 0x69, 0x00, 0x00,
|
||||
0x00, 0x14, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x14, 0x01, 0x01, 0x00, 0x00, 0x00, 0x20,
|
||||
0x02, 0x14, 0x01, 0x01, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x16, 0x01, 0x08, 0x00, 0x00, 0x00, 0xC0,
|
||||
0xA4, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x16, 0x01, 0x08, 0x00, 0x00, 0x00, 0xC0, 0xA4,
|
||||
0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x16, 0x01, 0x08, 0x00, 0x00, 0x00, 0xC0, 0xA4, 0x03,
|
||||
0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x18, 0x01,
|
||||
0x01, 0x00, 0x00, 0x00, 0x20, 0x02, 0x18, 0x01, 0x01, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x1A, 0x01,
|
||||
0x08, 0x00, 0x00, 0x00, 0x40, 0xA0, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x1A, 0x01, 0x08,
|
||||
0x00, 0x00, 0x00, 0x40, 0xA0, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x1A, 0x01, 0x08, 0x00,
|
||||
0x00, 0x00, 0x40, 0xA0, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x16, 0x00, 0x01, 0x00, 0x00,
|
||||
0x00, 0x01, 0x01, 0x16, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x16, 0x00, 0x01, 0x00, 0x00,
|
||||
0x00, 0x01, 0x00, 0x1A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x1A, 0x00, 0x01, 0x00, 0x00,
|
||||
0x00, 0x01, 0x02, 0x1A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x81, 0x1F, 0x01, 0x04, 0x00, 0x00,
|
||||
0x00, 0x07, 0x00, 0x00, 0x80, 0x81, 0x1F, 0x20, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x80,
|
||||
0x81, 0x1F, 0x6E, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x80, 0x81, 0x1F, 0x01, 0x04, 0x00,
|
||||
0x00, 0x00, 0x07, 0x00, 0x00, 0x80, 0x81, 0x1F, 0x20, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
|
||||
0x80, 0x81, 0x1F, 0x6E, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x80
|
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
* This file was autogenerated by openCONFIGURATOR-2.2.1_release on 06-Sep-2018 14:40:27
|
||||
* Project: Demo_RMN_3CN
|
||||
* Application process for openPOWERLINK_MN(240)
|
||||
*/
|
||||
#ifndef XAP_h
|
||||
#define XAP_h
|
||||
|
||||
#define COMPUTED_PI_OUT_SIZE 4
|
||||
typedef struct
|
||||
{
|
||||
unsigned CN1_DigitalInput_00h_AU8_DigitalInput:8;
|
||||
unsigned CN32_DigitalInput_00h_AU8_DigitalInput:8;
|
||||
unsigned CN110_DigitalInput_00h_AU8_DigitalInput:8;
|
||||
unsigned PADDING_VAR_1:8;
|
||||
} PI_OUT;
|
||||
|
||||
#define COMPUTED_PI_IN_SIZE 4
|
||||
typedef struct
|
||||
{
|
||||
unsigned CN1_DigitalOutput_00h_AU8_DigitalOutput:8;
|
||||
unsigned CN32_DigitalOutput_00h_AU8_DigitalOutput:8;
|
||||
unsigned CN110_DigitalOutput_00h_AU8_DigitalOutput:8;
|
||||
unsigned PADDING_VAR_1:8;
|
||||
} PI_IN;
|
||||
|
||||
#endif
|
|
@ -0,0 +1,16 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- This file was autogenerated by openCONFIGURATOR-2.2.1_release on 06-Sep-2018 14:40:27 -->
|
||||
<!-- Project: Demo_RMN_3CN -->
|
||||
<!-- Application process for openPOWERLINK_MN(240) -->
|
||||
<ApplicationProcess xmlns="http://ethernet-powerlink.org/POWERLINK/PI">
|
||||
<ProcessImage type="output" size="3">
|
||||
<Channel Name="CN1.DigitalInput.00h.AU8.DigitalInput" dataType="Unsigned8" dataSize="8" PIOffset="0x0000"/>
|
||||
<Channel Name="CN32.DigitalInput.00h.AU8.DigitalInput" dataType="Unsigned8" dataSize="8" PIOffset="0x0001"/>
|
||||
<Channel Name="CN110.DigitalInput.00h.AU8.DigitalInput" dataType="Unsigned8" dataSize="8" PIOffset="0x0002"/>
|
||||
</ProcessImage>
|
||||
<ProcessImage type="input" size="3">
|
||||
<Channel Name="CN1.DigitalOutput.00h.AU8.DigitalOutput" dataType="Unsigned8" dataSize="8" PIOffset="0x0000"/>
|
||||
<Channel Name="CN32.DigitalOutput.00h.AU8.DigitalOutput" dataType="Unsigned8" dataSize="8" PIOffset="0x0001"/>
|
||||
<Channel Name="CN110.DigitalOutput.00h.AU8.DigitalOutput" dataType="Unsigned8" dataSize="8" PIOffset="0x0002"/>
|
||||
</ProcessImage>
|
||||
</ApplicationProcess>
|
|
@ -0,0 +1,92 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file arp-target.h
|
||||
|
||||
\brief ARP demo target header
|
||||
|
||||
This file contains the target specific definitions like endian conversion.
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2016, B&R Industrial Automation GmbH
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
#ifndef _INC_arp_target_H_
|
||||
#define _INC_arp_target_H_
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include <oplk/oplk.h>
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
#if (TARGET_SYSTEM == _LINUX_)
|
||||
#include <arpa/inet.h>
|
||||
#else
|
||||
#if CHECK_IF_BIG_ENDIAN()
|
||||
// Big endian => no swap needed
|
||||
#define htons(x) (x)
|
||||
#define htonl(x) (x)
|
||||
#define ntohs(x) (x)
|
||||
#define ntohl(x) (x)
|
||||
#else
|
||||
// Little endian => swap needed
|
||||
// Swap long: 0x00C0FFEE --> 0xEEFFC000
|
||||
#define ARP_SWAPL(x) ((((x) >> 24) & 0x000000FF) | \
|
||||
(((x) >> 8) & 0x0000FF00) | \
|
||||
(((x) & 0x000000FF) << 24) | \
|
||||
(((x) & 0x0000FF00) << 8))
|
||||
|
||||
// Swap short: 0xC0FE --> 0xFEC0
|
||||
#define ARP_SWAPS(x) ((((x) >> 8) & 0x00FF) | \
|
||||
(((x) << 8) & 0xFF00))
|
||||
|
||||
#define htons(x) ARP_SWAPS(x)
|
||||
#define htonl(x) ARP_SWAPL(x)
|
||||
#define ntohs(x) ARP_SWAPS(x)
|
||||
#define ntohl(x) ARP_SWAPL(x)
|
||||
#endif //CHECK_IF_BIG_ENDIAN
|
||||
#endif //DEV_SYSTEM
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// typedef
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _INC_arp_target_H_ */
|
|
@ -0,0 +1,426 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file arp.c
|
||||
|
||||
\brief ARP demo implementation
|
||||
|
||||
This file implements an ARP demo for demo targets that have no IP stack.
|
||||
|
||||
\ingroup module_app_common
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2016, B&R Industrial Automation GmbH
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include "arp.h"
|
||||
#include "arp-target.h"
|
||||
|
||||
#include <oplk/oplk.h>
|
||||
|
||||
//============================================================================//
|
||||
// G L O B A L D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// module global vars
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// global function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
#define ARP_ETHERTYPE 0x0806 ///< ARP "EtherType"
|
||||
#define ARP_HWTYPE_ETHERNET 1 ///< ARP hardware type Ethernet
|
||||
#define ARP_PROTYPE_IPV4 0x0800 ///< ARP protocol type IP V4
|
||||
#define ARP_HWADDR_LENGTH 6 ///< ARP hardware address length Ethernet
|
||||
#define ARP_PROADDR_LENGTH 4 ///< ARP protocol address length IP V4
|
||||
#define ARP_OP_REQUEST 1 ///< ARP operation request
|
||||
#define ARP_OP_REPLY 2 ///< ARP operation reply
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local types
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
* \brief Ethernet with ARP message
|
||||
*
|
||||
* This struct defines an Ethernet frame with ARP message payload.
|
||||
*
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
UINT8 aDstMac[ARP_HWADDR_LENGTH]; ///< Ethernet destination MAC address
|
||||
UINT8 aSrcMac[ARP_HWADDR_LENGTH]; ///< Ethernet source MAC address
|
||||
UINT16 etherType; ///< Ethernet "etherType"
|
||||
UINT16 hardwareType; ///< ARP network protocol type
|
||||
UINT16 protocolType; ///< ARP internetwork protocol type
|
||||
UINT8 hardwareAddressLength; ///< ARP length of hardware address [octets]
|
||||
UINT8 protocolAddressLength; ///< ARP length of internetwork address [octets]
|
||||
UINT16 operation; ///< ARP operation
|
||||
UINT8 aSenderHardwareAddress[ARP_HWADDR_LENGTH]; ///< ARP sender hardware address
|
||||
UINT8 aSenderProtocolAddress[ARP_PROADDR_LENGTH]; ///< ARP sender internetwork address
|
||||
UINT8 aTargetHardwareAddress[ARP_HWADDR_LENGTH]; ///< ARP target hardware address
|
||||
UINT8 aTargetProtocolAddress[ARP_PROADDR_LENGTH]; ///< ARP target internetwork address
|
||||
} tArpFrame;
|
||||
|
||||
/**
|
||||
* \brief ARP instance
|
||||
*
|
||||
* This struct defines the ARP instance.
|
||||
*
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
tArpFrame frameTemplate; ///< ARP frame template
|
||||
UINT8 nodeId; ///< The local node ID
|
||||
UINT8 aMacAddr[ARP_HWADDR_LENGTH]; ///< The local node's MAC address in network order
|
||||
UINT8 aIpAddr[ARP_PROADDR_LENGTH]; ///< The local node's IP address in network order
|
||||
UINT8 aDefaultGwIp[ARP_PROADDR_LENGTH]; ///< Default gateway IP address in network order
|
||||
UINT8 aDefaultGwMac[ARP_HWADDR_LENGTH]; ///< Default gateway MAC address in network order
|
||||
} tArpInstance;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local vars
|
||||
//------------------------------------------------------------------------------
|
||||
static tArpInstance arpInstance_l;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
static void handleReply(const tArpFrame* pFrame_p);
|
||||
static int handleRequest(const tArpFrame* pFrame_p);
|
||||
|
||||
//============================================================================//
|
||||
// P U B L I C F U N C T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Initialize ARP module
|
||||
|
||||
The function initializes the ARP module before being used.
|
||||
|
||||
\param[in] nodeId_p The local node ID
|
||||
|
||||
\ingroup module_app_common
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void arp_init(UINT8 nodeId_p)
|
||||
{
|
||||
tArpFrame* pFrame;
|
||||
|
||||
memset(&arpInstance_l, 0, sizeof(tArpInstance));
|
||||
|
||||
arpInstance_l.nodeId = nodeId_p;
|
||||
|
||||
pFrame = &arpInstance_l.frameTemplate; // Set ARP frame template
|
||||
pFrame->etherType = htons(ARP_ETHERTYPE); // EtherType: ARP
|
||||
pFrame->hardwareType = htons(ARP_HWTYPE_ETHERNET); // Hardware Type: Ethernet
|
||||
pFrame->protocolType = htons(ARP_PROTYPE_IPV4); // Protocol Type: IP V4
|
||||
pFrame->hardwareAddressLength = ARP_HWADDR_LENGTH; // Hardware Address Length
|
||||
pFrame->protocolAddressLength = ARP_PROADDR_LENGTH; // Protocol Address Length
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Shutdown ARP module
|
||||
|
||||
The function shuts down the ARP module.
|
||||
|
||||
\ingroup module_app_common
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void arp_exit(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Set local node MAC address
|
||||
|
||||
The function sets the local node's MAC address.
|
||||
|
||||
\param[in] pMacAddr_p Pointer to buffer that holds the MAC address to be set
|
||||
|
||||
\ingroup module_app_common
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void arp_setMacAddr(const UINT8* pMacAddr_p)
|
||||
{
|
||||
memcpy(&arpInstance_l.aMacAddr, pMacAddr_p, ARP_HWADDR_LENGTH);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Set local node IP address
|
||||
|
||||
The function sets the local node's IP address.
|
||||
|
||||
\param[in] ipAddr_p IP address to be set
|
||||
|
||||
\ingroup module_app_common
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void arp_setIpAddr(UINT32 ipAddr_p)
|
||||
{
|
||||
UINT32 ipAddr = htonl(ipAddr_p); // Swap to get network order
|
||||
|
||||
memcpy(arpInstance_l.aIpAddr, &ipAddr, ARP_PROADDR_LENGTH);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Set default gateway address
|
||||
|
||||
The function sets the default gateway's IP address.
|
||||
|
||||
\param[in] defGateway_p Default gateway IP address
|
||||
|
||||
\ingroup module_app_common
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void arp_setDefGateway(UINT32 defGateway_p)
|
||||
{
|
||||
UINT32 defGateway = htonl(defGateway_p); // Swap to get network order
|
||||
|
||||
memcpy(arpInstance_l.aDefaultGwIp, &defGateway, ARP_PROADDR_LENGTH);
|
||||
|
||||
// Invalidate default gateway's MAC address
|
||||
memset(arpInstance_l.aDefaultGwMac, 0, ARP_HWADDR_LENGTH);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Send ARP request to POWERLINK node
|
||||
|
||||
The function sends an ARP request to the given POWERLINK node.
|
||||
|
||||
\param[in] ipAddr_p IP address to destination node
|
||||
|
||||
\return The function returns 0 if the ARP request has been sent, otherwise -1.
|
||||
|
||||
\ingroup module_app_common
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
int arp_sendRequest(UINT32 ipAddr_p)
|
||||
{
|
||||
tArpFrame frameBuffer;
|
||||
tArpFrame* pFrame = &frameBuffer;
|
||||
UINT32 ipAddr = htonl(ipAddr_p); // Swap to get network order
|
||||
|
||||
// Copy ARP frame template to frame buffer
|
||||
memcpy(pFrame, &arpInstance_l.frameTemplate, sizeof(tArpFrame));
|
||||
|
||||
// Set Destination MAC address (broadcast)
|
||||
memset(pFrame->aDstMac, 0xFF, ARP_HWADDR_LENGTH);
|
||||
|
||||
// Set ARP operation
|
||||
pFrame->operation = htons(ARP_OP_REQUEST);
|
||||
|
||||
// Sender IP Address
|
||||
memcpy(pFrame->aSenderProtocolAddress, arpInstance_l.aIpAddr, ARP_PROADDR_LENGTH);
|
||||
|
||||
// Overwrite last byte with node ID
|
||||
pFrame->aSenderProtocolAddress[3] = arpInstance_l.nodeId;
|
||||
|
||||
// Sender MAC Address
|
||||
memcpy(pFrame->aSenderHardwareAddress, &arpInstance_l.aMacAddr[0], ARP_HWADDR_LENGTH);
|
||||
|
||||
// Target IP Address
|
||||
memcpy(pFrame->aTargetProtocolAddress, &ipAddr, ARP_PROADDR_LENGTH);
|
||||
|
||||
if (oplk_sendEthFrame((tPlkFrame*)pFrame, sizeof(tArpFrame)) == kErrorOk)
|
||||
return 0;
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Process Ethernet ARP frames
|
||||
|
||||
The function processes a received Ethernet frame for ARP handling.
|
||||
|
||||
\param[in] pFrame_p Pointer to ARP frame
|
||||
\param[in] size_p Size of the frame
|
||||
|
||||
\return The function returns 0 if an ARP frame has been received and handled
|
||||
successfully, otherwise -1.
|
||||
|
||||
\ingroup module_app_common
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
int arp_processReceive(const tPlkFrame* pFrame_p,
|
||||
UINT size_p)
|
||||
{
|
||||
int ret = 0;
|
||||
tArpFrame* pFrame = (tArpFrame*)pFrame_p;
|
||||
|
||||
// Handle ARP frames: Check etherType and frame size
|
||||
if ((ntohs(pFrame->etherType) == ARP_ETHERTYPE) &&
|
||||
(size_p >= sizeof(tArpFrame)))
|
||||
{
|
||||
//Check for correct hardware, protocol type and length fields
|
||||
if ((ntohs(pFrame->hardwareType) == ARP_HWTYPE_ETHERNET) &&
|
||||
(ntohs(pFrame->protocolType) == ARP_PROTYPE_IPV4) &&
|
||||
(pFrame->hardwareAddressLength == ARP_HWADDR_LENGTH) &&
|
||||
(pFrame->protocolAddressLength == ARP_PROADDR_LENGTH))
|
||||
{
|
||||
switch (ntohs(pFrame->operation))
|
||||
{
|
||||
case ARP_OP_REPLY:
|
||||
handleReply(pFrame);
|
||||
break;
|
||||
|
||||
case ARP_OP_REQUEST:
|
||||
handleRequest(pFrame);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// It is no ARP frame => other protocol shall try...
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E F U N C T I O N S //
|
||||
//============================================================================//
|
||||
/// \name Private Functions
|
||||
/// \{
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Handle ARP Reply frame
|
||||
|
||||
The function handles an ARP Reply frame.
|
||||
|
||||
\param[in] pFrame_p Pointer to ARP frame
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static void handleReply(const tArpFrame* pFrame_p)
|
||||
{
|
||||
PRINTF("ARP: Node with IP Address %d.%d.%d.%d ",
|
||||
pFrame_p->aSenderProtocolAddress[0],
|
||||
pFrame_p->aSenderProtocolAddress[1],
|
||||
pFrame_p->aSenderProtocolAddress[2],
|
||||
pFrame_p->aSenderProtocolAddress[3]);
|
||||
PRINTF("has MAC Address %02X:%02X:%02X:%02X:%02X:%02X ",
|
||||
pFrame_p->aSenderHardwareAddress[0],
|
||||
pFrame_p->aSenderHardwareAddress[1],
|
||||
pFrame_p->aSenderHardwareAddress[2],
|
||||
pFrame_p->aSenderHardwareAddress[3],
|
||||
pFrame_p->aSenderHardwareAddress[4],
|
||||
pFrame_p->aSenderHardwareAddress[5]);
|
||||
|
||||
if (memcmp(pFrame_p->aSenderProtocolAddress, arpInstance_l.aDefaultGwIp, ARP_PROADDR_LENGTH) == 0)
|
||||
{
|
||||
PRINTF("(default gateway)");
|
||||
|
||||
// Store default gateway's MAC address
|
||||
memcpy(arpInstance_l.aDefaultGwMac, pFrame_p->aSenderHardwareAddress, ARP_HWADDR_LENGTH);
|
||||
}
|
||||
|
||||
PRINTF("\n");
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Handle ARP Request frame
|
||||
|
||||
The function handles an ARP Request frame by sending the corresponding ARP reply.
|
||||
|
||||
\param[in] pFrame_p Pointer to ARP frame
|
||||
|
||||
\return The function returns 0 if the ARP request has been answered successfully,
|
||||
otherwise -1.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static int handleRequest(const tArpFrame* pFrame_p)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
// Reply if the request is addressing us
|
||||
if (memcmp(pFrame_p->aTargetProtocolAddress, arpInstance_l.aIpAddr, ARP_PROADDR_LENGTH) == 0)
|
||||
{
|
||||
tArpFrame frameBuffer;
|
||||
tArpFrame* pFrame = &frameBuffer;
|
||||
const tArpFrame* pRxFrame = pFrame_p;
|
||||
|
||||
// Copy ARP frame template to frame buffer
|
||||
memcpy(pFrame, &arpInstance_l.frameTemplate, sizeof(tArpFrame));
|
||||
|
||||
// Copy Destination MAC address to received Source MAC
|
||||
memcpy(pFrame->aDstMac, pRxFrame->aSrcMac, ARP_HWADDR_LENGTH);
|
||||
|
||||
// Set ARP operation
|
||||
pFrame->operation = htons(ARP_OP_REPLY);
|
||||
|
||||
// Sender IP Address
|
||||
memcpy(pFrame->aSenderProtocolAddress, arpInstance_l.aIpAddr, ARP_PROADDR_LENGTH);
|
||||
|
||||
// Overwrite last byte with node ID
|
||||
pFrame->aSenderProtocolAddress[3] = arpInstance_l.nodeId;
|
||||
|
||||
// Sender MAC Address
|
||||
memcpy(pFrame->aSenderHardwareAddress, &arpInstance_l.aMacAddr[0], ARP_HWADDR_LENGTH);
|
||||
|
||||
// Copy received sender info to target info
|
||||
memcpy(pFrame->aTargetHardwareAddress, pRxFrame->aSenderHardwareAddress, ARP_HWADDR_LENGTH);
|
||||
memcpy(pFrame->aTargetProtocolAddress, pRxFrame->aSenderProtocolAddress, ARP_PROADDR_LENGTH);
|
||||
|
||||
if (oplk_sendEthFrame((tPlkFrame*)pFrame, sizeof(tArpFrame)) == kErrorOk)
|
||||
ret = 0;
|
||||
else
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/// \}
|
|
@ -0,0 +1,75 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file arp.h
|
||||
|
||||
\brief ARP demo implementation
|
||||
|
||||
This file contains the definitions for the ARP demo.
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2016, B&R Industrial Automation GmbH
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
#ifndef _INC_arp_H_
|
||||
#define _INC_arp_H_
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include <oplk/oplk.h>
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// typedef
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
void arp_init(UINT8 nodeId_p);
|
||||
void arp_exit(void);
|
||||
void arp_setMacAddr(const UINT8* pMacAddr_p);
|
||||
void arp_setIpAddr(UINT32 ipAddr_p);
|
||||
void arp_setDefGateway(UINT32 defGateway_p);
|
||||
|
||||
int arp_sendRequest(UINT32 ipAddr_p);
|
||||
int arp_processReceive(const tPlkFrame* pFrame_p,
|
||||
UINT size_p);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _INC_arp_H_ */
|
|
@ -0,0 +1,422 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file eventlog.c
|
||||
|
||||
\brief openPOWERLIK application event logger
|
||||
|
||||
This module implements an event logger for openPOWERLINK applications. It can
|
||||
print system events in a defined format. It allows filtering of events via
|
||||
categories and levels.
|
||||
|
||||
The module is intended to be used by openPOWERLINK C applications to print
|
||||
uniform log output. The module uses the eventlog string module to generate the
|
||||
log message strings.
|
||||
|
||||
\ingroup module_app_eventlog
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2016, B&R Industrial Automation GmbH
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include "eventlog.h"
|
||||
#include <oplk/debugstr.h>
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
|
||||
//============================================================================//
|
||||
// G L O B A L D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// module global vars
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// global function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
#define EVENTLOG_MAX_LENGTH 256 ///< Maximum log message length
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local types
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Instance of event log module
|
||||
*
|
||||
* This structure contains all valid information of an event log instance.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
tEventlogFormat format; ///< The format of the log output
|
||||
///< (kEventlogFormatReadable or kEventlogFormatParsable)
|
||||
tEventlogOutputCb pfnOutput; ///< Function pointer to the output function
|
||||
UINT32 filterLevel; ///< The level filter. It contains a bitmask with all
|
||||
///< levels to be printed.
|
||||
UINT32 filterCategory; ///< The category filter. It contains a bitmask with all
|
||||
///< categories to be printed.
|
||||
} tEventlogInstance;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local vars
|
||||
//------------------------------------------------------------------------------
|
||||
static tEventlogInstance eventlogInstance_l;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
static void printMessage(const char* message_p);
|
||||
|
||||
//============================================================================//
|
||||
// P U B L I C F U N C T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Initialize event logger
|
||||
|
||||
The function initializes the event logger. It sets up the logging filter and
|
||||
the logging format. A callback function that is used by the logger for
|
||||
printing log messages must be provided.
|
||||
|
||||
\param[in] format_p Specifies the logging format.
|
||||
\param[in] filterLevel_p Sets the filter for the logging level.
|
||||
\param[in] filterCategory_p Sets the filter for the logging category.
|
||||
\param[in] pfnOutput_p A callback function to be provided to the logger
|
||||
for printing log messages.
|
||||
\ingroup module_app_eventlog
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void eventlog_init(tEventlogFormat format_p,
|
||||
UINT32 filterLevel_p,
|
||||
UINT32 filterCategory_p,
|
||||
tEventlogOutputCb pfnOutput_p)
|
||||
{
|
||||
eventlogInstance_l.format = format_p;
|
||||
eventlogInstance_l.pfnOutput = pfnOutput_p;
|
||||
eventlogInstance_l.filterLevel = filterLevel_p;
|
||||
eventlogInstance_l.filterCategory = filterCategory_p;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Print a generic log message
|
||||
|
||||
The function can be used to print a generic log message. You can specify a
|
||||
printf style format string for printing.
|
||||
|
||||
\param[in] level_p The log level to be used for the output.
|
||||
\param[in] category_p The log category to be used for the output.
|
||||
\param[in] fmt_p The printf style format string which specifies the
|
||||
message.
|
||||
\param[in] ... Required arguments according to the format string.
|
||||
\ingroup module_app_eventlog
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void eventlog_printMessage(tEventlogLevel level_p,
|
||||
tEventlogCategory category_p,
|
||||
const char* fmt_p,
|
||||
...)
|
||||
{
|
||||
va_list arglist;
|
||||
char logMsg[EVENTLOG_MAX_LENGTH];
|
||||
|
||||
if (!((eventlogInstance_l.filterLevel & (1 << level_p)) &&
|
||||
(eventlogInstance_l.filterCategory & (1 << category_p))))
|
||||
return;
|
||||
|
||||
va_start(arglist, fmt_p);
|
||||
eventlog_createMessageString(logMsg,
|
||||
EVENTLOG_MAX_LENGTH,
|
||||
level_p,
|
||||
category_p,
|
||||
fmt_p,
|
||||
arglist);
|
||||
va_end(arglist);
|
||||
|
||||
printMessage(logMsg);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Print a node event
|
||||
|
||||
The function is used to log openPOWERLINK node events.
|
||||
|
||||
\param[in] pNodeEvent_p The node event information to be logged.
|
||||
|
||||
\ingroup module_app_eventlog
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void eventlog_printNodeEvent(const tOplkApiEventNode* pNodeEvent_p)
|
||||
{
|
||||
char logMsg[EVENTLOG_MAX_LENGTH];
|
||||
|
||||
if (!((eventlogInstance_l.filterLevel & (1 << kEventlogLevelEvent)) &&
|
||||
(eventlogInstance_l.filterCategory & (1 << kEventlogCategoryNodeEvent))))
|
||||
return;
|
||||
|
||||
eventlog_createNodeEventString(pNodeEvent_p,
|
||||
eventlogInstance_l.format,
|
||||
logMsg,
|
||||
EVENTLOG_MAX_LENGTH);
|
||||
printMessage(logMsg);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Print a state change event
|
||||
|
||||
The function is used to log openPOWERLINK state change events.
|
||||
|
||||
\param[in] pStateChangeEvent_p The state change event information to be logged.
|
||||
|
||||
\ingroup module_app_eventlog
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void eventlog_printStateEvent(const tEventNmtStateChange* pStateChangeEvent_p)
|
||||
{
|
||||
char logMsg[EVENTLOG_MAX_LENGTH];
|
||||
|
||||
if (!((eventlogInstance_l.filterLevel & (1 << kEventlogLevelEvent)) &&
|
||||
(eventlogInstance_l.filterCategory & (1 << kEventlogCategoryStateChangeEvent))))
|
||||
return;
|
||||
|
||||
eventlog_createStateEventString(pStateChangeEvent_p,
|
||||
eventlogInstance_l.format,
|
||||
logMsg,
|
||||
EVENTLOG_MAX_LENGTH);
|
||||
printMessage(logMsg);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Print a CFM result event
|
||||
|
||||
The function is used to log openPOWERLINK CFM result events.
|
||||
|
||||
\param[in] nodeId_p The node ID of the node specified in the received
|
||||
event.
|
||||
\param[in] nodeCommand_p The nodeCommand of the received CFM result event.
|
||||
|
||||
\ingroup module_app_eventlog
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void eventlog_printCfmResultEvent(UINT8 nodeId_p,
|
||||
tNmtNodeCommand nodeCommand_p)
|
||||
{
|
||||
char logMsg[EVENTLOG_MAX_LENGTH];
|
||||
|
||||
if (!((eventlogInstance_l.filterLevel & (1 << kEventlogLevelEvent)) &&
|
||||
(eventlogInstance_l.filterCategory & (1 << kEventlogCategoryCfmResultEvent))))
|
||||
return;
|
||||
|
||||
eventlog_createCfmResultEventString(nodeId_p,
|
||||
nodeCommand_p,
|
||||
eventlogInstance_l.format,
|
||||
logMsg,
|
||||
EVENTLOG_MAX_LENGTH);
|
||||
printMessage(logMsg);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Print a CFM progress event
|
||||
|
||||
The function is used to log openPOWERLINK CFM progress events.
|
||||
|
||||
\param[in] pProgress_p The information about the received event.
|
||||
|
||||
\ingroup module_app_eventlog
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void eventlog_printCfmProgressEvent(const tCfmEventCnProgress* pProgress_p)
|
||||
{
|
||||
char logMsg[EVENTLOG_MAX_LENGTH];
|
||||
|
||||
if (!((eventlogInstance_l.filterLevel & (1 << kEventlogLevelEvent)) &&
|
||||
(eventlogInstance_l.filterCategory & (1 << kEventlogCategoryCfmProgressEvent))))
|
||||
return;
|
||||
|
||||
eventlog_createCfmProgressEventString(pProgress_p,
|
||||
eventlogInstance_l.format,
|
||||
logMsg,
|
||||
EVENTLOG_MAX_LENGTH);
|
||||
printMessage(logMsg);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Print a PDO change event
|
||||
|
||||
The function is used to log openPOWERLINK PDO change events.
|
||||
|
||||
\param[in] pPdoChange_p The information about the received event.
|
||||
|
||||
\ingroup module_app_eventlog
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void eventlog_printPdoEvent(const tOplkApiEventPdoChange* pPdoChange_p)
|
||||
{
|
||||
char logMsg[EVENTLOG_MAX_LENGTH];
|
||||
|
||||
if (!((eventlogInstance_l.filterLevel & (1 << kEventlogLevelEvent)) &&
|
||||
(eventlogInstance_l.filterCategory & (1 << kEventlogCategoryPdoEvent))))
|
||||
return;
|
||||
|
||||
eventlog_createPdoEventString(pPdoChange_p,
|
||||
eventlogInstance_l.format,
|
||||
logMsg,
|
||||
EVENTLOG_MAX_LENGTH);
|
||||
printMessage(logMsg);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Log a PDO mapping information
|
||||
|
||||
The function is used to log openPOWERLINK PDO mappings.
|
||||
|
||||
\param[in] mapObject_p The object index of the mapping object.
|
||||
\param[in] subIndex_p The sub-index of the mapping object.
|
||||
\param[in] mapping_p The 64bit mapping information.
|
||||
|
||||
\ingroup module_app_eventlog
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void eventlog_printPdoMap(UINT16 mapObject_p,
|
||||
UINT8 subIndex_p,
|
||||
UINT64 mapping_p)
|
||||
{
|
||||
char logMsg[EVENTLOG_MAX_LENGTH];
|
||||
|
||||
if (!((eventlogInstance_l.filterLevel & (1 << kEventlogLevelInfo)) &&
|
||||
(eventlogInstance_l.filterCategory & (1 << kEventlogCategoryPdoMap))))
|
||||
return;
|
||||
|
||||
eventlog_createPdoMapString(mapObject_p,
|
||||
subIndex_p,
|
||||
mapping_p,
|
||||
eventlogInstance_l.format,
|
||||
logMsg,
|
||||
EVENTLOG_MAX_LENGTH);
|
||||
printMessage(logMsg);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Log a history event
|
||||
|
||||
The function is used to log openPOWERLINK history events.
|
||||
|
||||
\param[in] pHistory_p The information about the history event to log.
|
||||
|
||||
\ingroup module_app_eventlog
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void eventlog_printHistoryEvent(const tErrHistoryEntry* pHistory_p)
|
||||
{
|
||||
char logMsg[EVENTLOG_MAX_LENGTH];
|
||||
|
||||
if (!((eventlogInstance_l.filterLevel & (1 << kEventlogLevelEvent)) &&
|
||||
(eventlogInstance_l.filterCategory & (1 << kEventlogCategoryHistoryEvent))))
|
||||
return;
|
||||
|
||||
eventlog_createHistoryEventString(pHistory_p,
|
||||
eventlogInstance_l.format,
|
||||
logMsg,
|
||||
EVENTLOG_MAX_LENGTH);
|
||||
printMessage(logMsg);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Log an error event
|
||||
|
||||
The function is used to log openPOWERLINK error/warning events.
|
||||
|
||||
\param[in] pError_p The information about the error event to log.
|
||||
|
||||
\ingroup module_app_eventlog
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void eventlog_printErrorEvent(const tEventError* pError_p)
|
||||
{
|
||||
char logMsg[EVENTLOG_MAX_LENGTH];
|
||||
|
||||
if (!((eventlogInstance_l.filterLevel & (1 << kEventlogLevelEvent)) &&
|
||||
(eventlogInstance_l.filterCategory & (1 << kEventlogCategoryErrorEvent))))
|
||||
return;
|
||||
|
||||
eventlog_createErrorEventString(pError_p,
|
||||
eventlogInstance_l.format,
|
||||
logMsg,
|
||||
EVENTLOG_MAX_LENGTH);
|
||||
printMessage(logMsg);
|
||||
}
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E F U N C T I O N S //
|
||||
//============================================================================//
|
||||
/// \name Private Functions
|
||||
/// \{
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Print event log message
|
||||
|
||||
The function prints the eventlog message by calling the registered printing
|
||||
callback function.
|
||||
|
||||
\param[in] message_p Event log message to be printed.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static void printMessage(const char* message_p)
|
||||
{
|
||||
if (eventlogInstance_l.pfnOutput != NULL)
|
||||
{
|
||||
eventlogInstance_l.pfnOutput(message_p);
|
||||
eventlogInstance_l.pfnOutput("\n");
|
||||
}
|
||||
}
|
||||
|
||||
/// \}
|
|
@ -0,0 +1,88 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file eventlog.h
|
||||
|
||||
\brief Definitions for event log module
|
||||
|
||||
This file contains definitions for the eventlog module.
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2016, B&R Industrial Automation GmbH
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
#ifndef _INC_eventlog_H_
|
||||
#define _INC_eventlog_H_
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include <oplk/oplk.h>
|
||||
#include <oplk/nmt.h>
|
||||
#include "eventlogstring.h"
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// typedef
|
||||
//------------------------------------------------------------------------------
|
||||
typedef int (*tEventlogOutputCb)(const char* fmt_p, ...);
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
void eventlog_init(tEventlogFormat format_p,
|
||||
UINT32 filterLevel,
|
||||
UINT32 filterCategory,
|
||||
tEventlogOutputCb pfnOutput_p);
|
||||
void eventlog_printMessage(tEventlogLevel level_p,
|
||||
tEventlogCategory category_p,
|
||||
const char* fmt_p,
|
||||
...);
|
||||
void eventlog_printNodeEvent(const tOplkApiEventNode* pNodeEvent_p);
|
||||
void eventlog_printStateEvent(const tEventNmtStateChange* pStateChangeEvent_p);
|
||||
void eventlog_printCfmResultEvent(UINT8 nodeId_p,
|
||||
tNmtNodeCommand nodeCommand_p);
|
||||
void eventlog_printCfmProgressEvent(const tCfmEventCnProgress* pProgress_p);
|
||||
void eventlog_printPdoEvent(const tOplkApiEventPdoChange* pPdoChange_p);
|
||||
void eventlog_printHistoryEvent(const tErrHistoryEntry* pHistory_p);
|
||||
void eventlog_printErrorEvent(const tEventError* pError_p);
|
||||
void eventlog_printPdoMap(UINT16 mapObject_p,
|
||||
UINT8 subIndex_p,
|
||||
UINT64 mapping_p);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _INC_eventlog_H_ */
|
|
@ -0,0 +1,782 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file eventlogstring.c
|
||||
|
||||
\brief openPOWERLIK application event logger - string functions
|
||||
|
||||
This module implements the string functions for the event logger. It creates
|
||||
the output strings for the miscellaneous events which can be printed by the
|
||||
event logger. The strings can be created according to the specified output
|
||||
format. Two output formats are available. kEventlogFormatParsable specifies
|
||||
a format that's intended to be parsed by evaluation and test tools.
|
||||
kEventlogFormatReadable is intended to be read by humans.
|
||||
|
||||
\ingroup module_app_eventlogstring
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2017, B&R Industrial Automation GmbH
|
||||
Copyright (c) 2017, Kalycito Infotech Private Limited
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include "eventlogstring.h"
|
||||
#include <oplk/debugstr.h>
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
|
||||
//============================================================================//
|
||||
// G L O B A L D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// module global vars
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// global function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
* String values for log levels
|
||||
*
|
||||
* The variable contains an array with all log level strings.
|
||||
*/
|
||||
static const char* const sEventlogLevel_l[] =
|
||||
{
|
||||
"FATAL ",
|
||||
"ERROR ",
|
||||
"WARNING ",
|
||||
"INFO ",
|
||||
"DEBUG ",
|
||||
"EVENT ",
|
||||
};
|
||||
|
||||
/**
|
||||
* String values for log categories
|
||||
*
|
||||
* The variable contains an array with all log category strings.
|
||||
*/
|
||||
static const char* const sEventlogCategory_l[] =
|
||||
{
|
||||
// Generic
|
||||
"GENERIC ",
|
||||
"CONTROL ",
|
||||
"APP ",
|
||||
"PDOMAP ",
|
||||
"OBDICT ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
//Events
|
||||
"NODE ",
|
||||
"CFM_RESULT ",
|
||||
"CFM_PROGRESS ",
|
||||
"STATE_CHANGE ",
|
||||
"PDO_CHANGE ",
|
||||
"HISTORY ",
|
||||
"ERROR ",
|
||||
"SDO ",
|
||||
"USER ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
};
|
||||
|
||||
/**
|
||||
* String values for node events
|
||||
*
|
||||
* The variable contains an array with all node event strings.
|
||||
*/
|
||||
static const char* const sLogEventNodeEvent_l[] =
|
||||
{
|
||||
"NmtNodeEventFound",
|
||||
"NmtNodeEventUpdateSw",
|
||||
"NmtNodeEventCheckConf",
|
||||
"NmtNodeEventUpdateConf",
|
||||
"NmtNodeEventVerifyConf",
|
||||
"NmtNodeEventReadyToStart",
|
||||
"NmtNodeEventNmtState",
|
||||
"NmtNodeEventError",
|
||||
"NmtNodeEventAmniReceived",
|
||||
"NmtNodeEventConfDone"
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local types
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local vars
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
static size_t createTimeString(char* string_p,
|
||||
size_t strlen_p);
|
||||
static size_t createLogLevelString(char* string_p,
|
||||
size_t strlen_p,
|
||||
tEventlogLevel logLevel_p);
|
||||
static size_t createLogCategoryString(char* string_p,
|
||||
size_t strlen_p,
|
||||
tEventlogCategory logCategory_p);
|
||||
|
||||
//============================================================================//
|
||||
// P U B L I C F U N C T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Create a generic log message
|
||||
|
||||
The function can be used to print a generic log message. You can specify a
|
||||
printf style format string for printing.
|
||||
|
||||
\param[out] message_p Pointer to the message which should be printed.
|
||||
\param[in] messageSize_p Size of the message string to be printed.
|
||||
\param[in] level_p The log level to be used for the output.
|
||||
\param[in] category_p The log category to be used for the output.
|
||||
\param[in] fmt_p The printf style format string which specifies the
|
||||
message.
|
||||
\param[in] arg_p Required arguments according to the format string.
|
||||
|
||||
\ingroup module_app_eventlogstring
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void eventlog_createMessageString(char* message_p,
|
||||
size_t messageSize_p,
|
||||
tEventlogLevel level_p,
|
||||
tEventlogCategory category_p,
|
||||
const char* fmt_p,
|
||||
va_list arg_p)
|
||||
{
|
||||
size_t len;
|
||||
|
||||
len = createTimeString(message_p, messageSize_p);
|
||||
len += createLogLevelString(message_p + len, messageSize_p - len, level_p);
|
||||
len += createLogCategoryString(message_p + len, messageSize_p - len, category_p);
|
||||
|
||||
len += vsnprintf(message_p + len, messageSize_p - len, fmt_p, arg_p);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Create a node event string
|
||||
|
||||
The function is used to log openPOWERLINK node events.
|
||||
|
||||
\param[in] pNodeEvent_p The node event information to be logged.
|
||||
\param[in] format_p The format of the created string (kEventlogFormatParsable
|
||||
or kEventlogFormatReadable).
|
||||
\param[out] message_p Buffer to store the created message string.
|
||||
\param[in] messageSize_p Size of the message buffer.
|
||||
|
||||
\ingroup module_app_eventlogstring
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void eventlog_createNodeEventString(const tOplkApiEventNode* pNodeEvent_p,
|
||||
tEventlogFormat format_p,
|
||||
char* message_p,
|
||||
size_t messageSize_p)
|
||||
{
|
||||
size_t len;
|
||||
|
||||
len = createTimeString(message_p, messageSize_p);
|
||||
len += createLogLevelString(message_p + len, messageSize_p - len, kEventlogLevelEvent);
|
||||
len += createLogCategoryString(message_p + len, messageSize_p - len, kEventlogCategoryNodeEvent);
|
||||
|
||||
switch (format_p)
|
||||
{
|
||||
case kEventlogFormatParsable:
|
||||
len += snprintf(message_p + len,
|
||||
messageSize_p - len,
|
||||
"%03d ",
|
||||
pNodeEvent_p->nodeId);
|
||||
len += snprintf(message_p + len,
|
||||
messageSize_p - len,
|
||||
"EVENT:0x%02X ",
|
||||
pNodeEvent_p->nodeEvent);
|
||||
len += snprintf(message_p + len,
|
||||
messageSize_p - len,
|
||||
"STATE:0x%02X ",
|
||||
pNodeEvent_p->nmtState);
|
||||
len += snprintf(message_p + len,
|
||||
messageSize_p - len,
|
||||
"ERROR:0x%04X MANDATORY:%d",
|
||||
pNodeEvent_p->errorCode,
|
||||
pNodeEvent_p->fMandatory);
|
||||
break;
|
||||
|
||||
case kEventlogFormatReadable:
|
||||
len = snprintf(message_p + len,
|
||||
messageSize_p,
|
||||
"Node=%3u, %s State:%s",
|
||||
pNodeEvent_p->nodeId,
|
||||
sLogEventNodeEvent_l[pNodeEvent_p->nodeEvent],
|
||||
debugstr_getNmtStateStr(pNodeEvent_p->nmtState));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Print a state change event
|
||||
|
||||
The function is used to log openPOWERLINK state change events.
|
||||
|
||||
\param[in] pStateChangeEvent_p The state change event information to be logged.
|
||||
\param[in] format_p The format of the created string (kEventlogFormatParsable
|
||||
or kEventlogFormatReadable).
|
||||
\param[out] message_p Buffer to store the created message string.
|
||||
\param[in] messageSize_p Size of the message buffer.
|
||||
|
||||
\ingroup module_app_eventlogstring
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void eventlog_createStateEventString(const tEventNmtStateChange* pStateChangeEvent_p,
|
||||
tEventlogFormat format_p,
|
||||
char* message_p,
|
||||
size_t messageSize_p)
|
||||
{
|
||||
size_t len;
|
||||
|
||||
len = createTimeString(message_p, messageSize_p);
|
||||
len += createLogLevelString(message_p + len, messageSize_p - len, kEventlogLevelEvent);
|
||||
len += createLogCategoryString(message_p + len, messageSize_p - len, kEventlogCategoryStateChangeEvent);
|
||||
|
||||
switch (format_p)
|
||||
{
|
||||
case kEventlogFormatParsable:
|
||||
len += snprintf(message_p + len,
|
||||
messageSize_p - len,
|
||||
"OLDSTATE:0x%03X NEWSTATE:0x%03X EVENT:0x%02X",
|
||||
pStateChangeEvent_p->oldNmtState,
|
||||
pStateChangeEvent_p->newNmtState,
|
||||
pStateChangeEvent_p->nmtEvent);
|
||||
break;
|
||||
|
||||
case kEventlogFormatReadable:
|
||||
len += snprintf(message_p + len,
|
||||
messageSize_p - len,
|
||||
"%s->%s Originating event:%s",
|
||||
debugstr_getNmtStateStr(pStateChangeEvent_p->oldNmtState),
|
||||
debugstr_getNmtStateStr(pStateChangeEvent_p->newNmtState),
|
||||
debugstr_getNmtEventStr(pStateChangeEvent_p->nmtEvent));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Create a CFM result event string
|
||||
|
||||
The function is used to log openPOWERLINK CFM result events.
|
||||
|
||||
\param[in] nodeId_p The node ID of the node specified in the received
|
||||
event.
|
||||
\param[in] nodeCommand_p The nodeCommand of the received CFM result event.
|
||||
\param[in] format_p The format of the created string (kEventlogFormatParsable
|
||||
or kEventlogFormatReadable).
|
||||
\param[out] message_p Buffer to store the created message string.
|
||||
\param[in] messageSize_p Size of the message buffer.
|
||||
|
||||
\ingroup module_app_eventlogstring
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void eventlog_createCfmResultEventString(UINT8 nodeId_p,
|
||||
tNmtNodeCommand nodeCommand_p,
|
||||
tEventlogFormat format_p,
|
||||
char* message_p,
|
||||
size_t messageSize_p)
|
||||
{
|
||||
size_t len;
|
||||
|
||||
len = createTimeString(message_p, messageSize_p);
|
||||
len += createLogLevelString(message_p + len, messageSize_p - len, kEventlogLevelEvent);
|
||||
len += createLogCategoryString(message_p + len, messageSize_p - len, kEventlogCategoryCfmResultEvent);
|
||||
|
||||
switch (format_p)
|
||||
{
|
||||
case kEventlogFormatParsable:
|
||||
len += snprintf(message_p + len, messageSize_p - len, "%03d ", nodeId_p);
|
||||
len += snprintf(message_p + len, messageSize_p - len, "0x%02X ", nodeCommand_p);
|
||||
break;
|
||||
|
||||
case kEventlogFormatReadable:
|
||||
len += snprintf(message_p + len,
|
||||
messageSize_p - len,
|
||||
"Node=%3d, %s", nodeId_p,
|
||||
debugstr_getNmtNodeCommandTypeStr(nodeCommand_p));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Create a CFM progress event
|
||||
|
||||
The function is used to log openPOWERLINK CFM progress events.
|
||||
|
||||
\param[in] pProgress_p The information about the CFM progress event.
|
||||
\param[in] format_p The format of the created string (kEventlogFormatParsable
|
||||
or kEventlogFormatReadable).
|
||||
\param[out] message_p Buffer to store the created message string.
|
||||
\param[in] messageSize_p Size of the message buffer.
|
||||
|
||||
\ingroup module_app_eventlogstring
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void eventlog_createCfmProgressEventString(const tCfmEventCnProgress* pProgress_p,
|
||||
tEventlogFormat format_p,
|
||||
char* message_p,
|
||||
size_t messageSize_p)
|
||||
{
|
||||
size_t len;
|
||||
|
||||
len = createTimeString(message_p, messageSize_p);
|
||||
len += createLogLevelString(message_p + len, messageSize_p - len, kEventlogLevelEvent);
|
||||
len += createLogCategoryString(message_p + len, messageSize_p - len, kEventlogCategoryCfmProgressEvent);
|
||||
|
||||
switch (format_p)
|
||||
{
|
||||
case kEventlogFormatParsable:
|
||||
len += snprintf(message_p + len,
|
||||
messageSize_p - len,
|
||||
"%03d ",
|
||||
pProgress_p->nodeId);
|
||||
len += snprintf(message_p + len,
|
||||
messageSize_p - len,
|
||||
"OBJECT:0x%04X/%03d ",
|
||||
pProgress_p->objectIndex,
|
||||
pProgress_p->objectSubIndex);
|
||||
len += snprintf(message_p + len,
|
||||
messageSize_p - len,
|
||||
"SIZE:%05lu DOWNLOADED:%04lu ",
|
||||
(ULONG)pProgress_p->totalNumberOfBytes,
|
||||
(ULONG)pProgress_p->bytesDownloaded);
|
||||
len += snprintf(message_p + len,
|
||||
messageSize_p - len,
|
||||
"ABORTCODE:0x%08X ERROR:0x%04X ",
|
||||
pProgress_p->sdoAbortCode,
|
||||
pProgress_p->error);
|
||||
break;
|
||||
|
||||
case kEventlogFormatReadable:
|
||||
len += snprintf(message_p + len,
|
||||
messageSize_p - len,
|
||||
"Node=%3u, Object 0x%X/%03u, ",
|
||||
pProgress_p->nodeId,
|
||||
pProgress_p->objectIndex,
|
||||
pProgress_p->objectSubIndex);
|
||||
|
||||
len += snprintf(message_p + len,
|
||||
messageSize_p - len,
|
||||
"%4lu/%4lu Bytes",
|
||||
(ULONG)pProgress_p->bytesDownloaded,
|
||||
(ULONG)pProgress_p->totalNumberOfBytes);
|
||||
|
||||
if ((pProgress_p->sdoAbortCode != 0) ||
|
||||
(pProgress_p->error != kErrorOk))
|
||||
{
|
||||
len += snprintf(message_p + len,
|
||||
messageSize_p - len,
|
||||
" -> SDO Abort=%s(0x%08X), Error=0x%04X",
|
||||
debugstr_getAbortCodeStr(pProgress_p->sdoAbortCode),
|
||||
pProgress_p->sdoAbortCode,
|
||||
pProgress_p->error);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Create a PDO change event string
|
||||
|
||||
The function creates a PDO change event string.
|
||||
|
||||
\param[in] pPdoChange_p The information about the PDO change event.
|
||||
\param[in] format_p The format of the created string (kEventlogFormatParsable
|
||||
or kEventlogFormatReadable).
|
||||
\param[out] message_p Buffer to store the created message string.
|
||||
\param[in] messageSize_p Size of the message buffer.
|
||||
|
||||
\ingroup module_app_eventlogstring
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void eventlog_createPdoEventString(const tOplkApiEventPdoChange* pPdoChange_p,
|
||||
tEventlogFormat format_p,
|
||||
char* message_p,
|
||||
size_t messageSize_p)
|
||||
{
|
||||
size_t len;
|
||||
|
||||
len = createTimeString(message_p, messageSize_p);
|
||||
len += createLogLevelString(message_p + len, messageSize_p - len, kEventlogLevelEvent);
|
||||
len += createLogCategoryString(message_p + len, messageSize_p - len, kEventlogCategoryPdoEvent);
|
||||
|
||||
switch (format_p)
|
||||
{
|
||||
case kEventlogFormatParsable:
|
||||
len += snprintf(message_p + len,
|
||||
messageSize_p - len,
|
||||
(pPdoChange_p->fTx ? "TPDO " : "RPDO "));
|
||||
len += snprintf(message_p + len,
|
||||
messageSize_p - len,
|
||||
"MAPOBJ:0x%04x NODE:%03d NUM:%d ",
|
||||
pPdoChange_p->mappParamIndex,
|
||||
pPdoChange_p->nodeId,
|
||||
pPdoChange_p->mappObjectCount);
|
||||
len += snprintf(message_p + len,
|
||||
messageSize_p - len,
|
||||
(pPdoChange_p->fActivated ? "ACTIVATE" : "DELETE"));
|
||||
break;
|
||||
|
||||
case kEventlogFormatReadable:
|
||||
len += snprintf(message_p + len,
|
||||
messageSize_p - len,
|
||||
"%sPDO = 0x%X to node %d with %d objects %s",
|
||||
(pPdoChange_p->fTx ? "T" : "R"),
|
||||
pPdoChange_p->mappParamIndex,
|
||||
pPdoChange_p->nodeId,
|
||||
pPdoChange_p->mappObjectCount,
|
||||
(pPdoChange_p->fActivated ? "activated" : "deleted"));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Create a PDO mapping information string
|
||||
|
||||
The function creates a PDO mapping information string.
|
||||
|
||||
\param[in] mapObject_p The object index of the mapping object.
|
||||
\param[in] subIndex_p The sub-index of the mapping object.
|
||||
\param[in] mapping_p The 64 bit mapping information.
|
||||
\param[in] format_p The format of the created string (kEventlogFormatParsable
|
||||
or kEventlogFormatReadable).
|
||||
\param[out] message_p Buffer to store the created message string.
|
||||
\param[in] messageSize_p Size of the message buffer.
|
||||
|
||||
\ingroup module_app_eventlogstring
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void eventlog_createPdoMapString(UINT16 mapObject_p,
|
||||
UINT8 subIndex_p,
|
||||
UINT64 mapping_p,
|
||||
tEventlogFormat format_p,
|
||||
char* message_p,
|
||||
size_t messageSize_p)
|
||||
{
|
||||
size_t len;
|
||||
|
||||
len = createTimeString(message_p, messageSize_p);
|
||||
len += createLogLevelString(message_p + len, messageSize_p - len, kEventlogLevelInfo);
|
||||
len += createLogCategoryString(message_p + len, messageSize_p - len, kEventlogCategoryPdoMap);
|
||||
|
||||
switch (format_p)
|
||||
{
|
||||
case kEventlogFormatParsable:
|
||||
len += snprintf(message_p + len,
|
||||
messageSize_p - len,
|
||||
"MAPOBJ:0x%04x/%d OBJECT:0x%04x/%d OFFSET:%d LEN:%d",
|
||||
mapObject_p,
|
||||
subIndex_p,
|
||||
(UINT32)(mapping_p & 0x000000000000FFFFULL),
|
||||
(UINT32)((mapping_p & 0x0000000000FF0000ULL) >> 16),
|
||||
(UINT16)((mapping_p & 0x0000FFFF00000000ULL) >> 32),
|
||||
(UINT16)((mapping_p & 0xFFFF000000000000ULL) >> 48));
|
||||
break;
|
||||
|
||||
case kEventlogFormatReadable:
|
||||
len += snprintf(message_p + len,
|
||||
messageSize_p - len,
|
||||
" 0x%04x/%d Mapped object 0x%X/%3d", mapObject_p, subIndex_p,
|
||||
(UINT32)(mapping_p & 0x000000000000FFFFULL),
|
||||
(UINT32)((mapping_p & 0x0000000000FF0000ULL) >> 16));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Create a history event string
|
||||
|
||||
The function creates a history event string.
|
||||
|
||||
\param[in] pHistory_p The information about the history event.
|
||||
\param[in] format_p The format of the created string (kEventlogFormatParsable
|
||||
or kEventlogFormatReadable).
|
||||
\param[out] message_p Buffer to store the created message string.
|
||||
\param[in] messageSize_p Size of the message buffer.
|
||||
|
||||
\ingroup module_app_eventlogstring
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void eventlog_createHistoryEventString(const tErrHistoryEntry* pHistory_p,
|
||||
tEventlogFormat format_p,
|
||||
char* message_p,
|
||||
size_t messageSize_p)
|
||||
{
|
||||
size_t len;
|
||||
|
||||
len = createTimeString(message_p, messageSize_p);
|
||||
len += createLogLevelString(message_p + len, messageSize_p - len, kEventlogLevelEvent);
|
||||
len += createLogCategoryString(message_p + len, messageSize_p - len, kEventlogCategoryHistoryEvent);
|
||||
|
||||
switch (format_p)
|
||||
{
|
||||
case kEventlogFormatParsable:
|
||||
len += snprintf(message_p + len,
|
||||
messageSize_p - len,
|
||||
"TYPE:0x%04X CODE:0x%04X INFO:0x%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X",
|
||||
pHistory_p->entryType,
|
||||
pHistory_p->errorCode,
|
||||
(UINT16)pHistory_p->aAddInfo[0],
|
||||
(UINT16)pHistory_p->aAddInfo[1],
|
||||
(UINT16)pHistory_p->aAddInfo[2],
|
||||
(UINT16)pHistory_p->aAddInfo[3],
|
||||
(UINT16)pHistory_p->aAddInfo[4],
|
||||
(UINT16)pHistory_p->aAddInfo[5],
|
||||
(UINT16)pHistory_p->aAddInfo[6],
|
||||
(UINT16)pHistory_p->aAddInfo[7]);
|
||||
break;
|
||||
|
||||
case kEventlogFormatReadable:
|
||||
len += snprintf(message_p + len,
|
||||
messageSize_p - len,
|
||||
"HistoryEntry: Type=0x%04X Code=0x%04X (0x%02X %02X %02X %02X %02X %02X %02X %02X)",
|
||||
pHistory_p->entryType,
|
||||
pHistory_p->errorCode,
|
||||
(UINT16)pHistory_p->aAddInfo[0],
|
||||
(UINT16)pHistory_p->aAddInfo[1],
|
||||
(UINT16)pHistory_p->aAddInfo[2],
|
||||
(UINT16)pHistory_p->aAddInfo[3],
|
||||
(UINT16)pHistory_p->aAddInfo[4],
|
||||
(UINT16)pHistory_p->aAddInfo[5],
|
||||
(UINT16)pHistory_p->aAddInfo[6],
|
||||
(UINT16)pHistory_p->aAddInfo[7]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Create an error event string
|
||||
|
||||
The function creates a string for openPOWERLINK error/warning events.
|
||||
|
||||
\param[in] pError_p The information about the error event.
|
||||
\param[in] format_p The format of the created string (kEventlogFormatParsable
|
||||
or kEventlogFormatReadable).
|
||||
\param[out] message_p Buffer to store the created message string.
|
||||
\param[in] messageSize_p Size of the message buffer.
|
||||
|
||||
\ingroup module_app_eventlogstring
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void eventlog_createErrorEventString(const tEventError* pError_p,
|
||||
tEventlogFormat format_p,
|
||||
char* message_p,
|
||||
size_t messageSize_p)
|
||||
{
|
||||
size_t len;
|
||||
UINT i;
|
||||
|
||||
len = createTimeString(message_p, messageSize_p);
|
||||
len += createLogLevelString(message_p + len, messageSize_p - len, kEventlogLevelEvent);
|
||||
len += createLogCategoryString(message_p + len, messageSize_p - len, kEventlogCategoryHistoryEvent);
|
||||
|
||||
switch (format_p)
|
||||
{
|
||||
case kEventlogFormatParsable:
|
||||
len += snprintf(message_p + len,
|
||||
messageSize_p - len,
|
||||
"SOURCE:0x%02X ERROR:0x%03X ARG",
|
||||
pError_p->eventSource,
|
||||
pError_p->oplkError);
|
||||
|
||||
for (i = 0; i < sizeof(pError_p->errorArg); ++i)
|
||||
{
|
||||
len += snprintf(message_p + len,
|
||||
messageSize_p - len,
|
||||
":0x%02X",
|
||||
*((UINT8*)&pError_p->errorArg + i));
|
||||
}
|
||||
break;
|
||||
|
||||
case kEventlogFormatReadable:
|
||||
len += snprintf(message_p + len,
|
||||
messageSize_p - len,
|
||||
"Source = %s (0x%02X) OplkError = %s (0x%03X) ",
|
||||
debugstr_getEventSourceStr(pError_p->eventSource),
|
||||
pError_p->eventSource,
|
||||
debugstr_getRetValStr(pError_p->oplkError),
|
||||
pError_p->oplkError);
|
||||
|
||||
// check additional argument
|
||||
switch (pError_p->eventSource)
|
||||
{
|
||||
case kEventSourceEventk:
|
||||
case kEventSourceEventu:
|
||||
// error occurred within event processing
|
||||
// either in kernel or in user part
|
||||
len += snprintf(message_p + len,
|
||||
messageSize_p - len,
|
||||
"OrgSource = %s 0x%02X",
|
||||
debugstr_getEventSourceStr(pError_p->errorArg.eventSource),
|
||||
pError_p->errorArg.eventSource);
|
||||
break;
|
||||
|
||||
case kEventSourceDllk:
|
||||
// error occurred within the data link layer (e.g. interrupt processing)
|
||||
// the DWORD argument contains the DLL state and the NMT event
|
||||
len += snprintf(message_p + len,
|
||||
messageSize_p - len,
|
||||
"Val = 0x%X",
|
||||
pError_p->errorArg.uintArg);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E F U N C T I O N S //
|
||||
//============================================================================//
|
||||
/// \name Private Functions
|
||||
/// \{
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Create timestamp string
|
||||
|
||||
The function creates the timestamp string.
|
||||
|
||||
\param[out] string_p String buffer to print to.
|
||||
\param[in] strlen_p Length of string buffer.
|
||||
|
||||
\return The function returns the number of characters printed to the log string.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static size_t createTimeString(char* string_p,
|
||||
size_t strlen_p)
|
||||
{
|
||||
time_t timeStamp;
|
||||
struct tm* p_timeVal;
|
||||
size_t len;
|
||||
|
||||
time(&timeStamp);
|
||||
p_timeVal = localtime(&timeStamp);
|
||||
len = strftime(string_p, strlen_p, "%Y/%m/%d-%H:%M:%S ", p_timeVal);
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Create log level string
|
||||
|
||||
The function creates the log level string.
|
||||
|
||||
\param[out] string_p String buffer to print to.
|
||||
\param[in] strlen_p Length of string buffer.
|
||||
\param[in] logLevel_p The log level to print.
|
||||
|
||||
\return The function returns the number of characters printed to the log string.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static size_t createLogLevelString(char* string_p,
|
||||
size_t strlen_p,
|
||||
tEventlogLevel logLevel_p)
|
||||
{
|
||||
size_t len;
|
||||
|
||||
len = snprintf(string_p,
|
||||
strlen_p,
|
||||
"%s ",
|
||||
sEventlogLevel_l[logLevel_p]);
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Create log category string
|
||||
|
||||
The function creates the log category string.
|
||||
|
||||
\param[out] string_p String buffer to print to.
|
||||
\param[in] strlen_p Length of string buffer.
|
||||
\param[in] logCategory_p The log category to print.
|
||||
|
||||
\return The function returns the number of characters printed to the log string.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static size_t createLogCategoryString(char* string_p,
|
||||
size_t strlen_p,
|
||||
tEventlogCategory logCategory_p)
|
||||
{
|
||||
size_t len;
|
||||
|
||||
len = snprintf(string_p,
|
||||
strlen_p,
|
||||
"%s ",
|
||||
sEventlogCategory_l[logCategory_p]);
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
/// \}
|
|
@ -0,0 +1,190 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file eventlogstring.h
|
||||
|
||||
\brief Definitions for eventlog string functions
|
||||
|
||||
This file contains the definitions for the string functions of the eventlog
|
||||
module.
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2016, B&R Industrial Automation GmbH
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
#ifndef _INC_eventlogstring_H_
|
||||
#define _INC_eventlogstring_H_
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include <oplk/oplk.h>
|
||||
#include <oplk/nmt.h>
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
// unfortunately older windows compilers don't support snprintf and vsnprintf
|
||||
#if (TARGET_SYSTEM == _WIN32_)
|
||||
#if (_MSC_VER < 1900)
|
||||
#define snprintf _snprintf
|
||||
#define vsnprintf _vsnprintf
|
||||
#endif
|
||||
#endif
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// typedef
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Enumeration for eventlog levels
|
||||
*
|
||||
* This enumeration specifies the valid eventlog levels. The eventlog levels
|
||||
* are used to filter the eventlog output.
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
kEventlogLevelFatal = 0, ///< Fatal errors
|
||||
kEventlogLevelError, ///< Errors
|
||||
kEventlogLevelWarning, ///< Warnings
|
||||
kEventlogLevelInfo, ///< Information
|
||||
kEventlogLevelDebug, ///< Debug information
|
||||
kEventlogLevelEvent, ///< Events
|
||||
} eEventlogLevel;
|
||||
|
||||
typedef UINT32 tEventlogLevel;
|
||||
|
||||
/**
|
||||
* Enumeration for eventlog categories
|
||||
*
|
||||
* The eventlog is separated in different output categories. This enumeration
|
||||
* lists the valid categories. The categories are used to filter the eventlog
|
||||
* output.
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
kEventlogCategoryGeneric = 0, ///< Generic information
|
||||
kEventlogCategoryControl, ///< Control information
|
||||
kEventlogCategoryApplication, ///< Information of the Application
|
||||
kEventlogCategoryPdoMap, ///< PDO mapping information
|
||||
kEventlogCategoryObjectDictionary, ///< Object dictionary information
|
||||
|
||||
kEventlogCategoryNodeEvent = 15, ///< Node events
|
||||
kEventlogCategoryCfmResultEvent, ///< CfmResult events
|
||||
kEventlogCategoryCfmProgressEvent, ///< CfmProgress events
|
||||
kEventlogCategoryStateChangeEvent, ///< StateChange events
|
||||
kEventlogCategoryPdoEvent, ///< Pdo events
|
||||
kEventlogCategoryHistoryEvent, ///< History events
|
||||
kEventlogCategoryErrorEvent, ///< Error events
|
||||
kEventlogCategorySdoEvent, ///< Sdo events
|
||||
kEventlogCategoryUserEvent, ///< User event
|
||||
} eEventlogCategory;
|
||||
|
||||
typedef UINT32 tEventlogCategory;
|
||||
|
||||
/**
|
||||
* Enumeration for CFM events
|
||||
*
|
||||
* This enumeration lists the valid CFM events.
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
kLogEventCfmProgress = 0, ///< CFM progress event
|
||||
kLogEventCfmResult ///< CFM result event
|
||||
} eEventlogEventCfmType;
|
||||
|
||||
typedef UINT32 tEventlogEventCfmType;
|
||||
|
||||
/**
|
||||
* Enumeration for eventlog output format
|
||||
*
|
||||
* This enumeration lists the valid eventlog output formats.
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
kEventlogFormatParsable, ///< Parsable format. Intended for further processing.
|
||||
kEventlogFormatReadable ///< Readable format. Optimized for easy reading by humans.
|
||||
} eEventlogFormat;
|
||||
|
||||
typedef UINT32 tEventlogFormat;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
void eventlog_createMessageString(char* message_p,
|
||||
size_t messageSize_p,
|
||||
tEventlogLevel level_p,
|
||||
tEventlogCategory category_p,
|
||||
const char* fmt_p,
|
||||
va_list arg_p);
|
||||
void eventlog_createNodeEventString(const tOplkApiEventNode* pNodeEvent_p,
|
||||
tEventlogFormat format_p,
|
||||
char* message_p,
|
||||
size_t messageSize_p);
|
||||
void eventlog_createStateEventString(const tEventNmtStateChange* pStateChangeEvent_p,
|
||||
tEventlogFormat format_p,
|
||||
char* message_p,
|
||||
size_t messageSize_p);
|
||||
void eventlog_createCfmResultEventString(UINT8 nodeId_p,
|
||||
tNmtNodeCommand nodeCommand_p,
|
||||
tEventlogFormat format_p,
|
||||
char* message_p,
|
||||
size_t messageSize_p);
|
||||
void eventlog_createCfmProgressEventString(const tCfmEventCnProgress* pProgress_p,
|
||||
tEventlogFormat format_p,
|
||||
char* message_p,
|
||||
size_t messageSize_p);
|
||||
void eventlog_createPdoEventString(const tOplkApiEventPdoChange* pPdoChange_p,
|
||||
tEventlogFormat format_p,
|
||||
char* message_p,
|
||||
size_t messageSize_p);
|
||||
void eventlog_createHistoryEventString(const tErrHistoryEntry* pHistory_p,
|
||||
tEventlogFormat format_p,
|
||||
char* message_p,
|
||||
size_t messageSize_p);
|
||||
void eventlog_createErrorEventString(const tEventError* pError_p,
|
||||
tEventlogFormat format_p,
|
||||
char* message_p,
|
||||
size_t messageSize_p);
|
||||
void eventlog_createPdoMapString(UINT16 mapObject_p,
|
||||
UINT8 subIndex_p,
|
||||
UINT64 mapping_p,
|
||||
tEventlogFormat format_p,
|
||||
char* message_p,
|
||||
size_t messageSize_p);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _INC_eventlogstring_H_ */
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,106 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file firmwarecheck.h
|
||||
|
||||
\brief Header file of the firmware check module
|
||||
|
||||
This header file contains the definitions of the firware check module.
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2017, B&R Industrial Automation GmbH
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
#ifndef _INC_firmwarecheck_H_
|
||||
#define _INC_firmwarecheck_H_
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include <oplk/oplk.h>
|
||||
#include <firmwaremanager/firmwaremanager.h>
|
||||
#include <firmwaremanager/firmwareinfo.h>
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#define FIRMWARECHECK_INVALID_NODEID C_ADR_INVALID
|
||||
#define FIRMWARECHECK_MAX_NODEID C_ADR_BROADCAST
|
||||
#define FIRMWARECHECK_INVALID_SDO ((UINT)-1)
|
||||
|
||||
#ifndef tabentries
|
||||
#define tabentries(aVar_p) (sizeof(aVar_p) / sizeof(*(aVar_p)))
|
||||
#endif
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// typedef
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief No firmware update required
|
||||
|
||||
This function is called if a firmware update is not required for a certain node.
|
||||
|
||||
\param nodeId_p [in] ID of the already up-to-date node
|
||||
\param pSdoConnection_p [in] Pointer to SDO connection handle
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
typedef tFirmwareRet (*tNoFirmwareCheckNodeCb)(UINT nodeId_p,
|
||||
tSdoComConHdl* pSdoConnection_p);
|
||||
|
||||
/**
|
||||
\brief Firmware check configuration
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
tFirmwareInfoHandle pFwInfo; ///< Handle of the firmware store instance
|
||||
///< for accessing the firmware configuration
|
||||
tNoFirmwareCheckNodeCb pfnNoUpdateRequired; ///< No update required callback
|
||||
} tFirmwareCheckConfig;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
tFirmwareRet firmwarecheck_init(const tFirmwareCheckConfig* pConfig_p);
|
||||
void firmwarecheck_exit(void);
|
||||
tFirmwareRet firmwarecheck_processNodeEvent(UINT nodeId_p);
|
||||
tFirmwareRet firmwarecheck_processSdoEvent(const tSdoComFinished* pSdoComFinished_p);
|
||||
tFirmwareRet firmwarecheck_checkModulesOfNextNode(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _INC_firmwareinfo_H_ */
|
|
@ -0,0 +1,292 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file firmwareinfo.c
|
||||
|
||||
\brief Source file of the firmware info module
|
||||
|
||||
This module implements an access to firmware information generated by the
|
||||
openCONFIGURATOR.
|
||||
|
||||
\ingroup module_app_firmwaremanager
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2017, B&R Industrial Automation GmbH
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include <firmwaremanager/firmwareinfo.h>
|
||||
|
||||
//============================================================================//
|
||||
// G L O B A L D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// module global vars
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// global function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local types
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
\brief Firmware info instance
|
||||
*/
|
||||
typedef struct tFirmwareInfoInstance
|
||||
{
|
||||
tFirmwareInfoConfig config; ///< Firmware info configuration
|
||||
tFirmwareInfoList pInfoList; ///< Firmware info list
|
||||
} tFirmwareInfoInstance;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local vars
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
static tFirmwareRet initInfoList(tFirmwareInfoInstance* pHandle_p);
|
||||
static tFirmwareInfo* findModuleInInfoList(tFirmwareInfoInstance* pHandle_p,
|
||||
const tFirmwareModuleInfo * pModuleInfo_p);
|
||||
|
||||
//============================================================================//
|
||||
// P U B L I C F U N C T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Create a firmware info instance
|
||||
|
||||
This function creates an instance of the firmware info module.
|
||||
|
||||
\param pConfig_p [in] Pointer to the configuration structure for instance
|
||||
creation.
|
||||
\param ppHandle_p [out] Pointer to a firmware info handle which is filled if
|
||||
creation was successful.
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
|
||||
\ingroup module_app_firmwaremanager
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
tFirmwareRet firmwareinfo_create(const tFirmwareInfoConfig* pConfig_p,
|
||||
tFirmwareInfoHandle* ppHandle_p)
|
||||
{
|
||||
tFirmwareRet ret = kFwReturnOk;
|
||||
tFirmwareInfoInstance* instance = NULL;
|
||||
|
||||
if ((pConfig_p == NULL) || (ppHandle_p == NULL))
|
||||
{
|
||||
ret = kFwReturnInvalidParameter;
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
instance = (tFirmwareInfoInstance*)malloc(sizeof(tFirmwareInfoInstance));
|
||||
if (instance == NULL)
|
||||
{
|
||||
ret = kFwReturnNoResource;
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
memset(instance, 0, sizeof(tFirmwareInfoInstance));
|
||||
memcpy(&instance->config, pConfig_p, sizeof(tFirmwareInfoConfig));
|
||||
|
||||
ret = initInfoList(instance);
|
||||
|
||||
EXIT:
|
||||
if (ret == kFwReturnOk)
|
||||
{
|
||||
*ppHandle_p = instance;
|
||||
}
|
||||
else
|
||||
{
|
||||
free(instance);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Destroy a firmware info instance
|
||||
|
||||
This function destroys an instance of the firmware info module.
|
||||
|
||||
\param pHandle_p [in] Handle of the firmware info instance which shall be
|
||||
destroyed.
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
|
||||
\ingroup module_app_firmwaremanager
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
tFirmwareRet firmwareinfo_destroy(tFirmwareInfoHandle pHandle_p)
|
||||
{
|
||||
tFirmwareRet ret = kFwReturnOk;
|
||||
|
||||
if (pHandle_p != NULL)
|
||||
{
|
||||
firmwareinfodecode_freeInfo(pHandle_p->pInfoList);
|
||||
free(pHandle_p);
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = kFwReturnInvalidInstance;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Get the firmware info a specific module
|
||||
|
||||
This function gets the available firmware information for a specified module.
|
||||
|
||||
\param pHandle_p [in] Handle of the firmware info instance
|
||||
\param pModuleInfo_p [in] Pointer to the module info specifying the requested
|
||||
module.
|
||||
\param ppFwInfo_p [out] Pointer to a firmware info pointer which is filled
|
||||
if an associated firmware info is available for
|
||||
the specified module.
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
|
||||
\ingroup module_app_firmwaremanager
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
tFirmwareRet firmwareinfo_getInfoForNode(tFirmwareInfoHandle pHandle_p,
|
||||
const tFirmwareModuleInfo * pModuleInfo_p,
|
||||
tFirmwareInfo** ppFwInfo_p)
|
||||
{
|
||||
tFirmwareRet ret = kFwReturnOk;
|
||||
tFirmwareInfo* pInfo = NULL;
|
||||
|
||||
if (pHandle_p == NULL)
|
||||
{
|
||||
ret = kFwReturnInvalidInstance;
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
if ((pModuleInfo_p == NULL) || (ppFwInfo_p == NULL))
|
||||
{
|
||||
ret = kFwReturnInvalidParameter;
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
pInfo = findModuleInInfoList(pHandle_p, pModuleInfo_p);
|
||||
|
||||
if (pInfo != NULL)
|
||||
{
|
||||
*ppFwInfo_p = pInfo;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = kFwReturnModuleNotFound;
|
||||
}
|
||||
|
||||
EXIT:
|
||||
return ret;
|
||||
}
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E F U N C T I O N S //
|
||||
//============================================================================//
|
||||
/// \name Private Functions
|
||||
/// \{
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Initialize firmware info list
|
||||
|
||||
\param pHandle_p [in] Handle of the firmware info instance
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static tFirmwareRet initInfoList(tFirmwareInfoInstance* pHandle_p)
|
||||
{
|
||||
tFirmwareRet ret = kFwReturnOk;
|
||||
|
||||
ret = firmwareinfodecode_decodeInfo(pHandle_p->config.pFwStore,
|
||||
&pHandle_p->pInfoList);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Find module in firmware info list
|
||||
|
||||
\param pHandle_p [in] Handle of the firmware info instance
|
||||
\param pModuleInfo_p [in] Pointer to module info
|
||||
|
||||
\return This functions returns a pointer to the firmware info list.
|
||||
\retval NULL No firmware info is found
|
||||
\retval !NULL Pointer to the found firmware info
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static tFirmwareInfo* findModuleInInfoList(tFirmwareInfoInstance* pHandle_p,
|
||||
const tFirmwareModuleInfo * pModuleInfo_p)
|
||||
{
|
||||
tFirmwareInfo* pInfo = NULL;
|
||||
tFirmwareInfoEntry* pIter = pHandle_p->pInfoList;
|
||||
|
||||
while (pIter != NULL)
|
||||
{
|
||||
if (memcmp(pModuleInfo_p, &pIter->fwInfo.moduleInfo,
|
||||
sizeof(tFirmwareModuleInfo)) == 0)
|
||||
{
|
||||
pInfo = &pIter->fwInfo;
|
||||
break;
|
||||
}
|
||||
|
||||
pIter = pIter->pNext;
|
||||
}
|
||||
|
||||
return pInfo;
|
||||
}
|
||||
|
||||
/// \}
|
|
@ -0,0 +1,90 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file firmwareinfo.h
|
||||
|
||||
\brief Header file of the firmware info module
|
||||
|
||||
This header file contains the definitions of the firware info module.
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2017, B&R Industrial Automation GmbH
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
#ifndef _INC_firmwareinfo_H_
|
||||
#define _INC_firmwareinfo_H_
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include <firmwaremanager/firmwaremanager.h>
|
||||
#include <firmwaremanager/firmwareinfodecode.h>
|
||||
#include <firmwaremanager/firmwarestore.h>
|
||||
|
||||
#include <oplk/oplk.h>
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// typedef
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* \brief Handle to a firmware info instance
|
||||
*/
|
||||
typedef struct tFirmwareInfoInstance* tFirmwareInfoHandle;
|
||||
|
||||
/**
|
||||
* \brief Configuration structure for a firmware info instance
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
tFirmwareStoreHandle pFwStore; ///< Handle of the firmware store instance
|
||||
///< for accessing the firmware configuration
|
||||
} tFirmwareInfoConfig;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
tFirmwareRet firmwareinfo_create(const tFirmwareInfoConfig* pConfig_p,
|
||||
tFirmwareInfoHandle* ppHandle_p);
|
||||
tFirmwareRet firmwareinfo_destroy(tFirmwareInfoHandle pHandle_p);
|
||||
tFirmwareRet firmwareinfo_getInfoForNode(tFirmwareInfoHandle pHandle_p,
|
||||
const tFirmwareModuleInfo * pModuleInfo_p,
|
||||
tFirmwareInfo** ppFwInfo_p);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _INC_firmwareinfo_H_ */
|
|
@ -0,0 +1,311 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file firmwareinfodecode-ascii.c
|
||||
|
||||
\brief Source file of the firmware info decode module for ASCII format
|
||||
|
||||
This module implements the decoding of the firmware informations stored as
|
||||
ASCII information.
|
||||
|
||||
\ingroup module_app_firmwaremanager
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2017, B&R Industrial Automation GmbH
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include <firmwaremanager/firmwareinfodecode.h>
|
||||
#include <firmwaremanager/firmwarestore.h>
|
||||
|
||||
#include <string.h>
|
||||
|
||||
//============================================================================//
|
||||
// G L O B A L D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// module global vars
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// global function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#define FIRMWAREINFO_ASCII_LINE_SEPERATOR "\n"
|
||||
#define FIRMWAREINFO_LINE_FORMAT "%x\t%x\t%x\t%x\t%x\t%x\t%x\t%255s"
|
||||
#define FIRMWAREINFO_FW_IMAGE_PATH_LENGTH 256u
|
||||
#define FIRMWAREINFO_NUMBER_OF_VALUES_PER_LINE 8
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local types
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local vars
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
static tFirmwareRet parseLine(tFirmwareStoreHandle pFwStore_p, char* pLine_p,
|
||||
tFirmwareInfo* pInfo_p);
|
||||
|
||||
//============================================================================//
|
||||
// P U B L I C F U N C T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Decode the firmware information
|
||||
|
||||
This function decodes the information contained in the passed storage. The
|
||||
resulting information will be stored in a list returned via \ref ppInfoList_p.
|
||||
The memory required for the firmware informations is allocated and must be freed
|
||||
by calling \ref firmwareinfodecode_freeInfo.
|
||||
|
||||
\param pStore_p [in] Handle of the firmware store module accessing the
|
||||
information storage.
|
||||
\param ppInfoList_p [out] Pointer to a list of firmware infos which will be
|
||||
filled with the decoded information.
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
|
||||
\ingroup module_app_firmwaremanager
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
tFirmwareRet firmwareinfodecode_decodeInfo(tFirmwareStoreHandle pStore_p,
|
||||
tFirmwareInfoList* ppInfoList_p)
|
||||
{
|
||||
tFirmwareRet ret = kFwReturnOk;
|
||||
size_t dataSize;
|
||||
void* pData;
|
||||
char* pFileString;
|
||||
char* pLine;
|
||||
tFirmwareInfoList pList = NULL;
|
||||
tFirmwareInfoEntry** ppInsertIter = &pList;
|
||||
tFirmwareInfoEntry* pEntry = NULL;
|
||||
|
||||
if (ppInfoList_p == NULL)
|
||||
{
|
||||
ret = kFwReturnInvalidParameter;
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
ret = firmwarestore_loadData(pStore_p);
|
||||
if (ret != kFwReturnOk)
|
||||
{
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
ret = firmwarestore_getData(pStore_p, &pData, &dataSize);
|
||||
if (ret != kFwReturnOk)
|
||||
{
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
pFileString = pData;
|
||||
|
||||
pLine = strtok(pFileString, FIRMWAREINFO_ASCII_LINE_SEPERATOR);
|
||||
|
||||
while (pLine != NULL)
|
||||
{
|
||||
pEntry = (tFirmwareInfoEntry*)malloc(sizeof(tFirmwareInfoEntry));
|
||||
if (pEntry == NULL)
|
||||
{
|
||||
ret = kFwReturnNoResource;
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
memset(pEntry, 0, sizeof(tFirmwareInfoEntry));
|
||||
|
||||
ret = parseLine(pStore_p, pLine, &pEntry->fwInfo);
|
||||
if (ret == kFwReturnOk)
|
||||
{
|
||||
if (*ppInsertIter != NULL)
|
||||
{
|
||||
(*ppInsertIter)->pNext = pEntry;
|
||||
}
|
||||
*ppInsertIter = pEntry;
|
||||
ppInsertIter = &pEntry->pNext;
|
||||
}
|
||||
else
|
||||
{
|
||||
free(pEntry);
|
||||
|
||||
if (ret == kFwReturnIgnoreInfoFileLine)
|
||||
{
|
||||
ret = kFwReturnOk;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
pLine = strtok(NULL, FIRMWAREINFO_ASCII_LINE_SEPERATOR);
|
||||
}
|
||||
|
||||
*ppInfoList_p = pList;
|
||||
|
||||
EXIT:
|
||||
(void)firmwarestore_flushData(pStore_p);
|
||||
|
||||
if (ret != kFwReturnOk)
|
||||
{
|
||||
while (pList != NULL)
|
||||
{
|
||||
pEntry = pList;
|
||||
pList = pEntry->pNext;
|
||||
free(pEntry);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Free the decoded firmware information
|
||||
|
||||
This function frees the by \ref firmwareinfodecode_decodeInfo previously
|
||||
allocated resources.
|
||||
|
||||
\param pInfoList_p [int] List of firmware informations which shall be freed
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
|
||||
\ingroup module_app_firmwaremanager
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
tFirmwareRet firmwareinfodecode_freeInfo(tFirmwareInfoList pInfoList_p)
|
||||
{
|
||||
tFirmwareRet ret = kFwReturnOk;
|
||||
tFirmwareInfoEntry* rem;
|
||||
tFirmwareInfoList pInfoList = pInfoList_p;
|
||||
|
||||
if (pInfoList_p != NULL)
|
||||
{
|
||||
while (pInfoList != NULL)
|
||||
{
|
||||
rem = pInfoList;
|
||||
pInfoList = rem->pNext;
|
||||
free(rem);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = kFwReturnInvalidParameter;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E F U N C T I O N S //
|
||||
//============================================================================//
|
||||
/// \name Private Functions
|
||||
/// \{
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Parse line of firmware info file
|
||||
|
||||
This function parses the given line of a firmware info file and returns the
|
||||
firmware information.
|
||||
|
||||
\param pStore_p [in] Handle of the firmware store module accessing the
|
||||
information storage.
|
||||
\param pLine_p [in] Line to be parsed
|
||||
\param pInfo_p [out] Pointer used to return the firmware information
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static tFirmwareRet parseLine(tFirmwareStoreHandle pFwStore_p, char* pLine_p,
|
||||
tFirmwareInfo* pInfo_p)
|
||||
{
|
||||
tFirmwareRet ret = kFwReturnOk;
|
||||
tFirmwareInfo info;
|
||||
int result;
|
||||
tFirmwareStoreConfig storeConfig;
|
||||
char imagePath[FIRMWAREINFO_FW_IMAGE_PATH_LENGTH];
|
||||
char completePath[FIRMWAREINFO_FW_IMAGE_PATH_LENGTH];
|
||||
void* baseInfo;
|
||||
|
||||
memset(imagePath, 0, FIRMWAREINFO_FW_IMAGE_PATH_LENGTH);
|
||||
|
||||
result = sscanf(pLine_p, FIRMWAREINFO_LINE_FORMAT, (unsigned int*)&info.moduleInfo.nodeId,
|
||||
&info.moduleInfo.vendorId, &info.moduleInfo.productId,
|
||||
&info.moduleInfo.hwVariant, &info.appSwDate,
|
||||
&info.appSwTime, (unsigned int*)&info.fFirmwareLocked, imagePath);
|
||||
|
||||
if (result != FIRMWAREINFO_NUMBER_OF_VALUES_PER_LINE)
|
||||
{
|
||||
ret = kFwReturnIgnoreInfoFileLine;
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
memset(&storeConfig, 0, sizeof(tFirmwareStoreConfig));
|
||||
|
||||
ret = firmwarestore_getBase(pFwStore_p, &baseInfo);
|
||||
if (ret != kFwReturnOk)
|
||||
{
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
sprintf(completePath, "%s%c%s", (char*)baseInfo, FIRMWARESTORE_PATH_DIR_SEP, imagePath);
|
||||
|
||||
storeConfig.pFilename = completePath;
|
||||
|
||||
ret = firmwarestore_create(&storeConfig, &info.pFwImage);
|
||||
if (ret != kFwReturnOk)
|
||||
{
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
memcpy(pInfo_p, &info, sizeof(tFirmwareInfo));
|
||||
|
||||
EXIT:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/// \}
|
|
@ -0,0 +1,111 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file firmwareinfodecode.h
|
||||
|
||||
\brief Header file of the firmware info decode module
|
||||
|
||||
This header file contains the definitions of the firware info decoe module.
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2017, B&R Industrial Automation GmbH
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
#ifndef _INC_firmwareinfodecode_H_
|
||||
#define _INC_firmwareinfodecode_H_
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include <firmwaremanager/firmwaremanager.h>
|
||||
#include <firmwaremanager/firmwarestore.h>
|
||||
|
||||
#include <oplk/oplk.h>
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// typedef
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
\brief Information structure representing a module
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
UINT8 nodeId; ///< ID of the node
|
||||
UINT32 vendorId; ///< Vendor ID of the module
|
||||
UINT32 productId; ///< Product ID of the module
|
||||
UINT32 hwVariant; ///< Hardware variant of the module
|
||||
} tFirmwareModuleInfo;
|
||||
|
||||
/**
|
||||
\brief Structure containing information about the configured firmware
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
tFirmwareModuleInfo moduleInfo; ///< Info of the associated module
|
||||
UINT32 appSwDate; ///< Software date of the configured firmware
|
||||
UINT32 appSwTime; ///< Software time of the configured firmware
|
||||
BOOL fFirmwareLocked; ///< Flag for representation if the firmware
|
||||
///< should be locked, this functionality is
|
||||
///< currently not supported.
|
||||
tFirmwareStoreHandle pFwImage; ///< Handle of the firmware store instance for
|
||||
///< accessing the firmware
|
||||
} tFirmwareInfo;
|
||||
|
||||
/**
|
||||
\brief List entry for a firmware info
|
||||
*/
|
||||
typedef struct tFirmwareInfoEntry
|
||||
{
|
||||
tFirmwareInfo fwInfo; ///< Firmware info structure
|
||||
struct tFirmwareInfoEntry* pNext; ///< Pointer to the next entry within list
|
||||
} tFirmwareInfoEntry;
|
||||
|
||||
/**
|
||||
\brief List of firmware info entries
|
||||
*/
|
||||
typedef tFirmwareInfoEntry* tFirmwareInfoList;
|
||||
//------------------------------------------------------------------------------
|
||||
// function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
tFirmwareRet firmwareinfodecode_decodeInfo(tFirmwareStoreHandle pStore_p,
|
||||
tFirmwareInfoList* ppInfoList_p);
|
||||
tFirmwareRet firmwareinfodecode_freeInfo(tFirmwareInfoList pInfoList_p);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _INC_firmwareinfodecode_H_ */
|
|
@ -0,0 +1,541 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file firmwaremanager.c
|
||||
|
||||
\brief Source file of the firmware manager
|
||||
|
||||
This module implements the firmware manager.
|
||||
|
||||
\ingroup module_app_firmwaremanager
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2017, B&R Industrial Automation GmbH
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include <firmwaremanager/firmwaremanager.h>
|
||||
#include <firmwaremanager/firmwaretrace.h>
|
||||
#include <firmwaremanager/firmwarestore.h>
|
||||
#include <firmwaremanager/firmwareinfo.h>
|
||||
#include <firmwaremanager/firmwarecheck.h>
|
||||
#include <firmwaremanager/firmwareupdate.h>
|
||||
|
||||
#include <oplk/oplk.h>
|
||||
#include <oplk/debugstr.h>
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
//============================================================================//
|
||||
// G L O B A L D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// module global vars
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// global function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#ifndef tabentries
|
||||
#define tabentries(aVar_p) (sizeof(aVar_p) / sizeof(*(aVar_p)))
|
||||
#endif
|
||||
|
||||
#define FIRMWARE_MANAGER_MAX_NODE_ID C_ADR_BROADCAST
|
||||
|
||||
#define FIRMWARE_MANAGER_PRINT_LINE_LENGTH 80
|
||||
#define FIRMWARE_MANAGER_PRINT_NODE_LENGTH 6
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local types
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Process SDO finished event
|
||||
|
||||
This function is called to process an SDO finish event triggered by openPOWERLINK.
|
||||
|
||||
\param pSdoComFinished_p [in] Pointer to SDO finished
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
typedef tFirmwareRet (*tFirmwareProcessSdoEvent)(const tSdoComFinished* pSdoComFinished_p);
|
||||
|
||||
/**
|
||||
\brief Firmware manager instance
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
BOOL fInitialized; ///< Instance initialized flag
|
||||
tFirmwareStoreHandle firmwareStore; ///< Firmware store handle
|
||||
tFirmwareInfoHandle firmwareInfo; ///< Firmware info handle
|
||||
BOOL fCheckModules; ///< Check modular devices (triggered by periodic thread)
|
||||
} tFirmwareManagerInstance;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local vars
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
static tFirmwareManagerInstance instance_l;
|
||||
|
||||
static tFirmwareProcessSdoEvent apfnProcessSdoEvent_l[] =
|
||||
{
|
||||
firmwarecheck_processSdoEvent,
|
||||
firmwareupdate_processSdoEvent
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
static tFirmwareRet firmwareUpdateNotRequired(UINT nodeId_p,
|
||||
tSdoComConHdl* pSdoConnection_p);
|
||||
static tFirmwareRet nodeUpdateCompleteCb(UINT nodeId_p,
|
||||
tSdoComConHdl* pSdoConnection_p);
|
||||
static tFirmwareRet moduleUpdateCompleteCb(UINT nodeId_p,
|
||||
tSdoComConHdl* pSdoConnection_p);
|
||||
static tFirmwareRet errorDuringUpdate(UINT nodeId_p,
|
||||
tSdoComConHdl* pSdoConnection_p);
|
||||
|
||||
static void cleanupSdo(tSdoComConHdl* pSdoConnection_p);
|
||||
|
||||
//============================================================================//
|
||||
// P U B L I C F U N C T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Initialize the firmware manager
|
||||
|
||||
This function initializes the firmware manager.
|
||||
|
||||
\param fwInfoFileName_p [in] Firmware info file created by openCONFIGURATOR
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
|
||||
\ingroup module_app_firmwaremanager
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
tFirmwareRet firmwaremanager_init(const char* fwInfoFileName_p)
|
||||
{
|
||||
tFirmwareRet ret = kFwReturnOk;
|
||||
tFirmwareStoreConfig storeConfig;
|
||||
tFirmwareInfoConfig infoConfig;
|
||||
tFirmwareCheckConfig checkConfig;
|
||||
tFirmwareUpdateConfig updateConfig;
|
||||
|
||||
if (instance_l.fInitialized)
|
||||
{
|
||||
ret = kFwReturnAlreadyInitialized;
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
memset(&instance_l, 0, sizeof(tFirmwareManagerInstance));
|
||||
|
||||
memset(&storeConfig, 0, sizeof(tFirmwareStoreConfig));
|
||||
|
||||
storeConfig.pFilename = fwInfoFileName_p;
|
||||
|
||||
ret = firmwarestore_create(&storeConfig, &instance_l.firmwareStore);
|
||||
if (ret != kFwReturnOk)
|
||||
{
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
memset(&infoConfig, 0, sizeof(infoConfig));
|
||||
|
||||
infoConfig.pFwStore = instance_l.firmwareStore;
|
||||
|
||||
firmwareinfo_create(&infoConfig, &instance_l.firmwareInfo);
|
||||
|
||||
memset(&checkConfig, 0, sizeof(tFirmwareCheckConfig));
|
||||
|
||||
checkConfig.pFwInfo = instance_l.firmwareInfo;
|
||||
checkConfig.pfnNoUpdateRequired = firmwareUpdateNotRequired;
|
||||
|
||||
ret = firmwarecheck_init(&checkConfig);
|
||||
if (ret != kFwReturnOk)
|
||||
{
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
memset(&updateConfig, 0, sizeof(tFirmwareUpdateConfig));
|
||||
|
||||
updateConfig.pfnNodeUpdateComplete = nodeUpdateCompleteCb;
|
||||
updateConfig.pfnModuleUpdateComplete = moduleUpdateCompleteCb;
|
||||
updateConfig.pfnError = errorDuringUpdate;
|
||||
|
||||
ret = firmwareupdate_init(&updateConfig);
|
||||
if (ret != kFwReturnOk)
|
||||
{
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
instance_l.fInitialized = TRUE;
|
||||
|
||||
EXIT:
|
||||
if (ret != kFwReturnOk)
|
||||
{
|
||||
firmwareupdate_exit();
|
||||
firmwarecheck_exit();
|
||||
firmwareinfo_destroy(instance_l.firmwareInfo);
|
||||
firmwarestore_destroy(instance_l.firmwareStore);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Deinitialize the firmware manager
|
||||
|
||||
This function deinitializes the firmware manager.
|
||||
|
||||
\ingroup module_app_firmwaremanager
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void firmwaremanager_exit(void)
|
||||
{
|
||||
firmwareupdate_exit();
|
||||
firmwarecheck_exit();
|
||||
firmwareinfo_destroy(instance_l.firmwareInfo);
|
||||
firmwarestore_destroy(instance_l.firmwareStore);
|
||||
|
||||
instance_l.fInitialized = FALSE;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Firmware manager thread
|
||||
|
||||
This function implements the firmware manager thread. It shall be called regularly
|
||||
(e.g. every 5 seconds) to trigger checking the firmware of modular devices.
|
||||
The function also polls the firmware update transmission status to trace the
|
||||
firmware manager activity.
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
|
||||
\ingroup module_app_firmwaremanager
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
tOplkError firmwaremanager_thread(void)
|
||||
{
|
||||
tOplkError ret = kErrorOk;
|
||||
UINT nodeId;
|
||||
tFirmwareRet fwReturn;
|
||||
tFirmwareUpdateTransmissionStatus status;
|
||||
char line[FIRMWARE_MANAGER_PRINT_LINE_LENGTH];
|
||||
char node[FIRMWARE_MANAGER_PRINT_NODE_LENGTH];
|
||||
BOOL fFinalPrint = FALSE;
|
||||
|
||||
ret = oplk_postUserEvent((void*)&instance_l);
|
||||
|
||||
memset(line, 0, FIRMWARE_MANAGER_PRINT_LINE_LENGTH);
|
||||
strcpy(line, "Updating node");
|
||||
|
||||
for (nodeId = 0u; nodeId < FIRMWARE_MANAGER_MAX_NODE_ID; nodeId++)
|
||||
{
|
||||
fwReturn = firmwareupdate_getTransmissionStatus(nodeId, &status);
|
||||
if ((fwReturn == kFwReturnOk) && status.fTransmissionActive)
|
||||
{
|
||||
fFinalPrint = TRUE;
|
||||
sprintf(node, " 0x%02X", (UINT8)(nodeId & 0xFF));
|
||||
strcat(line, node);
|
||||
|
||||
if (strlen(line) > FIRMWARE_MANAGER_PRINT_LINE_LENGTH - FIRMWARE_MANAGER_PRINT_NODE_LENGTH)
|
||||
{
|
||||
FWM_TRACE("%s\n", line);
|
||||
memset(line, 0, FIRMWARE_MANAGER_PRINT_LINE_LENGTH);
|
||||
strcpy(line, "Updating node");
|
||||
fFinalPrint = FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (fFinalPrint)
|
||||
{
|
||||
FWM_TRACE("%s\n", line);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Process openPOWERLINK events
|
||||
|
||||
This function processes openPOWERLINK events.
|
||||
|
||||
\param eventType_p [in] Event type
|
||||
\param pEventArg_p [in] Pointer to event argument
|
||||
\param pUserArg_p [in] User argument
|
||||
|
||||
\return This functions returns a value of \ref tOplkError.
|
||||
|
||||
\ingroup module_app_firmwaremanager
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
tOplkError firmwaremanager_processEvent(tOplkApiEventType eventType_p,
|
||||
const tOplkApiEventArg* pEventArg_p,
|
||||
void* pUserArg_p)
|
||||
{
|
||||
tOplkError ret = kErrorOk;
|
||||
tFirmwareRet fwRet;
|
||||
size_t iter;
|
||||
|
||||
UNUSED_PARAMETER(pUserArg_p);
|
||||
|
||||
switch (eventType_p)
|
||||
{
|
||||
case kOplkApiEventUserDef:
|
||||
if ((pEventArg_p->pUserArg == &instance_l) && instance_l.fCheckModules)
|
||||
{
|
||||
fwRet = firmwarecheck_checkModulesOfNextNode();
|
||||
|
||||
if (fwRet != kFwReturnOk)
|
||||
{
|
||||
ret = kErrorGeneralError;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = kErrorOk;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case kOplkApiEventSdo:
|
||||
for (iter = 0; iter < tabentries(apfnProcessSdoEvent_l); iter++)
|
||||
{
|
||||
fwRet = apfnProcessSdoEvent_l[iter](&pEventArg_p->sdoInfo);
|
||||
if (fwRet != kFwReturnInvalidSdoEvent)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (fwRet == kFwReturnInvalidSdoEvent)
|
||||
{
|
||||
// Event is ignored because no firmware module felt responsible for it.
|
||||
ret = kErrorOk;
|
||||
}
|
||||
else if (fwRet != kFwReturnOk)
|
||||
{
|
||||
ret = kErrorGeneralError;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = kErrorOk;
|
||||
}
|
||||
break;
|
||||
|
||||
case kOplkApiEventNode:
|
||||
if ((eventType_p == kOplkApiEventNode))
|
||||
{
|
||||
if (pEventArg_p->nodeEvent.nodeEvent == kNmtNodeEventUpdateSw)
|
||||
{
|
||||
fwRet = firmwarecheck_processNodeEvent(pEventArg_p->nodeEvent.nodeId);
|
||||
if (fwRet == kFwReturnInterruptBoot)
|
||||
{
|
||||
ret = kErrorReject;
|
||||
}
|
||||
else if (fwRet != kFwReturnOk)
|
||||
{
|
||||
ret = kErrorGeneralError;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = kErrorOk;
|
||||
}
|
||||
}
|
||||
else if (pEventArg_p->nodeEvent.nodeEvent == kNmtNodeEventConfDone)
|
||||
{
|
||||
instance_l.fCheckModules = TRUE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E F U N C T I O N S //
|
||||
//============================================================================//
|
||||
/// \name Private Functions
|
||||
/// \{
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Firmware update not required callback
|
||||
|
||||
This function is called if a firmware update is not required for the given
|
||||
node.
|
||||
|
||||
\param nodeId_p [in] Node ID
|
||||
\param pSdoConnection_p [in] Pointer to SDO connection handle
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static tFirmwareRet firmwareUpdateNotRequired(UINT nodeId_p,
|
||||
tSdoComConHdl* pSdoConnection_p)
|
||||
{
|
||||
tFirmwareRet ret = kFwReturnOk;
|
||||
tOplkError result;
|
||||
|
||||
cleanupSdo(pSdoConnection_p);
|
||||
|
||||
FWM_TRACE("No firmware update required for node %d, continuing boot/operation\n",
|
||||
nodeId_p);
|
||||
|
||||
result = oplk_triggerMnStateChange(nodeId_p, kNmtNodeCommandSwOk);
|
||||
if (result != kErrorOk)
|
||||
{
|
||||
FWM_ERROR("(%s) - Triggering MN state change failed with %d\n",
|
||||
__func__, result);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Modular firmware update completed
|
||||
|
||||
This function is called if a modular firmware update is completed for the given
|
||||
node.
|
||||
|
||||
\param nodeId_p [in] Node ID
|
||||
\param pSdoConnection_p [in] Pointer to SDO connection handle
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static tFirmwareRet moduleUpdateCompleteCb(UINT nodeId_p,
|
||||
tSdoComConHdl* pSdoConnection_p)
|
||||
{
|
||||
tFirmwareRet ret = kFwReturnOk;
|
||||
|
||||
cleanupSdo(pSdoConnection_p);
|
||||
|
||||
FWM_TRACE("Firmware update of modules complete for node %d\n", nodeId_p);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Node firmware update completed
|
||||
|
||||
This function is called if a firmware update is completed for the given node.
|
||||
|
||||
\param nodeId_p [in] Node ID
|
||||
\param pSdoConnection_p [in] Pointer to SDO connection handle
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static tFirmwareRet nodeUpdateCompleteCb(UINT nodeId_p,
|
||||
tSdoComConHdl* pSdoConnection_p)
|
||||
{
|
||||
tFirmwareRet ret = kFwReturnOk;
|
||||
tOplkError result;
|
||||
|
||||
cleanupSdo(pSdoConnection_p);
|
||||
|
||||
FWM_TRACE("Firmware update of node %d complete\n", nodeId_p);
|
||||
|
||||
result = oplk_triggerMnStateChange(nodeId_p, kNmtNodeCommandSwUpdated);
|
||||
if (result != kErrorOk)
|
||||
{
|
||||
FWM_ERROR("(%s) - Triggering MN state change failed with %d\n",
|
||||
__func__, result);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Firmware update error
|
||||
|
||||
This function is called if an error happend during a firmware update for the
|
||||
given node.
|
||||
|
||||
\param nodeId_p [in] Node ID
|
||||
\param pSdoConnection_p [in] Pointer to SDO connection handle
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static tFirmwareRet errorDuringUpdate(UINT nodeId_p,
|
||||
tSdoComConHdl* pSdoConnection_p)
|
||||
{
|
||||
tFirmwareRet ret = kFwReturnOk;
|
||||
tOplkError result;
|
||||
|
||||
cleanupSdo(pSdoConnection_p);
|
||||
|
||||
FWM_TRACE("An error occurred during check/update for node %d\n", nodeId_p);
|
||||
|
||||
result = oplk_triggerMnStateChange(nodeId_p, kNmtNodeCommandSwErr);
|
||||
if (result != kErrorOk)
|
||||
{
|
||||
FWM_ERROR("(%s) - Triggering MN state change failed with %d\n",
|
||||
__func__, result);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static void cleanupSdo(tSdoComConHdl* pSdoConnection_p)
|
||||
{
|
||||
oplk_freeSdoChannel(*pSdoConnection_p);
|
||||
*pSdoConnection_p = FIRMWARECHECK_INVALID_SDO;
|
||||
}
|
||||
|
||||
/// \}
|
|
@ -0,0 +1,103 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file firmwaremanager.h
|
||||
|
||||
\brief Header file for the firmware manager modules
|
||||
|
||||
This header file contains the general definitions for all firmware manager
|
||||
modules.
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2017, B&R Industrial Automation GmbH
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
#ifndef _INC_firmwaremanager_H_
|
||||
#define _INC_firmwaremanager_H_
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include <oplk/oplk.h>
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// typedef
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
\brief Enum with return values used by the firmware manager modules
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
kFwReturnOk = 0, ///< Function call was successful
|
||||
kFwReturnInvalidParameter, ///< An invalid parameter was passed
|
||||
kFwReturnInvalidInstance, ///< An invalid instance was passed
|
||||
kFwReturnNoResource, ///< The allocation of required resources failed
|
||||
kFwReturnFileOperationFailed, ///< A File operation failed
|
||||
kFwReturnInfoFormatError, ///< The supplied fw.info file in formated invalid
|
||||
kFwReturnModuleNotFound, ///< The requested module was not found
|
||||
kFwReturnAlreadyInitialized, ///< Firmware manager is already initialized
|
||||
kFwReturnInvalidNodeId, ///< An invalid node ID was passed
|
||||
kFwReturnSdoWriteFailed, ///< A SDO write command failed
|
||||
kFwReturnInvalidSdoSize, ///< A SDO event returned an invalid number of transferred bytes
|
||||
kFwReturnInvalidSdoEvent, ///< An invalid SDO finished event was passed
|
||||
kFwReturnNoIdent, ///< Failed to get ident for node
|
||||
kFwReturnOdError, ///< Failed to access local OD
|
||||
kFwReturnInterruptBoot, ///< Signalize interruption of boot process
|
||||
kFwReturnSdoWriteError, ///< Failed to issue an SDO write
|
||||
kFwReturnSdoReadError, ///< Failed to issue an SDO read
|
||||
kFwReturnInvalidNodeInfo, ///< An invalid node info was passed
|
||||
kFwReturnResetNodeFailed, ///< Failed to send reset node
|
||||
kFwReturnInvalidCheckState, ///< Invalid state in firmware check module
|
||||
kFwReturnIgnoreInfoFileLine, ///< Ignore the current info file line
|
||||
} tFirmwareRet;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
tFirmwareRet firmwaremanager_init(const char* fwInfoFileName_p);
|
||||
void firmwaremanager_exit(void);
|
||||
|
||||
tOplkError firmwaremanager_thread(void);
|
||||
|
||||
tOplkError firmwaremanager_processEvent(tOplkApiEventType eventType_p,
|
||||
const tOplkApiEventArg* pEventArg_p,
|
||||
void* pUserArg_p);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _INC_firmwaremanager_H_ */
|
|
@ -0,0 +1,467 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file firmwarestore-file.c
|
||||
|
||||
\brief Source file of the firmware store module using a file system
|
||||
|
||||
This module implements an access to stored informations and firmware images
|
||||
provided by the openCONFIGURATOR.
|
||||
|
||||
\ingroup module_app_firmwaremanager
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2017, B&R Industrial Automation GmbH
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include <firmwaremanager/firmwarestore.h>
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
//============================================================================//
|
||||
// G L O B A L D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// module global vars
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// global function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#define FWSTORE_READ_MODE "rb"
|
||||
#define FWSTORE_FILEPATH_LENGTH 256u
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local types
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
\brief Firmware store instance
|
||||
*/
|
||||
typedef struct tFirmwareStoreInstance
|
||||
{
|
||||
char aFilename[FWSTORE_FILEPATH_LENGTH]; ///< File name
|
||||
char aPathToFile[FWSTORE_FILEPATH_LENGTH]; ///< Path to file
|
||||
FILE* pStorageFd; ///< File descriptor
|
||||
void* pData; ///< File data pointer
|
||||
size_t dataSize; ///< File data size
|
||||
} tFirmwareStoreInstance;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local vars
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
static tFirmwareRet allocAndReadData(FILE* pFile_p,
|
||||
void** ppBuffer_p, size_t* pDataSize_p);
|
||||
static tFirmwareRet flushData(tFirmwareStoreHandle pHandle_p);
|
||||
static void getPathToFile(const char* pFilename_p, char* aPath_p);
|
||||
|
||||
//============================================================================//
|
||||
// P U B L I C F U N C T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Create a firmware store instance
|
||||
|
||||
This function creates an instance of the firmware store module.
|
||||
|
||||
\param pConfig_p [in] Pointer to the configuration structure for the created
|
||||
instance.
|
||||
\param ppHandle_p [out] Pointer to an instance handle which is filled if
|
||||
creation was successful.
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
|
||||
\ingroup module_app_firmwaremanager
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
tFirmwareRet firmwarestore_create(const tFirmwareStoreConfig* pConfig_p,
|
||||
tFirmwareStoreHandle* ppHandle_p)
|
||||
{
|
||||
tFirmwareRet ret = kFwReturnOk;
|
||||
tFirmwareStoreInstance* instance;
|
||||
|
||||
if ((pConfig_p == NULL) || (ppHandle_p == NULL))
|
||||
{
|
||||
ret = kFwReturnInvalidParameter;
|
||||
}
|
||||
|
||||
instance = (tFirmwareStoreInstance*)malloc(sizeof(tFirmwareStoreInstance));
|
||||
if (instance == NULL)
|
||||
{
|
||||
ret = kFwReturnNoResource;
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
memset(instance, 0, sizeof(tFirmwareStoreInstance));
|
||||
strncpy(instance->aFilename, pConfig_p->pFilename, FWSTORE_FILEPATH_LENGTH);
|
||||
|
||||
getPathToFile(instance->aFilename, instance->aPathToFile);
|
||||
|
||||
*ppHandle_p = instance;
|
||||
|
||||
EXIT:
|
||||
return ret;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Destroy a firmware store instance
|
||||
|
||||
This function destroys an instance of the firmware store module.
|
||||
|
||||
\param pHandle_p [in] Handle of the firmware store module which shall be
|
||||
destroyed.
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
|
||||
\ingroup module_app_firmwaremanager
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
tFirmwareRet firmwarestore_destroy (tFirmwareStoreHandle pHandle_p)
|
||||
{
|
||||
tFirmwareRet ret = kFwReturnOk;
|
||||
|
||||
if (pHandle_p == NULL)
|
||||
{
|
||||
ret = kFwReturnInvalidInstance;
|
||||
}
|
||||
|
||||
ret = flushData(pHandle_p);
|
||||
|
||||
if (ret == kFwReturnOk)
|
||||
{
|
||||
free (pHandle_p);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Load data represented by the firmware store instance
|
||||
|
||||
This function acquires necessary resources and frees the data. All
|
||||
acquired resources can be flushed manually by calling
|
||||
\ref firmwarestore_flushData, unflushed resources will be freed within
|
||||
\ref firmwarestore_destroy.
|
||||
|
||||
\param pHandle_p [in] Handle of the firmware store module
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
|
||||
\ingroup module_app_firmwaremanager
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
tFirmwareRet firmwarestore_loadData(tFirmwareStoreHandle pHandle_p)
|
||||
{
|
||||
tFirmwareRet ret = kFwReturnOk;
|
||||
|
||||
if (pHandle_p == NULL)
|
||||
{
|
||||
ret = kFwReturnInvalidInstance;
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
pHandle_p->pStorageFd = fopen(pHandle_p->aFilename, FWSTORE_READ_MODE);
|
||||
if (pHandle_p->pStorageFd == NULL)
|
||||
{
|
||||
ret = kFwReturnFileOperationFailed;
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
ret = allocAndReadData(pHandle_p->pStorageFd, &pHandle_p->pData, &pHandle_p->dataSize);
|
||||
|
||||
EXIT:
|
||||
return ret;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Flush data represented by the firmware store instance
|
||||
|
||||
This function frees necessary resources and frees the data.
|
||||
|
||||
\param pHandle_p [in] Handle of the firmware store module
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
|
||||
\ingroup module_app_firmwaremanager
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
tFirmwareRet firmwarestore_flushData(tFirmwareStoreHandle pHandle_p)
|
||||
{
|
||||
tFirmwareRet ret = kFwReturnOk;
|
||||
|
||||
if (pHandle_p != NULL)
|
||||
{
|
||||
ret = flushData(pHandle_p);
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = kFwReturnInvalidInstance;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Access the data provided by the firmware store instance
|
||||
|
||||
This function provides access to the data represented by the firmware store
|
||||
module.
|
||||
|
||||
\param pHandle_p [in] Handle of the firmware store module
|
||||
\param ppData_p [out] Pointer which will be filled with the data buffer
|
||||
\param pDataSize_p [out] Pointer which will be filled with the available datasize
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
|
||||
\ingroup module_app_firmwaremanager
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
tFirmwareRet firmwarestore_getData(tFirmwareStoreHandle pHandle_p,
|
||||
void** ppData_p, size_t* pDataSize_p)
|
||||
{
|
||||
tFirmwareRet ret = kFwReturnOk;
|
||||
|
||||
if (pHandle_p == NULL)
|
||||
{
|
||||
ret = kFwReturnInvalidInstance;
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
if ((ppData_p == NULL) || (pDataSize_p == NULL))
|
||||
{
|
||||
ret = kFwReturnInvalidParameter;
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
if (pHandle_p->pData == NULL)
|
||||
{
|
||||
ret = allocAndReadData(pHandle_p->pStorageFd, &pHandle_p->pData, &pHandle_p->dataSize);
|
||||
}
|
||||
|
||||
if (ret == kFwReturnOk)
|
||||
{
|
||||
*ppData_p = pHandle_p->pData;
|
||||
*pDataSize_p = pHandle_p->dataSize;
|
||||
}
|
||||
|
||||
EXIT:
|
||||
return ret;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Get the base of the represented storage
|
||||
|
||||
This function provides the base information of the storage, i.e. the base
|
||||
address of a memory storage or the containing directory of a file.
|
||||
|
||||
\param pHandle_p [in] Handle of the firmware store module
|
||||
\param ppData_p [out] Pointer which will be filled with the base information
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
|
||||
\ingroup module_app_firmwaremanager
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
tFirmwareRet firmwarestore_getBase(tFirmwareStoreHandle pHandle_p,
|
||||
void** ppBase_p)
|
||||
{
|
||||
tFirmwareRet ret = kFwReturnOk;
|
||||
|
||||
if (pHandle_p == NULL)
|
||||
{
|
||||
ret = kFwReturnInvalidInstance;
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
if (ppBase_p == NULL)
|
||||
{
|
||||
ret = kFwReturnInvalidParameter;
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
*ppBase_p = pHandle_p->aPathToFile;
|
||||
|
||||
EXIT:
|
||||
return ret;
|
||||
}
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E F U N C T I O N S //
|
||||
//============================================================================//
|
||||
/// \name Private Functions
|
||||
/// \{
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Allocate buffer and read data from file
|
||||
|
||||
\param pFile_p [in] File handle to be read
|
||||
\param ppBuffer_p [out] Pointer to buffer allocated and filled with the read data
|
||||
\param pDataSize [out] Pointer filled with the allocated buffer size
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static tFirmwareRet allocAndReadData(FILE* pFile_p,
|
||||
void** ppBuffer_p, size_t* pDataSize_p)
|
||||
{
|
||||
tFirmwareRet ret = kFwReturnOk;
|
||||
UINT8* pBuffer = NULL;
|
||||
size_t fileSize;
|
||||
size_t readBytes;
|
||||
int result;
|
||||
long tellResult;
|
||||
|
||||
result = fseek(pFile_p, 0, SEEK_END);
|
||||
if (result < 0)
|
||||
{
|
||||
ret = kFwReturnFileOperationFailed;
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
tellResult = ftell(pFile_p);
|
||||
if (tellResult < 0)
|
||||
{
|
||||
ret = kFwReturnFileOperationFailed;
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
fileSize = (size_t)tellResult;
|
||||
|
||||
pBuffer = (UINT8*)malloc(fileSize);
|
||||
if (pBuffer == NULL)
|
||||
{
|
||||
ret = kFwReturnNoResource;
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
rewind(pFile_p);
|
||||
|
||||
readBytes = fread(pBuffer, 1u, fileSize, pFile_p);
|
||||
if (readBytes != fileSize)
|
||||
{
|
||||
ret = kFwReturnFileOperationFailed;
|
||||
}
|
||||
|
||||
*ppBuffer_p = pBuffer;
|
||||
pBuffer = NULL;
|
||||
*pDataSize_p = fileSize;
|
||||
|
||||
EXIT:
|
||||
free(pBuffer);
|
||||
rewind(pFile_p);
|
||||
return ret;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Flush firmware store data
|
||||
|
||||
\param pHandle_p [in] Store handle
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static tFirmwareRet flushData(tFirmwareStoreHandle pHandle_p)
|
||||
{
|
||||
tFirmwareRet ret = kFwReturnOk;
|
||||
int result;
|
||||
|
||||
if (pHandle_p->pStorageFd != NULL)
|
||||
{
|
||||
result = fclose(pHandle_p->pStorageFd);
|
||||
|
||||
if (result == 0)
|
||||
{
|
||||
pHandle_p->pStorageFd = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = kFwReturnFileOperationFailed;
|
||||
}
|
||||
}
|
||||
|
||||
free(pHandle_p->pData);
|
||||
pHandle_p->pData = NULL;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Get path to file
|
||||
|
||||
\param pFilename_p [in] File name
|
||||
\param pPath_p [out] Pointer which will be filled with the path
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static void getPathToFile(const char* pFilename_p, char* pPath_p)
|
||||
{
|
||||
char* pPos;
|
||||
|
||||
pPos = strrchr(pFilename_p, FIRMWARESTORE_PATH_DIR_SEP);
|
||||
|
||||
memset(pPath_p, 0, FWSTORE_FILEPATH_LENGTH);
|
||||
|
||||
if (pPos != NULL)
|
||||
{
|
||||
memcpy(pPath_p, pFilename_p, (pPos - pFilename_p));
|
||||
}
|
||||
else
|
||||
{
|
||||
pPath_p[0] = '.';
|
||||
}
|
||||
}
|
||||
|
||||
/// \}
|
|
@ -0,0 +1,102 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file firmwarestore.h
|
||||
|
||||
\brief Header file of the firmware store module
|
||||
|
||||
This header file contains the definitions of the firware store module.
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2017, B&R Industrial Automation GmbH
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
#ifndef _INC_firmwarestore_H_
|
||||
#define _INC_firmwarestore_H_
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include <firmwaremanager/firmwaremanager.h>
|
||||
|
||||
#include <oplk/oplk.h>
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#if defined(_WIN32)
|
||||
#define FIRMWARESTORE_PATH_DIR_SEP '\\'
|
||||
#else
|
||||
#define FIRMWARESTORE_PATH_DIR_SEP '/'
|
||||
#endif
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// typedef
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* \brief Handle to a firmware store instance
|
||||
*/
|
||||
typedef struct tFirmwareStoreInstance* tFirmwareStoreHandle;
|
||||
|
||||
/**
|
||||
* \brief Configuration structure for a firmware store instance
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
const char* pFilename; ///< Filename of the accessed file.
|
||||
///< This member is only used by the file
|
||||
///< system based implementation.
|
||||
const void* pStorageBuffer; ///< Pointer to the memory holding the
|
||||
///< accessed information. This member is
|
||||
///< only used by the non file system
|
||||
///< implementation.
|
||||
} tFirmwareStoreConfig;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
tFirmwareRet firmwarestore_create (const tFirmwareStoreConfig* pConfig_p,
|
||||
tFirmwareStoreHandle* pHandle_p);
|
||||
tFirmwareRet firmwarestore_destroy (tFirmwareStoreHandle pHandle_p);
|
||||
tFirmwareRet firmwarestore_loadData(tFirmwareStoreHandle pHandle_p);
|
||||
tFirmwareRet firmwarestore_flushData(tFirmwareStoreHandle pHandle_p);
|
||||
tFirmwareRet firmwarestore_getData(tFirmwareStoreHandle pHandle_p,
|
||||
void** ppData_p, size_t* pDataSize_p);
|
||||
tFirmwareRet firmwarestore_getBase(tFirmwareStoreHandle pHandle_p,
|
||||
void** ppBase_p);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _INC_firmwarestore_H_ */
|
|
@ -0,0 +1,87 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file firmwaretrace.h
|
||||
|
||||
\brief Header file for trace macros used within firmware manager modules
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2017, B&R Industrial Automation GmbH
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
#ifndef _INC_firmwaretrace_H_
|
||||
#define _INC_firmwaretrace_H_
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#define FWM_TRACE_ENABLE
|
||||
|
||||
#if !defined(FWM_TRACE_PREFIX)
|
||||
#define FWM_TRACE_PREFIX "FWM: "
|
||||
#endif
|
||||
|
||||
#if !defined(FWM_ERROR_PREFIX)
|
||||
#define FWM_ERROR_PREFIX "FWM-ERROR: "
|
||||
#endif
|
||||
|
||||
#if defined(FWM_TRACE_ENABLE)
|
||||
#define FWM_TRACE(...) printf(FWM_TRACE_PREFIX __VA_ARGS__)
|
||||
#else
|
||||
#define FWM_TRACE(...)
|
||||
#endif
|
||||
|
||||
#if defined(FWM_TRACE_ENABLE)
|
||||
#define FWM_ERROR(...) fprintf(stderr, FWM_ERROR_PREFIX __VA_ARGS__)
|
||||
#else
|
||||
#define FWM_ERROR(...)
|
||||
#endif
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// typedef
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _INC_firmwaretrace_H_ */
|
|
@ -0,0 +1,715 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file firmwareupdate.c
|
||||
|
||||
\brief Source file of the firmware update module
|
||||
|
||||
This module implements firmware updates of a node with wrong version.
|
||||
|
||||
\ingroup module_app_firmwaremanager
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2017, B&R Industrial Automation GmbH
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include <firmwaremanager/firmwaretrace.h>
|
||||
#include <firmwaremanager/firmwareupdate.h>
|
||||
#include <firmwaremanager/firmwarestore.h>
|
||||
|
||||
#include <oplk/oplk.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
//============================================================================//
|
||||
// G L O B A L D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// module global vars
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// global function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#define FIRMWARE_UPDATE_MAX_NODE_ID C_ADR_BROADCAST ///< Maximum value of a node ID
|
||||
|
||||
#define FIRMWARE_UPDATE_SDO_TYPE kSdoTypeAsnd ///< SDO type used for firmware update
|
||||
#define FIRMWARE_UPDATE_INVALID_SDO ((tSdoComConHdl)-1) ///< Invalid SDO handle
|
||||
|
||||
#if !defined(FIRMWARE_UPDATE_MAX_PARALLEL_TRANSMISSIONS)
|
||||
#define FIRMWARE_UPDATE_MAX_PARALLEL_TRANSMISSIONS 5 ///< Number of parallel transmissions of firmware images
|
||||
#endif
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local types
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
\brief Firmware update transmission information
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
BOOL fTranmissionActive; ///< Active transmission
|
||||
tFirmwareUpdateList pUpdateList; ///< Firmware update list
|
||||
void* pFirmwareImage; ///< Firmware image in progress
|
||||
size_t firmwareSize; ///< Size of firmware image in progress
|
||||
tSdoComConHdl sdoComCon; ///< SDO handle
|
||||
} tFirmwareUpdateTransmissionInfo;
|
||||
|
||||
/**
|
||||
\brief Firmware update instance
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
BOOL fInitialized; ///< Instance initialized flag
|
||||
tFirmwareUpdateConfig config; ///< Instance configuration
|
||||
tFirmwareUpdateTransmissionInfo aTransmissions[FIRMWARE_UPDATE_MAX_NODE_ID]; ///< Node transmission array
|
||||
size_t numberOfStartedTransmissions; ///< Number of started transmissions
|
||||
size_t numberOfFinishedTransmissions; ///< Number of finished/aborted transmissions
|
||||
} tFirmwareUpdateInstance;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local vars
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
static tFirmwareUpdateInstance instance_l;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
static tFirmwareRet checkPointerAndInstance(const void* pCheck_p);
|
||||
static tFirmwareUpdateTransmissionInfo* getInfo(UINT nodeId_p);
|
||||
static BOOL isExpectedSdoCompleteEvent(tFirmwareUpdateTransmissionInfo* pInfo_p,
|
||||
const tSdoComFinished* pSdoComFinished_p);
|
||||
static tFirmwareRet transmitFirmware(tFirmwareUpdateTransmissionInfo* pInfo_p);
|
||||
static tFirmwareRet startTransmission(tFirmwareUpdateTransmissionInfo* pInfo_p);
|
||||
|
||||
static void transmissionFailed(tFirmwareUpdateTransmissionInfo* pInfo_p);
|
||||
static tFirmwareRet transmissionSucceeded(tFirmwareUpdateTransmissionInfo* pInfo_p);
|
||||
static void cleanupTransmission(tFirmwareUpdateTransmissionInfo* pInfo_p);
|
||||
static void cleanupInstance(void);
|
||||
static BOOL isTransmissionAllowed(tFirmwareUpdateTransmissionInfo* pInfo_p);
|
||||
|
||||
static tFirmwareUpdateTransmissionInfo* getNextPendingTransmission(void);
|
||||
|
||||
//============================================================================//
|
||||
// P U B L I C F U N C T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Initialize the firmware update module
|
||||
|
||||
This function initializes the firmware update module.
|
||||
|
||||
\param pConfig_p [in] Pointer to the configuration structure for the
|
||||
firmware update module.
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
|
||||
\ingroup module_app_firmwaremanager
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
tFirmwareRet firmwareupdate_init(const tFirmwareUpdateConfig* pConfig_p)
|
||||
{
|
||||
tFirmwareRet ret = kFwReturnOk;
|
||||
|
||||
if (instance_l.fInitialized)
|
||||
{
|
||||
ret = kFwReturnAlreadyInitialized;
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
memset(&instance_l, 0, sizeof(tFirmwareUpdateInstance));
|
||||
|
||||
memcpy(&instance_l.config, pConfig_p, sizeof(tFirmwareUpdateConfig));
|
||||
|
||||
instance_l.fInitialized = TRUE;
|
||||
|
||||
EXIT:
|
||||
return ret;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Deinitialize the firmware update module
|
||||
|
||||
This function deinitializes the firmware update module.
|
||||
|
||||
\ingroup module_app_firmwaremanager
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void firmwareupdate_exit(void)
|
||||
{
|
||||
instance_l.fInitialized = FALSE;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Process the given list of firmware updates
|
||||
|
||||
This function processes the required firmware updates defined by the given list.
|
||||
|
||||
\param ppList_p [in, out] Pointer to List of required firmware updates, when
|
||||
an error occurs the returned list contains entries
|
||||
which were not freed.
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
|
||||
\ingroup module_app_firmwaremanager
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
tFirmwareRet firmwareupdate_processUpdateList(tFirmwareUpdateList* ppList_p)
|
||||
{
|
||||
tFirmwareRet ret = kFwReturnOk;
|
||||
tFirmwareUpdateEntry** ppInsertIter;
|
||||
tFirmwareUpdateTransmissionInfo* pInfo;
|
||||
|
||||
ret = checkPointerAndInstance(ppList_p);
|
||||
if (ret != kFwReturnOk)
|
||||
{
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
pInfo = &instance_l.aTransmissions[(*ppList_p)->nodeId];
|
||||
|
||||
ppInsertIter = &pInfo->pUpdateList;
|
||||
|
||||
while (*ppInsertIter != NULL)
|
||||
{
|
||||
ppInsertIter = &(*ppInsertIter)->pNext;
|
||||
}
|
||||
|
||||
*ppInsertIter = (*ppList_p);
|
||||
|
||||
*ppList_p = NULL;
|
||||
|
||||
if (!pInfo->fTranmissionActive)
|
||||
{
|
||||
pInfo->sdoComCon = FIRMWARE_UPDATE_INVALID_SDO;
|
||||
}
|
||||
|
||||
ret = startTransmission(pInfo);
|
||||
|
||||
EXIT:
|
||||
return ret;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Process an SDO event
|
||||
|
||||
This function processes SDO events given by the passed \ref tSdoComFinished
|
||||
structure. By processing the according events this module checks the result of
|
||||
firmware transmissions and proceeds for further required updates.
|
||||
|
||||
\param pSdoComFinished_p [in] Structure of the SDO event
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
|
||||
\ingroup module_app_firmwaremanager
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
tFirmwareRet firmwareupdate_processSdoEvent(const tSdoComFinished* pSdoComFinished_p)
|
||||
{
|
||||
tFirmwareRet ret = kFwReturnOk;
|
||||
tFirmwareUpdateTransmissionInfo* pInfo = NULL;
|
||||
BOOL fSucceeded = TRUE;
|
||||
|
||||
ret = checkPointerAndInstance(pSdoComFinished_p);
|
||||
if (ret != kFwReturnOk)
|
||||
{
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
pInfo = &instance_l.aTransmissions[pSdoComFinished_p->nodeId];
|
||||
|
||||
if (!isExpectedSdoCompleteEvent(pInfo, pSdoComFinished_p))
|
||||
{
|
||||
ret = kFwReturnInvalidSdoEvent;
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
if (pSdoComFinished_p->sdoComConState != kSdoComTransferFinished)
|
||||
{
|
||||
FWM_ERROR("SDO write failed for node 0x%X with state: 0x%x and abort code 0x%x\n",
|
||||
pSdoComFinished_p->nodeId, pSdoComFinished_p->sdoComConState, pSdoComFinished_p->abortCode);
|
||||
|
||||
fSucceeded = FALSE;
|
||||
}
|
||||
|
||||
if (pSdoComFinished_p->transferredBytes != pInfo->firmwareSize)
|
||||
{
|
||||
FWM_ERROR("SDO written number of bytes does not match for node 0x%X: %lu - %lu\n",
|
||||
pSdoComFinished_p->nodeId, (ULONG)pSdoComFinished_p->transferredBytes, (ULONG)pInfo->firmwareSize);
|
||||
|
||||
fSucceeded = FALSE;
|
||||
}
|
||||
|
||||
if (pSdoComFinished_p->abortCode != 0)
|
||||
{
|
||||
FWM_ERROR("SDO event with abort code: 0x%x for node 0x%X\n", pSdoComFinished_p->abortCode, pSdoComFinished_p->nodeId);
|
||||
|
||||
fSucceeded = FALSE;
|
||||
}
|
||||
|
||||
if (fSucceeded)
|
||||
{
|
||||
ret = transmissionSucceeded(pInfo);
|
||||
}
|
||||
else
|
||||
{
|
||||
transmissionFailed(pInfo);
|
||||
}
|
||||
|
||||
ret = startTransmission(pInfo);
|
||||
|
||||
EXIT:
|
||||
if (ret != kFwReturnOk)
|
||||
{
|
||||
cleanupInstance();
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Get update transmission status
|
||||
|
||||
This function returns the node's update transmission status.
|
||||
|
||||
\param pConfig_p [in] Pointer to the configuration structure for the
|
||||
firmware update module.
|
||||
\param nodeId_p [in] Node ID
|
||||
\param pStatus_p [in] Pointer used to return the transmission status
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
|
||||
\ingroup module_app_firmwaremanager
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
tFirmwareRet firmwareupdate_getTransmissionStatus(UINT nodeId_p,
|
||||
tFirmwareUpdateTransmissionStatus* pStatus_p)
|
||||
{
|
||||
tFirmwareRet ret = kFwReturnOk;
|
||||
tFirmwareUpdateTransmissionInfo* pInfo;
|
||||
tFirmwareUpdateEntry* pIter;
|
||||
UINT count = 0u;
|
||||
|
||||
ret = checkPointerAndInstance(pStatus_p);
|
||||
if (ret != kFwReturnOk)
|
||||
{
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
pInfo = getInfo(nodeId_p);
|
||||
if (pInfo == NULL)
|
||||
{
|
||||
ret = kFwReturnInvalidNodeId;
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
pIter = pInfo->pUpdateList;
|
||||
|
||||
while (pIter != NULL)
|
||||
{
|
||||
count++;
|
||||
pIter = pIter->pNext;
|
||||
}
|
||||
|
||||
pStatus_p->fTransmissionActive = pInfo->fTranmissionActive;
|
||||
pStatus_p->numberOfPendingTransmissions = count;
|
||||
|
||||
EXIT:
|
||||
return ret;
|
||||
}
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E F U N C T I O N S //
|
||||
//============================================================================//
|
||||
/// \name Private Functions
|
||||
/// \{
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Check pointer and instance
|
||||
|
||||
\param pCheck_p [in] Pointer checked
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static tFirmwareRet checkPointerAndInstance(const void* pCheck_p)
|
||||
{
|
||||
tFirmwareRet ret = kFwReturnOk;
|
||||
|
||||
if (!instance_l.fInitialized)
|
||||
{
|
||||
ret = kFwReturnInvalidInstance;
|
||||
}
|
||||
else if (pCheck_p == NULL)
|
||||
{
|
||||
ret = kFwReturnInvalidParameter;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Get transmission information
|
||||
|
||||
\param nodeId_p [in] Node ID
|
||||
|
||||
\return This functions returns a pointer to the transmission information.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static tFirmwareUpdateTransmissionInfo* getInfo(UINT nodeId_p)
|
||||
{
|
||||
tFirmwareUpdateTransmissionInfo* pInfo = NULL;
|
||||
|
||||
if (nodeId_p <= FIRMWARE_UPDATE_MAX_NODE_ID)
|
||||
{
|
||||
pInfo = &instance_l.aTransmissions[nodeId_p];
|
||||
}
|
||||
|
||||
return pInfo;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Check SDO complete event's validity
|
||||
|
||||
\param pInfo_p [in] Pointer to transmission information
|
||||
\param pSdoComFinished_p [in] Pointer to SDO finish
|
||||
|
||||
\return This functions returns a \ref BOOL.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static BOOL isExpectedSdoCompleteEvent(tFirmwareUpdateTransmissionInfo* pInfo_p,
|
||||
const tSdoComFinished* pSdoComFinished_p)
|
||||
{
|
||||
return ((pSdoComFinished_p->pUserArg == &instance_l) &&
|
||||
pInfo_p->fTranmissionActive &&
|
||||
(pInfo_p->pUpdateList != NULL) &&
|
||||
(pSdoComFinished_p->targetIndex == pInfo_p->pUpdateList->index) &&
|
||||
(pSdoComFinished_p->targetSubIndex == pInfo_p->pUpdateList->subindex) &&
|
||||
(pSdoComFinished_p->sdoComConHdl == pInfo_p->sdoComCon));
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Transmit firmware update image
|
||||
|
||||
\param pInfo_p [in] Pointer to transmission information
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static tFirmwareRet transmitFirmware(tFirmwareUpdateTransmissionInfo* pInfo_p)
|
||||
{
|
||||
tFirmwareRet ret = kFwReturnOk;
|
||||
tOplkError oplkRet;
|
||||
|
||||
if (pInfo_p->fTranmissionActive)
|
||||
{
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
if (!isTransmissionAllowed(pInfo_p))
|
||||
{
|
||||
FWM_TRACE("Postpone update for node: %u index: 0x%x subindex: 0x%x\n",
|
||||
pInfo_p->pUpdateList->nodeId, pInfo_p->pUpdateList->index,
|
||||
pInfo_p->pUpdateList->subindex);
|
||||
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
FWM_TRACE("Start update for node: %u index: 0x%x subindex: 0x%x\n",
|
||||
pInfo_p->pUpdateList->nodeId, pInfo_p->pUpdateList->index,
|
||||
pInfo_p->pUpdateList->subindex);
|
||||
|
||||
ret = firmwarestore_loadData(pInfo_p->pUpdateList->pStoreHandle);
|
||||
if (ret != kFwReturnOk)
|
||||
{
|
||||
FWM_ERROR("Loading image for transmission failed with %d and errno %d\n",
|
||||
ret, errno);
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
ret = firmwarestore_getData(pInfo_p->pUpdateList->pStoreHandle,
|
||||
&pInfo_p->pFirmwareImage,
|
||||
&pInfo_p->firmwareSize);
|
||||
if (ret != kFwReturnOk)
|
||||
{
|
||||
FWM_ERROR("Getting the image for transmission failed with %d and errno %d\n",
|
||||
ret, errno);
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
oplkRet = oplk_writeObject(&pInfo_p->sdoComCon,
|
||||
pInfo_p->pUpdateList->nodeId,
|
||||
pInfo_p->pUpdateList->index,
|
||||
pInfo_p->pUpdateList->subindex,
|
||||
pInfo_p->pFirmwareImage,
|
||||
(UINT)pInfo_p->firmwareSize,
|
||||
FIRMWARE_UPDATE_SDO_TYPE,
|
||||
&instance_l);
|
||||
|
||||
if ((oplkRet != kErrorApiTaskDeferred) && (pInfo_p->sdoComCon != FIRMWARE_UPDATE_INVALID_SDO))
|
||||
{
|
||||
FWM_ERROR("Writing the firmware object failed with 0x%X\n", oplkRet);
|
||||
ret = kFwReturnSdoWriteFailed;
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
instance_l.numberOfStartedTransmissions++;
|
||||
pInfo_p->fTranmissionActive = TRUE;
|
||||
|
||||
EXIT:
|
||||
if (ret != kFwReturnOk)
|
||||
{
|
||||
firmwarestore_flushData(pInfo_p->pUpdateList->pStoreHandle);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Start firmware update image transmission
|
||||
|
||||
\param pInfo_p [in] Pointer to transmission information
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static tFirmwareRet startTransmission(tFirmwareUpdateTransmissionInfo* pInfo_p)
|
||||
{
|
||||
tFirmwareRet ret = kFwReturnOk;
|
||||
|
||||
while (pInfo_p->pUpdateList != NULL)
|
||||
{
|
||||
ret = transmitFirmware(pInfo_p);
|
||||
if (ret == kFwReturnOk)
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
FWM_ERROR("Transmission of the firmware failed with %d\n", ret);
|
||||
transmissionFailed(pInfo_p);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Handle firmware update transmission failed
|
||||
|
||||
\param pInfo_p [in] Pointer to transmission information
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static void transmissionFailed(tFirmwareUpdateTransmissionInfo* pInfo_p)
|
||||
{
|
||||
pInfo_p->fTranmissionActive = FALSE;
|
||||
instance_l.numberOfFinishedTransmissions++;
|
||||
|
||||
if (pInfo_p->pUpdateList->fIsNode)
|
||||
{
|
||||
if (instance_l.config.pfnError != NULL)
|
||||
{
|
||||
instance_l.config.pfnError(pInfo_p->pUpdateList->nodeId,
|
||||
&pInfo_p->sdoComCon);
|
||||
}
|
||||
}
|
||||
|
||||
cleanupTransmission(pInfo_p);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Handle firmware update transmission succeeded
|
||||
|
||||
\param pInfo_p [in] Pointer to transmission information
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static tFirmwareRet transmissionSucceeded(tFirmwareUpdateTransmissionInfo* pInfo_p)
|
||||
{
|
||||
tFirmwareRet ret = kFwReturnOk;
|
||||
tFirmwareUpdateTransmissionInfo* pNextInfo;
|
||||
|
||||
FWM_TRACE("Update finished for node: %u index: 0x%x subindex: 0x%x\n",
|
||||
pInfo_p->pUpdateList->nodeId, pInfo_p->pUpdateList->index,
|
||||
pInfo_p->pUpdateList->subindex);
|
||||
|
||||
|
||||
if (pInfo_p->pUpdateList->fIsNode)
|
||||
{
|
||||
// Node callback
|
||||
if (instance_l.config.pfnNodeUpdateComplete != NULL)
|
||||
{
|
||||
ret = instance_l.config.pfnNodeUpdateComplete(pInfo_p->pUpdateList->nodeId,
|
||||
&pInfo_p->sdoComCon);
|
||||
}
|
||||
}
|
||||
else if (pInfo_p->pUpdateList->pNext == NULL)
|
||||
{
|
||||
// Module callback
|
||||
if (instance_l.config.pfnModuleUpdateComplete != NULL)
|
||||
{
|
||||
ret = instance_l.config.pfnModuleUpdateComplete(pInfo_p->pUpdateList->nodeId,
|
||||
&pInfo_p->sdoComCon);
|
||||
}
|
||||
}
|
||||
|
||||
instance_l.numberOfFinishedTransmissions++;
|
||||
|
||||
if (pInfo_p->pUpdateList->pNext == NULL)
|
||||
{
|
||||
pNextInfo = getNextPendingTransmission();
|
||||
|
||||
if (pNextInfo != NULL)
|
||||
{
|
||||
FWM_TRACE("Start next pending transmission for node 0x%X\n",
|
||||
pNextInfo->pUpdateList->nodeId);
|
||||
startTransmission(pNextInfo);
|
||||
}
|
||||
}
|
||||
|
||||
cleanupTransmission(pInfo_p);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Clean up firmware update transmission
|
||||
|
||||
\param pInfo_p [in] Pointer to transmission information
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static void cleanupTransmission(tFirmwareUpdateTransmissionInfo* pInfo_p)
|
||||
{
|
||||
tFirmwareUpdateEntry* pRem;
|
||||
tFirmwareStoreHandle pFwStore;
|
||||
|
||||
pInfo_p->fTranmissionActive = FALSE;
|
||||
pFwStore = pInfo_p->pUpdateList->pStoreHandle;
|
||||
|
||||
pRem = pInfo_p->pUpdateList;
|
||||
pInfo_p->pUpdateList = pInfo_p->pUpdateList->pNext;
|
||||
free(pRem);
|
||||
|
||||
firmwarestore_flushData(pFwStore);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Clean up firmware update instance
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static void cleanupInstance(void)
|
||||
{
|
||||
tFirmwareUpdateEntry* pRem;
|
||||
size_t iter;
|
||||
|
||||
for (iter = 0u; iter < FIRMWARE_UPDATE_MAX_NODE_ID; iter++)
|
||||
{
|
||||
pRem = instance_l.aTransmissions[iter].pUpdateList;
|
||||
while (pRem != NULL)
|
||||
{
|
||||
instance_l.aTransmissions[iter].pUpdateList = pRem->pNext;
|
||||
free(pRem);
|
||||
pRem = instance_l.aTransmissions[iter].pUpdateList;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static tFirmwareUpdateTransmissionInfo* getNextPendingTransmission(void)
|
||||
{
|
||||
tFirmwareUpdateTransmissionInfo* pInfo = NULL;
|
||||
size_t i;
|
||||
|
||||
for (i = 0U; i < FIRMWARE_UPDATE_MAX_NODE_ID; i++)
|
||||
{
|
||||
|
||||
if (!instance_l.aTransmissions[i].fTranmissionActive &&
|
||||
(instance_l.aTransmissions[i].pUpdateList != NULL))
|
||||
{
|
||||
pInfo = &instance_l.aTransmissions[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return pInfo;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Check if the start of the given transmission is allowed
|
||||
|
||||
\return This functions returns a boolean value, which is true if the
|
||||
transmission is allowed.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static BOOL isTransmissionAllowed(tFirmwareUpdateTransmissionInfo* pInfo_p)
|
||||
{
|
||||
size_t numberOfActiveTransmissions = instance_l.numberOfStartedTransmissions -
|
||||
instance_l.numberOfFinishedTransmissions;
|
||||
|
||||
UNUSED_PARAMETER(pInfo_p);
|
||||
|
||||
return (numberOfActiveTransmissions < FIRMWARE_UPDATE_MAX_PARALLEL_TRANSMISSIONS);
|
||||
|
||||
}
|
||||
|
||||
/// \}
|
|
@ -0,0 +1,128 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file firmwareupdate.h
|
||||
|
||||
\brief Header file of the firmware update module
|
||||
|
||||
This header file contains the definitions of the firware update module.
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2017, B&R Industrial Automation GmbH
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
#ifndef _INC_firmwareupdate_H_
|
||||
#define _INC_firmwareupdate_H_
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include <firmwaremanager/firmwaremanager.h>
|
||||
#include <firmwaremanager/firmwareinfodecode.h>
|
||||
|
||||
#include <oplk/oplk.h>
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// typedef
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Firmware update node callback
|
||||
|
||||
This function is called by the firmware update module to inform about a node's
|
||||
update completion.
|
||||
|
||||
\param nodeId_p [in] Node ID
|
||||
\param pSdoConnection_p [in] Pointer to SDO connection used for this node
|
||||
|
||||
\return This functions returns a value of \ref tFirmwareRet.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
typedef tFirmwareRet (*tFirmwareUpdateNodeCb)(UINT nodeId_p,
|
||||
tSdoComConHdl* pSdoConnection_p);
|
||||
|
||||
/**
|
||||
\brief Firmware update transmission status
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
UINT numberOfPendingTransmissions; ///< Number of pending transmissions
|
||||
BOOL fTransmissionActive; ///< Active transmission flag
|
||||
} tFirmwareUpdateTransmissionStatus;
|
||||
|
||||
/**
|
||||
\brief Firmware update configuration
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
tFirmwareUpdateNodeCb pfnNodeUpdateComplete; ///< Node update complete callback
|
||||
tFirmwareUpdateNodeCb pfnModuleUpdateComplete; ///< Modules of a node update complete callback
|
||||
tFirmwareUpdateNodeCb pfnError; ///< Node update error callback
|
||||
} tFirmwareUpdateConfig;
|
||||
|
||||
/**
|
||||
\brief Firmware update entry
|
||||
*/
|
||||
typedef struct tFirmwareUpdateEntry
|
||||
{
|
||||
UINT nodeId; ///< Node ID
|
||||
UINT index; ///< Index of remote domain object
|
||||
UINT subindex; ///< Subindex of remote domain object
|
||||
tFirmwareStoreHandle pStoreHandle; ///< Handle to firmware update file
|
||||
BOOL fIsNode; ///< Flag for identification of node (Head) update
|
||||
struct tFirmwareUpdateEntry* pNext; ///< Pointer to next update entry
|
||||
} tFirmwareUpdateEntry;
|
||||
|
||||
/**
|
||||
\brief Firmware update list
|
||||
*/
|
||||
typedef tFirmwareUpdateEntry* tFirmwareUpdateList;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
tFirmwareRet firmwareupdate_init(const tFirmwareUpdateConfig* pConfig_p);
|
||||
void firmwareupdate_exit(void);
|
||||
tFirmwareRet firmwareupdate_processUpdateList(tFirmwareUpdateList* ppList_p);
|
||||
tFirmwareRet firmwareupdate_processSdoEvent(const tSdoComFinished* pSdoComFinished_p);
|
||||
tFirmwareRet firmwareupdate_getTransmissionStatus(UINT nodeId_p,
|
||||
tFirmwareUpdateTransmissionStatus* pStatus_p);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _INC_firmwareinfo_H_ */
|
|
@ -0,0 +1,326 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file gpio-c5socarm.c
|
||||
|
||||
\brief GPIOs for Altera Cyclone-V ARM
|
||||
|
||||
The file implements the GPIOs on Altera Cyclone-V ARM core used by
|
||||
openPOWERLINK demo applications.
|
||||
|
||||
\ingroup module_app_common
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2015, Kalycito Infotech Private Limited
|
||||
Copyright (c) 2016, B&R Industrial Automation GmbH
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include <alt_generalpurpose_io.h>
|
||||
|
||||
#include <oplk/oplk.h>
|
||||
#include "gpio.h"
|
||||
|
||||
#include <system.h>
|
||||
|
||||
//============================================================================//
|
||||
// G L O B A L D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// module global vars
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// global function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#define LED_OUTPUT_DELAY_US 500000 // 500ms
|
||||
|
||||
#define HPS_LED_ALL_BIT_MASK 0x0000F000
|
||||
#define HPS_LED_ALL_TURN_ON 0x00000000
|
||||
#define HPS_LED_ALL_TURN_OFF 0x0000F000
|
||||
#define HPS_LED_0_TURN_ON 0x00007000 // GPIO[44] (HPS_LED_0) --> Error Led
|
||||
#define HPS_LED_1_TURN_ON 0x0000B000 // GPIO[43] (HPS_LED_1) --> Status Led
|
||||
#define HPS_LED_2_TURN_ON 0x0000D000 // GPIO[42] (HPS_LED_2)
|
||||
#define HPS_LED_3_TURN_ON 0x0000E000 // GPIO[41] (HPS_LED_3)
|
||||
|
||||
#define HPS_LED_0_TURN_OFF 0x00008000
|
||||
#define HPS_LED_1_TURN_OFF 0x00004000
|
||||
#define HPS_LED_2_TURN_OFF 0x00002000
|
||||
#define HPS_LED_3_TURN_OFF 0x00001000
|
||||
|
||||
#define HPS_PB_INT_ALL_BIT_MASK 0x01E00000 // Interrupt bits for GPIO2
|
||||
|
||||
#define HPS_PB_0_ASSERT 0x01C00000 // GPIO[8] (HPS_PB_0)
|
||||
#define HPS_PB_1_ASSERT 0x01A00000 // GPIO[9] (HPS_PB_1)
|
||||
#define HPS_PB_2_ASSERT 0x01600000 // GPIO[10](HPS_PB_2)
|
||||
#define HPS_PB_3_ASSERT 0x00E00000 // GPIO[11](HPS_PB_3)
|
||||
|
||||
#define HPS_PB_ALL_BIT_MASK 0x01E00000
|
||||
|
||||
#define HPS_PB_0_BIT_MASK 0x01000000 // GPIO[8] (HPS_PB_0)
|
||||
#define HPS_PB_1_BIT_MASK 0x00800000 // GPIO[9] (HPS_PB_1)
|
||||
#define HPS_PB_2_BIT_MASK 0x00400000 // GPIO[10](HPS_PB_2)
|
||||
#define HPS_PB_3_BIT_MASK 0x00200000 // GPIO[11](HPS_PB_3)
|
||||
|
||||
#define HPS_DIPSW_ALL_BIT_MASK 0x001E0000
|
||||
#define HPS_DIPSW_NET_VAL(portVal) ((portVal >> 17) & 0xF)
|
||||
|
||||
#define HPS_DIPSW_0_BIT_MASK 0x00100000 // GPIO[4] (HPS_DIPSW_0)
|
||||
#define HPS_DIPSW_1_BIT_MASK 0x00080000 // GPIO[5] (HPS_DIPSW_1)
|
||||
#define HPS_DIPSW_2_BIT_MASK 0x00040000 // GPIO[6](HPS_DIPSW_2)
|
||||
#define HPS_DIPSW_3_BIT_MASK 0x00020000 // GPIO[7](HPS_DIPSW_3)
|
||||
|
||||
#define FPGA_PB_ALL_BIT_MASK 0x00000003
|
||||
|
||||
#define FPGA_PB_1_BIT_MASK 0x00000002
|
||||
#define FPGA_PB_0_BIT_MASK 0x00000001
|
||||
|
||||
#define FPGA_DIPSW_ALL_BIT_MASK 0x0000000F
|
||||
|
||||
#define FPGA_DIPSW_0_BIT_MASK 0x00000001
|
||||
#define FPGA_DIPSW_1_BIT_MASK 0x00000002
|
||||
#define FPGA_DIPSW_3_BIT_MASK 0x00000001
|
||||
#define FPGA_DIPSW_4_BIT_MASK 0x00000002
|
||||
|
||||
#define FPGA_DIPSW_NET_VAL(portVal) (portVal & FPGA_DIPSW_ALL_BIT_MASK)
|
||||
|
||||
// Determine size of an array
|
||||
#define ARRAY_COUNT(array) (sizeof(array) / sizeof(array[0]))
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local types
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local vars
|
||||
//------------------------------------------------------------------------------
|
||||
ALT_GPIO_CONFIG_RECORD_t cfgHpsGPI[] =
|
||||
{
|
||||
{ ALT_HLGPI_4, ALT_GPIO_PIN_INPUT, 0, 0, 0, 0 }, // HPS_DIPSW_0
|
||||
{ ALT_HLGPI_5, ALT_GPIO_PIN_INPUT, 0, 0, 0, 0 }, // HPS_DIPSW_1
|
||||
{ ALT_HLGPI_6, ALT_GPIO_PIN_INPUT, 0, 0, 0, 0 }, // HPS_DIPSW_2
|
||||
{ ALT_HLGPI_7, ALT_GPIO_PIN_INPUT, 0, 0, 0, 0 }, // HPS_DIPSW_3
|
||||
{ ALT_HLGPI_8, ALT_GPIO_PIN_INPUT, 0, 0, 0, 0 }, // HPS_PB_0
|
||||
{ ALT_HLGPI_9, ALT_GPIO_PIN_INPUT, 0, 0, 0, 0 }, // HPS_PB_1
|
||||
{ ALT_HLGPI_10, ALT_GPIO_PIN_INPUT, 0, 0, 0, 0 }, // HPS_PB_2
|
||||
{ ALT_HLGPI_11, ALT_GPIO_PIN_INPUT, 0, 0, 0, 0 } // HPS_PB_3
|
||||
};
|
||||
|
||||
ALT_GPIO_CONFIG_RECORD_t cfgHpsGPO[] =
|
||||
{
|
||||
{ ALT_GPIO_1BIT_44, ALT_GPIO_PIN_OUTPUT, 0, 0, 0, ALT_GPIO_PIN_DATAZERO }, // HPS_LED_0
|
||||
{ ALT_GPIO_1BIT_43, ALT_GPIO_PIN_OUTPUT, 0, 0, 0, ALT_GPIO_PIN_DATAZERO }, // HPS_LED_1
|
||||
{ ALT_GPIO_1BIT_42, ALT_GPIO_PIN_OUTPUT, 0, 0, 0, ALT_GPIO_PIN_DATAZERO }, // HPS_LED_2
|
||||
{ ALT_GPIO_1BIT_41, ALT_GPIO_PIN_OUTPUT, 0, 0, 0, ALT_GPIO_PIN_DATAZERO } // HPS_LED_3
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//============================================================================//
|
||||
// P U B L I C F U N C T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Initialize GPIO module
|
||||
|
||||
The function initializes the GPIO module before being used.
|
||||
|
||||
\ingroup module_app_common
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void gpio_init(void)
|
||||
{
|
||||
ALT_STATUS_CODE halRet = ALT_E_SUCCESS;
|
||||
|
||||
/* Initialize HPS GPIO */
|
||||
|
||||
// Initialize GPIO module
|
||||
halRet = alt_gpio_init();
|
||||
if (halRet != ALT_E_SUCCESS)
|
||||
goto Exit;
|
||||
|
||||
halRet = alt_gpio_group_config(cfgHpsGPO, ARRAY_COUNT(cfgHpsGPO)); // Setup GPIO LED
|
||||
if (halRet != ALT_E_SUCCESS)
|
||||
goto Exit;
|
||||
|
||||
halRet = alt_gpio_port_data_write(ALT_GPIO_PORTB,
|
||||
HPS_LED_ALL_BIT_MASK,
|
||||
HPS_LED_ALL_TURN_OFF); // clear the Leds
|
||||
if (halRet != ALT_E_SUCCESS)
|
||||
goto Exit;
|
||||
|
||||
halRet = alt_gpio_group_config(cfgHpsGPI, ARRAY_COUNT(cfgHpsGPI)); // Setup GPIO PUSHBUTTON
|
||||
if (halRet != ALT_E_SUCCESS)
|
||||
goto Exit;
|
||||
|
||||
halRet = alt_gpio_port_int_disable(ALT_GPIO_PORTC, HPS_PB_INT_ALL_BIT_MASK); // Enable GPIO interrupts
|
||||
if (halRet != ALT_E_SUCCESS)
|
||||
goto Exit;
|
||||
|
||||
/* Initialize FPGA GPIO */
|
||||
|
||||
// will be initialized in target initialization
|
||||
|
||||
// Clear the dip switch and push button interrupt status registers
|
||||
#if defined(HOST_0_BUTTON_PIO_BASE)
|
||||
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(HOST_0_BUTTON_PIO_BASE, 0x0);
|
||||
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(HOST_0_BUTTON_PIO_BASE, FPGA_PB_ALL_BIT_MASK);
|
||||
#endif
|
||||
|
||||
#if defined(HOST_0_DIPSW_PIO_BASE)
|
||||
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(HOST_0_DIPSW_PIO_BASE, 0x0);
|
||||
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(HOST_0_DIPSW_PIO_BASE, FPGA_DIPSW_ALL_BIT_MASK);
|
||||
#endif
|
||||
|
||||
Exit:
|
||||
return;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Shutdown GPIO module
|
||||
|
||||
The function shuts down the GPIO module.
|
||||
|
||||
\ingroup module_app_common
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void gpio_exit(void)
|
||||
{
|
||||
/* Uninitialize HPS GPIO */
|
||||
alt_gpio_uninit();
|
||||
|
||||
/* Uninitialize FPGA GPIO */
|
||||
|
||||
// will be handled by target module
|
||||
#if defined(HOST_0_BUTTON_PIO_BASE)
|
||||
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(HOST_0_BUTTON_PIO_BASE, 0x0);
|
||||
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(HOST_0_BUTTON_PIO_BASE, FPGA_PB_ALL_BIT_MASK);
|
||||
#endif
|
||||
#if defined(HOST_0_DIPSW_PIO_BASE)
|
||||
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(HOST_0_DIPSW_PIO_BASE, 0x0);
|
||||
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(HOST_0_DIPSW_PIO_BASE, FPGA_DIPSW_ALL_BIT_MASK);
|
||||
#endif
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Gets the node switch value
|
||||
|
||||
The function returns the node ID set by the node switches.
|
||||
|
||||
\return Returns the set node ID
|
||||
|
||||
\ingroup module_app_common
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
UINT8 gpio_getNodeid(void)
|
||||
{
|
||||
UINT8 nodeId;
|
||||
UINT32 hpsSwStatus = 0;
|
||||
UINT32 fpgaSwStatus = 0;
|
||||
|
||||
hpsSwStatus = alt_gpio_port_data_read(ALT_GPIO_PORTC, HPS_DIPSW_ALL_BIT_MASK);
|
||||
|
||||
#if defined(HOST_0_DIPSW_PIO_BASE)
|
||||
fpgaSwStatus = IORD_ALTERA_AVALON_PIO_DATA(HOST_0_DIPSW_PIO_BASE);
|
||||
#endif
|
||||
|
||||
nodeId = (UINT8)((FPGA_DIPSW_NET_VAL(fpgaSwStatus) << HOST_0_DIPSW_PIO_DATA_WIDTH) | HPS_DIPSW_NET_VAL(hpsSwStatus));
|
||||
|
||||
return nodeId;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Gets the application input
|
||||
|
||||
The function returns application inputs.
|
||||
|
||||
\return Returns the application inputs.
|
||||
|
||||
\ingroup module_app_common
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
UINT32 gpio_getAppInput(void)
|
||||
{
|
||||
UINT32 input;
|
||||
|
||||
#if defined(HOST_0_BUTTON_PIO_BASE)
|
||||
input = (UINT32)IORD_ALTERA_AVALON_PIO_EDGE_CAP(HOST_0_BUTTON_PIO_BASE);
|
||||
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(HOST_0_BUTTON_PIO_BASE, FPGA_PB_ALL_BIT_MASK);
|
||||
#else
|
||||
input = 0;
|
||||
#endif
|
||||
|
||||
return input;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Sets the application output
|
||||
|
||||
The function sets the application outputs.
|
||||
|
||||
\param[in] val_p Determines the value to be set to the output
|
||||
|
||||
\ingroup module_app_common
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void gpio_setAppOutputs(UINT32 val_p)
|
||||
{
|
||||
ALT_STATUS_CODE halRet = ALT_E_SUCCESS;
|
||||
|
||||
halRet = alt_gpio_port_data_write(ALT_GPIO_PORTB, HPS_LED_ALL_BIT_MASK, ~val_p);
|
||||
}
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E F U N C T I O N S //
|
||||
//============================================================================//
|
||||
/// \name Private Functions
|
||||
/// \{
|
||||
|
||||
/// \}
|
|
@ -0,0 +1,201 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file gpio-microblaze.c
|
||||
|
||||
\brief GPIOs for Xilinx microblaze
|
||||
|
||||
The file implements the GPIOs on Xilinx microblaze used by openPOWERLINK demo
|
||||
applications.
|
||||
|
||||
\ingroup module_app_common
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2016, B&R Industrial Automation GmbH
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include <xparameters.h>
|
||||
#include <xgpio_l.h>
|
||||
#include <oplk/oplk.h>
|
||||
#include "gpio.h"
|
||||
|
||||
//============================================================================//
|
||||
// G L O B A L D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// module global vars
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// global function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
#ifdef XPAR_NODE_SWITCHES_BASEADDR
|
||||
#define NODE_SWITCH_BASE XPAR_NODE_SWITCHES_BASEADDR
|
||||
#endif // XPAR_NODE_SWITCHES_BASEADDR
|
||||
|
||||
#ifdef XPAR_GPIO_INPUTS_BASEADDR
|
||||
#define GPIO_INPUTS_BASE XPAR_GPIO_INPUTS_BASEADDR
|
||||
#endif // XPAR_GPIO_INPUTS_BASEADDR
|
||||
|
||||
#ifdef XPAR_GPIO_OUTPUTS_BASEADDR
|
||||
#define GPIO_OUTPUTS_BASE XPAR_GPIO_OUTPUTS_BASEADDR
|
||||
#endif // XPAR_GPIO_OUTPUTS_BASEADDR
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local types
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local vars
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//============================================================================//
|
||||
// P U B L I C F U N C T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Initialize GPIO module
|
||||
|
||||
The function initializes the GPIO module.
|
||||
|
||||
\ingroup module_app_common
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void gpio_init(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Shutdown GPIO module
|
||||
|
||||
The function shuts down the GPIO module.
|
||||
|
||||
\ingroup module_app_common
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void gpio_exit(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Gets the node switch value
|
||||
|
||||
The function returns the node ID set by the node switches.
|
||||
|
||||
\return Returns the set node ID
|
||||
|
||||
\ingroup module_app_common
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
UINT8 gpio_getNodeid(void)
|
||||
{
|
||||
UINT8 nodeid;
|
||||
|
||||
#if defined(NODE_SWITCH_BASE)
|
||||
nodeid = XGpio_ReadReg(NODE_SWITCH_BASE, 0);
|
||||
#else
|
||||
nodeid = 0;
|
||||
#endif
|
||||
|
||||
return nodeid;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Gets the application input
|
||||
|
||||
The function returns application inputs.
|
||||
|
||||
\return Returns the application inputs.
|
||||
|
||||
\ingroup module_app_common
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
UINT32 gpio_getAppInput(void)
|
||||
{
|
||||
UINT32 input;
|
||||
|
||||
#if defined(GPIO_INPUTS_BASE)
|
||||
input = XGpio_ReadReg(GPIO_INPUTS_BASE, 0);
|
||||
#else
|
||||
input = 0;
|
||||
#endif
|
||||
|
||||
return input;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Sets the application output
|
||||
|
||||
The function sets the application outputs.
|
||||
|
||||
\param[in] val_p Determines the value to be set to the output
|
||||
|
||||
\ingroup module_app_common
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void gpio_setAppOutputs(UINT32 val_p)
|
||||
{
|
||||
#if defined(GPIO_OUTPUTS_BASE)
|
||||
XGpio_WriteReg(GPIO_OUTPUTS_BASE, XGPIO_DATA_OFFSET, val_p);
|
||||
#else
|
||||
UNUSED_PARAMETER(val_p);
|
||||
#endif
|
||||
}
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E F U N C T I O N S //
|
||||
//============================================================================//
|
||||
/// \name Private Functions
|
||||
/// \{
|
||||
|
||||
/// \}
|
|
@ -0,0 +1,192 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file gpio-nios2.c
|
||||
|
||||
\brief GPIOs for Altera Nios II
|
||||
|
||||
The file implements the GPIOs on Altera Nios II used by openPOWERLINK demo
|
||||
applications.
|
||||
|
||||
\ingroup module_app_common
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2016, B&R Industrial Automation GmbH
|
||||
Copyright (c) 2013, SYSTEC electronic GmbH
|
||||
Copyright (c) 2013, Kalycito Infotech Private Ltd.All rights reserved.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include <system.h>
|
||||
#include <altera_avalon_pio_regs.h>
|
||||
#include <oplk/oplk.h>
|
||||
#include "gpio.h"
|
||||
|
||||
//============================================================================//
|
||||
// G L O B A L D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// module global vars
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// global function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local types
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local vars
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//============================================================================//
|
||||
// P U B L I C F U N C T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Initialize GPIO module
|
||||
|
||||
The function initializes the GPIO module.
|
||||
|
||||
\ingroup module_app_common
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void gpio_init(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Shutdown GPIO module
|
||||
|
||||
The function shuts down the GPIO module.
|
||||
|
||||
\ingroup module_app_common
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void gpio_exit(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Gets the node switch value
|
||||
|
||||
The function returns the node ID set by the node switches.
|
||||
|
||||
\return Returns the set node ID
|
||||
|
||||
\ingroup module_app_common
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
UINT8 gpio_getNodeid(void)
|
||||
{
|
||||
UINT8 nodeid;
|
||||
|
||||
#if defined(NODE_SWITCH_PIO_BASE)
|
||||
nodeid = IORD_ALTERA_AVALON_PIO_DATA(NODE_SWITCH_PIO_BASE);
|
||||
#else
|
||||
nodeid = 0;
|
||||
#endif
|
||||
|
||||
return nodeid;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Gets the application input
|
||||
|
||||
The function returns application inputs.
|
||||
|
||||
\return Returns the application inputs.
|
||||
|
||||
\ingroup module_app_common
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
UINT32 gpio_getAppInput(void)
|
||||
{
|
||||
UINT32 input;
|
||||
|
||||
#if defined(APP_PIO_BASE)
|
||||
input = IORD_ALTERA_AVALON_PIO_DATA(APP_PIO_BASE);
|
||||
#else
|
||||
input = 0;
|
||||
#endif
|
||||
|
||||
return input;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Sets the application output
|
||||
|
||||
The function sets the application outputs.
|
||||
|
||||
\param[in] val_p Determines the value to be set to the output
|
||||
|
||||
\ingroup module_app_common
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void gpio_setAppOutputs(UINT32 val_p)
|
||||
{
|
||||
#if defined(APP_PIO_BASE)
|
||||
IOWR_ALTERA_AVALON_PIO_DATA(APP_PIO_BASE, val_p);
|
||||
#else
|
||||
UNUSED_PARAMETER(val_p);
|
||||
#endif
|
||||
}
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E F U N C T I O N S //
|
||||
//============================================================================//
|
||||
/// \name Private Functions
|
||||
/// \{
|
||||
|
||||
/// \}
|
|
@ -0,0 +1,73 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file gpio.h
|
||||
|
||||
\brief Definitions for GPIOs
|
||||
|
||||
This header file provides the definitions for GPIOs used by the openPOWERLINK
|
||||
examples.
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2016, B&R Industrial Automation GmbH
|
||||
Copyright (c) 2013, SYSTEC electronic GmbH
|
||||
Copyright (c) 2013, Kalycito Infotech Private Ltd.All rights reserved.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
#ifndef _INC_gpio_H_
|
||||
#define _INC_gpio_H_
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include <oplk/oplk.h>
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// typedef
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
void gpio_init(void);
|
||||
void gpio_exit(void);
|
||||
UINT8 gpio_getNodeid(void);
|
||||
UINT32 gpio_getAppInput(void);
|
||||
void gpio_setAppOutputs(UINT32 val_p);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _INC_gpio_H_ */
|
|
@ -0,0 +1,280 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file lcd.c
|
||||
|
||||
\brief Generic LCD interface
|
||||
|
||||
The generic LCD interface module enables to control any LCD.
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2016, B&R Industrial Automation GmbH
|
||||
Copyright (c) 2013, SYSTEC electronic GmbH
|
||||
Copyright (c) 2013, Kalycito Infotech Private Ltd.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include <string.h>
|
||||
#include <oplk/oplk.h>
|
||||
#include "lcd.h"
|
||||
#include "lcdl.h"
|
||||
|
||||
|
||||
//============================================================================//
|
||||
// G L O B A L D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// module global vars
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// global function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
#define LCD_COLUMN 16 ///< Minimum line size needed
|
||||
|
||||
static const char aStrNmtState_l[10][LCD_COLUMN + 1] =
|
||||
{
|
||||
"INVALID ",
|
||||
"OFF ",
|
||||
"INITIALISATION ",
|
||||
"NOT ACTIVE ",
|
||||
"BASIC ETHERNET ",
|
||||
"PRE_OP1 ",
|
||||
"PRE_OP2 ",
|
||||
"READY_TO_OP ",
|
||||
"OPERATIONAL ",
|
||||
"STOPPED "
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local types
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local vars
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//============================================================================//
|
||||
// P U B L I C F U N C T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Initialize the LCD
|
||||
|
||||
The function initializes the generic LCD instance.
|
||||
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void lcd_init(void)
|
||||
{
|
||||
// Initialize low-level module
|
||||
lcdl_init();
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Shutdown the LCD
|
||||
|
||||
The function exits the generic LCD instance.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void lcd_exit(void)
|
||||
{
|
||||
// Shutdown low-level module
|
||||
lcdl_exit();
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Clear the LCD
|
||||
|
||||
The function clears the display.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void lcd_clear(void)
|
||||
{
|
||||
lcdl_clear();
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Print text to LCD
|
||||
|
||||
The function prints the provided text to the specified line in the LCD.
|
||||
|
||||
\param[in] sText_p Text to be printed
|
||||
\param[in] line_p Line to print the text in
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void lcd_printText(const char* sText_p,
|
||||
UINT line_p)
|
||||
{
|
||||
if (lcdl_changeToLine(line_p) != 0)
|
||||
return;
|
||||
|
||||
lcdl_printText(sText_p);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Print NMT state to LCD
|
||||
|
||||
The function prints the NMT state to the second line of the display.
|
||||
|
||||
\param[in] nmtState_p NMT state to be written
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void lcd_printNmtState(tNmtState nmtState_p)
|
||||
{
|
||||
if (lcdl_changeToLine(2) != 0)
|
||||
return;
|
||||
|
||||
switch (nmtState_p)
|
||||
{
|
||||
case kNmtGsOff:
|
||||
lcdl_printText(aStrNmtState_l[1]);
|
||||
break;
|
||||
|
||||
case kNmtGsInitialising:
|
||||
case kNmtGsResetApplication:
|
||||
case kNmtGsResetCommunication:
|
||||
case kNmtGsResetConfiguration:
|
||||
lcdl_printText(aStrNmtState_l[2]);
|
||||
break;
|
||||
|
||||
case kNmtCsNotActive:
|
||||
case kNmtMsNotActive:
|
||||
lcdl_printText(aStrNmtState_l[3]);
|
||||
break;
|
||||
|
||||
case kNmtCsBasicEthernet:
|
||||
case kNmtMsBasicEthernet:
|
||||
lcdl_printText(aStrNmtState_l[4]);
|
||||
break;
|
||||
|
||||
case kNmtCsPreOperational1:
|
||||
case kNmtMsPreOperational1:
|
||||
lcdl_printText(aStrNmtState_l[5]);
|
||||
break;
|
||||
|
||||
case kNmtCsPreOperational2:
|
||||
case kNmtMsPreOperational2:
|
||||
lcdl_printText(aStrNmtState_l[6]);
|
||||
break;
|
||||
|
||||
case kNmtCsReadyToOperate:
|
||||
case kNmtMsReadyToOperate:
|
||||
lcdl_printText(aStrNmtState_l[7]);
|
||||
break;
|
||||
|
||||
case kNmtCsOperational:
|
||||
case kNmtMsOperational:
|
||||
lcdl_printText(aStrNmtState_l[8]);
|
||||
break;
|
||||
|
||||
case kNmtCsStopped:
|
||||
lcdl_printText(aStrNmtState_l[9]);
|
||||
break;
|
||||
|
||||
default:
|
||||
lcdl_printText(aStrNmtState_l[0]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Print node ID to LCD
|
||||
|
||||
The function prints the provided node ID to the first line of the display.
|
||||
In addition to the printed node ID 'MN' (=0xF0) or 'CN' is added.
|
||||
|
||||
\param[in] nodeId_p node ID to be written
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void lcd_printNodeId(UINT8 nodeId_p)
|
||||
{
|
||||
char textNodeID[LCD_COLUMN+1];
|
||||
|
||||
sprintf(textNodeID,
|
||||
"NodeID=0x%02X (%s)",
|
||||
nodeId_p,
|
||||
(nodeId_p == C_ADR_MN_DEF_NODE_ID) ? "MN" : "CN");
|
||||
|
||||
if (lcdl_changeToLine(1) != 0)
|
||||
return;
|
||||
|
||||
lcdl_printText(textNodeID);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Print error code to LCD
|
||||
|
||||
The function prints the provided error code to the second line of the display.
|
||||
|
||||
\param[in] error_p error code
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void lcd_printError(tOplkError error_p)
|
||||
{
|
||||
char textError[LCD_COLUMN+1];
|
||||
|
||||
sprintf(textError, "ERROR=0x%04X", error_p);
|
||||
|
||||
if (lcdl_changeToLine(2) != 0)
|
||||
return;
|
||||
|
||||
lcdl_printText(textError);
|
||||
}
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E F U N C T I O N S //
|
||||
//============================================================================//
|
||||
/// \name Private Functions
|
||||
/// \{
|
||||
|
||||
/// \}
|
|
@ -0,0 +1,76 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file lcd.h
|
||||
|
||||
\brief Generic LCD interface
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2016, B&R Industrial Automation GmbH
|
||||
Copyright (c) 2013, SYSTEC electronic GmbH
|
||||
Copyright (c) 2013, Kalycito Infotech Private Ltd.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
#ifndef _INC_lcd_H_
|
||||
#define _INC_lcd_H_
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include <oplk/oplk.h>
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// typedef
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
void lcd_init(void);
|
||||
void lcd_exit(void);
|
||||
|
||||
void lcd_clear(void);
|
||||
void lcd_printText(const char* sText_p,
|
||||
UINT line_p);
|
||||
void lcd_printNmtState(tNmtState nmtState_p);
|
||||
void lcd_printNodeId(UINT8 nodeId_p);
|
||||
void lcd_printError(tOplkError error_p);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _INC_lcd_H_ */
|
|
@ -0,0 +1,216 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file lcdl-16207.c
|
||||
|
||||
\brief Low-level LCD functions for Altera Avalon LCD IP-Core with HD44780
|
||||
|
||||
This implementation uses the Altera Avalon LCD 16207 IP-Core to handle the
|
||||
display controller HD44780 - available e.g. on the Terasic DE2-115 board.
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2016, B&R Industrial Automation GmbH
|
||||
Copyright (c) 2013, SYSTEC electronic GmbH
|
||||
Copyright (c) 2013, Kalycito Infotech Private Ltd.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include <unistd.h> // for usleep()
|
||||
#include <string.h>
|
||||
|
||||
#include <system.h>
|
||||
#include <altera_avalon_lcd_16207_regs.h>
|
||||
|
||||
#include "lcdl.h"
|
||||
|
||||
//============================================================================//
|
||||
// G L O B A L D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
#if !defined(LCD_BASE)
|
||||
#error "Rename the LCD component in QSYS/SOPC to 'lcd'!"
|
||||
#endif
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// module global vars
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// global function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
#define LCDL_COLUMN 16 ///< Column count
|
||||
#define LCDL_LINE 2 ///< Line count
|
||||
|
||||
#define LCDL_WRCMD(data) IOWR_ALTERA_AVALON_LCD_16207_COMMAND(LCD_BASE, data)
|
||||
#define LCDL_RDCMD() IORD_ALTERA_AVALON_LCD_16207_STATUS(LCD_BASE)
|
||||
#define LCDL_WRDATA(data) IOWR_ALTERA_AVALON_LCD_16207_DATA(LCD_BASE, data)
|
||||
#define LCDL_RDDATA() IORD_ALTERA_AVALON_LCD_16207_DATA(LCD_BASE)
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local types
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local vars
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
//============================================================================//
|
||||
// P U B L I C F U N C T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Initialize the low-level LCD module
|
||||
|
||||
This function writes a sequence of initialization parameters to the LCD.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void lcdl_init(void)
|
||||
{
|
||||
LCDL_WRCMD(0x38);
|
||||
usleep(2000);
|
||||
LCDL_WRCMD(0x0C);
|
||||
usleep(2000);
|
||||
LCDL_WRCMD(0x01);
|
||||
usleep(2000);
|
||||
LCDL_WRCMD(0x06);
|
||||
usleep(2000);
|
||||
LCDL_WRCMD(0x80);
|
||||
usleep(2000);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Shutdown the low-level LCD module
|
||||
|
||||
This function exits the LCD instance.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void lcdl_exit(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Clear the LCD
|
||||
|
||||
This function clears all lines of the display.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void lcdl_clear(void)
|
||||
{
|
||||
LCDL_WRCMD(0x01);
|
||||
usleep(2000);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Change to specified line
|
||||
|
||||
Changes to specified line of the LCD
|
||||
|
||||
\param[in] line_p Specifies the line
|
||||
|
||||
\return The function returns 0 if the line is changed successfully,
|
||||
otherwise -1.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
int lcdl_changeToLine(unsigned int line_p)
|
||||
{
|
||||
if (line_p > LCDL_LINE)
|
||||
return -1;
|
||||
|
||||
switch (line_p)
|
||||
{
|
||||
case 1:
|
||||
LCDL_WRCMD(0x80);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
LCDL_WRCMD(0xC0);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
usleep(2000);
|
||||
return 0;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Print text to the LCD
|
||||
|
||||
Writes text to the LCD currently selected.
|
||||
|
||||
\param[in] sText_p The text to print
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void lcdl_printText(const char* sText_p)
|
||||
{
|
||||
int i;
|
||||
int length = strlen(sText_p);
|
||||
|
||||
// Longer text is cut due to column limitation!
|
||||
for (i = 0; i < LCDL_COLUMN; i++)
|
||||
{
|
||||
// Write blank if provided text is shorter than column count.
|
||||
if (i < length)
|
||||
LCDL_WRDATA(sText_p[i]);
|
||||
else
|
||||
LCDL_WRDATA(' ');
|
||||
|
||||
usleep(2000);
|
||||
}
|
||||
}
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E F U N C T I O N S //
|
||||
//============================================================================//
|
||||
/// \name Private Functions
|
||||
/// \{
|
||||
|
||||
/// \}
|
|
@ -0,0 +1,409 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file lcd-c5socarm.c
|
||||
|
||||
\brief LCD functions for Altera Cyclone-V HPS LCD
|
||||
|
||||
This implementation uses the Altera Cyclone-V HPS LCD available on
|
||||
Altera Cyclone-V development board(D) for handling LCD module.
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2016, B&R Industrial Automation GmbH
|
||||
Copyright (c) 2013, SYSTEC electronic GmbH
|
||||
Copyright (c) 2015, Kalycito Infotech Private Ltd.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdbool.h>
|
||||
#include <inttypes.h>
|
||||
#include <alt_cache.h>
|
||||
#include <alt_interrupt.h>
|
||||
#include <alt_i2c.h>
|
||||
#include <alt_globaltmr.h>
|
||||
#include <alt_timers.h>
|
||||
#include <socal/hps.h>
|
||||
#include <socal/socal.h>
|
||||
|
||||
#include <system.h>
|
||||
#include <sleep.h>
|
||||
#include <trace/trace.h>
|
||||
#include "lcdl.h"
|
||||
|
||||
//============================================================================//
|
||||
// G L O B A L D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// module global vars
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// global function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//TODO Replace the I2C address from system.h
|
||||
#define LCD_I2C_ADDRESS (0x50 >> 1) // I2C address of LCD module
|
||||
#define LCD_I2C_SPEED 40000 // I2C bus speed for accessing LCD module
|
||||
#define LCD_ESCAPE_CHAR 0xfe // Escape character used to prefix commands
|
||||
#define LCD_POS_1ST_LINE 0x00 // LCD cursor position for 1st line
|
||||
#define LCD_POS_2ND_LINE 0x40 // LCD cursor position for 2nd line
|
||||
#define LCD_PRINT_DELAY_US 500 // Delay in us after printing text on LCD
|
||||
#define LCDL_COLUMN 16 // Maximum Column length
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local types
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
// Commands supported by the LCD display
|
||||
typedef enum
|
||||
{
|
||||
kLcdCmdDisplayOn = 0,
|
||||
kLcdCmdDisplayOff,
|
||||
kLcdCmdSetCursor,
|
||||
kLcdCmdCursorHome,
|
||||
kLcdCmdUnderlineCursorOn,
|
||||
kLcdCmdUnderlineCursorOff,
|
||||
kLcdCmdMoveCursorLeftOnePlace,
|
||||
kLcdCmdMoveCursorRightOnePlace,
|
||||
kLcdCmdBlinkingCursorOn,
|
||||
kLcdCmdBlinkingCursorOff,
|
||||
kLcdCmdBackspace,
|
||||
kLcdCmdClearScreen,
|
||||
kLcdCmdSetContrast,
|
||||
kLcdCmdSetBacklightBrightness,
|
||||
kLcdCmdLoadCustomCharacter,
|
||||
kLcdCmdMoveDisplayOnePlaceToTheLeft,
|
||||
kLcdCmdMoveDisplayOnePlaceToTheRight,
|
||||
kLcdCmdChangeRS232BaudRate,
|
||||
kLcdCmdChangeI2CAddress,
|
||||
kLcdCmdDisplayFirmwareVersionNumber,
|
||||
kLcdCmdDisplayRS232BaudRate,
|
||||
kLcdCmdDisplayI2CAddress,
|
||||
} tLcdCmd;
|
||||
|
||||
// Command description
|
||||
typedef struct
|
||||
{
|
||||
uint8_t command;
|
||||
uint8_t padding;
|
||||
uint16_t executionDuration;
|
||||
} tLcdCmdDesc;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local vars
|
||||
//------------------------------------------------------------------------------
|
||||
ALT_I2C_DEV_t* deviceHandle_l;
|
||||
|
||||
// Descriptions for all supported commands
|
||||
static tLcdCmdDesc lcdCommands_l[] =
|
||||
{
|
||||
{0x41, 0, 100}, // LCD_COMMAND_DISPLAY_ON,
|
||||
{0x42, 0, 100}, // LCD_COMMAND_DISPLAY_OFF,
|
||||
{0x45, 1, 100}, // LCD_COMMAND_SET_CURSOR,
|
||||
{0x46, 0, 1500}, // LCD_COMMAND_CURSOR_HOME,
|
||||
{0x47, 0, 1500}, // LCD_COMMAND_UNDERLINE_CURSOR_ON,
|
||||
{0x48, 0, 1500}, // LCD_COMMAND_UNDERLINE_CURSOR_OFF,
|
||||
{0x49, 0, 100}, // LCD_COMMAND_MOVE_CURSOR_LEFT_ONE_PLACE,
|
||||
{0x4A, 0, 100}, // LCD_COMMAND_MOVE_CURSOR_RIGHT_ONE_PLACE,
|
||||
{0x4B, 0, 100}, // LCD_COMMAND_BLINKING_CURSOR_ON,
|
||||
{0x4C, 0, 100}, // LCD_COMMAND_BLINKING_CURSOR_OFF,
|
||||
{0x4E, 0, 100}, // LCD_COMMAND_BACKSPACE,
|
||||
{0x51, 0, 1500}, // LCD_COMMAND_CLEAR_SCREEN,
|
||||
{0x52, 1, 500}, // LCD_COMMAND_SET_CONTRAST,
|
||||
{0x53, 1, 100}, // LCD_COMMAND_SET_BACKLIGHT_BRIGHTNESS,
|
||||
{0x54, 9, 200}, // LCD_COMMAND_LOAD_CUSTOM_CHARACTER,
|
||||
{0x55, 0, 100}, // LCD_COMMAND_MOVE_DISPLAY_ONE_PLACE_TO_THE_LEFT,
|
||||
{0x56, 0, 100}, // LCD_COMMAND_MOVE_DISPLAY_ONE_PLACE_TO_THE_RIGHT,
|
||||
{0x61, 1, 3000}, // LCD_COMMAND_CHANGE_RS_232_BAUD_RATE,
|
||||
{0x62, 1, 3000}, // LCD_COMMAND_CHANGE_I2C_ADDRESS,
|
||||
{0x70, 0, 4000}, // LCD_COMMAND_DISPLAY_FIRMWARE_VERSION_NUMBER,
|
||||
{0x71, 0, 10000}, // LCD_COMMAND_DISPLAY_RS_232_BAUD_RATE,
|
||||
{0x72, 0, 4000}, // LCD_COMMAND_DISPLAY_I2C_ADDRESS,
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
static inline ALT_STATUS_CODE sendLcdCommand(ALT_I2C_DEV_t* deviceHdl_p,
|
||||
tLcdCmd command_p,
|
||||
const uint8_t* pArg_p);
|
||||
//============================================================================//
|
||||
// P U B L I C F U N C T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Initialize the LCD
|
||||
|
||||
This function writes a sequence of initialization parameters to the LCD.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void lcdl_init(void)
|
||||
{
|
||||
int ret = 0;
|
||||
ALT_I2C_MASTER_CONFIG_t cfg;
|
||||
uint32_t speed;
|
||||
|
||||
// Init I2C module
|
||||
if (alt_i2c_init(ALT_I2C_I2C0, deviceHandle_l) != ALT_E_SUCCESS)
|
||||
{
|
||||
ret = -1;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
if (alt_i2c_enable(deviceHandle_l) != ALT_E_SUCCESS) // Enable I2C module
|
||||
{
|
||||
ret = -1;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
if (alt_i2c_master_config_get(deviceHandle_l, &cfg) != ALT_E_SUCCESS) // Configure I2C module
|
||||
{
|
||||
ret = -1;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
if (alt_i2c_master_config_speed_get(deviceHandle_l, &cfg, (uint32_t*)&speed) != ALT_E_SUCCESS)
|
||||
{
|
||||
ret = -1;
|
||||
goto Exit;
|
||||
}
|
||||
TRACE("LCD INFO: Current I2C speed = %d Hz.\n", (int)speed);
|
||||
|
||||
if (alt_i2c_master_config_speed_set(deviceHandle_l, &cfg, LCD_I2C_SPEED) != ALT_E_SUCCESS)
|
||||
{
|
||||
ret = -1;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
if (alt_i2c_master_config_speed_get(deviceHandle_l, &cfg, (uint32_t*)&speed) != ALT_E_SUCCESS)
|
||||
{
|
||||
ret = -1;
|
||||
goto Exit;
|
||||
}
|
||||
else
|
||||
{
|
||||
TRACE("LCD INFO: New I2C speed = %d Hz.\n", (int)speed);
|
||||
cfg.addr_mode = ALT_I2C_ADDR_MODE_7_BIT;
|
||||
cfg.restart_enable = ALT_E_TRUE;
|
||||
|
||||
if (alt_i2c_master_config_set(deviceHandle_l, &cfg) != ALT_E_SUCCESS)
|
||||
{
|
||||
ret = -1;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
if (alt_i2c_sda_hold_time_set(deviceHandle_l, 8) != ALT_E_SUCCESS)
|
||||
{
|
||||
ret = -1;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
if (alt_i2c_master_target_set(deviceHandle_l, LCD_I2C_ADDRESS) != ALT_E_SUCCESS) // Set target display I2C address
|
||||
{
|
||||
ret = -1;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
if (sendLcdCommand(deviceHandle_l, kLcdCmdDisplayOn, NULL) != ALT_E_SUCCESS) // Turn display on
|
||||
{
|
||||
ret = -1;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
if (sendLcdCommand(deviceHandle_l, kLcdCmdBlinkingCursorOn, NULL) != ALT_E_SUCCESS) // Turn cursor on
|
||||
{
|
||||
ret = -1;
|
||||
goto Exit;
|
||||
}
|
||||
else
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
Exit:
|
||||
if (ret != 0)
|
||||
{
|
||||
TRACE("LCD ERR: Initialization failed!!\n");
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Exit the LCD instance
|
||||
|
||||
This function exits the LCD instance.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void lcdl_exit(void)
|
||||
{
|
||||
lcdl_clear();
|
||||
sendLcdCommand(deviceHandle_l, kLcdCmdDisplayOff, NULL);
|
||||
sendLcdCommand(deviceHandle_l, kLcdCmdBlinkingCursorOff, NULL);
|
||||
alt_i2c_disable(deviceHandle_l);
|
||||
alt_i2c_uninit(deviceHandle_l);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Clear the LCD
|
||||
|
||||
This function clears all lines of the display.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void lcdl_clear(void)
|
||||
{
|
||||
// Clear screen
|
||||
if (sendLcdCommand(deviceHandle_l, kLcdCmdClearScreen, NULL) != ALT_E_SUCCESS)
|
||||
{
|
||||
TRACE("LCD ERR: Failed to clear screen\n");
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Change to specified line
|
||||
|
||||
Changes to specified line of the LCD.
|
||||
|
||||
\param[in] line_p Specifies the line
|
||||
|
||||
\return The function returns 0 if the line is changed successfully, -1 otherwise.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
int lcdl_changeToLine(unsigned int line_p)
|
||||
{
|
||||
uint8_t param;
|
||||
|
||||
if (line_p < 2)
|
||||
param = LCD_POS_1ST_LINE;
|
||||
else
|
||||
param = LCD_POS_2ND_LINE;
|
||||
|
||||
if (sendLcdCommand(deviceHandle_l, kLcdCmdSetCursor, ¶m) != ALT_E_SUCCESS)
|
||||
return -1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Print text to the LCD
|
||||
|
||||
Writes text to the LCD currently selected.
|
||||
|
||||
\param[in] sText_p The text to print
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void lcdl_printText(const char* sText_p)
|
||||
{
|
||||
ALT_STATUS_CODE halRet = ALT_E_SUCCESS;
|
||||
size_t txtLen = strlen(sText_p);
|
||||
const char padTxt = ' ';
|
||||
|
||||
for (size_t i = 0; i < LCDL_COLUMN; i++)
|
||||
{
|
||||
if (i < txtLen)
|
||||
halRet = alt_i2c_master_transmit(deviceHandle_l,
|
||||
&sText_p[i],
|
||||
1,
|
||||
ALT_E_FALSE,
|
||||
ALT_E_TRUE);
|
||||
else
|
||||
halRet = alt_i2c_master_transmit(deviceHandle_l,
|
||||
&padTxt,
|
||||
1,
|
||||
ALT_E_FALSE,
|
||||
ALT_E_TRUE);
|
||||
|
||||
if (halRet != ALT_E_SUCCESS)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E F U N C T I O N S //
|
||||
//============================================================================//
|
||||
/// \name Private Functions
|
||||
/// \{
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Send command to LCD display
|
||||
|
||||
The function sends a I2C command to the LCD module.
|
||||
|
||||
\param[in,out] deviceHdl_p I2C device
|
||||
\param[in] command_p Opcode of command to be sent
|
||||
\param[in] pArg_p Command parameters or NULL for no parameters
|
||||
|
||||
\return Returns an ALT_STATUS_CODE error code.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static inline ALT_STATUS_CODE sendLcdCommand(ALT_I2C_DEV_t* deviceHdl_p,
|
||||
tLcdCmd command_p,
|
||||
const uint8_t* pArg_p)
|
||||
{
|
||||
ALT_STATUS_CODE halRet = ALT_E_SUCCESS;
|
||||
tLcdCmdDesc lcdCommandDesc = lcdCommands_l[(int)command_p];
|
||||
uint8_t data[10];
|
||||
uint8_t dataLen = 0;
|
||||
|
||||
data[dataLen++] = LCD_ESCAPE_CHAR;
|
||||
data[dataLen++] = lcdCommandDesc.command;
|
||||
for (uint8_t i = 0; i < lcdCommandDesc.padding; i++)
|
||||
data[dataLen++] = pArg_p[i];
|
||||
|
||||
halRet = alt_i2c_master_transmit(deviceHdl_p,
|
||||
data,
|
||||
dataLen,
|
||||
ALT_E_FALSE,
|
||||
ALT_E_TRUE);
|
||||
|
||||
return halRet;
|
||||
}
|
||||
|
||||
/// \}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue