75 |
75 |
76 struct ec_slave; |
76 struct ec_slave; |
77 typedef struct ec_slave ec_slave_t; /**< \see ec_slave */ |
77 typedef struct ec_slave ec_slave_t; /**< \see ec_slave */ |
78 |
78 |
79 /** |
79 /** |
80 Initialization type for PDO registrations. |
80 * Bus status. |
81 This type is used as a parameter for the ec_domain_register_pdo_list() |
81 */ |
82 function. |
82 |
83 */ |
83 typedef enum { |
84 |
84 EC_BUS_FAILURE = -1, /**< At least one slave with process data exchange |
85 typedef struct |
85 is offline. */ |
86 { |
86 EC_BUS_OK /**< All slaves with process data exchange are |
87 const char *slave_address; /**< slave address string (see |
87 online. */ |
88 ecrt_master_get_slave()) */ |
88 } |
|
89 ec_bus_status_t; |
|
90 |
|
91 /** |
|
92 * Master status. |
|
93 * This is used for the output parameter of ecrt_master_get_status(). |
|
94 */ |
|
95 |
|
96 typedef struct { |
|
97 ec_bus_status_t bus_status; /**< \see ec_bus_status_t */ |
|
98 unsigned int bus_tainted; /**< non-zero, if the bus topology is invalid */ |
|
99 unsigned int slaves_responding; /**< number of responging slaves */ |
|
100 } |
|
101 ec_master_status_t; |
|
102 |
|
103 /** |
|
104 * List entry for domain PDO registrations. |
|
105 * This type is used as a parameter for the ecrt_domain_register_pdo_list() |
|
106 * convenience function. |
|
107 */ |
|
108 |
|
109 typedef struct { |
|
110 const char *slave_address; /**< slave address string |
|
111 \see ec_master_parse_slave_address() */ |
89 uint32_t vendor_id; /**< vendor ID */ |
112 uint32_t vendor_id; /**< vendor ID */ |
90 uint32_t product_code; /**< product code */ |
113 uint32_t product_code; /**< product code */ |
91 uint16_t pdo_index; /**< PDO index */ |
114 uint16_t pdo_entry_index; /**< PDO entry index */ |
92 uint8_t pdo_subindex; /**< PDO subindex */ |
115 uint8_t pdo_entry_subindex; /**< PDO entry subindex */ |
93 void **data_ptr; /**< address of the process data pointer */ |
116 void **data_ptr; /**< address of the process data pointer */ |
94 } |
117 } |
95 ec_pdo_reg_t; |
118 ec_pdo_reg_t; |
96 |
119 |
97 /** |
120 /** |
98 Direction type for ec_domain_register_pdo_range() |
121 * Direction type for PDO mapping and range registration functions. |
99 */ |
122 */ |
100 |
123 |
101 typedef enum {EC_DIR_INPUT, EC_DIR_OUTPUT} ec_direction_t; |
124 typedef enum { |
102 |
125 EC_DIR_OUTPUT, /**< values written by master */ |
103 /****************************************************************************** |
126 EC_DIR_INPUT /**< values read by master */ |
104 * Master request functions |
127 } |
|
128 ec_direction_t; |
|
129 |
|
130 /****************************************************************************** |
|
131 * Global functions |
105 *****************************************************************************/ |
132 *****************************************************************************/ |
106 |
133 |
107 ec_master_t *ecrt_request_master(unsigned int master_index); |
134 ec_master_t *ecrt_request_master(unsigned int master_index); |
108 void ecrt_release_master(ec_master_t *master); |
135 void ecrt_release_master(ec_master_t *master); |
109 |
136 |
116 void ecrt_master_callbacks(ec_master_t *master, int (*request_cb)(void *), |
143 void ecrt_master_callbacks(ec_master_t *master, int (*request_cb)(void *), |
117 void (*release_cb)(void *), void *cb_data); |
144 void (*release_cb)(void *), void *cb_data); |
118 |
145 |
119 ec_domain_t *ecrt_master_create_domain(ec_master_t *master); |
146 ec_domain_t *ecrt_master_create_domain(ec_master_t *master); |
120 |
147 |
|
148 ec_slave_t *ecrt_master_get_slave(const ec_master_t *, const char *, |
|
149 uint32_t vendor_id, uint32_t product_code); |
|
150 ec_slave_t *ecrt_master_get_slave_by_pos(const ec_master_t *, uint16_t, |
|
151 uint32_t vendor_id, uint32_t product_code); |
|
152 |
121 int ecrt_master_activate(ec_master_t *master); |
153 int ecrt_master_activate(ec_master_t *master); |
122 |
154 |
123 void ecrt_master_send(ec_master_t *master); |
155 void ecrt_master_send(ec_master_t *master); |
124 void ecrt_master_receive(ec_master_t *master); |
156 void ecrt_master_receive(ec_master_t *master); |
125 |
157 |
126 void ecrt_master_run(ec_master_t *master); |
158 void ecrt_master_get_status(const ec_master_t *master, ec_master_status_t *); |
127 |
|
128 ec_slave_t *ecrt_master_get_slave(const ec_master_t *, const char *); |
|
129 |
|
130 /** \cond */ |
|
131 int ecrt_master_state(const ec_master_t *master); |
|
132 /** \endcond */ |
|
133 |
159 |
134 /****************************************************************************** |
160 /****************************************************************************** |
135 * Domain Methods |
161 * Domain Methods |
136 *****************************************************************************/ |
162 *****************************************************************************/ |
137 |
163 |
138 ec_slave_t *ecrt_domain_register_pdo(ec_domain_t *domain, |
164 int ecrt_domain_register_pdo(ec_domain_t *domain, ec_slave_t *slave, |
139 const char *address, |
165 uint16_t pdo_index, uint8_t pdo_subindex, void **data_ptr); |
140 uint32_t vendor_id, |
166 |
141 uint32_t product_code, |
167 int ecrt_domain_register_pdo_range(ec_domain_t *domain, ec_slave_t *slave, |
142 uint16_t pdo_index, |
168 ec_direction_t direction, uint16_t offset, uint16_t length, |
143 uint8_t pdo_subindex, |
169 void **data_ptr); |
144 void **data_ptr); |
|
145 |
170 |
146 int ecrt_domain_register_pdo_list(ec_domain_t *domain, |
171 int ecrt_domain_register_pdo_list(ec_domain_t *domain, |
147 const ec_pdo_reg_t *pdos); |
172 const ec_pdo_reg_t *pdos); |
148 |
|
149 ec_slave_t *ecrt_domain_register_pdo_range(ec_domain_t *domain, |
|
150 const char *address, |
|
151 uint32_t vendor_id, |
|
152 uint32_t product_code, |
|
153 ec_direction_t direction, |
|
154 uint16_t offset, |
|
155 uint16_t length, |
|
156 void **data_ptr); |
|
157 |
173 |
158 void ecrt_domain_process(ec_domain_t *domain); |
174 void ecrt_domain_process(ec_domain_t *domain); |
159 void ecrt_domain_queue(ec_domain_t *domain); |
175 void ecrt_domain_queue(ec_domain_t *domain); |
|
176 |
160 int ecrt_domain_state(const ec_domain_t *domain); |
177 int ecrt_domain_state(const ec_domain_t *domain); |
161 |
178 |
162 /****************************************************************************** |
179 /****************************************************************************** |
163 * Slave Methods |
180 * Slave Methods |
164 *****************************************************************************/ |
181 *****************************************************************************/ |
168 int ecrt_slave_conf_sdo16(ec_slave_t *slave, uint16_t sdo_index, |
185 int ecrt_slave_conf_sdo16(ec_slave_t *slave, uint16_t sdo_index, |
169 uint8_t sdo_subindex, uint16_t value); |
186 uint8_t sdo_subindex, uint16_t value); |
170 int ecrt_slave_conf_sdo32(ec_slave_t *slave, uint16_t sdo_index, |
187 int ecrt_slave_conf_sdo32(ec_slave_t *slave, uint16_t sdo_index, |
171 uint8_t sdo_subindex, uint32_t value); |
188 uint8_t sdo_subindex, uint32_t value); |
172 |
189 |
|
190 void ecrt_slave_pdo_mapping_clear(ec_slave_t *, ec_direction_t); |
|
191 int ecrt_slave_pdo_mapping_add(ec_slave_t *, ec_direction_t, uint16_t); |
|
192 int ecrt_slave_pdo_mapping(ec_slave_t *, ec_direction_t, unsigned int, ...); |
|
193 |
173 /****************************************************************************** |
194 /****************************************************************************** |
174 * Bitwise read/write macros |
195 * Bitwise read/write macros |
175 *****************************************************************************/ |
196 *****************************************************************************/ |
176 |
197 |
177 /** |
198 /** |
178 Read a certain bit of an EtherCAT data byte. |
199 * Read a certain bit of an EtherCAT data byte. |
179 \param DATA EtherCAT data pointer |
200 * \param DATA EtherCAT data pointer |
180 \param POS bit position |
201 * \param POS bit position |
181 */ |
202 */ |
182 |
203 |
183 #define EC_READ_BIT(DATA, POS) ((*((uint8_t *) (DATA)) >> (POS)) & 0x01) |
204 #define EC_READ_BIT(DATA, POS) ((*((uint8_t *) (DATA)) >> (POS)) & 0x01) |
184 |
205 |
185 /** |
206 /** |
186 Write a certain bit of an EtherCAT data byte. |
207 * Write a certain bit of an EtherCAT data byte. |
187 \param DATA EtherCAT data pointer |
208 * \param DATA EtherCAT data pointer |
188 \param POS bit position |
209 * \param POS bit position |
189 \param VAL new bit value |
210 * \param VAL new bit value |
190 */ |
211 */ |
191 |
212 |
192 #define EC_WRITE_BIT(DATA, POS, VAL) \ |
213 #define EC_WRITE_BIT(DATA, POS, VAL) \ |
193 do { \ |
214 do { \ |
194 if (VAL) *((uint8_t *) (DATA)) |= (1 << (POS)); \ |
215 if (VAL) *((uint8_t *) (DATA)) |= (1 << (POS)); \ |
195 else *((uint8_t *) (DATA)) &= ~(1 << (POS)); \ |
216 else *((uint8_t *) (DATA)) &= ~(1 << (POS)); \ |
198 /****************************************************************************** |
219 /****************************************************************************** |
199 * Read macros |
220 * Read macros |
200 *****************************************************************************/ |
221 *****************************************************************************/ |
201 |
222 |
202 /** |
223 /** |
203 Read an 8-bit unsigned value from EtherCAT data. |
224 * Read an 8-bit unsigned value from EtherCAT data. |
204 \return EtherCAT data value |
225 * \return EtherCAT data value |
205 */ |
226 */ |
206 |
227 |
207 #define EC_READ_U8(DATA) \ |
228 #define EC_READ_U8(DATA) \ |
208 ((uint8_t) *((uint8_t *) (DATA))) |
229 ((uint8_t) *((uint8_t *) (DATA))) |
209 |
230 |
210 /** |
231 /** |
211 Read an 8-bit signed value from EtherCAT data. |
232 * Read an 8-bit signed value from EtherCAT data. |
212 \param DATA EtherCAT data pointer |
233 * \param DATA EtherCAT data pointer |
213 \return EtherCAT data value |
234 * \return EtherCAT data value |
214 */ |
235 */ |
215 |
236 |
216 #define EC_READ_S8(DATA) \ |
237 #define EC_READ_S8(DATA) \ |
217 ((int8_t) *((uint8_t *) (DATA))) |
238 ((int8_t) *((uint8_t *) (DATA))) |
218 |
239 |
219 /** |
240 /** |
220 Read a 16-bit unsigned value from EtherCAT data. |
241 * Read a 16-bit unsigned value from EtherCAT data. |
221 \param DATA EtherCAT data pointer |
242 * \param DATA EtherCAT data pointer |
222 \return EtherCAT data value |
243 * \return EtherCAT data value |
223 */ |
244 */ |
224 |
245 |
225 #define EC_READ_U16(DATA) \ |
246 #define EC_READ_U16(DATA) \ |
226 ((uint16_t) le16_to_cpup((void *) (DATA))) |
247 ((uint16_t) le16_to_cpup((void *) (DATA))) |
227 |
248 |
228 /** |
249 /** |
229 Read a 16-bit signed value from EtherCAT data. |
250 * Read a 16-bit signed value from EtherCAT data. |
230 \param DATA EtherCAT data pointer |
251 * \param DATA EtherCAT data pointer |
231 \return EtherCAT data value |
252 * \return EtherCAT data value |
232 */ |
253 */ |
233 |
254 |
234 #define EC_READ_S16(DATA) \ |
255 #define EC_READ_S16(DATA) \ |
235 ((int16_t) le16_to_cpup((void *) (DATA))) |
256 ((int16_t) le16_to_cpup((void *) (DATA))) |
236 |
257 |
237 /** |
258 /** |
238 Read a 32-bit unsigned value from EtherCAT data. |
259 * Read a 32-bit unsigned value from EtherCAT data. |
239 \param DATA EtherCAT data pointer |
260 * \param DATA EtherCAT data pointer |
240 \return EtherCAT data value |
261 * \return EtherCAT data value |
241 */ |
262 */ |
242 |
263 |
243 #define EC_READ_U32(DATA) \ |
264 #define EC_READ_U32(DATA) \ |
244 ((uint32_t) le32_to_cpup((void *) (DATA))) |
265 ((uint32_t) le32_to_cpup((void *) (DATA))) |
245 |
266 |
246 /** |
267 /** |
247 Read a 32-bit signed value from EtherCAT data. |
268 * Read a 32-bit signed value from EtherCAT data. |
248 \param DATA EtherCAT data pointer |
269 * \param DATA EtherCAT data pointer |
249 \return EtherCAT data value |
270 * \return EtherCAT data value |
250 */ |
271 */ |
251 |
272 |
252 #define EC_READ_S32(DATA) \ |
273 #define EC_READ_S32(DATA) \ |
253 ((int32_t) le32_to_cpup((void *) (DATA))) |
274 ((int32_t) le32_to_cpup((void *) (DATA))) |
254 |
275 |
255 |
|
256 /****************************************************************************** |
276 /****************************************************************************** |
257 * Write macros |
277 * Write macros |
258 *****************************************************************************/ |
278 *****************************************************************************/ |
259 |
279 |
260 /** |
280 /** |
261 Write an 8-bit unsigned value to EtherCAT data. |
281 * Write an 8-bit unsigned value to EtherCAT data. |
262 \param DATA EtherCAT data pointer |
282 * \param DATA EtherCAT data pointer |
263 \param VAL new value |
283 * \param VAL new value |
264 */ |
284 */ |
265 |
285 |
266 #define EC_WRITE_U8(DATA, VAL) \ |
286 #define EC_WRITE_U8(DATA, VAL) \ |
267 do { \ |
287 do { \ |
268 *((uint8_t *)(DATA)) = ((uint8_t) (VAL)); \ |
288 *((uint8_t *)(DATA)) = ((uint8_t) (VAL)); \ |
269 } while (0) |
289 } while (0) |
270 |
290 |
271 /** |
291 /** |
272 Write an 8-bit signed value to EtherCAT data. |
292 * Write an 8-bit signed value to EtherCAT data. |
273 \param DATA EtherCAT data pointer |
293 * \param DATA EtherCAT data pointer |
274 \param VAL new value |
294 * \param VAL new value |
275 */ |
295 */ |
276 |
296 |
277 #define EC_WRITE_S8(DATA, VAL) EC_WRITE_U8(DATA, VAL) |
297 #define EC_WRITE_S8(DATA, VAL) EC_WRITE_U8(DATA, VAL) |
278 |
298 |
279 /** |
299 /** |
280 Write a 16-bit unsigned value to EtherCAT data. |
300 * Write a 16-bit unsigned value to EtherCAT data. |
281 \param DATA EtherCAT data pointer |
301 * \param DATA EtherCAT data pointer |
282 \param VAL new value |
302 * \param VAL new value |
283 */ |
303 */ |
284 |
304 |
285 #define EC_WRITE_U16(DATA, VAL) \ |
305 #define EC_WRITE_U16(DATA, VAL) \ |
286 do { \ |
306 do { \ |
287 *((uint16_t *) (DATA)) = (uint16_t) (VAL); \ |
307 *((uint16_t *) (DATA)) = (uint16_t) (VAL); \ |
288 cpu_to_le16s(DATA); \ |
308 cpu_to_le16s(DATA); \ |
289 } while (0) |
309 } while (0) |
290 |
310 |
291 /** |
311 /** |
292 Write a 16-bit signed value to EtherCAT data. |
312 * Write a 16-bit signed value to EtherCAT data. |
293 \param DATA EtherCAT data pointer |
313 * \param DATA EtherCAT data pointer |
294 \param VAL new value |
314 * \param VAL new value |
295 */ |
315 */ |
296 |
316 |
297 #define EC_WRITE_S16(DATA, VAL) EC_WRITE_U16(DATA, VAL) |
317 #define EC_WRITE_S16(DATA, VAL) EC_WRITE_U16(DATA, VAL) |
298 |
318 |
299 /** |
319 /** |
300 Write a 32-bit unsigned value to EtherCAT data. |
320 * Write a 32-bit unsigned value to EtherCAT data. |
301 \param DATA EtherCAT data pointer |
321 * \param DATA EtherCAT data pointer |
302 \param VAL new value |
322 * \param VAL new value |
303 */ |
323 */ |
304 |
324 |
305 #define EC_WRITE_U32(DATA, VAL) \ |
325 #define EC_WRITE_U32(DATA, VAL) \ |
306 do { \ |
326 do { \ |
307 *((uint32_t *) (DATA)) = (uint32_t) (VAL); \ |
327 *((uint32_t *) (DATA)) = (uint32_t) (VAL); \ |
308 cpu_to_le16s(DATA); \ |
328 cpu_to_le16s(DATA); \ |
309 } while (0) |
329 } while (0) |
310 |
330 |
311 /** |
331 /** |
312 Write a 32-bit signed value to EtherCAT data. |
332 * Write a 32-bit signed value to EtherCAT data. |
313 \param DATA EtherCAT data pointer |
333 * \param DATA EtherCAT data pointer |
314 \param VAL new value |
334 * \param VAL new value |
315 */ |
335 */ |
316 |
336 |
317 #define EC_WRITE_S32(DATA, VAL) EC_WRITE_U32(DATA, VAL) |
337 #define EC_WRITE_S32(DATA, VAL) EC_WRITE_U32(DATA, VAL) |
318 |
338 |
319 /*****************************************************************************/ |
339 /*****************************************************************************/ |
320 |
340 |