ec_datagram.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /*
  2. * Copyright (c) 2025, sakumisu
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #ifndef EC_DATAGRAM_H
  7. #define EC_DATAGRAM_H
  8. /** EtherCAT datagram type.
  9. */
  10. typedef enum {
  11. EC_DATAGRAM_NONE = 0x00, /**< Dummy. */
  12. EC_DATAGRAM_APRD = 0x01, /**< Auto Increment Physical Read. */
  13. EC_DATAGRAM_APWR = 0x02, /**< Auto Increment Physical Write. */
  14. EC_DATAGRAM_APRW = 0x03, /**< Auto Increment Physical ReadWrite. */
  15. EC_DATAGRAM_FPRD = 0x04, /**< Configured Address Physical Read. */
  16. EC_DATAGRAM_FPWR = 0x05, /**< Configured Address Physical Write. */
  17. EC_DATAGRAM_FPRW = 0x06, /**< Configured Address Physical ReadWrite. */
  18. EC_DATAGRAM_BRD = 0x07, /**< Broadcast Read. */
  19. EC_DATAGRAM_BWR = 0x08, /**< Broadcast Write. */
  20. EC_DATAGRAM_BRW = 0x09, /**< Broadcast ReadWrite. */
  21. EC_DATAGRAM_LRD = 0x0A, /**< Logical Read. */
  22. EC_DATAGRAM_LWR = 0x0B, /**< Logical Write. */
  23. EC_DATAGRAM_LRW = 0x0C, /**< Logical ReadWrite. */
  24. EC_DATAGRAM_ARMW = 0x0D, /**< Auto Increment Physical Read Multiple
  25. Write. */
  26. EC_DATAGRAM_FRMW = 0x0E, /**< Configured Address Physical Read Multiple
  27. Write. */
  28. } ec_datagram_type_t;
  29. /** EtherCAT datagram state.
  30. */
  31. typedef enum {
  32. EC_DATAGRAM_INIT, /**< Initial state of a new datagram. */
  33. EC_DATAGRAM_QUEUED, /**< Queued for sending. */
  34. EC_DATAGRAM_SENT, /**< Sent (still in the queue). */
  35. EC_DATAGRAM_RECEIVED, /**< Received (dequeued). */
  36. EC_DATAGRAM_TIMED_OUT, /**< Timed out (dequeued). */
  37. EC_DATAGRAM_ERROR /**< Error while sending/receiving (dequeued). */
  38. } ec_datagram_state_t;
  39. /** EtherCAT datagram.
  40. */
  41. typedef struct {
  42. ec_dlist_t queue;
  43. ec_dlist_t ext_queue;
  44. ec_dlist_t sent;
  45. uint8_t netdev_idx; /**< Netdev via which the datagram shall be / was sent. */
  46. ec_datagram_type_t type; /**< Datagram type (APRD, BWR, etc.). */
  47. bool static_alloc; /**< True, if \a data is statically allocated. */
  48. uint8_t address[EC_ADDR_LEN]; /**< Recipient address. */
  49. uint8_t *data; /**< Datagram payload. */
  50. size_t mem_size; /**< Datagram \a data memory size. */
  51. size_t data_size; /**< Size of the data in \a data. */
  52. uint8_t index; /**< Index (set by master). */
  53. uint16_t working_counter; /**< Working counter. */
  54. ec_datagram_state_t state; /**< State. */
  55. uint32_t lrw_read_offset; /**< Read Offset in LRW datagram. */
  56. uint32_t lrw_read_size; /**< Read Size in LRW datagram. */
  57. uint64_t jiffies_sent; /**< Jiffies [ns], when the datagram was sent. */
  58. uint64_t jiffies_received; /**< Jiffies [ns], when the datagram was received. */
  59. char name[EC_DATAGRAM_NAME_SIZE]; /**< Description of the datagram. */
  60. bool waiter; /**< True, if someone is waiting for the datagram. */
  61. ec_osal_sem_t wait; /**< Semaphore for waiting. */
  62. } ec_datagram_t;
  63. void ec_datagram_init(ec_datagram_t *datagram, size_t mem_size);
  64. void ec_datagram_init_static(ec_datagram_t *datagram, uint8_t *data, size_t mem_size);
  65. void ec_datagram_clear(ec_datagram_t *datagram);
  66. void ec_datagram_unqueue(ec_datagram_t *datagram);
  67. void ec_datagram_zero(ec_datagram_t *datagram);
  68. void ec_datagram_fill(ec_datagram_t *datagram,
  69. ec_datagram_type_t type,
  70. uint16_t adp,
  71. uint16_t ado,
  72. uint16_t size);
  73. void ec_datagram_aprd(ec_datagram_t *datagram, uint16_t autoinc_address, uint16_t mem_address, size_t data_size);
  74. void ec_datagram_apwr(ec_datagram_t *datagram, uint16_t autoinc_address, uint16_t mem_address, size_t data_size);
  75. void ec_datagram_aprw(ec_datagram_t *datagram, uint16_t autoinc_address, uint16_t mem_address, size_t data_size);
  76. void ec_datagram_armw(ec_datagram_t *datagram, uint16_t autoinc_address, uint16_t mem_address, size_t data_size);
  77. void ec_datagram_fprd(ec_datagram_t *datagram, uint16_t configured_address, uint16_t mem_address, size_t data_size);
  78. void ec_datagram_fpwr(ec_datagram_t *datagram, uint16_t configured_address, uint16_t mem_address, size_t data_size);
  79. void ec_datagram_fprw(ec_datagram_t *datagram, uint16_t configured_address, uint16_t mem_address, size_t data_size);
  80. void ec_datagram_frmw(ec_datagram_t *datagram, uint16_t configured_address, uint16_t mem_address, size_t data_size);
  81. void ec_datagram_brd(ec_datagram_t *datagram, uint16_t mem_address, size_t data_size);
  82. void ec_datagram_bwr(ec_datagram_t *datagram, uint16_t mem_address, size_t data_size);
  83. void ec_datagram_brw(ec_datagram_t *datagram, uint16_t mem_address, size_t data_size);
  84. void ec_datagram_lrd(ec_datagram_t *datagram, uint32_t offset, size_t data_size);
  85. void ec_datagram_lwr(ec_datagram_t *datagram, uint32_t offset, size_t data_size);
  86. void ec_datagram_lrw(ec_datagram_t *datagram, uint32_t offset, size_t data_size);
  87. const char *ec_datagram_type_string(const ec_datagram_t *datagram);
  88. #endif