master/master.c
changeset 2150 5144a4bc6184
parent 2117 afb40fd6018e
child 2164 cf4db3c282d2
equal deleted inserted replaced
2149:98e1e773bed0 2150:5144a4bc6184
     1 /******************************************************************************
     1 /******************************************************************************
     2  *
     2  *
     3  *  $Id$
     3  *  $Id: master.c,v afb40fd6018e 2011/09/16 12:10:23 fp $
     4  *
     4  *
     5  *  Copyright (C) 2006-2008  Florian Pose, Ingenieurgemeinschaft IgH
     5  *  Copyright (C) 2006-2008  Florian Pose, Ingenieurgemeinschaft IgH
     6  *
     6  *
     7  *  This file is part of the IgH EtherCAT Master.
     7  *  This file is part of the IgH EtherCAT Master.
     8  *
     8  *
  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);