From b0518d610039004117bc42bb9fa8c99123cf6a84 Mon Sep 17 00:00:00 2001 From: Johann Fischer Date: Mon, 28 Dec 2020 16:19:19 +0100 Subject: [PATCH] modbus: get interface index according to interface name Add function to get Modbus RTU interface index according to interface name. This can be used to clearly identify interfaces in the application. Signed-off-by: Johann Fischer --- include/modbus/modbus_rtu.h | 12 ++++++++++++ samples/subsys/modbus/rtu_client/app.overlay | 2 +- samples/subsys/modbus/rtu_server/app.overlay | 2 +- samples/subsys/modbus/rtu_server/src/main.c | 10 +++++++++- subsys/modbus/mb_rtu_core.c | 13 +++++++++++++ subsys/modbus/mb_rtu_internal.h | 2 ++ tests/subsys/modbus_rtu/boards/frdm_k64f.overlay | 4 ++-- tests/subsys/modbus_rtu/boards/reel_board.overlay | 2 +- 8 files changed, 41 insertions(+), 6 deletions(-) diff --git a/include/modbus/modbus_rtu.h b/include/modbus/modbus_rtu.h index cbe1136d873..6eb24da98d5 100644 --- a/include/modbus/modbus_rtu.h +++ b/include/modbus/modbus_rtu.h @@ -334,6 +334,18 @@ struct mbs_rtu_user_callbacks { int (*holding_reg_wr_fp)(uint16_t addr, float reg); }; +/** + * @brief Get Modbus RTU interface index according to interface name + * + * If there is more than one interface, it can be used to clearly + * identify interfaces in the application. + * + * @param iface_name Modbus RTU interface name + * + * @retval Modbus RTU interface index or negative error value. + */ +int mb_rtu_iface_get_by_name(const char *iface_name); + /** * @brief Configure Modbus Interface as server * diff --git a/samples/subsys/modbus/rtu_client/app.overlay b/samples/subsys/modbus/rtu_client/app.overlay index 124708a18c3..39f4489fc23 100644 --- a/samples/subsys/modbus/rtu_client/app.overlay +++ b/samples/subsys/modbus/rtu_client/app.overlay @@ -9,7 +9,7 @@ modbus0 { compatible = "zephyr,modbus-serial"; - label = "MODBUS"; + label = "MODBUS0"; status = "okay"; de-gpios = <&arduino_header 15 GPIO_ACTIVE_LOW>; /* D9 */ }; diff --git a/samples/subsys/modbus/rtu_server/app.overlay b/samples/subsys/modbus/rtu_server/app.overlay index 124708a18c3..39f4489fc23 100644 --- a/samples/subsys/modbus/rtu_server/app.overlay +++ b/samples/subsys/modbus/rtu_server/app.overlay @@ -9,7 +9,7 @@ modbus0 { compatible = "zephyr,modbus-serial"; - label = "MODBUS"; + label = "MODBUS0"; status = "okay"; de-gpios = <&arduino_header 15 GPIO_ACTIVE_LOW>; /* D9 */ }; diff --git a/samples/subsys/modbus/rtu_server/src/main.c b/samples/subsys/modbus/rtu_server/src/main.c index 2e9052eaf3c..f746d088e26 100644 --- a/samples/subsys/modbus/rtu_server/src/main.c +++ b/samples/subsys/modbus/rtu_server/src/main.c @@ -102,8 +102,16 @@ static struct mbs_rtu_user_callbacks mbs_cbs = { static int init_modbus_server(void) { - const uint8_t iface = 0; const uint32_t mb_rtu_br = 19200; + const char iface_name[] = {DT_PROP(DT_INST(0, zephyr_modbus_serial), label)}; + int iface; + + iface = mb_rtu_iface_get_by_name(iface_name); + + if (iface < 0) { + LOG_ERR("Failed to get iface index for %s", iface_name); + return iface; + } return mb_rtu_cfg_server(iface, 1, mb_rtu_br, UART_CFG_PARITY_NONE, &mbs_cbs, false); diff --git a/subsys/modbus/mb_rtu_core.c b/subsys/modbus/mb_rtu_core.c index 1c21da7d1a8..0339b4f2fbb 100644 --- a/subsys/modbus/mb_rtu_core.c +++ b/subsys/modbus/mb_rtu_core.c @@ -49,6 +49,7 @@ DT_INST_FOREACH_STATUS_OKAY(MB_RTU_DEFINE_GPIO_CFGS) (&d##_cfg_##n), (NULL)) #define MODBUS_DT_GET_DEV(n) { \ + .iface_name = DT_INST_LABEL(n), \ .dev_name = DT_INST_BUS_LABEL(n), \ .de = MB_RTU_ASSIGN_GPIO_CFG(n, de_gpios), \ .re = MB_RTU_ASSIGN_GPIO_CFG(n, re_gpios), \ @@ -663,6 +664,7 @@ static struct mb_rtu_context *mb_cfg_iface(const uint8_t iface, k_timer_init(&ctx->rtu_timer, mb_rtu_tmr_handler, NULL); k_timer_user_data_set(&ctx->rtu_timer, ctx); + LOG_DBG("Modbus interface %s initialized", ctx->iface_name); return ctx; } @@ -696,6 +698,17 @@ int mb_rtu_cfg_server(const uint8_t iface, const uint8_t node_addr, return 0; } +int mb_rtu_iface_get_by_name(const char *iface_name) +{ + for (int i = 0; i < ARRAY_SIZE(mb_ctx_tbl); i++) { + if (strcmp(iface_name, mb_ctx_tbl[i].iface_name) == 0) { + return i; + } + } + + return -ENODEV; +} + int mb_rtu_cfg_client(const uint8_t iface, const uint32_t baud, const enum uart_config_parity parity, const uint32_t rx_timeout, diff --git a/subsys/modbus/mb_rtu_internal.h b/subsys/modbus/mb_rtu_internal.h index 4d65c0e97dc..834b74676b0 100644 --- a/subsys/modbus/mb_rtu_internal.h +++ b/subsys/modbus/mb_rtu_internal.h @@ -89,6 +89,8 @@ struct mb_rtu_gpio_config { #define MB_RTU_STATE_CONFIGURED 0 struct mb_rtu_context { + /* Interface name */ + const char *iface_name; /* UART device name */ const char *dev_name; /* UART device */ diff --git a/tests/subsys/modbus_rtu/boards/frdm_k64f.overlay b/tests/subsys/modbus_rtu/boards/frdm_k64f.overlay index 581336fe344..e439d4cee07 100644 --- a/tests/subsys/modbus_rtu/boards/frdm_k64f.overlay +++ b/tests/subsys/modbus_rtu/boards/frdm_k64f.overlay @@ -9,7 +9,7 @@ modbus0 { compatible = "zephyr,modbus-serial"; - label = "MODBUS"; + label = "MODBUS0"; status = "okay"; de-gpios = <&gpiob 22 GPIO_ACTIVE_LOW>; /* red LED */ re-gpios = <&gpioe 26 GPIO_ACTIVE_LOW>; /* green LED */ @@ -22,7 +22,7 @@ modbus1 { compatible = "zephyr,modbus-serial"; - label = "MODBUS"; + label = "MODBUS1"; status = "okay"; }; }; diff --git a/tests/subsys/modbus_rtu/boards/reel_board.overlay b/tests/subsys/modbus_rtu/boards/reel_board.overlay index 840434e4917..d5f6a80fae6 100644 --- a/tests/subsys/modbus_rtu/boards/reel_board.overlay +++ b/tests/subsys/modbus_rtu/boards/reel_board.overlay @@ -9,7 +9,7 @@ modbus0 { compatible = "zephyr,modbus-serial"; - label = "MODBUS"; + label = "MODBUS0"; status = "okay"; }; };