master/master.c
changeset 56 36d1fa37f5e1
parent 55 059a9e712aa7
child 58 21b7342e2a90
equal deleted inserted replaced
55:059a9e712aa7 56:36d1fa37f5e1
    79 }
    79 }
    80 
    80 
    81 /*****************************************************************************/
    81 /*****************************************************************************/
    82 
    82 
    83 /**
    83 /**
       
    84    Setzt den Master in den Ausgangszustand.
       
    85 
       
    86    Bei einem "release" sollte immer diese Funktion aufgerufen werden,
       
    87    da sonst Slave-Liste, Domains, etc. weiter existieren.
       
    88 
       
    89    @param master Zeiger auf den zurückzusetzenden Master
       
    90 */
       
    91 
       
    92 void ec_master_reset(ec_master_t *master)
       
    93 {
       
    94   if (master->bus_slaves) {
       
    95     kfree(master->bus_slaves);
       
    96     master->bus_slaves = NULL;
       
    97   }
       
    98 
       
    99   master->bus_slaves_count = 0;
       
   100   master->command_index = 0;
       
   101   master->tx_data_length = 0;
       
   102   master->rx_data_length = 0;
       
   103   master->domain_count = 0;
       
   104   master->debug_level = 0;
       
   105   master->bus_time = 0;
       
   106   master->frames_lost = 0;
       
   107   master->t_lost_output = 0;
       
   108 }
       
   109 
       
   110 /*****************************************************************************/
       
   111 
       
   112 /**
    84    Öffnet das EtherCAT-Geraet des Masters.
   113    Öffnet das EtherCAT-Geraet des Masters.
    85 
   114 
    86    @param master Der EtherCAT-Master
   115    @param master Der EtherCAT-Master
    87 
   116 
    88    @return 0, wenn alles o.k., < 0, wenn das Geraet nicht geoeffnet werden
   117    @return 0, wenn alles o.k., < 0, wenn das Geraet nicht geoeffnet werden
   708 
   737 
   709 ec_slave_t *EtherCAT_rt_register_slave(ec_master_t *master,
   738 ec_slave_t *EtherCAT_rt_register_slave(ec_master_t *master,
   710                                        unsigned int bus_index,
   739                                        unsigned int bus_index,
   711                                        const char *vendor_name,
   740                                        const char *vendor_name,
   712                                        const char *product_name,
   741                                        const char *product_name,
   713                                        unsigned int domain)
   742                                        int domain)
   714 {
   743 {
   715   ec_slave_t *slave;
   744   ec_slave_t *slave;
   716   const ec_slave_type_t *type;
   745   const ec_slave_type_t *type;
   717   ec_domain_t *dom;
   746   ec_domain_t *dom;
   718   unsigned int j;
   747   unsigned int j;
   719 
   748 
       
   749   if (domain < 0) {
       
   750     printk(KERN_ERR "EtherCAT: Invalid domain: %i\n", domain);
       
   751     return NULL;
       
   752   }
       
   753 
   720   if (bus_index >= master->bus_slaves_count) {
   754   if (bus_index >= master->bus_slaves_count) {
   721     printk(KERN_ERR "EtherCAT: Illegal bus index! (%i / %i)\n", bus_index,
   755     printk(KERN_ERR "EtherCAT: Illegal bus index! (%i / %i)\n", bus_index,
   722            master->bus_slaves_count);
   756            master->bus_slaves_count);
   723     return NULL;
   757     return NULL;
   724   }
   758   }
   732 
   766 
   733   type = slave->type;
   767   type = slave->type;
   734 
   768 
   735   if (strcmp(vendor_name, type->vendor_name) ||
   769   if (strcmp(vendor_name, type->vendor_name) ||
   736       strcmp(product_name, type->product_name)) {
   770       strcmp(product_name, type->product_name)) {
   737     printk(KERN_ERR "Invalid Slave Type! Requested: \"%s %s\", present: \"%s"
   771     printk(KERN_ERR "Invalid Slave Type! Requested: \"%s %s\", found: \"%s"
   738            " %s\".\n", vendor_name, product_name, type->vendor_name,
   772            " %s\".\n", vendor_name, product_name, type->vendor_name,
   739            type->product_name);
   773            type->product_name);
   740     return NULL;
   774     return NULL;
   741   }
   775   }
   742 
   776 
   743   // Check, if process data domain already exists...
   777   // Check, if process data domain already exists...
   744   dom = NULL;
   778   dom = NULL;
   745   for (j = 0; j < master->domain_count; j++) {
   779   for (j = 0; j < master->domain_count; j++) {
   746     if (domain == master->domains[j].number) {
   780     if (domain == master->domains[j].number) {
   747       dom = master->domains + j;
   781       dom = master->domains + j;
       
   782       break;
   748     }
   783     }
   749   }
   784   }
   750 
   785 
   751   // Create process data domain
   786   // Create process data domain
   752   if (!dom) {
   787   if (!dom) {
   768            EC_FRAME_SIZE - 14);
   803            EC_FRAME_SIZE - 14);
   769     return NULL;
   804     return NULL;
   770   }
   805   }
   771 
   806 
   772   slave->process_data = dom->data + dom->data_size;
   807   slave->process_data = dom->data + dom->data_size;
       
   808   slave->logical_address = dom->data_size;
       
   809   slave->registered = 1;
       
   810 
   773   dom->data_size += type->process_data_size;
   811   dom->data_size += type->process_data_size;
   774   slave->registered = 1;
       
   775 
   812 
   776   return slave;
   813   return slave;
   777 }
   814 }
   778 
   815 
   779 /*****************************************************************************/
   816 /*****************************************************************************/
  1027           timeout_us Timeout in Mikrosekunden
  1064           timeout_us Timeout in Mikrosekunden
  1028 
  1065 
  1029    @return 0 bei Erfolg, sonst < 0
  1066    @return 0 bei Erfolg, sonst < 0
  1030 */
  1067 */
  1031 
  1068 
  1032 int EtherCAT_rt_exchange_io(ec_master_t *master, unsigned int domain,
  1069 int EtherCAT_rt_domain_xio(ec_master_t *master, unsigned int domain,
  1033                             unsigned int timeout_us)
  1070                            unsigned int timeout_us)
  1034 {
  1071 {
  1035   unsigned int i;
  1072   unsigned int i;
  1036   ec_domain_t *dom;
  1073   ec_domain_t *dom;
  1037   unsigned long start_ticks, end_ticks, timeout_ticks;
  1074   unsigned long start_ticks, end_ticks, timeout_ticks;
  1038 
  1075 
  1103   return 0;
  1140   return 0;
  1104 }
  1141 }
  1105 
  1142 
  1106 /*****************************************************************************/
  1143 /*****************************************************************************/
  1107 
  1144 
       
  1145 /**
       
  1146    Setzt die Debug-Ebene des Masters.
       
  1147 */
       
  1148 
       
  1149 void EtherCAT_rt_debug_level(ec_master_t *master, int level)
       
  1150 {
       
  1151   master->debug_level = level;
       
  1152 }
       
  1153 
       
  1154 /*****************************************************************************/
       
  1155 
  1108 EXPORT_SYMBOL(EtherCAT_rt_register_slave);
  1156 EXPORT_SYMBOL(EtherCAT_rt_register_slave);
  1109 EXPORT_SYMBOL(EtherCAT_rt_activate_slaves);
  1157 EXPORT_SYMBOL(EtherCAT_rt_activate_slaves);
  1110 EXPORT_SYMBOL(EtherCAT_rt_deactivate_slaves);
  1158 EXPORT_SYMBOL(EtherCAT_rt_deactivate_slaves);
  1111 EXPORT_SYMBOL(EtherCAT_rt_exchange_io);
  1159 EXPORT_SYMBOL(EtherCAT_rt_domain_xio);
       
  1160 EXPORT_SYMBOL(EtherCAT_rt_debug_level);
  1112 
  1161 
  1113 /*****************************************************************************/
  1162 /*****************************************************************************/
  1114 
  1163 
  1115 /* Emacs-Konfiguration
  1164 /* Emacs-Konfiguration
  1116 ;;; Local Variables: ***
  1165 ;;; Local Variables: ***