drivers/ec_master.c
changeset 47 ad5f969f263b
parent 43 35120a61d55e
child 48 7e75772ea28c
equal deleted inserted replaced
46:f2d7a73d2f32 47:ad5f969f263b
    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)) {
  1058     return -1;
  1055     return -1;
  1059   }
  1056   }
  1060 
  1057 
  1061   // Daten vom Kommando in den Prozessdatenspeicher kopieren
  1058   // Daten vom Kommando in den Prozessdatenspeicher kopieren
  1062   memcpy(dom->data, dom->command.data, dom->data_size);
  1059   memcpy(dom->data, dom->command.data, dom->data_size);
  1063 #endif
       
  1064 
  1060 
  1065   return 0;
  1061   return 0;
  1066 }
  1062 }
  1067 
  1063 
  1068 /*****************************************************************************/
  1064 /*****************************************************************************/