equal
deleted
inserted
replaced
847 |
847 |
848 /*****************************************************************************/ |
848 /*****************************************************************************/ |
849 |
849 |
850 /** Sends the datagrams in the queue. |
850 /** Sends the datagrams in the queue. |
851 * |
851 * |
852 * \return 0 in case of success, else < 0 |
|
853 */ |
852 */ |
854 void ec_master_send_datagrams(ec_master_t *master /**< EtherCAT master */) |
853 void ec_master_send_datagrams(ec_master_t *master /**< EtherCAT master */) |
855 { |
854 { |
856 ec_datagram_t *datagram, *next; |
855 ec_datagram_t *datagram, *next; |
857 size_t datagram_size; |
856 size_t datagram_size; |
858 uint8_t *frame_data, *cur_data; |
857 uint8_t *frame_data, *cur_data; |
859 void *follows_word; |
858 void *follows_word; |
860 #ifdef EC_HAVE_CYCLES |
859 #ifdef EC_HAVE_CYCLES |
861 cycles_t cycles_start, cycles_sent, cycles_end; |
860 cycles_t cycles_start, cycles_sent, cycles_end; |
862 #endif |
861 #endif |
1165 static int ec_master_idle_thread(void *priv_data) |
1164 static int ec_master_idle_thread(void *priv_data) |
1166 { |
1165 { |
1167 ec_master_t *master = (ec_master_t *) priv_data; |
1166 ec_master_t *master = (ec_master_t *) priv_data; |
1168 ec_slave_t *slave = NULL; |
1167 ec_slave_t *slave = NULL; |
1169 int fsm_exec; |
1168 int fsm_exec; |
|
1169 size_t sent_bytes; |
1170 ec_master_set_send_interval(master,1000000 / HZ); // send interval in IDLE phase |
1170 ec_master_set_send_interval(master,1000000 / HZ); // send interval in IDLE phase |
1171 if (master->debug_level) |
1171 if (master->debug_level) |
1172 EC_DBG("Idle thread running with send interval = %d us, max data size=%d\n",master->send_interval,master->max_queue_size); |
1172 EC_DBG("Idle thread running with send interval = %d us, max data size=%d\n",master->send_interval,master->max_queue_size); |
1173 |
1173 |
1174 while (!kthread_should_stop()) { |
1174 while (!kthread_should_stop()) { |
1196 if (fsm_exec) { |
1196 if (fsm_exec) { |
1197 ec_master_queue_datagram(master, &master->fsm_datagram); |
1197 ec_master_queue_datagram(master, &master->fsm_datagram); |
1198 } |
1198 } |
1199 ec_master_inject_external_datagrams(master); |
1199 ec_master_inject_external_datagrams(master); |
1200 ecrt_master_send(master); |
1200 ecrt_master_send(master); |
|
1201 sent_bytes = master->main_device.tx_skb[master->main_device.tx_ring_index]->len; |
1201 up(&master->io_sem); |
1202 up(&master->io_sem); |
1202 |
1203 |
1203 if (ec_fsm_master_idle(&master->fsm)) |
1204 if (ec_fsm_master_idle(&master->fsm)) |
1204 ec_master_nanosleep(master->send_interval*1000); |
1205 ec_master_nanosleep(master->send_interval*1000); |
1205 else |
1206 else |
1206 schedule(); |
1207 ec_master_nanosleep(sent_bytes*EC_BYTE_TRANSMITION_TIME); |
1207 } |
1208 } |
1208 |
1209 |
1209 if (master->debug_level) |
1210 if (master->debug_level) |
1210 EC_DBG("Master IDLE thread exiting...\n"); |
1211 EC_DBG("Master IDLE thread exiting...\n"); |
1211 return 0; |
1212 return 0; |
1980 ec_device_poll(&master->main_device); |
1981 ec_device_poll(&master->main_device); |
1981 return; |
1982 return; |
1982 } |
1983 } |
1983 |
1984 |
1984 // send frames |
1985 // send frames |
1985 ec_master_send_datagrams(master); |
1986 ec_master_send_datagrams(master); |
1986 } |
1987 } |
1987 |
1988 |
1988 /*****************************************************************************/ |
1989 /*****************************************************************************/ |
1989 |
1990 |
1990 void ecrt_master_receive(ec_master_t *master) |
1991 void ecrt_master_receive(ec_master_t *master) |