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) { |
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: *** |