Commit 669d3e9e authored by Johann Fischer's avatar Johann Fischer Committed by Carles Cufi
Browse files

modbus: make MODBUS support over serial line optional



Make MODBUS support over serial line optional.

Signed-off-by: default avatarJohann Fischer <johann.fischer@nordicsemi.no>
parent b132ab55
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -8,6 +8,10 @@ if(CONFIG_MODBUS)

	zephyr_library_sources(
		modbus_core.c
	)

	zephyr_library_sources_ifdef(
		CONFIG_MODBUS_SERIAL
		modbus_serial.c
	)

+11 −2
Original line number Diff line number Diff line
# Copyright (c) 2020 PHYTEC Messtechnik GmbH
# SPDX-License-Identifier: Apache-2.0

config MODBUS
DT_COMPAT_MODBUS_RTU := zephyr,modbus-serial

menuconfig MODBUS
	bool "Modbus support"
	depends on SERIAL && SERIAL_HAS_DRIVER

if MODBUS

@@ -39,7 +40,15 @@ config MODBUS_CLIENT
	bool
	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
	depends on MODBUS_SERIAL
	bool "Modbus transmission mode ASCII"
	help
	  Enable ASCII transmission mode.
+32 −7
Original line number Diff line number Diff line
@@ -40,9 +40,11 @@ DT_INST_FOREACH_STATUS_OKAY(MB_RTU_DEFINE_GPIO_CFGS)
		.re = MB_RTU_ASSIGN_GPIO_CFG(n, re_gpios),	\
	},

#ifdef CONFIG_MODBUS_SERIAL
static struct modbus_serial_config modbus_serial_cfg[] = {
	DT_INST_FOREACH_STATUS_OKAY(MODBUS_DT_GET_SERIAL_DEV)
};
#endif

#define MODBUS_DT_GET_DEV(n) {					\
		.iface_name = DT_INST_LABEL(n),			\
@@ -66,8 +68,10 @@ static void modbus_rx_handler(struct k_work *item)
	switch (ctx->mode) {
	case MODBUS_MODE_RTU:
	case MODBUS_MODE_ASCII:
		if (IS_ENABLED(CONFIG_MODBUS_SERIAL)) {
			modbus_serial_rx_disable(ctx);
			ctx->rx_frame_err = modbus_serial_rx_frame(ctx);
		}
		break;
	default:
		LOG_ERR("Unknown MODBUS mode");
@@ -85,7 +89,8 @@ static void modbus_rx_handler(struct k_work *item)
		switch (ctx->mode) {
		case MODBUS_MODE_RTU:
		case MODBUS_MODE_ASCII:
			if (respond == false) {
			if (IS_ENABLED(CONFIG_MODBUS_SERIAL) &&
			    respond == false) {
				LOG_DBG("Server has dropped frame");
				modbus_serial_rx_enable(ctx);
			}
@@ -101,7 +106,8 @@ void mb_tx_frame(struct modbus_context *ctx)
	switch (ctx->mode) {
	case MODBUS_MODE_RTU:
	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");
		}
		break;
@@ -171,10 +177,19 @@ static struct modbus_context *mb_cfg_iface(const uint8_t iface,
		mbs_reset_statistics(ctx);
	}

	if (modbus_serial_init(ctx, baud, parity, ascii_mode) != 0) {
	switch (ctx->mode) {
	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;
	}

	LOG_DBG("Modbus interface %s initialized", ctx->iface_name);

@@ -254,7 +269,17 @@ int modbus_disable(const uint8_t iface)

	ctx = &mb_ctx_tbl[iface];

	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->node_addr = 0;
	ctx->mode = MODBUS_MODE_RTU;