ec_master.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /*
  2. * Copyright (c) 2025, sakumisu
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #ifndef EC_MASTER_H
  7. #define EC_MASTER_H
  8. #include <stdbool.h>
  9. #include <string.h>
  10. #include <stdint.h>
  11. #include <stdlib.h>
  12. #include "ec_config.h"
  13. #include "ec_util.h"
  14. #include "ec_list.h"
  15. #include "ec_errno.h"
  16. #include "ec_log.h"
  17. #include "esc_register.h"
  18. #include "ec_def.h"
  19. #include "ec_osal.h"
  20. #include "ec_port.h"
  21. #include "ec_timestamp.h"
  22. #include "ec_version.h"
  23. #include "ec_datagram.h"
  24. #include "ec_common.h"
  25. #include "ec_sii.h"
  26. #include "ec_slave.h"
  27. #include "ec_mailbox.h"
  28. #include "ec_coe.h"
  29. #include "ec_foe.h"
  30. #include "ec_eoe.h"
  31. #include "ec_cmd.h"
  32. typedef struct {
  33. unsigned int timeouts;
  34. unsigned int corrupted;
  35. unsigned int unmatched;
  36. } ec_master_stats_t;
  37. typedef enum {
  38. EC_UNKNOWN, /**< Unknown phase. No Ethernet device is attached. */
  39. EC_IDLE, /**< Idle phase. An Ethernet device is attached, but the master is not in use, yet. */
  40. EC_OPERATION /**< Operation phase. The master was requested by a realtime application. */
  41. } ec_master_phase_t;
  42. typedef struct ec_master {
  43. uint8_t index;
  44. ec_netdev_t *netdev[CONFIG_EC_MAX_NETDEVS];
  45. bool link_state[CONFIG_EC_MAX_NETDEVS];
  46. uint32_t slaves_working_counter[CONFIG_EC_MAX_NETDEVS];
  47. ec_slave_state_t slaves_state[CONFIG_EC_MAX_NETDEVS];
  48. bool started; /**< Master is started. */
  49. bool scan_done; /**< Slave scan is done. */
  50. bool rescan_request; /**< Rescan requested. */
  51. ec_master_stats_t stats;
  52. ec_master_phase_t phase;
  53. ec_datagram_t main_datagram; /**< Main datagram for slave scan & state change & config & sii */
  54. ec_datagram_t pdo_datagram; /**< pdo datagram */
  55. ec_dlist_t datagram_queue; /**< Queue of pending datagrams*/
  56. uint8_t datagram_index;
  57. ec_slave_t *dc_ref_clock; /**< DC reference clock slave. */
  58. ec_datagram_t dc_ref_sync_datagram; /**< Datagram used for synchronizing the reference clock to the master clock. */
  59. ec_datagram_t dc_all_sync_datagram; /**< Datagram used for synchronizing all slaves to the dc ref clock. */
  60. bool dc_sync_with_dc_ref_enable; /**< true: Sync the reference clock by dc ref clock, false: by master */
  61. uint32_t cycle_time; /**< Cycle time [ns]. */
  62. int32_t shift_time; /**< Shift time [ns]. */
  63. int64_t dc_sync_integral; /**< DC integral value. */
  64. uint64_t interval;
  65. ec_slave_t *slaves;
  66. uint32_t slave_count;
  67. bool perf_enable;
  68. uint64_t last_start_time;
  69. uint32_t min_period_ns;
  70. uint32_t max_period_ns;
  71. uint64_t total_period_ns;
  72. uint64_t period_count;
  73. uint32_t min_exec_ns;
  74. uint32_t max_exec_ns;
  75. uint64_t total_exec_ns;
  76. uint64_t exec_count;
  77. int32_t min_offset_ns;
  78. int32_t max_offset_ns;
  79. ec_osal_mutex_t scan_lock;
  80. ec_osal_thread_t scan_thread;
  81. ec_osal_thread_t nonperiod_thread;
  82. ec_osal_sem_t nonperiod_sem;
  83. struct ec_osal_timer *linkdetect_timer;
  84. bool nonperiod_suspend;
  85. uint8_t pdo_buffer[CONFIG_EC_MAX_NETDEVS][CONFIG_EC_MAX_PDO_BUFSIZE];
  86. uint32_t actual_pdo_size; /**< Actual PDO size for current setting. */
  87. uint32_t expected_working_counter; /**< Expected working counter for PDO datagrams. */
  88. uint32_t actual_working_counter; /**< Actual working counter for PDO datagrams. */
  89. } ec_master_t;
  90. int ec_master_init(ec_master_t *master, uint8_t master_index);
  91. void ec_master_deinit(ec_master_t *master);
  92. int ec_master_start(ec_master_t *master);
  93. int ec_master_stop(ec_master_t *master);
  94. int ec_master_queue_ext_datagram(ec_master_t *master, ec_datagram_t *datagram, bool wakep_poll, bool waiter);
  95. uint8_t *ec_master_get_slave_domain(ec_master_t *master, uint32_t slave_index);
  96. uint8_t *ec_master_get_slave_domain_output(ec_master_t *master, uint32_t slave_index);
  97. uint8_t *ec_master_get_slave_domain_input(ec_master_t *master, uint32_t slave_index);
  98. uint32_t ec_master_get_slave_domain_size(ec_master_t *master, uint32_t slave_index);
  99. uint32_t ec_master_get_slave_domain_osize(ec_master_t *master, uint32_t slave_index);
  100. uint32_t ec_master_get_slave_domain_isize(ec_master_t *master, uint32_t slave_index);
  101. int ec_master_find_slave_sync_info(uint32_t vendor_id,
  102. uint32_t product_code,
  103. uint32_t revision_number,
  104. uint8_t cia402_mode,
  105. ec_sync_info_t **syncs,
  106. uint8_t *sync_count);
  107. #endif