2480 return retval; |
2480 return retval; |
2481 } |
2481 } |
2482 |
2482 |
2483 /*****************************************************************************/ |
2483 /*****************************************************************************/ |
2484 |
2484 |
|
2485 int ecrt_master_sdo_download_complete(ec_master_t *master, |
|
2486 uint16_t slave_position, uint16_t index, uint8_t *data, |
|
2487 size_t data_size, uint32_t *abort_code) |
|
2488 { |
|
2489 ec_master_sdo_request_t request; |
|
2490 |
|
2491 EC_MASTER_DBG(master, 1, "%s(master = 0x%p," |
|
2492 " slave_position = %u, index = 0x%04X," |
|
2493 " data = 0x%p, data_size = %zu, abort_code = 0x%p)\n", |
|
2494 __func__, master, slave_position, index, data, data_size, |
|
2495 abort_code); |
|
2496 |
|
2497 if (!data_size) { |
|
2498 EC_MASTER_ERR(master, "Zero data size!\n"); |
|
2499 return -EINVAL; |
|
2500 } |
|
2501 |
|
2502 ec_sdo_request_init(&request.req); |
|
2503 ec_sdo_request_address(&request.req, index, 0); |
|
2504 if (ec_sdo_request_alloc(&request.req, data_size)) { |
|
2505 ec_sdo_request_clear(&request.req); |
|
2506 return -ENOMEM; |
|
2507 } |
|
2508 |
|
2509 request.req.complete_access = 1; |
|
2510 memcpy(request.req.data, data, data_size); |
|
2511 request.req.data_size = data_size; |
|
2512 ecrt_sdo_request_write(&request.req); |
|
2513 |
|
2514 if (down_interruptible(&master->master_sem)) |
|
2515 return -EINTR; |
|
2516 |
|
2517 if (!(request.slave = ec_master_find_slave(master, 0, slave_position))) { |
|
2518 up(&master->master_sem); |
|
2519 EC_MASTER_ERR(master, "Slave %u does not exist!\n", slave_position); |
|
2520 ec_sdo_request_clear(&request.req); |
|
2521 return -EINVAL; |
|
2522 } |
|
2523 |
|
2524 EC_SLAVE_DBG(request.slave, 1, "Schedule SDO download request" |
|
2525 " (complete access).\n"); |
|
2526 |
|
2527 // schedule request. |
|
2528 list_add_tail(&request.list, &request.slave->slave_sdo_requests); |
|
2529 |
|
2530 up(&master->master_sem); |
|
2531 |
|
2532 // wait for processing through FSM |
|
2533 if (wait_event_interruptible(request.slave->sdo_queue, |
|
2534 request.req.state != EC_INT_REQUEST_QUEUED)) { |
|
2535 // interrupted by signal |
|
2536 down(&master->master_sem); |
|
2537 if (request.req.state == EC_INT_REQUEST_QUEUED) { |
|
2538 list_del(&request.list); |
|
2539 up(&master->master_sem); |
|
2540 ec_sdo_request_clear(&request.req); |
|
2541 return -EINTR; |
|
2542 } |
|
2543 // request already processing: interrupt not possible. |
|
2544 up(&master->master_sem); |
|
2545 } |
|
2546 |
|
2547 // wait until master FSM has finished processing |
|
2548 wait_event(request.slave->sdo_queue, |
|
2549 request.req.state != EC_INT_REQUEST_BUSY); |
|
2550 |
|
2551 EC_SLAVE_DBG(request.slave, 1, "Finished SDO download request" |
|
2552 " (complete access).\n"); |
|
2553 |
|
2554 *abort_code = request.req.abort_code; |
|
2555 |
|
2556 if (request.req.state == EC_INT_REQUEST_SUCCESS) { |
|
2557 return 0; |
|
2558 } else if (request.req.errno) { |
|
2559 return -request.req.errno; |
|
2560 } else { |
|
2561 return -EIO; |
|
2562 } |
|
2563 } |
|
2564 |
|
2565 /*****************************************************************************/ |
|
2566 |
2485 int ecrt_master_sdo_upload(ec_master_t *master, uint16_t slave_position, |
2567 int ecrt_master_sdo_upload(ec_master_t *master, uint16_t slave_position, |
2486 uint16_t index, uint8_t subindex, uint8_t *target, |
2568 uint16_t index, uint8_t subindex, uint8_t *target, |
2487 size_t target_size, size_t *result_size, uint32_t *abort_code) |
2569 size_t target_size, size_t *result_size, uint32_t *abort_code) |
2488 { |
2570 { |
2489 ec_master_sdo_request_t* request; |
2571 ec_master_sdo_request_t* request; |
2751 EXPORT_SYMBOL(ecrt_master_sync_reference_clock); |
2833 EXPORT_SYMBOL(ecrt_master_sync_reference_clock); |
2752 EXPORT_SYMBOL(ecrt_master_sync_slave_clocks); |
2834 EXPORT_SYMBOL(ecrt_master_sync_slave_clocks); |
2753 EXPORT_SYMBOL(ecrt_master_sync_monitor_queue); |
2835 EXPORT_SYMBOL(ecrt_master_sync_monitor_queue); |
2754 EXPORT_SYMBOL(ecrt_master_sync_monitor_process); |
2836 EXPORT_SYMBOL(ecrt_master_sync_monitor_process); |
2755 EXPORT_SYMBOL(ecrt_master_sdo_download); |
2837 EXPORT_SYMBOL(ecrt_master_sdo_download); |
|
2838 EXPORT_SYMBOL(ecrt_master_sdo_download_complete); |
2756 EXPORT_SYMBOL(ecrt_master_sdo_upload); |
2839 EXPORT_SYMBOL(ecrt_master_sdo_upload); |
2757 EXPORT_SYMBOL(ecrt_master_write_idn); |
2840 EXPORT_SYMBOL(ecrt_master_write_idn); |
2758 EXPORT_SYMBOL(ecrt_master_read_idn); |
2841 EXPORT_SYMBOL(ecrt_master_read_idn); |
2759 EXPORT_SYMBOL(ecrt_master_reset); |
2842 EXPORT_SYMBOL(ecrt_master_reset); |
2760 EXPORT_SYMBOL(ecrt_master_find_domain); |
2843 EXPORT_SYMBOL(ecrt_master_find_domain); |