master/master.c
changeset 1602 2f6683e9181f
parent 1600 e36c92cf58a9
child 1605 1a588303083a
equal deleted inserted replaced
1601:a784812c787f 1602:2f6683e9181f
   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)