master/master.c
changeset 239 07bca2b018ed
parent 238 b4960499098f
child 246 0bf7c769de06
equal deleted inserted replaced
238:b4960499098f 239:07bca2b018ed
    44 #include "ethernet.h"
    44 #include "ethernet.h"
    45 
    45 
    46 /*****************************************************************************/
    46 /*****************************************************************************/
    47 
    47 
    48 void ec_master_freerun(void *);
    48 void ec_master_freerun(void *);
    49 #ifdef EOE_TIMER
       
    50 void ec_master_run_eoe(unsigned long);
    49 void ec_master_run_eoe(unsigned long);
    51 #else
       
    52 void ec_master_run_eoe(void *);
       
    53 #endif
       
    54 ssize_t ec_show_master_attribute(struct kobject *, struct attribute *, char *);
    50 ssize_t ec_show_master_attribute(struct kobject *, struct attribute *, char *);
    55 void ec_master_process_watch_command(ec_master_t *);
    51 void ec_master_process_watch_command(ec_master_t *);
    56 
    52 
    57 /*****************************************************************************/
    53 /*****************************************************************************/
    58 
    54 
   107     INIT_LIST_HEAD(&master->command_queue);
   103     INIT_LIST_HEAD(&master->command_queue);
   108     INIT_LIST_HEAD(&master->domains);
   104     INIT_LIST_HEAD(&master->domains);
   109     INIT_LIST_HEAD(&master->eoe_slaves);
   105     INIT_LIST_HEAD(&master->eoe_slaves);
   110     ec_command_init(&master->simple_command);
   106     ec_command_init(&master->simple_command);
   111     INIT_WORK(&master->freerun_work, ec_master_freerun, (void *) master);
   107     INIT_WORK(&master->freerun_work, ec_master_freerun, (void *) master);
   112 
       
   113     // init eoe timer
       
   114 #ifdef EOE_TIMER
       
   115     init_timer(&master->eoe_timer);
   108     init_timer(&master->eoe_timer);
   116     master->eoe_timer.function = ec_master_run_eoe;
   109     master->eoe_timer.function = ec_master_run_eoe;
   117     master->eoe_timer.data = (unsigned long) master;
   110     master->eoe_timer.data = (unsigned long) master;
   118 #else
       
   119     INIT_WORK(&master->eoe_work, ec_master_run_eoe, (void *) master);
       
   120 #endif
       
   121 
   111 
   122     // init kobject and add it to the hierarchy
   112     // init kobject and add it to the hierarchy
   123     memset(&master->kobj, 0x00, sizeof(struct kobject));
   113     memset(&master->kobj, 0x00, sizeof(struct kobject));
   124     kobject_init(&master->kobj);
   114     kobject_init(&master->kobj);
   125     master->kobj.ktype = &ktype_ec_master;
   115     master->kobj.ktype = &ktype_ec_master;
   178     ec_command_t *command, *next_c;
   168     ec_command_t *command, *next_c;
   179     ec_domain_t *domain, *next_d;
   169     ec_domain_t *domain, *next_d;
   180     ec_eoe_t *eoe, *next_eoe;
   170     ec_eoe_t *eoe, *next_eoe;
   181 
   171 
   182     // stop EoE processing
   172     // stop EoE processing
   183 #ifdef EOE_TIMER
       
   184     del_timer_sync(&master->eoe_timer);
   173     del_timer_sync(&master->eoe_timer);
   185 #else
       
   186     if (!cancel_delayed_work(&master->eoe_work)) {
       
   187         flush_workqueue(master->eoe_workqueue);
       
   188     }
       
   189 #endif
       
   190 
   174 
   191     // stop free-run mode
   175     // stop free-run mode
   192     ec_master_freerun_stop(master);
   176     ec_master_freerun_stop(master);
   193 
   177 
   194     ec_master_clear_slaves(master);
   178     ec_master_clear_slaves(master);
   806 
   790 
   807 /**
   791 /**
   808    Does the Ethernet-over-EtherCAT processing.
   792    Does the Ethernet-over-EtherCAT processing.
   809 */
   793 */
   810 
   794 
   811 #ifdef EOE_TIMER
       
   812 void ec_master_run_eoe(unsigned long data /**< master pointer */)
   795 void ec_master_run_eoe(unsigned long data /**< master pointer */)
   813 #else
       
   814 void ec_master_run_eoe(void *data /**< master pointer */)
       
   815 #endif
       
   816 {
   796 {
   817     ec_master_t *master = (ec_master_t *) data;
   797     ec_master_t *master = (ec_master_t *) data;
   818     ec_eoe_t *eoe;
   798     ec_eoe_t *eoe;
   819     unsigned int active = 0;
   799     unsigned int active = 0;
   820 
   800 
   832         ecrt_master_async_send(master);
   812         ecrt_master_async_send(master);
   833 
   813 
   834         master->release_cb(master->cb_data);
   814         master->release_cb(master->cb_data);
   835     }
   815     }
   836 
   816 
   837 #ifdef EOE_TIMER
       
   838     master->eoe_timer.expires += HZ / EC_EOE_FREQUENCY;
   817     master->eoe_timer.expires += HZ / EC_EOE_FREQUENCY;
   839     add_timer(&master->eoe_timer);
   818     add_timer(&master->eoe_timer);
   840 #else
       
   841     queue_delayed_work(master->eoe_workqueue, &master->eoe_work,
       
   842                        HZ / EC_EOE_FREQUENCY);
       
   843 #endif
       
   844 }
   819 }
   845 
   820 
   846 /******************************************************************************
   821 /******************************************************************************
   847  *  Realtime interface
   822  *  Realtime interface
   848  *****************************************************************************/
   823  *****************************************************************************/
  1446         EC_WARN("start_eoe: no EoE-capable slaves present.\n");
  1421         EC_WARN("start_eoe: no EoE-capable slaves present.\n");
  1447         return 0;
  1422         return 0;
  1448     }
  1423     }
  1449 
  1424 
  1450     // start EoE processing
  1425     // start EoE processing
  1451 #ifdef EOE_TIMER
       
  1452     master->eoe_timer.expires = jiffies + 10;
  1426     master->eoe_timer.expires = jiffies + 10;
  1453     add_timer(&master->eoe_timer);
  1427     add_timer(&master->eoe_timer);
  1454 #else
       
  1455     queue_work(master->eoe_workqueue, &master->eoe_work);
       
  1456 #endif
       
  1457     return 0;
  1428     return 0;
  1458 }
  1429 }
  1459 
  1430 
  1460 /*****************************************************************************/
  1431 /*****************************************************************************/
  1461 
  1432