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); |
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) |