GfA-buildroot-libmodbus-GfA.patch 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. diff --git a/package/libmodbus/001-GfA-echo-rtu.patch b/package/libmodbus/001-GfA-echo-rtu.patch
  2. new file mode 100644
  3. index 0000000000..386172f970
  4. --- /dev/null
  5. +++ b/package/libmodbus/001-GfA-echo-rtu.patch
  6. @@ -0,0 +1,105 @@
  7. +diff -Naur a/src/modbus-rtu.c b/src/modbus-rtu.c
  8. +--- a/src/modbus-rtu.c 2017-10-11 23:07:11.623017506 +0200
  9. ++++ b/src/modbus-rtu.c 2017-10-11 23:07:20.495035402 +0200
  10. +@@ -257,6 +257,27 @@
  11. + }
  12. + #endif
  13. +
  14. ++
  15. ++ssize_t _modbus_rtu_write_n_read(modbus_t *ctx, const uint8_t *req, int req_length) {
  16. ++ ssize_t w, r, i;
  17. ++ uint8_t rb[req_length];
  18. ++
  19. ++ // Transmit
  20. ++ w = write(ctx->s, req, req_length);
  21. ++
  22. ++ // Read back written bytes if hw has echo
  23. ++ r = 0;
  24. ++ while (r < w)
  25. ++ r += read(ctx->s, rb + r, w - r);
  26. ++ if (ctx->debug) {
  27. ++ for (i = 0; i < r; ++i)
  28. ++ fprintf(stderr, "|%02X|", rb[i]);
  29. ++ fprintf(stderr, "\n");
  30. ++ }
  31. ++
  32. ++ return w;
  33. ++}
  34. ++
  35. + ssize_t _modbus_rtu_send(modbus_t *ctx, const uint8_t *req, int req_length)
  36. + {
  37. + #if defined(_WIN32)
  38. +@@ -264,7 +285,14 @@
  39. + DWORD n_bytes = 0;
  40. + return (WriteFile(ctx_rtu->w_ser.fd, req, req_length, &n_bytes, NULL)) ? n_bytes : -1;
  41. + #else
  42. +- return write(ctx->s, req, req_length);
  43. ++ modbus_rtu_t *ctx_rtu = ctx->backend_data;
  44. ++ ssize_t w;
  45. ++
  46. ++ if(!ctx_rtu->echohw)
  47. ++ w = write(ctx->s, req, req_length);
  48. ++ else
  49. ++ w = _modbus_rtu_write_n_read(ctx, req, req_length);
  50. ++ return w;
  51. + #endif
  52. + }
  53. +
  54. +@@ -772,6 +800,30 @@
  55. + }
  56. + }
  57. +
  58. ++
  59. ++int modbus_rtu_set_echohw_mode(modbus_t* ctx, uint8_t mode) {
  60. ++ if (ctx->backend->backend_type == _MODBUS_BACKEND_TYPE_RTU) {
  61. ++ modbus_rtu_t* rtu = (modbus_rtu_t*) ctx->backend_data;
  62. ++ rtu->echohw= mode;
  63. ++ return 0;
  64. ++ }
  65. ++ /* Wrong backend and invalid mode specified */
  66. ++ errno = EINVAL;
  67. ++ return -1;
  68. ++
  69. ++}
  70. ++
  71. ++int modbus_rtu_get_echohw_mode(modbus_t* ctx) {
  72. ++ if (ctx->backend->backend_type == _MODBUS_BACKEND_TYPE_RTU) {
  73. ++ modbus_rtu_t* rtu = (modbus_rtu_t*) ctx->backend_data;
  74. ++ return rtu->echohw;
  75. ++ }
  76. ++ /* Wrong backend and invalid mode specified */
  77. ++ errno = EINVAL;
  78. ++ return -1;
  79. ++
  80. ++}
  81. ++
  82. + void _modbus_rtu_close(modbus_t *ctx)
  83. + {
  84. + /* Closes the file descriptor in RTU mode */
  85. +diff -Naur a/src/modbus-rtu.h b/src/modbus-rtu.h
  86. +--- a/src/modbus-rtu.h 2017-10-11 23:07:11.623017506 +0200
  87. ++++ b/src/modbus-rtu.h 2017-10-11 23:07:20.495035402 +0200
  88. +@@ -37,6 +37,12 @@
  89. + int modbus_rtu_set_serial_mode(modbus_t *ctx, int mode);
  90. + int modbus_rtu_get_serial_mode(modbus_t *ctx);
  91. +
  92. ++#define MODBUS_RTU_HAS_ECHOHW 1
  93. ++#define MODBUS_RTU_NO_ECHOHW 0
  94. ++
  95. ++int modbus_rtu_set_echohw_mode(modbus_t *ctx, uint8_t mode);
  96. ++int modbus_rtu_get_echohw_mode(modbus_t *ctx);
  97. ++
  98. + MODBUS_END_DECLS
  99. +
  100. + #endif /* _MODBUS_RTU_H_ */
  101. +diff -Naur a/src/modbus-rtu-private.h b/src/modbus-rtu-private.h
  102. +--- a/src/modbus-rtu-private.h 2017-10-11 23:07:11.623017506 +0200
  103. ++++ b/src/modbus-rtu-private.h 2017-10-11 23:07:20.495035402 +0200
  104. +@@ -81,6 +81,7 @@
  105. + #if HAVE_DECL_TIOCSRS485
  106. + int serial_mode;
  107. + #endif
  108. ++ uint8_t echohw;
  109. + } modbus_rtu_t;
  110. +
  111. + #endif /* _MODBUS_RTU_PRIVATE_H_ */