42 MODULE_PARM_DESC(ecat_master_count, "Number of EtherCAT master to initialize."); |
43 MODULE_PARM_DESC(ecat_master_count, "Number of EtherCAT master to initialize."); |
43 |
44 |
44 module_init(ecat_init_module); |
45 module_init(ecat_init_module); |
45 module_exit(ecat_cleanup_module); |
46 module_exit(ecat_cleanup_module); |
46 |
47 |
47 EXPORT_SYMBOL(EtherCAT_master); |
48 EXPORT_SYMBOL(EtherCAT_register_device); |
|
49 EXPORT_SYMBOL(EtherCAT_unregister_device); |
|
50 EXPORT_SYMBOL(EtherCAT_request); |
|
51 EXPORT_SYMBOL(EtherCAT_release); |
48 |
52 |
49 /******************************************************************************/ |
53 /******************************************************************************/ |
50 |
54 |
51 /** |
55 /** |
52 Init-Funktion des EtherCAT-Master-Treibermodules |
56 Init-Funktion des EtherCAT-Master-Treibermodules |
108 |
121 |
109 if (ecat_masters) |
122 if (ecat_masters) |
110 { |
123 { |
111 for (i = 0; i < ecat_master_count; i++) |
124 for (i = 0; i < ecat_master_count; i++) |
112 { |
125 { |
|
126 if (ecat_masters_reserved[i]) { |
|
127 printk(KERN_WARNING "EtherCAT: Warning - Master %i is still in use!\n", i); |
|
128 } |
|
129 |
113 EtherCAT_master_clear(&ecat_masters[i]); |
130 EtherCAT_master_clear(&ecat_masters[i]); |
114 } |
131 } |
115 |
132 |
116 kfree(ecat_masters); |
133 kfree(ecat_masters); |
117 } |
134 } |
118 |
135 |
119 printk(KERN_ERR "EtherCAT: Master driver cleaned up.\n"); |
136 printk(KERN_ERR "EtherCAT: Master driver cleaned up.\n"); |
120 } |
137 } |
121 |
138 |
122 /******************************************************************************/ |
139 /***************************************************************/ |
123 |
140 |
124 /** |
141 /** |
125 Gibt einen Zeiger auf einen bestimmten EtherCAT-Master zurueck. |
142 Setzt das EtherCAT-Geraet, auf dem der Master arbeitet. |
|
143 |
|
144 Registriert das Geraet beim Master, der es daraufhin oeffnet. |
|
145 |
|
146 @param master Der EtherCAT-Master |
|
147 @param device Das EtherCAT-Geraet |
|
148 @return 0, wenn alles o.k., |
|
149 < 0, wenn bereits ein Geraet registriert |
|
150 oder das Geraet nicht geoeffnet werden konnte. |
|
151 */ |
|
152 |
|
153 int EtherCAT_register_device(int index, EtherCAT_device_t *device) |
|
154 { |
|
155 if (index < 0 || index >= ecat_master_count) |
|
156 { |
|
157 printk(KERN_ERR "EtherCAT: Master %i does not exist!\n", index); |
|
158 return -1; |
|
159 } |
|
160 |
|
161 return EtherCAT_master_open(&ecat_masters[index], device); |
|
162 } |
|
163 |
|
164 /***************************************************************/ |
|
165 |
|
166 /** |
|
167 Loescht das EtherCAT-Geraet, auf dem der Master arbeitet. |
|
168 |
|
169 @param master Der EtherCAT-Master |
|
170 @param device Das EtherCAT-Geraet |
|
171 */ |
|
172 |
|
173 void EtherCAT_unregister_device(int index, EtherCAT_device_t *device) |
|
174 { |
|
175 if (index < 0 || index >= ecat_master_count) |
|
176 { |
|
177 printk(KERN_WARNING "EtherCAT: Master %i does not exist!\n", index); |
|
178 return; |
|
179 } |
|
180 |
|
181 EtherCAT_master_close(&ecat_masters[index], device); |
|
182 } |
|
183 |
|
184 /******************************************************************************/ |
|
185 |
|
186 /** |
|
187 Reserviert einen bestimmten EtherCAT-Master und das zugehörige Gerät. |
|
188 |
|
189 Gibt einen Zeiger auf den reservierten EtherCAT-Master zurueck. |
126 |
190 |
127 @param index Index des gewuenschten Masters |
191 @param index Index des gewuenschten Masters |
128 @returns Zeiger auf EtherCAT-Master oder NULL, wenn Parameter ungueltig. |
192 @returns Zeiger auf EtherCAT-Master oder NULL, wenn Parameter ungueltig. |
129 */ |
193 */ |
130 |
194 |
131 EtherCAT_master_t *EtherCAT_master(int index) |
195 EtherCAT_master_t *EtherCAT_request(int index) |
132 { |
196 { |
133 if (index < 0 || index >= ecat_master_count) |
197 if (index < 0 || index >= ecat_master_count) { |
134 { |
|
135 printk(KERN_ERR "EtherCAT: Master %i does not exist!\n", index); |
198 printk(KERN_ERR "EtherCAT: Master %i does not exist!\n", index); |
136 return NULL; |
199 return NULL; |
137 } |
200 } |
138 |
201 |
|
202 if (ecat_masters_reserved[index]) { |
|
203 printk(KERN_ERR "EtherCAT: Master %i already in use!\n", index); |
|
204 return NULL; |
|
205 } |
|
206 |
|
207 if (!ecat_masters[index].dev) { |
|
208 printk(KERN_ERR "EtherCAT: Master %i has no device assigned yet!\n", index); |
|
209 return NULL; |
|
210 } |
|
211 |
|
212 if (!ecat_masters[index].dev->module) { |
|
213 printk(KERN_ERR "EtherCAT: Master %i device module is not set!\n", index); |
|
214 return NULL; |
|
215 } |
|
216 |
|
217 if (!try_module_get(ecat_masters[index].dev->module)) { |
|
218 printk(KERN_ERR "EtherCAT: Could not reserve device module!\n"); |
|
219 return NULL; |
|
220 } |
|
221 |
|
222 ecat_masters_reserved[index] = 1; |
|
223 |
|
224 printk(KERN_INFO "EtherCAT: Reserved master %i.\n", index); |
|
225 |
139 return &ecat_masters[index]; |
226 return &ecat_masters[index]; |
140 } |
227 } |
141 |
228 |
142 /******************************************************************************/ |
229 /******************************************************************************/ |
|
230 |
|
231 /** |
|
232 Gibt einen zuvor reservierten EtherCAT-Master wieder frei. |
|
233 |
|
234 @param master Zeiger auf den freizugebenden EtherCAT-Master. |
|
235 */ |
|
236 |
|
237 void EtherCAT_release(EtherCAT_master_t *master) |
|
238 { |
|
239 unsigned int i; |
|
240 |
|
241 for (i = 0; i < ecat_master_count; i++) |
|
242 { |
|
243 if (&ecat_masters[i] == master) |
|
244 { |
|
245 if (!ecat_masters[i].dev) { |
|
246 printk(KERN_WARNING "EtherCAT: Could not release device" |
|
247 "module because of no device!\n"); |
|
248 return; |
|
249 } |
|
250 |
|
251 module_put(ecat_masters[i].dev->module); |
|
252 ecat_masters_reserved[i] = 0; |
|
253 |
|
254 printk(KERN_INFO "EtherCAT: Released master %i.\n", i); |
|
255 |
|
256 return; |
|
257 } |
|
258 } |
|
259 |
|
260 printk(KERN_WARNING "EtherCAT: Master %X was never reserved!\n", |
|
261 (unsigned int) master); |
|
262 } |
|
263 |
|
264 /******************************************************************************/ |