|
@@ -0,0 +1,228 @@
|
|
|
+diff --git a/package/libmodbus/001-GfA-echo-rtu.patch b/package/libmodbus/001-GfA-echo-rtu.patch
|
|
|
+deleted file mode 100644
|
|
|
+index 386172f..0000000
|
|
|
+--- a/package/libmodbus/001-GfA-echo-rtu.patch
|
|
|
++++ /dev/null
|
|
|
+@@ -1,105 +0,0 @@
|
|
|
+-diff -Naur a/src/modbus-rtu.c b/src/modbus-rtu.c
|
|
|
+---- a/src/modbus-rtu.c 2017-10-11 23:07:11.623017506 +0200
|
|
|
+-+++ b/src/modbus-rtu.c 2017-10-11 23:07:20.495035402 +0200
|
|
|
+-@@ -257,6 +257,27 @@
|
|
|
+- }
|
|
|
+- #endif
|
|
|
+-
|
|
|
+-+
|
|
|
+-+ssize_t _modbus_rtu_write_n_read(modbus_t *ctx, const uint8_t *req, int req_length) {
|
|
|
+-+ ssize_t w, r, i;
|
|
|
+-+ uint8_t rb[req_length];
|
|
|
+-+
|
|
|
+-+ // Transmit
|
|
|
+-+ w = write(ctx->s, req, req_length);
|
|
|
+-+
|
|
|
+-+ // Read back written bytes if hw has echo
|
|
|
+-+ r = 0;
|
|
|
+-+ while (r < w)
|
|
|
+-+ r += read(ctx->s, rb + r, w - r);
|
|
|
+-+ if (ctx->debug) {
|
|
|
+-+ for (i = 0; i < r; ++i)
|
|
|
+-+ fprintf(stderr, "|%02X|", rb[i]);
|
|
|
+-+ fprintf(stderr, "\n");
|
|
|
+-+ }
|
|
|
+-+
|
|
|
+-+ return w;
|
|
|
+-+}
|
|
|
+-+
|
|
|
+- ssize_t _modbus_rtu_send(modbus_t *ctx, const uint8_t *req, int req_length)
|
|
|
+- {
|
|
|
+- #if defined(_WIN32)
|
|
|
+-@@ -264,7 +285,14 @@
|
|
|
+- DWORD n_bytes = 0;
|
|
|
+- return (WriteFile(ctx_rtu->w_ser.fd, req, req_length, &n_bytes, NULL)) ? n_bytes : -1;
|
|
|
+- #else
|
|
|
+-- return write(ctx->s, req, req_length);
|
|
|
+-+ modbus_rtu_t *ctx_rtu = ctx->backend_data;
|
|
|
+-+ ssize_t w;
|
|
|
+-+
|
|
|
+-+ if(!ctx_rtu->echohw)
|
|
|
+-+ w = write(ctx->s, req, req_length);
|
|
|
+-+ else
|
|
|
+-+ w = _modbus_rtu_write_n_read(ctx, req, req_length);
|
|
|
+-+ return w;
|
|
|
+- #endif
|
|
|
+- }
|
|
|
+-
|
|
|
+-@@ -772,6 +800,30 @@
|
|
|
+- }
|
|
|
+- }
|
|
|
+-
|
|
|
+-+
|
|
|
+-+int modbus_rtu_set_echohw_mode(modbus_t* ctx, uint8_t mode) {
|
|
|
+-+ if (ctx->backend->backend_type == _MODBUS_BACKEND_TYPE_RTU) {
|
|
|
+-+ modbus_rtu_t* rtu = (modbus_rtu_t*) ctx->backend_data;
|
|
|
+-+ rtu->echohw= mode;
|
|
|
+-+ return 0;
|
|
|
+-+ }
|
|
|
+-+ /* Wrong backend and invalid mode specified */
|
|
|
+-+ errno = EINVAL;
|
|
|
+-+ return -1;
|
|
|
+-+
|
|
|
+-+}
|
|
|
+-+
|
|
|
+-+int modbus_rtu_get_echohw_mode(modbus_t* ctx) {
|
|
|
+-+ if (ctx->backend->backend_type == _MODBUS_BACKEND_TYPE_RTU) {
|
|
|
+-+ modbus_rtu_t* rtu = (modbus_rtu_t*) ctx->backend_data;
|
|
|
+-+ return rtu->echohw;
|
|
|
+-+ }
|
|
|
+-+ /* Wrong backend and invalid mode specified */
|
|
|
+-+ errno = EINVAL;
|
|
|
+-+ return -1;
|
|
|
+-+
|
|
|
+-+}
|
|
|
+-+
|
|
|
+- void _modbus_rtu_close(modbus_t *ctx)
|
|
|
+- {
|
|
|
+- /* Closes the file descriptor in RTU mode */
|
|
|
+-diff -Naur a/src/modbus-rtu.h b/src/modbus-rtu.h
|
|
|
+---- a/src/modbus-rtu.h 2017-10-11 23:07:11.623017506 +0200
|
|
|
+-+++ b/src/modbus-rtu.h 2017-10-11 23:07:20.495035402 +0200
|
|
|
+-@@ -37,6 +37,12 @@
|
|
|
+- int modbus_rtu_set_serial_mode(modbus_t *ctx, int mode);
|
|
|
+- int modbus_rtu_get_serial_mode(modbus_t *ctx);
|
|
|
+-
|
|
|
+-+#define MODBUS_RTU_HAS_ECHOHW 1
|
|
|
+-+#define MODBUS_RTU_NO_ECHOHW 0
|
|
|
+-+
|
|
|
+-+int modbus_rtu_set_echohw_mode(modbus_t *ctx, uint8_t mode);
|
|
|
+-+int modbus_rtu_get_echohw_mode(modbus_t *ctx);
|
|
|
+-+
|
|
|
+- MODBUS_END_DECLS
|
|
|
+-
|
|
|
+- #endif /* _MODBUS_RTU_H_ */
|
|
|
+-diff -Naur a/src/modbus-rtu-private.h b/src/modbus-rtu-private.h
|
|
|
+---- a/src/modbus-rtu-private.h 2017-10-11 23:07:11.623017506 +0200
|
|
|
+-+++ b/src/modbus-rtu-private.h 2017-10-11 23:07:20.495035402 +0200
|
|
|
+-@@ -81,6 +81,7 @@
|
|
|
+- #if HAVE_DECL_TIOCSRS485
|
|
|
+- int serial_mode;
|
|
|
+- #endif
|
|
|
+-+ uint8_t echohw;
|
|
|
+- } modbus_rtu_t;
|
|
|
+-
|
|
|
+- #endif /* _MODBUS_RTU_PRIVATE_H_ */
|
|
|
+diff --git a/package/libmodbus/002-GfA-fflush-for-debug.patch b/package/libmodbus/002-GfA-fflush-for-debug.patch
|
|
|
+deleted file mode 100644
|
|
|
+index 93eaa9a..0000000
|
|
|
+--- a/package/libmodbus/002-GfA-fflush-for-debug.patch
|
|
|
++++ /dev/null
|
|
|
+@@ -1,47 +0,0 @@
|
|
|
+-diff '--exclude=.libs*' -Naurp libmodbus-3.0.6/src/modbus.c b/src/modbus.c
|
|
|
+---- libmodbus-3.0.6/src/modbus.c 2014-04-02 23:34:00.000000000 +0200
|
|
|
+-+++ b/src/modbus.c 2018-06-15 08:36:32.657047324 +0200
|
|
|
+-@@ -170,6 +170,7 @@ static int send_msg(modbus_t *ctx, uint8
|
|
|
+- for (i = 0; i < msg_length; i++)
|
|
|
+- printf("[%.2X]", msg[i]);
|
|
|
+- printf("\n");
|
|
|
+-+ fflush(stdout);
|
|
|
+- }
|
|
|
+-
|
|
|
+- /* In recovery mode, the write command will be issued until to be
|
|
|
+-@@ -407,6 +408,7 @@ static int receive_msg(modbus_t *ctx, ui
|
|
|
+- int i;
|
|
|
+- for (i=0; i < rc; i++)
|
|
|
+- printf("<%.2X>", msg[msg_length + i]);
|
|
|
+-+ fflush(stdout);
|
|
|
+- }
|
|
|
+-
|
|
|
+- /* Sums bytes received */
|
|
|
+-diff '--exclude=.libs*' -Naurp libmodbus-3.0.6/src/modbus-rtu.c b/src/modbus-rtu.c
|
|
|
+---- libmodbus-3.0.6/src/modbus-rtu.c 2018-06-16 17:44:19.011371930 +0200
|
|
|
+-+++ b/src/modbus-rtu.c 2018-06-15 08:34:34.544888427 +0200
|
|
|
+-@@ -260,7 +260,7 @@ static int win32_ser_read(struct win32_s
|
|
|
+-
|
|
|
+- ssize_t _modbus_rtu_write_n_read(modbus_t *ctx, const uint8_t *req, int req_length) {
|
|
|
+- ssize_t w, r, i;
|
|
|
+-- uint8_t rb[req_length];
|
|
|
+-+ uint8_t rb[512];
|
|
|
+-
|
|
|
+- // Transmit
|
|
|
+- w = write(ctx->s, req, req_length);
|
|
|
+-@@ -273,6 +273,7 @@ ssize_t _modbus_rtu_write_n_read(modbus_
|
|
|
+- for (i = 0; i < r; ++i)
|
|
|
+- fprintf(stderr, "|%02X|", rb[i]);
|
|
|
+- fprintf(stderr, "\n");
|
|
|
+-+ fflush(stderr);
|
|
|
+- }
|
|
|
+-
|
|
|
+- return w;
|
|
|
+-@@ -325,6 +326,7 @@ int _modbus_rtu_check_integrity(modbus_t
|
|
|
+- if (ctx->debug) {
|
|
|
+- fprintf(stderr, "ERROR CRC received %0X != CRC calculated %0X\n",
|
|
|
+- crc_received, crc_calculated);
|
|
|
+-+ fflush(stderr);
|
|
|
+- }
|
|
|
+- if (ctx->error_recovery & MODBUS_ERROR_RECOVERY_PROTOCOL) {
|
|
|
+- _modbus_rtu_flush(ctx);
|
|
|
+diff --git a/package/libmodbus/003-GfA-empty-input-queue-on-CRC-error.patch b/package/libmodbus/003-GfA-empty-input-queue-on-CRC-error.patch
|
|
|
+deleted file mode 100644
|
|
|
+index 79a7ae3..0000000
|
|
|
+--- a/package/libmodbus/003-GfA-empty-input-queue-on-CRC-error.patch
|
|
|
++++ /dev/null
|
|
|
+@@ -1,39 +0,0 @@
|
|
|
+-diff '--exclude=.libs*' '--exclude=*.la' '--exclude=*.lo' '--exclude=Makefile*' -Naurp libmodbus-3.0.6/src/modbus-rtu.c b/src/modbus-rtu.c
|
|
|
+---- libmodbus-3.0.6/src/modbus-rtu.c 2018-06-22 10:34:55.987233891 +0200
|
|
|
+-+++ b/src/modbus-rtu.c 2018-06-18 19:47:12.682614777 +0200
|
|
|
+-@@ -323,6 +323,35 @@ int _modbus_rtu_check_integrity(modbus_t
|
|
|
+- if (crc_calculated == crc_received) {
|
|
|
+- return msg_length;
|
|
|
+- } else {
|
|
|
+-+ modbus_rtu_t *ctx_rtu = ctx->backend_data;
|
|
|
+-+
|
|
|
+-+ if(ctx_rtu->echohw) {/* on active echomode empty receiver on crc error */
|
|
|
+-+ int rc;
|
|
|
+-+ fd_set rfds;
|
|
|
+-+ struct timeval tv;
|
|
|
+-+
|
|
|
+-+ /* Add a file descriptor to the set */
|
|
|
+-+ FD_ZERO(&rfds);
|
|
|
+-+ FD_SET(ctx->s, &rfds);
|
|
|
+-+
|
|
|
+-+ if (ctx->debug) {
|
|
|
+-+ fprintf(stderr, "ERROR CRC received on ECHOHW empty input tv.tv_sec=%d tv.tv_usec=%d\n",
|
|
|
+-+ (int)ctx->response_timeout.tv_sec,
|
|
|
+-+ (int)ctx->response_timeout.tv_usec);
|
|
|
+-+ fflush(stderr);
|
|
|
+-+ }
|
|
|
+-+
|
|
|
+-+ do {
|
|
|
+-+ unsigned char cc[256]; /* dummy buffer für cleaning input */
|
|
|
+-+
|
|
|
+-+ tv.tv_sec = ctx->response_timeout.tv_sec;
|
|
|
+-+ tv.tv_usec = ctx->response_timeout.tv_usec;
|
|
|
+-+
|
|
|
+-+ rc = ctx->backend->select(ctx, &rfds, &tv, sizeof(cc));
|
|
|
+-+ if(rc > 0) ctx->backend->recv(ctx, msg + msg_length, rc);
|
|
|
+-+ } while(rc > 0); /* read until transfer empty */
|
|
|
+-+ }
|
|
|
+-+
|
|
|
+- if (ctx->debug) {
|
|
|
+- fprintf(stderr, "ERROR CRC received %0X != CRC calculated %0X\n",
|
|
|
+- crc_received, crc_calculated);
|
|
|
+diff --git a/package/libmodbus/libmodbus.mk b/package/libmodbus/libmodbus.mk
|
|
|
+index 1f8c730..62909e4 100644
|
|
|
+--- a/package/libmodbus/libmodbus.mk
|
|
|
++++ b/package/libmodbus/libmodbus.mk
|
|
|
+@@ -4,10 +4,12 @@
|
|
|
+ #
|
|
|
+ ################################################################################
|
|
|
+
|
|
|
+-LIBMODBUS_VERSION = 3.0.6
|
|
|
+-LIBMODBUS_SITE = http://libmodbus.org/releases
|
|
|
++LIBMODBUS_VERSION = GfA
|
|
|
++LIBMODBUS_SITE = https://gogs.reru.org/GfA/libmodbus.git
|
|
|
++LIBMODBUS_SITE_METHOD = git
|
|
|
+ LIBMODBUS_LICENSE = LGPLv2.1+
|
|
|
+ LIBMODBUS_LICENSE_FILES = COPYING.LESSER
|
|
|
++LIBMODBUS_AUTORECONF = YES
|
|
|
+ LIBMODBUS_INSTALL_STAGING = YES
|
|
|
+
|
|
|
+ $(eval $(autotools-package))
|