modbus: add raw ADU support

MODBUS raw ADU support allows to implement
MODBUS messaging service over TCP or UDP.

Signed-off-by: Johann Fischer <johann.fischer@nordicsemi.no>
This commit is contained in:
Johann Fischer 2021-03-11 00:42:21 +01:00 committed by Carles Cufí
commit 6394298960
6 changed files with 359 additions and 9 deletions

View file

@ -51,8 +51,18 @@ static struct modbus_serial_config modbus_serial_cfg[] = {
.cfg = &modbus_serial_cfg[n], \
},
#define DEFINE_MODBUS_RAW_ADU(x, _) { \
.iface_name = "RAW_"#x, \
.raw_tx_cb = NULL, \
.mode = MODBUS_MODE_RAW, \
},
static struct modbus_context mb_ctx_tbl[] = {
DT_INST_FOREACH_STATUS_OKAY(MODBUS_DT_GET_DEV)
#ifdef CONFIG_MODBUS_RAW_ADU
UTIL_LISTIFY(CONFIG_MODBUS_NUMOF_RAW_ADU, DEFINE_MODBUS_RAW_ADU, _)
#endif
};
static void modbus_rx_handler(struct k_work *item)
@ -73,6 +83,11 @@ static void modbus_rx_handler(struct k_work *item)
ctx->rx_adu_err = modbus_serial_rx_adu(ctx);
}
break;
case MODBUS_MODE_RAW:
if (IS_ENABLED(CONFIG_MODBUS_RAW_ADU)) {
ctx->rx_adu_err = modbus_raw_rx_adu(ctx);
}
break;
default:
LOG_ERR("Unknown MODBUS mode");
return;
@ -113,6 +128,12 @@ void modbus_tx_adu(struct modbus_context *ctx)
LOG_ERR("Unsupported MODBUS serial mode");
}
break;
case MODBUS_MODE_RAW:
if (IS_ENABLED(CONFIG_MODBUS_RAW_ADU) &&
modbus_raw_tx_adu(ctx)) {
LOG_ERR("Unsupported MODBUS raw mode");
}
break;
default:
LOG_ERR("Unknown MODBUS mode");
}
@ -149,6 +170,17 @@ struct modbus_context *modbus_get_context(const uint8_t iface)
return ctx;
}
int modbus_iface_get_by_ctx(const struct modbus_context *ctx)
{
for (int i = 0; i < ARRAY_SIZE(mb_ctx_tbl); i++) {
if (&mb_ctx_tbl[i] == ctx) {
return i;
}
}
return -ENODEV;
}
int modbus_iface_get_by_name(const char *iface_name)
{
for (int i = 0; i < ARRAY_SIZE(mb_ctx_tbl); i++) {
@ -216,6 +248,14 @@ int modbus_init_server(const int iface, struct modbus_iface_param param)
goto init_server_error;
}
break;
case MODBUS_MODE_RAW:
if (IS_ENABLED(CONFIG_MODBUS_RAW_ADU) &&
modbus_raw_init(ctx, param) != 0) {
LOG_ERR("Failed to init MODBUS raw ADU support");
rc = -EINVAL;
goto init_server_error;
}
break;
default:
LOG_ERR("Unknown MODBUS mode");
rc = -ENOTSUP;
@ -268,6 +308,14 @@ int modbus_init_client(const int iface, struct modbus_iface_param param)
goto init_client_error;
}
break;
case MODBUS_MODE_RAW:
if (IS_ENABLED(CONFIG_MODBUS_RAW_ADU) &&
modbus_raw_init(ctx, param) != 0) {
LOG_ERR("Failed to init MODBUS raw ADU support");
rc = -EINVAL;
goto init_client_error;
}
break;
default:
LOG_ERR("Unknown MODBUS mode");
rc = -ENOTSUP;
@ -306,6 +354,8 @@ int modbus_disable(const uint8_t iface)
modbus_serial_disable(ctx);
}
break;
case MODBUS_MODE_RAW:
break;
default:
LOG_ERR("Unknown MODBUS mode");
}