38 #include "master.h" |
38 #include "master.h" |
39 #include "domain.h" |
39 #include "domain.h" |
40 #include "slave_config.h" |
40 #include "slave_config.h" |
41 #include "master/ioctl.h" |
41 #include "master/ioctl.h" |
42 |
42 |
43 /*****************************************************************************/ |
43 /****************************************************************************/ |
44 |
44 |
45 int ecrt_master_reserve(ec_master_t *master) |
45 int ecrt_master_reserve(ec_master_t *master) |
46 { |
46 { |
47 if (ioctl(master->fd, EC_IOCTL_REQUEST, NULL) == -1) { |
47 if (ioctl(master->fd, EC_IOCTL_REQUEST, NULL) == -1) { |
48 fprintf(stderr, "Failed to reserve master: %s\n", |
48 fprintf(stderr, "Failed to reserve master: %s\n", |
149 } else { |
149 } else { |
150 master->first_config = sc; |
150 master->first_config = sc; |
151 } |
151 } |
152 } |
152 } |
153 |
153 |
154 /*****************************************************************************/ |
154 /****************************************************************************/ |
155 |
155 |
156 ec_slave_config_t *ecrt_master_slave_config(ec_master_t *master, |
156 ec_slave_config_t *ecrt_master_slave_config(ec_master_t *master, |
157 uint16_t alias, uint16_t position, uint32_t vendor_id, |
157 uint16_t alias, uint16_t position, uint32_t vendor_id, |
158 uint32_t product_code) |
158 uint32_t product_code) |
159 { |
159 { |
208 master_info->scan_busy = data.scan_busy; |
208 master_info->scan_busy = data.scan_busy; |
209 master_info->app_time = data.app_time; |
209 master_info->app_time = data.app_time; |
210 return 0; |
210 return 0; |
211 } |
211 } |
212 |
212 |
213 /*****************************************************************************/ |
213 /****************************************************************************/ |
214 |
214 |
215 int ecrt_master_get_slave(ec_master_t *master, uint16_t slave_position, |
215 int ecrt_master_get_slave(ec_master_t *master, uint16_t slave_position, |
216 ec_slave_info_t *slave_info) |
216 ec_slave_info_t *slave_info) |
217 { |
217 { |
218 ec_ioctl_slave_t data; |
218 ec_ioctl_slave_t data; |
231 slave_info->revision_number = data.revision_number; |
231 slave_info->revision_number = data.revision_number; |
232 slave_info->serial_number = data.serial_number; |
232 slave_info->serial_number = data.serial_number; |
233 slave_info->alias = data.alias; |
233 slave_info->alias = data.alias; |
234 slave_info->current_on_ebus = data.current_on_ebus; |
234 slave_info->current_on_ebus = data.current_on_ebus; |
235 for ( i = 0; i < EC_MAX_PORTS; i++ ) { |
235 for ( i = 0; i < EC_MAX_PORTS; i++ ) { |
236 slave_info->ports[i].desc = data.ports[i].desc; |
236 slave_info->ports[i].desc = data.ports[i].desc; |
237 slave_info->ports[i].link.link_up = data.ports[i].link.link_up; |
237 slave_info->ports[i].link.link_up = data.ports[i].link.link_up; |
238 slave_info->ports[i].link.loop_closed = data.ports[i].link.loop_closed; |
238 slave_info->ports[i].link.loop_closed = |
239 slave_info->ports[i].link.signal_detected = data.ports[i].link.signal_detected; |
239 data.ports[i].link.loop_closed; |
240 slave_info->ports[i].receive_time = data.ports[i].receive_time; |
240 slave_info->ports[i].link.signal_detected = |
241 slave_info->ports[i].next_slave = data.ports[i].next_slave; |
241 data.ports[i].link.signal_detected; |
242 slave_info->ports[i].delay_to_next_dc = data.ports[i].delay_to_next_dc; |
242 slave_info->ports[i].receive_time = data.ports[i].receive_time; |
|
243 slave_info->ports[i].next_slave = data.ports[i].next_slave; |
|
244 slave_info->ports[i].delay_to_next_dc = |
|
245 data.ports[i].delay_to_next_dc; |
243 } |
246 } |
244 slave_info->al_state = data.al_state; |
247 slave_info->al_state = data.al_state; |
245 slave_info->error_flag = data.error_flag; |
248 slave_info->error_flag = data.error_flag; |
246 slave_info->sync_count = data.sync_count; |
249 slave_info->sync_count = data.sync_count; |
247 slave_info->sdo_count = data.sdo_count; |
250 slave_info->sdo_count = data.sdo_count; |
248 strncpy(slave_info->name, data.name, EC_MAX_STRING_LENGTH); |
251 strncpy(slave_info->name, data.name, EC_MAX_STRING_LENGTH); |
249 return 0; |
252 return 0; |
250 } |
253 } |
251 |
254 |
252 /*****************************************************************************/ |
255 /****************************************************************************/ |
253 |
256 |
254 int ecrt_master_get_sync_manager(ec_master_t *master, uint16_t slave_position, |
257 int ecrt_master_get_sync_manager(ec_master_t *master, uint16_t slave_position, |
255 uint8_t sync_index, ec_sync_info_t *sync) |
258 uint8_t sync_index, ec_sync_info_t *sync) |
256 { |
259 { |
257 ec_ioctl_slave_sync_t data; |
260 ec_ioctl_slave_sync_t data; |
279 EC_WD_ENABLE : EC_WD_DISABLE; |
282 EC_WD_ENABLE : EC_WD_DISABLE; |
280 |
283 |
281 return 0; |
284 return 0; |
282 } |
285 } |
283 |
286 |
284 /*****************************************************************************/ |
287 /****************************************************************************/ |
285 |
288 |
286 int ecrt_master_get_pdo(ec_master_t *master, uint16_t slave_position, |
289 int ecrt_master_get_pdo(ec_master_t *master, uint16_t slave_position, |
287 uint8_t sync_index, uint16_t pos, ec_pdo_info_t *pdo) |
290 uint8_t sync_index, uint16_t pos, ec_pdo_info_t *pdo) |
288 { |
291 { |
289 ec_ioctl_slave_sync_pdo_t data; |
292 ec_ioctl_slave_sync_pdo_t data; |
337 entry->bit_length = data.bit_length; |
340 entry->bit_length = data.bit_length; |
338 |
341 |
339 return 0; |
342 return 0; |
340 } |
343 } |
341 |
344 |
342 /*****************************************************************************/ |
345 /****************************************************************************/ |
343 |
346 |
344 int ecrt_master_sdo_download(ec_master_t *master, uint16_t slave_position, |
347 int ecrt_master_sdo_download(ec_master_t *master, uint16_t slave_position, |
345 uint16_t index, uint8_t subindex, uint8_t *data, |
348 uint16_t index, uint8_t subindex, uint8_t *data, |
346 size_t data_size, uint32_t *abort_code) |
349 size_t data_size, uint32_t *abort_code) |
347 { |
350 { |
391 } |
394 } |
392 |
395 |
393 return 0; |
396 return 0; |
394 } |
397 } |
395 |
398 |
396 /*****************************************************************************/ |
399 /****************************************************************************/ |
397 |
400 |
398 int ecrt_master_sdo_upload(ec_master_t *master, uint16_t slave_position, |
401 int ecrt_master_sdo_upload(ec_master_t *master, uint16_t slave_position, |
399 uint16_t index, uint8_t subindex, uint8_t *target, |
402 uint16_t index, uint8_t subindex, uint8_t *target, |
400 size_t target_size, size_t *result_size, uint32_t *abort_code) |
403 size_t target_size, size_t *result_size, uint32_t *abort_code) |
401 { |
404 { |
418 |
421 |
419 *result_size = upload.data_size; |
422 *result_size = upload.data_size; |
420 return 0; |
423 return 0; |
421 } |
424 } |
422 |
425 |
423 /*****************************************************************************/ |
426 /****************************************************************************/ |
424 |
427 |
425 int ecrt_master_write_idn(ec_master_t *master, uint16_t slave_position, |
428 int ecrt_master_write_idn(ec_master_t *master, uint16_t slave_position, |
426 uint8_t drive_no, uint16_t idn, uint8_t *data, size_t data_size, |
429 uint8_t drive_no, uint16_t idn, uint8_t *data, size_t data_size, |
427 uint16_t *error_code) |
430 uint16_t *error_code) |
428 { |
431 { |
443 } |
446 } |
444 |
447 |
445 return 0; |
448 return 0; |
446 } |
449 } |
447 |
450 |
448 /*****************************************************************************/ |
451 /****************************************************************************/ |
449 |
452 |
450 int ecrt_master_read_idn(ec_master_t *master, uint16_t slave_position, |
453 int ecrt_master_read_idn(ec_master_t *master, uint16_t slave_position, |
451 uint8_t drive_no, uint16_t idn, uint8_t *target, size_t target_size, |
454 uint8_t drive_no, uint16_t idn, uint8_t *target, size_t target_size, |
452 size_t *result_size, uint16_t *error_code) |
455 size_t *result_size, uint16_t *error_code) |
453 { |
456 { |
484 |
487 |
485 if (master->process_data_size) { |
488 if (master->process_data_size) { |
486 master->process_data = mmap(0, master->process_data_size, |
489 master->process_data = mmap(0, master->process_data_size, |
487 PROT_READ | PROT_WRITE, MAP_SHARED, master->fd, 0); |
490 PROT_READ | PROT_WRITE, MAP_SHARED, master->fd, 0); |
488 if (master->process_data == MAP_FAILED) { |
491 if (master->process_data == MAP_FAILED) { |
489 fprintf(stderr, "Failed to map process data: %s", strerror(errno)); |
492 fprintf(stderr, "Failed to map process data: %s", |
|
493 strerror(errno)); |
490 master->process_data = NULL; |
494 master->process_data = NULL; |
491 master->process_data_size = 0; |
495 master->process_data_size = 0; |
492 return -1; // FIXME |
496 return -1; // FIXME |
493 } |
497 } |
494 |
498 |
509 } |
513 } |
510 |
514 |
511 ec_master_clear_config(master); |
515 ec_master_clear_config(master); |
512 } |
516 } |
513 |
517 |
514 /*****************************************************************************/ |
518 /****************************************************************************/ |
515 |
519 |
516 int ecrt_master_set_send_interval(ec_master_t *master,size_t send_interval_us) |
520 int ecrt_master_set_send_interval(ec_master_t *master, |
|
521 size_t send_interval_us) |
517 { |
522 { |
518 if (ioctl(master->fd, EC_IOCTL_SET_SEND_INTERVAL, |
523 if (ioctl(master->fd, EC_IOCTL_SET_SEND_INTERVAL, |
519 &send_interval_us) == -1) { |
524 &send_interval_us) == -1) { |
520 fprintf(stderr, "Failed to set send interval: %s\n", |
525 fprintf(stderr, "Failed to set send interval: %s\n", |
521 strerror(errno)); |
526 strerror(errno)); |
522 return -1; // FIXME |
527 return -1; // FIXME |
523 } |
528 } |
524 return 0; |
529 return 0; |
525 } |
530 } |
526 |
531 |
527 /*****************************************************************************/ |
532 /****************************************************************************/ |
528 |
533 |
529 void ecrt_master_send(ec_master_t *master) |
534 void ecrt_master_send(ec_master_t *master) |
530 { |
535 { |
531 if (ioctl(master->fd, EC_IOCTL_SEND, NULL) == -1) { |
536 if (ioctl(master->fd, EC_IOCTL_SEND, NULL) == -1) { |
532 fprintf(stderr, "Failed to send: %s\n", strerror(errno)); |
537 fprintf(stderr, "Failed to send: %s\n", strerror(errno)); |
533 } |
538 } |
534 } |
539 } |
535 |
540 |
536 /*****************************************************************************/ |
541 /****************************************************************************/ |
537 |
542 |
538 void ecrt_master_receive(ec_master_t *master) |
543 void ecrt_master_receive(ec_master_t *master) |
539 { |
544 { |
540 if (ioctl(master->fd, EC_IOCTL_RECEIVE, NULL) == -1) { |
545 if (ioctl(master->fd, EC_IOCTL_RECEIVE, NULL) == -1) { |
541 fprintf(stderr, "Failed to receive: %s\n", strerror(errno)); |
546 fprintf(stderr, "Failed to receive: %s\n", strerror(errno)); |
542 } |
547 } |
543 } |
548 } |
544 |
549 |
545 /*****************************************************************************/ |
550 /****************************************************************************/ |
546 |
551 |
547 void ecrt_master_state(const ec_master_t *master, ec_master_state_t *state) |
552 void ecrt_master_state(const ec_master_t *master, ec_master_state_t *state) |
548 { |
553 { |
549 if (ioctl(master->fd, EC_IOCTL_MASTER_STATE, state) == -1) { |
554 if (ioctl(master->fd, EC_IOCTL_MASTER_STATE, state) == -1) { |
550 fprintf(stderr, "Failed to get master state: %s\n", strerror(errno)); |
555 fprintf(stderr, "Failed to get master state: %s\n", strerror(errno)); |
551 } |
556 } |
552 } |
557 } |
553 |
558 |
554 /*****************************************************************************/ |
559 /****************************************************************************/ |
555 |
560 |
556 int ecrt_master_link_state(const ec_master_t *master, unsigned int dev_idx, |
561 int ecrt_master_link_state(const ec_master_t *master, unsigned int dev_idx, |
557 ec_master_link_state_t *state) |
562 ec_master_link_state_t *state) |
558 { |
563 { |
559 ec_ioctl_link_state_t io; |
564 ec_ioctl_link_state_t io; |
578 fprintf(stderr, "Failed to set application time: %s\n", |
583 fprintf(stderr, "Failed to set application time: %s\n", |
579 strerror(errno)); |
584 strerror(errno)); |
580 } |
585 } |
581 } |
586 } |
582 |
587 |
583 /*****************************************************************************/ |
588 /****************************************************************************/ |
584 |
589 |
585 void ecrt_master_sync_reference_clock(ec_master_t *master) |
590 void ecrt_master_sync_reference_clock(ec_master_t *master) |
586 { |
591 { |
587 if (ioctl(master->fd, EC_IOCTL_SYNC_REF, NULL) == -1) { |
592 if (ioctl(master->fd, EC_IOCTL_SYNC_REF, NULL) == -1) { |
588 fprintf(stderr, "Failed to sync reference clock: %s\n", |
593 fprintf(stderr, "Failed to sync reference clock: %s\n", |
589 strerror(errno)); |
594 strerror(errno)); |
590 } |
595 } |
591 } |
596 } |
592 |
597 |
593 /*****************************************************************************/ |
598 /****************************************************************************/ |
594 |
599 |
595 void ecrt_master_sync_slave_clocks(ec_master_t *master) |
600 void ecrt_master_sync_slave_clocks(ec_master_t *master) |
596 { |
601 { |
597 if (ioctl(master->fd, EC_IOCTL_SYNC_SLAVES, NULL) == -1) { |
602 if (ioctl(master->fd, EC_IOCTL_SYNC_SLAVES, NULL) == -1) { |
598 fprintf(stderr, "Failed to sync slave clocks: %s\n", strerror(errno)); |
603 fprintf(stderr, "Failed to sync slave clocks: %s\n", strerror(errno)); |
599 } |
604 } |
600 } |
605 } |
601 |
606 |
602 /*****************************************************************************/ |
607 /****************************************************************************/ |
603 |
608 |
604 void ecrt_master_sync_monitor_queue(ec_master_t *master) |
609 void ecrt_master_sync_monitor_queue(ec_master_t *master) |
605 { |
610 { |
606 if (ioctl(master->fd, EC_IOCTL_SYNC_MON_QUEUE, NULL) == -1) { |
611 if (ioctl(master->fd, EC_IOCTL_SYNC_MON_QUEUE, NULL) == -1) { |
607 fprintf(stderr, "Failed to queue sync monitor datagram: %s\n", |
612 fprintf(stderr, "Failed to queue sync monitor datagram: %s\n", |
608 strerror(errno)); |
613 strerror(errno)); |
609 } |
614 } |
610 } |
615 } |
611 |
616 |
612 /*****************************************************************************/ |
617 /****************************************************************************/ |
613 |
618 |
614 uint32_t ecrt_master_sync_monitor_process(ec_master_t *master) |
619 uint32_t ecrt_master_sync_monitor_process(ec_master_t *master) |
615 { |
620 { |
616 uint32_t time_diff; |
621 uint32_t time_diff; |
617 |
622 |
622 } |
627 } |
623 |
628 |
624 return time_diff; |
629 return time_diff; |
625 } |
630 } |
626 |
631 |
627 /*****************************************************************************/ |
632 /****************************************************************************/ |
628 |
633 |
629 void ecrt_master_reset(ec_master_t *master) |
634 void ecrt_master_reset(ec_master_t *master) |
630 { |
635 { |
631 if (ioctl(master->fd, EC_IOCTL_RESET, NULL) == -1) { |
636 if (ioctl(master->fd, EC_IOCTL_RESET, NULL) == -1) { |
632 fprintf(stderr, "Failed to reset master: %s\n", strerror(errno)); |
637 fprintf(stderr, "Failed to reset master: %s\n", strerror(errno)); |
633 } |
638 } |
634 } |
639 } |
635 |
640 |
636 /*****************************************************************************/ |
641 /****************************************************************************/ |