drivers/ec_master.c
branchkernel2.6
changeset 24 d417dd9bdc2f
parent 23 39364fbcd069
child 26 60435f959e5c
equal deleted inserted replaced
23:39364fbcd069 24:d417dd9bdc2f
     7  *  $Date$
     7  *  $Date$
     8  *  $Author$
     8  *  $Author$
     9  *
     9  *
    10  ***************************************************************/
    10  ***************************************************************/
    11 
    11 
       
    12 #include <linux/module.h>
    12 #include <linux/kernel.h>
    13 #include <linux/kernel.h>
    13 #include <linux/string.h>
    14 #include <linux/string.h>
    14 #include <linux/slab.h>
    15 #include <linux/slab.h>
    15 #include <linux/delay.h>
    16 #include <linux/delay.h>
    16 
    17 
    50   master->debug_level = 0;
    51   master->debug_level = 0;
    51 
    52 
    52   return 0;
    53   return 0;
    53 }
    54 }
    54 
    55 
    55 EXPORT_SYMBOL(EtherCAT_master_init);
       
    56 
       
    57 /***************************************************************/
    56 /***************************************************************/
    58 
    57 
    59 /**
    58 /**
    60    Destruktor eines EtherCAT-Masters.
    59    Destruktor eines EtherCAT-Masters.
    61 
    60 
    77   }
    76   }
    78 
    77 
    79   master->process_data_length = 0;
    78   master->process_data_length = 0;
    80 }
    79 }
    81 
    80 
    82 EXPORT_SYMBOL(EtherCAT_master_clear);
       
    83 
       
    84 /***************************************************************/
    81 /***************************************************************/
    85 
    82 
    86 /**
    83 /**
    87    Sendet ein einzelnes Kommando in einem Frame und
    84    Sendet ein einzelnes Kommando in einem Frame und
    88    wartet auf dessen Empfang.
    85    wartet auf dessen Empfang.
    96 int EtherCAT_simple_send_receive(EtherCAT_master_t *master,
    93 int EtherCAT_simple_send_receive(EtherCAT_master_t *master,
    97                                  EtherCAT_command_t *cmd)
    94                                  EtherCAT_command_t *cmd)
    98 {
    95 {
    99   unsigned int tries_left;
    96   unsigned int tries_left;
   100 
    97 
       
    98 //  EC_DBG("ECAT send...\n");  //HM
       
    99 
   101   if (EtherCAT_simple_send(master, cmd) < 0) return -1;
   100   if (EtherCAT_simple_send(master, cmd) < 0) return -1;
   102 
   101 
       
   102 //   EC_DBG("ECAT call isr \n");  //HM
       
   103   udelay(3);  //FIXME nur zum Test HM
       
   104 
   103   EtherCAT_device_call_isr(master->dev);
   105   EtherCAT_device_call_isr(master->dev);
   104 
   106 
   105   tries_left = 1000;
   107   tries_left = 100;
   106   while (master->dev->state == ECAT_DS_SENT && tries_left)
   108   while (master->dev->state == ECAT_DS_SENT && tries_left)
   107   {
   109   {
   108     udelay(1);
   110     udelay(1);
       
   111 //    EC_DBG("ECAT call isr \n");  //HM
   109     EtherCAT_device_call_isr(master->dev);
   112     EtherCAT_device_call_isr(master->dev);
   110     tries_left--;
   113     tries_left--;
   111   }
   114   }
   112 
   115 
       
   116 //   EC_DBG("ECAT recieve \n");  //HM
       
   117 
   113   if (EtherCAT_simple_receive(master, cmd) < 0) return -1;
   118   if (EtherCAT_simple_receive(master, cmd) < 0) return -1;
       
   119 
       
   120 //   EC_DBG("ECAT recieve done\n"); //HM
   114 
   121 
   115   return 0;
   122   return 0;
   116 }
   123 }
   117 
   124 
   118 /***************************************************************/
   125 /***************************************************************/
   500   master->slave_count = slave_count;
   507   master->slave_count = slave_count;
   501 
   508 
   502   return 0;
   509   return 0;
   503 }
   510 }
   504 
   511 
   505 EXPORT_SYMBOL(EtherCAT_check_slaves);
       
   506 
       
   507 /***************************************************************/
   512 /***************************************************************/
   508 
   513 
   509 /**
   514 /**
   510    Entfernt den Zeiger auf das Slave-Array.
   515    Entfernt den Zeiger auf das Slave-Array.
   511 
   516 
   633     return -2;
   638     return -2;
   634   }
   639   }
   635 
   640 
   636   if (cmd.working_counter != 1)
   641   if (cmd.working_counter != 1)
   637   {
   642   {
   638     EC_DBG(KERN_ERR "EtherCAT: Could not set state %02X - Device did not respond!\n", state_and_ack);
   643     EC_DBG(KERN_ERR "EtherCAT: Could not set state %02X - Device \"%s %s\" (%d) did not respond!\n", 
       
   644 	   state_and_ack,
       
   645 	   slave->desc->vendor_name, 
       
   646 	   slave->desc->product_name,
       
   647 	   slave->ring_position*(-1));
   639     return -3;
   648     return -3;
   640   }
   649   }
   641 
   650 
   642   slave->requested_state = state_and_ack & 0x0F;
   651   slave->requested_state = state_and_ack & 0x0F;
   643 
   652 
   926   }
   935   }
   927 
   936 
   928   return 0;
   937   return 0;
   929 }
   938 }
   930 
   939 
   931 EXPORT_SYMBOL(EtherCAT_activate_all_slaves);
       
   932 
       
   933 /***************************************************************/
   940 /***************************************************************/
   934 
   941 
   935 /**
   942 /**
   936    Deaktiviert alle Slaves.
   943    Deaktiviert alle Slaves.
   937 
   944 
   955     }
   962     }
   956   }
   963   }
   957 
   964 
   958   return ret;
   965   return ret;
   959 }
   966 }
   960 
       
   961 EXPORT_SYMBOL(EtherCAT_deactivate_all_slaves);
       
   962 
   967 
   963 /***************************************************************/
   968 /***************************************************************/
   964 
   969 
   965 /**
   970 /**
   966    Sendet alle Prozessdaten an die Slaves.
   971    Sendet alle Prozessdaten an die Slaves.
   986   }
   991   }
   987 
   992 
   988   return 0;
   993   return 0;
   989 }
   994 }
   990 
   995 
   991 EXPORT_SYMBOL(EtherCAT_write_process_data);
       
   992 
       
   993 /***************************************************************/
   996 /***************************************************************/
   994 
   997 
   995 /**
   998 /**
   996    Empfängt alle Prozessdaten von den Slaves.
   999    Empfängt alle Prozessdaten von den Slaves.
   997 
  1000 
  1008 {
  1011 {
  1009   unsigned int tries_left;
  1012   unsigned int tries_left;
  1010 
  1013 
  1011   EtherCAT_device_call_isr(master->dev);
  1014   EtherCAT_device_call_isr(master->dev);
  1012 
  1015 
  1013   tries_left = 1000;
  1016   tries_left = 100;
  1014   while (master->dev->state == ECAT_DS_SENT && tries_left)
  1017   while (master->dev->state == ECAT_DS_SENT && tries_left)
  1015   {
  1018   {
  1016     udelay(1);
  1019     udelay(1);
  1017     EtherCAT_device_call_isr(master->dev);
  1020     EtherCAT_device_call_isr(master->dev);
  1018     tries_left--;
  1021     tries_left--;
  1041          master->process_data_length);
  1044          master->process_data_length);
  1042 
  1045 
  1043   return 0;
  1046   return 0;
  1044 }
  1047 }
  1045 
  1048 
  1046 EXPORT_SYMBOL(EtherCAT_read_process_data);
       
  1047 
       
  1048 /***************************************************************/
  1049 /***************************************************************/
  1049 
  1050 
  1050 /**
  1051 /**
  1051    Verwirft das zuletzt gesendete Prozessdatenkommando.
  1052    Verwirft das zuletzt gesendete Prozessdatenkommando.
  1052 
  1053 
  1057 {
  1058 {
  1058   EtherCAT_device_call_isr(master->dev);
  1059   EtherCAT_device_call_isr(master->dev);
  1059   master->dev->state = ECAT_DS_READY;
  1060   master->dev->state = ECAT_DS_READY;
  1060 }
  1061 }
  1061 
  1062 
  1062 EXPORT_SYMBOL(EtherCAT_clear_process_data);
       
  1063 
       
  1064 /***************************************************************/
  1063 /***************************************************************/
  1065 
  1064 
  1066 /**
  1065 /**
  1067    Gibt Frame-Inhalte zwecks Debugging aus.
  1066    Gibt Frame-Inhalte zwecks Debugging aus.
  1068 
  1067 
  1095   }
  1094   }
  1096   EC_DBG("\n");
  1095   EC_DBG("\n");
  1097 }
  1096 }
  1098 
  1097 
  1099 /***************************************************************/
  1098 /***************************************************************/
       
  1099 
       
  1100 EXPORT_SYMBOL(EtherCAT_master_init);
       
  1101 EXPORT_SYMBOL(EtherCAT_master_clear);
       
  1102 EXPORT_SYMBOL(EtherCAT_read_process_data);
       
  1103 EXPORT_SYMBOL(EtherCAT_write_process_data);
       
  1104 EXPORT_SYMBOL(EtherCAT_check_slaves);
       
  1105 EXPORT_SYMBOL(EtherCAT_activate_all_slaves);
       
  1106 EXPORT_SYMBOL(EtherCAT_clear_process_data);
       
  1107 EXPORT_SYMBOL(EtherCAT_deactivate_all_slaves);