31 master->command_index = 0x00; |
31 master->command_index = 0x00; |
32 master->tx_data_length = 0; |
32 master->tx_data_length = 0; |
33 master->rx_data_length = 0; |
33 master->rx_data_length = 0; |
34 master->domain_count = 0; |
34 master->domain_count = 0; |
35 master->debug_level = 0; |
35 master->debug_level = 0; |
36 master->tx_time = 0; |
36 master->bus_time = 0; |
37 master->rx_time = 0; |
|
38 master->rx_tries = 0; |
|
39 } |
37 } |
40 |
38 |
41 /*****************************************************************************/ |
39 /*****************************************************************************/ |
42 |
40 |
43 /** |
41 /** |
248 |
246 |
249 if (unlikely(master->debug_level > 0)) { |
247 if (unlikely(master->debug_level > 0)) { |
250 printk(KERN_DEBUG "device send...\n"); |
248 printk(KERN_DEBUG "device send...\n"); |
251 } |
249 } |
252 |
250 |
253 // Zeit nehmen |
|
254 rdtscl(master->tx_time); |
|
255 |
|
256 // Send frame |
251 // Send frame |
257 if (unlikely(EtherCAT_device_send(master->dev, |
252 if (unlikely(EtherCAT_device_send(master->dev, |
258 master->tx_data, |
253 master->tx_data, |
259 framelength) != 0)) { |
254 framelength) != 0)) { |
260 printk(KERN_ERR "EtherCAT: Could not send!\n"); |
255 printk(KERN_ERR "EtherCAT: Could not send!\n"); |
993 /*****************************************************************************/ |
988 /*****************************************************************************/ |
994 |
989 |
995 /** |
990 /** |
996 Sendet und empfängt Prozessdaten der angegebenen Domäne |
991 Sendet und empfängt Prozessdaten der angegebenen Domäne |
997 |
992 |
998 @param master EtherCAT-Master |
993 @param master EtherCAT-Master |
999 domain Domäne |
994 domain Domäne |
|
995 timeout_us Timeout in Mikrosekunden |
1000 |
996 |
1001 @return 0 bei Erfolg, sonst < 0 |
997 @return 0 bei Erfolg, sonst < 0 |
1002 */ |
998 */ |
1003 |
999 |
1004 int EtherCAT_process_data_cycle(EtherCAT_master_t *master, |
1000 int EtherCAT_process_data_cycle(EtherCAT_master_t *master, unsigned int domain, |
1005 unsigned int domain) |
1001 unsigned int timeout_us) |
1006 { |
1002 { |
1007 unsigned int i, tries; |
1003 unsigned int i; |
1008 EtherCAT_domain_t *dom = NULL; |
1004 EtherCAT_domain_t *dom; |
1009 |
1005 unsigned long start_ticks, end_ticks, timeout_ticks; |
|
1006 |
|
1007 dom = NULL; |
1010 for (i = 0; i < master->domain_count; i++) { |
1008 for (i = 0; i < master->domain_count; i++) { |
1011 if (master->domains[i].number == domain) { |
1009 if (master->domains[i].number == domain) { |
1012 dom = master->domains + i; |
1010 dom = master->domains + i; |
1013 break; |
1011 break; |
1014 } |
1012 } |
1021 |
1019 |
1022 EtherCAT_command_logical_read_write(&dom->command, |
1020 EtherCAT_command_logical_read_write(&dom->command, |
1023 dom->logical_offset, dom->data_size, |
1021 dom->logical_offset, dom->data_size, |
1024 dom->data); |
1022 dom->data); |
1025 |
1023 |
|
1024 rdtscl(start_ticks); // Sendezeit nehmen |
|
1025 |
1026 if (unlikely(EtherCAT_simple_send(master, &dom->command) < 0)) { |
1026 if (unlikely(EtherCAT_simple_send(master, &dom->command) < 0)) { |
1027 printk(KERN_ERR "EtherCAT: Could not send process data command!\n"); |
1027 printk(KERN_ERR "EtherCAT: Could not send process data command!\n"); |
1028 return -1; |
1028 return -1; |
1029 } |
1029 } |
1030 |
1030 |
1031 udelay(3); |
1031 timeout_ticks = timeout_us * cpu_khz / 1000; |
1032 |
1032 |
1033 #if 1 |
|
1034 // Warten |
1033 // Warten |
1035 tries = 0; |
1034 do { |
1036 EtherCAT_device_call_isr(master->dev); |
|
1037 while (unlikely(master->dev->state == ECAT_DS_SENT && tries < 100)) { |
|
1038 udelay(1); |
|
1039 EtherCAT_device_call_isr(master->dev); |
1035 EtherCAT_device_call_isr(master->dev); |
1040 tries++; |
1036 rdtscl(end_ticks); // Empfangszeit nehmen |
1041 } |
1037 } |
1042 |
1038 while (unlikely(master->dev->state == ECAT_DS_SENT |
1043 rdtscl(master->rx_time); |
1039 && end_ticks - start_ticks < timeout_ticks)); |
1044 master->rx_tries = tries; |
1040 |
1045 |
1041 master->bus_time = (end_ticks - start_ticks) * 1000 / cpu_khz; |
1046 if (unlikely(tries == 100)) { |
1042 |
|
1043 if (unlikely(end_ticks - start_ticks >= timeout_ticks)) { |
1047 printk(KERN_ERR "EtherCAT: Timeout while receiving process data!\n"); |
1044 printk(KERN_ERR "EtherCAT: Timeout while receiving process data!\n"); |
1048 return -1; |
1045 return -1; |
1049 } |
1046 } |
1050 |
1047 |
1051 if (unlikely(EtherCAT_simple_receive(master, &dom->command) < 0)) { |
1048 if (unlikely(EtherCAT_simple_receive(master, &dom->command) < 0)) { |