master/master.c
changeset 1513 60ca68d853b8
parent 1507 68e89abadd19
child 1516 e3b09f847512
equal deleted inserted replaced
1512:388901f44a5e 1513:60ca68d853b8
   166 #endif
   166 #endif
   167 
   167 
   168     init_MUTEX(&master->io_sem);
   168     init_MUTEX(&master->io_sem);
   169     master->send_cb = NULL;
   169     master->send_cb = NULL;
   170     master->receive_cb = NULL;
   170     master->receive_cb = NULL;
       
   171     master->cb_data = NULL;
   171     master->app_send_cb = NULL;
   172     master->app_send_cb = NULL;
   172     master->app_receive_cb = NULL;
   173     master->app_receive_cb = NULL;
       
   174     master->app_cb_data = NULL;
   173 
   175 
   174     INIT_LIST_HEAD(&master->sii_requests);
   176     INIT_LIST_HEAD(&master->sii_requests);
   175     init_waitqueue_head(&master->sii_queue);
   177     init_waitqueue_head(&master->sii_queue);
   176 
   178 
   177     INIT_LIST_HEAD(&master->slave_sdo_requests);
   179     INIT_LIST_HEAD(&master->slave_sdo_requests);
   380 /*****************************************************************************/
   382 /*****************************************************************************/
   381 
   383 
   382 /** Internal sending callback.
   384 /** Internal sending callback.
   383  */
   385  */
   384 void ec_master_internal_send_cb(
   386 void ec_master_internal_send_cb(
   385         ec_master_t *master /**< EtherCAT master. */
   387         void *cb_data /**< Callback data. */
   386         )
   388         )
   387 {
   389 {
       
   390     ec_master_t *master = (ec_master_t *) cb_data;
   388     down(&master->io_sem);
   391     down(&master->io_sem);
   389     ecrt_master_send_ext(master);
   392     ecrt_master_send_ext(master);
   390     up(&master->io_sem);
   393     up(&master->io_sem);
   391 }
   394 }
   392 
   395 
   393 /*****************************************************************************/
   396 /*****************************************************************************/
   394 
   397 
   395 /** Internal receiving callback.
   398 /** Internal receiving callback.
   396  */
   399  */
   397 void ec_master_internal_receive_cb(
   400 void ec_master_internal_receive_cb(
   398         ec_master_t *master /**< EtherCAT master. */
   401         void *cb_data /**< Callback data. */
   399         )
   402         )
   400 {
   403 {
       
   404     ec_master_t *master = (ec_master_t *) cb_data;
   401     down(&master->io_sem);
   405     down(&master->io_sem);
   402     ecrt_master_receive(master);
   406     ecrt_master_receive(master);
   403     up(&master->io_sem);
   407     up(&master->io_sem);
   404 }
   408 }
   405 
   409 
   471     if (master->debug_level)
   475     if (master->debug_level)
   472         EC_DBG("ORPHANED -> IDLE.\n");
   476         EC_DBG("ORPHANED -> IDLE.\n");
   473 
   477 
   474     master->send_cb = ec_master_internal_send_cb;
   478     master->send_cb = ec_master_internal_send_cb;
   475     master->receive_cb = ec_master_internal_receive_cb;
   479     master->receive_cb = ec_master_internal_receive_cb;
       
   480     master->cb_data = master;
   476 
   481 
   477     master->phase = EC_IDLE;
   482     master->phase = EC_IDLE;
   478     ret = ec_master_thread_start(master, ec_master_idle_thread,
   483     ret = ec_master_thread_start(master, ec_master_idle_thread,
   479             "EtherCAT-IDLE");
   484             "EtherCAT-IDLE");
   480     if (ret)
   485     if (ret)
   572 #endif
   577 #endif
   573 
   578 
   574     master->phase = EC_OPERATION;
   579     master->phase = EC_OPERATION;
   575     master->app_send_cb = NULL;
   580     master->app_send_cb = NULL;
   576     master->app_receive_cb = NULL;
   581     master->app_receive_cb = NULL;
       
   582     master->app_cb_data = NULL;
   577     return ret;
   583     return ret;
   578     
   584     
   579 out_allow:
   585 out_allow:
   580     master->allow_scan = 1;
   586     master->allow_scan = 1;
   581     master->allow_config = 1;
   587     master->allow_config = 1;
   604 #endif
   610 #endif
   605     ec_master_thread_stop(master);
   611     ec_master_thread_stop(master);
   606     
   612     
   607     master->send_cb = ec_master_internal_send_cb;
   613     master->send_cb = ec_master_internal_send_cb;
   608     master->receive_cb = ec_master_internal_receive_cb;
   614     master->receive_cb = ec_master_internal_receive_cb;
       
   615     master->cb_data = master;
   609     
   616     
   610     down(&master->master_sem);
   617     down(&master->master_sem);
   611     ec_master_clear_domains(master);
   618     ec_master_clear_domains(master);
   612     ec_master_clear_slave_configs(master);
   619     ec_master_clear_slave_configs(master);
   613     up(&master->master_sem);
   620     up(&master->master_sem);
  1128         }
  1135         }
  1129         if (none_open)
  1136         if (none_open)
  1130             goto schedule;
  1137             goto schedule;
  1131 
  1138 
  1132         // receive datagrams
  1139         // receive datagrams
  1133         master->receive_cb(master);
  1140         master->receive_cb(master->cb_data);
  1134 
  1141 
  1135         // actual EoE processing
  1142         // actual EoE processing
  1136         sth_to_send = 0;
  1143         sth_to_send = 0;
  1137         list_for_each_entry(eoe, &master->eoe_handlers, list) {
  1144         list_for_each_entry(eoe, &master->eoe_handlers, list) {
  1138             ec_eoe_run(eoe);
  1145             ec_eoe_run(eoe);
  1148             list_for_each_entry(eoe, &master->eoe_handlers, list) {
  1155             list_for_each_entry(eoe, &master->eoe_handlers, list) {
  1149                 ec_eoe_queue(eoe);
  1156                 ec_eoe_queue(eoe);
  1150             }
  1157             }
  1151             // (try to) send datagrams
  1158             // (try to) send datagrams
  1152             down(&master->ext_queue_sem);
  1159             down(&master->ext_queue_sem);
  1153             master->send_cb(master);
  1160             master->send_cb(master->cb_data);
  1154             up(&master->ext_queue_sem);
  1161             up(&master->ext_queue_sem);
  1155         }
  1162         }
  1156 
  1163 
  1157 schedule:
  1164 schedule:
  1158         if (all_idle) {
  1165         if (all_idle) {
  1657     master->injection_seq_fsm = 0;
  1664     master->injection_seq_fsm = 0;
  1658     master->injection_seq_rt = 0;
  1665     master->injection_seq_rt = 0;
  1659 
  1666 
  1660     master->send_cb = master->app_send_cb;
  1667     master->send_cb = master->app_send_cb;
  1661     master->receive_cb = master->app_receive_cb;
  1668     master->receive_cb = master->app_receive_cb;
       
  1669     master->cb_data = master->app_cb_data;
  1662     
  1670     
  1663     ret = ec_master_thread_start(master, ec_master_operation_thread,
  1671     ret = ec_master_thread_start(master, ec_master_operation_thread,
  1664                 "EtherCAT-OP");
  1672                 "EtherCAT-OP");
  1665     if (ret < 0) {
  1673     if (ret < 0) {
  1666         EC_ERR("Failed to start master thread!\n");
  1674         EC_ERR("Failed to start master thread!\n");
  1834 }
  1842 }
  1835 
  1843 
  1836 /*****************************************************************************/
  1844 /*****************************************************************************/
  1837 
  1845 
  1838 void ecrt_master_callbacks(ec_master_t *master,
  1846 void ecrt_master_callbacks(ec_master_t *master,
  1839         void (*send_cb)(ec_master_t *), void (*receive_cb)(ec_master_t *))
  1847         void (*send_cb)(void *), void (*receive_cb)(void *), void *cb_data)
  1840 {
  1848 {
  1841     if (master->debug_level)
  1849     if (master->debug_level)
  1842         EC_DBG("ecrt_master_callbacks(master = 0x%x, send_cb = 0x%x, "
  1850         EC_DBG("ecrt_master_callbacks(master = 0x%x, send_cb = 0x%x, "
  1843                 " receive_cb = 0x%x)\n", (u32) master, (u32) send_cb,
  1851                 " receive_cb = 0x%x, cb_data = 0x%x)\n", (u32) master,
  1844                 (u32) receive_cb);
  1852                 (u32) send_cb, (u32) receive_cb, (u32) cb_data);
  1845 
  1853 
  1846     master->app_send_cb = send_cb;
  1854     master->app_send_cb = send_cb;
  1847     master->app_receive_cb = receive_cb;
  1855     master->app_receive_cb = receive_cb;
       
  1856     master->app_cb_data = cb_data;
  1848 }
  1857 }
  1849 
  1858 
  1850 /*****************************************************************************/
  1859 /*****************************************************************************/
  1851 
  1860 
  1852 void ecrt_master_state(const ec_master_t *master, ec_master_state_t *state)
  1861 void ecrt_master_state(const ec_master_t *master, ec_master_state_t *state)