90 Manages slaves, domains and IO. |
90 Manages slaves, domains and IO. |
91 */ |
91 */ |
92 |
92 |
93 struct ec_master |
93 struct ec_master |
94 { |
94 { |
95 struct list_head list; /**< list item for module's master list */ |
95 struct kobject kobj; /**< kobject */ |
96 atomic_t available; /**< zero, if the master is reserved for RT */ |
|
97 unsigned int index; /**< master index */ |
96 unsigned int index; /**< master index */ |
98 |
97 unsigned int reserved; /**< non-zero, if the master is reserved for RT */ |
99 struct kobject kobj; /**< kobject */ |
98 |
100 |
99 ec_device_t main_device; /**< EtherCAT device */ |
101 ec_device_t *device; /**< EtherCAT device */ |
100 const uint8_t *main_mac; /**< MAC address of main device */ |
|
101 ec_device_t backup_device; /**< EtherCAT backup device */ |
|
102 const uint8_t *backup_mac; /**< MAC address of backup device */ |
102 struct semaphore device_sem; /**< device semaphore */ |
103 struct semaphore device_sem; /**< device semaphore */ |
103 |
104 |
104 ec_fsm_master_t fsm; /**< master state machine */ |
105 ec_fsm_master_t fsm; /**< master state machine */ |
105 ec_datagram_t fsm_datagram; /**< datagram used for state machines */ |
106 ec_datagram_t fsm_datagram; /**< datagram used for state machines */ |
106 ec_master_mode_t mode; /**< master mode */ |
107 ec_master_mode_t mode; /**< master mode */ |
|
108 unsigned int injection_seq_fsm; /**< datagram injection sequence number |
|
109 for the FSM side */ |
|
110 unsigned int injection_seq_rt; /**< datagram injection sequence number |
|
111 for the realtime side */ |
107 |
112 |
108 struct list_head slaves; /**< list of slaves on the bus */ |
113 struct list_head slaves; /**< list of slaves on the bus */ |
109 unsigned int slave_count; /**< number of slaves on the bus */ |
114 unsigned int slave_count; /**< number of slaves on the bus */ |
|
115 |
|
116 ec_request_state_t scan_state; /**< current scanning state */ |
|
117 unsigned int allow_scan; /**< non-zero, if slave scanning is allowed */ |
|
118 struct semaphore scan_sem; /**< semaphore protecting the scan_state |
|
119 variable and the allow_scan flag */ |
|
120 wait_queue_head_t scan_queue; /**< queue for processes that wait for |
|
121 slave scanning */ |
|
122 |
|
123 ec_request_state_t config_state; /**< state of slave configuration */ |
|
124 unsigned int allow_config; /**< non-zero, if slave scanning is allowed */ |
|
125 struct semaphore config_sem; /**< semaphore protecting the config_state |
|
126 variable and the allow_config flag */ |
|
127 wait_queue_head_t config_queue; /**< queue for processes that wait for |
|
128 slave configuration */ |
110 |
129 |
111 struct list_head datagram_queue; /**< datagram queue */ |
130 struct list_head datagram_queue; /**< datagram queue */ |
112 uint8_t datagram_index; /**< current datagram index */ |
131 uint8_t datagram_index; /**< current datagram index */ |
113 |
132 |
114 struct list_head domains; /**< list of domains */ |
133 struct list_head domains; /**< list of domains */ |
115 |
134 |
116 int debug_level; /**< master debug level */ |
135 int debug_level; /**< master debug level */ |
117 ec_stats_t stats; /**< cyclic statistics */ |
136 ec_stats_t stats; /**< cyclic statistics */ |
|
137 unsigned int pdo_slaves_offline; /** number of slaves, for which PDOs |
|
138 were registered and that are offline |
|
139 (used for bus status) */ |
|
140 unsigned int frames_timed_out; /**< there were frame timeouts in the last |
|
141 call to ecrt_master_receive() */ |
118 |
142 |
119 int thread_id; /**< master thread PID */ |
143 int thread_id; /**< master thread PID */ |
120 struct completion thread_exit; /**< thread completion object */ |
144 struct completion thread_exit; /**< thread completion object */ |
121 uint32_t idle_cycle_times[HZ]; /**< Idle cycle times ring */ |
145 uint32_t idle_cycle_times[HZ]; /**< Idle cycle times ring */ |
122 unsigned int idle_cycle_time_pos; /**< time ring buffer position */ |
146 unsigned int idle_cycle_time_pos; /**< time ring buffer position */ |
123 |
147 |
124 struct timer_list eoe_timer; /**< EoE timer object */ |
148 struct timer_list eoe_timer; /**< EoE timer object */ |
|
149 unsigned int eoe_running; /**< non-zero, if EoE processing is active. */ |
|
150 struct list_head eoe_handlers; /**< Ethernet-over-EtherCAT handlers */ |
125 uint32_t eoe_cycle_times[HZ]; /**< EoE cycle times ring */ |
151 uint32_t eoe_cycle_times[HZ]; /**< EoE cycle times ring */ |
126 unsigned int eoe_cycle_time_pos; /**< time ring buffer position */ |
152 unsigned int eoe_cycle_time_pos; /**< time ring buffer position */ |
127 unsigned int eoe_running; /**< non-zero, if EoE processing is active. */ |
|
128 unsigned int eoe_checked; /**< non-zero, if EoE processing is not |
|
129 necessary. */ |
|
130 struct list_head eoe_handlers; /**< Ethernet-over-EtherCAT handlers */ |
|
131 |
153 |
132 spinlock_t internal_lock; /**< spinlock used in idle mode */ |
154 spinlock_t internal_lock; /**< spinlock used in idle mode */ |
133 int (*request_cb)(void *); /**< lock request callback */ |
155 int (*request_cb)(void *); /**< lock request callback */ |
134 void (*release_cb)(void *); /**< lock release callback */ |
156 void (*release_cb)(void *); /**< lock release callback */ |
135 void *cb_data; /**< data parameter of locking callbacks */ |
157 void *cb_data; /**< data parameter of locking callbacks */ |
136 |
158 int (*ext_request_cb)(void *); /**< external lock request callback */ |
137 uint8_t eeprom_write_enable; /**< allow write operations to EEPROMs */ |
159 void (*ext_release_cb)(void *); /**< externam lock release callback */ |
138 |
160 void *ext_cb_data; /**< data parameter of external locking callbacks */ |
139 ec_sdo_request_t *sdo_request; /**< pointer to the current SDO request */ |
161 |
140 unsigned int sdo_seq_user; /**< sequence number for user space */ |
162 struct list_head eeprom_requests; /**< EEPROM write requests */ |
141 unsigned int sdo_seq_master; /**< sequence number for master */ |
163 struct semaphore eeprom_sem; /**< semaphore protecting the list of |
142 struct semaphore sdo_sem; /**< SDO semaphore */ |
164 EEPROM write requests */ |
143 struct timer_list sdo_timer; /**< timer for polling sdo processing */ |
165 wait_queue_head_t eeprom_queue; /**< wait queue for EEPROM |
144 struct completion sdo_complete; /**< SDO request completion object */ |
166 write requests from user space */ |
|
167 |
|
168 struct list_head sdo_requests; /**< SDO access requests */ |
|
169 struct semaphore sdo_sem; /**< semaphore protecting the list of |
|
170 SDO access requests */ |
|
171 wait_queue_head_t sdo_queue; /**< wait queue for SDO access requests |
|
172 from user space */ |
145 }; |
173 }; |
146 |
174 |
147 /*****************************************************************************/ |
175 /*****************************************************************************/ |
148 |
176 |
149 // master creation/deletion |
177 // master creation/deletion |
150 int ec_master_init(ec_master_t *, unsigned int, unsigned int); |
178 int ec_master_init(ec_master_t *, struct kobject *, unsigned int, |
151 void ec_master_destroy(ec_master_t *); |
179 const uint8_t *, const uint8_t *); |
|
180 void ec_master_clear(ec_master_t *); |
152 |
181 |
153 // mode transitions |
182 // mode transitions |
154 int ec_master_enter_idle_mode(ec_master_t *); |
183 int ec_master_enter_idle_mode(ec_master_t *); |
155 void ec_master_leave_idle_mode(ec_master_t *); |
184 void ec_master_leave_idle_mode(ec_master_t *); |
156 int ec_master_enter_operation_mode(ec_master_t *); |
185 int ec_master_enter_operation_mode(ec_master_t *); |