modbus: make MODBUS support over serial line optional

Make MODBUS support over serial line optional.

Signed-off-by: Johann Fischer <johann.fischer@nordicsemi.no>
This commit is contained in:
Johann Fischer 2021-03-03 17:55:14 +01:00 committed by Carles Cufí
commit 669d3e9e91
3 changed files with 47 additions and 9 deletions

View file

@ -8,6 +8,10 @@ if(CONFIG_MODBUS)
zephyr_library_sources( zephyr_library_sources(
modbus_core.c modbus_core.c
)
zephyr_library_sources_ifdef(
CONFIG_MODBUS_SERIAL
modbus_serial.c modbus_serial.c
) )

View file

@ -1,9 +1,10 @@
# Copyright (c) 2020 PHYTEC Messtechnik GmbH # Copyright (c) 2020 PHYTEC Messtechnik GmbH
# SPDX-License-Identifier: Apache-2.0 # SPDX-License-Identifier: Apache-2.0
config MODBUS DT_COMPAT_MODBUS_RTU := zephyr,modbus-serial
menuconfig MODBUS
bool "Modbus support" bool "Modbus support"
depends on SERIAL && SERIAL_HAS_DRIVER
if MODBUS if MODBUS
@ -39,7 +40,15 @@ config MODBUS_CLIENT
bool bool
default y if MODBUS_ROLE_CLIENT || MODBUS_ROLE_CLIENT_SERVER default y if MODBUS_ROLE_CLIENT || MODBUS_ROLE_CLIENT_SERVER
config MODBUS_SERIAL
bool "Modbus over serial line support"
depends on SERIAL && SERIAL_HAS_DRIVER
default $(dt_compat_enabled,$(DT_COMPAT_MODBUS_RTU))
help
Enable Modbus over serial line support.
config MODBUS_ASCII_MODE config MODBUS_ASCII_MODE
depends on MODBUS_SERIAL
bool "Modbus transmission mode ASCII" bool "Modbus transmission mode ASCII"
help help
Enable ASCII transmission mode. Enable ASCII transmission mode.

View file

@ -40,9 +40,11 @@ DT_INST_FOREACH_STATUS_OKAY(MB_RTU_DEFINE_GPIO_CFGS)
.re = MB_RTU_ASSIGN_GPIO_CFG(n, re_gpios), \ .re = MB_RTU_ASSIGN_GPIO_CFG(n, re_gpios), \
}, },
#ifdef CONFIG_MODBUS_SERIAL
static struct modbus_serial_config modbus_serial_cfg[] = { static struct modbus_serial_config modbus_serial_cfg[] = {
DT_INST_FOREACH_STATUS_OKAY(MODBUS_DT_GET_SERIAL_DEV) DT_INST_FOREACH_STATUS_OKAY(MODBUS_DT_GET_SERIAL_DEV)
}; };
#endif
#define MODBUS_DT_GET_DEV(n) { \ #define MODBUS_DT_GET_DEV(n) { \
.iface_name = DT_INST_LABEL(n), \ .iface_name = DT_INST_LABEL(n), \
@ -66,8 +68,10 @@ static void modbus_rx_handler(struct k_work *item)
switch (ctx->mode) { switch (ctx->mode) {
case MODBUS_MODE_RTU: case MODBUS_MODE_RTU:
case MODBUS_MODE_ASCII: case MODBUS_MODE_ASCII:
modbus_serial_rx_disable(ctx); if (IS_ENABLED(CONFIG_MODBUS_SERIAL)) {
ctx->rx_frame_err = modbus_serial_rx_frame(ctx); modbus_serial_rx_disable(ctx);
ctx->rx_frame_err = modbus_serial_rx_frame(ctx);
}
break; break;
default: default:
LOG_ERR("Unknown MODBUS mode"); LOG_ERR("Unknown MODBUS mode");
@ -85,7 +89,8 @@ static void modbus_rx_handler(struct k_work *item)
switch (ctx->mode) { switch (ctx->mode) {
case MODBUS_MODE_RTU: case MODBUS_MODE_RTU:
case MODBUS_MODE_ASCII: case MODBUS_MODE_ASCII:
if (respond == false) { if (IS_ENABLED(CONFIG_MODBUS_SERIAL) &&
respond == false) {
LOG_DBG("Server has dropped frame"); LOG_DBG("Server has dropped frame");
modbus_serial_rx_enable(ctx); modbus_serial_rx_enable(ctx);
} }
@ -101,7 +106,8 @@ void mb_tx_frame(struct modbus_context *ctx)
switch (ctx->mode) { switch (ctx->mode) {
case MODBUS_MODE_RTU: case MODBUS_MODE_RTU:
case MODBUS_MODE_ASCII: case MODBUS_MODE_ASCII:
if (modbus_serial_tx_frame(ctx)) { if (IS_ENABLED(CONFIG_MODBUS_SERIAL) &&
modbus_serial_tx_frame(ctx)) {
LOG_ERR("Unsupported MODBUS serial mode"); LOG_ERR("Unsupported MODBUS serial mode");
} }
break; break;
@ -171,8 +177,17 @@ static struct modbus_context *mb_cfg_iface(const uint8_t iface,
mbs_reset_statistics(ctx); mbs_reset_statistics(ctx);
} }
if (modbus_serial_init(ctx, baud, parity, ascii_mode) != 0) { switch (ctx->mode) {
LOG_ERR("Failed to init MODBUS over serial line"); case MODBUS_MODE_RTU:
case MODBUS_MODE_ASCII:
if (IS_ENABLED(CONFIG_MODBUS_SERIAL) &&
modbus_serial_init(ctx, baud, parity, ascii_mode) != 0) {
LOG_ERR("Failed to init MODBUS over serial line");
return NULL;
}
break;
default:
LOG_ERR("Unknown MODBUS mode");
return NULL; return NULL;
} }
@ -254,7 +269,17 @@ int modbus_disable(const uint8_t iface)
ctx = &mb_ctx_tbl[iface]; ctx = &mb_ctx_tbl[iface];
modbus_serial_disable(ctx); switch (ctx->mode) {
case MODBUS_MODE_RTU:
case MODBUS_MODE_ASCII:
if (IS_ENABLED(CONFIG_MODBUS_SERIAL)) {
modbus_serial_disable(ctx);
}
break;
default:
LOG_ERR("Unknown MODBUS mode");
}
ctx->rxwait_to = 0; ctx->rxwait_to = 0;
ctx->node_addr = 0; ctx->node_addr = 0;
ctx->mode = MODBUS_MODE_RTU; ctx->mode = MODBUS_MODE_RTU;