61 Init-Funktion des EtherCAT-Master-Treibermodules |
61 Init-Funktion des EtherCAT-Master-Treibermodules |
62 |
62 |
63 Initialisiert soviele Master, wie im Parameter ec_master_count |
63 Initialisiert soviele Master, wie im Parameter ec_master_count |
64 angegeben wurde (Default ist 1). |
64 angegeben wurde (Default ist 1). |
65 |
65 |
66 @returns 0, wenn alles o.k., -1 bei ungueltiger Anzahl Master |
66 \return 0 wenn alles ok, < 0 bei ungültiger Anzahl Master |
67 oder zu wenig Speicher. |
67 oder zu wenig Speicher. |
68 */ |
68 */ |
69 |
69 |
70 int __init ec_init_module(void) |
70 int __init ec_init_module(void) |
71 { |
71 { |
72 unsigned int i; |
72 unsigned int i; |
138 *****************************************************************************/ |
138 *****************************************************************************/ |
139 |
139 |
140 /** |
140 /** |
141 Registeriert das EtherCAT-Geraet fuer einen EtherCAT-Master. |
141 Registeriert das EtherCAT-Geraet fuer einen EtherCAT-Master. |
142 |
142 |
143 @param master_index Index des EtherCAT-Masters |
143 \return 0 wenn alles ok, oder < 0 wenn bereits ein Gerät registriert |
144 @param dev Das net_device des EtherCAT-Geraetes |
144 oder das Geraet nicht geöffnet werden konnte. |
145 @param isr Funktionszeiger auf die Interrupt-Service-Routine |
|
146 @param module Zeiger auf das Modul (fuer try_module_lock()) |
|
147 |
|
148 @return 0, wenn alles o.k., |
|
149 < 0, wenn bereits ein Geraet registriert oder das Geraet nicht |
|
150 geoeffnet werden konnte. |
|
151 */ |
145 */ |
152 |
146 |
153 ec_device_t *EtherCAT_dev_register(unsigned int master_index, |
147 ec_device_t *EtherCAT_dev_register(unsigned int master_index, |
154 struct net_device *dev, |
148 /**< Index des EtherCAT-Masters */ |
|
149 struct net_device *net_dev, |
|
150 /**< net_device des EtherCAT-Gerätes */ |
155 irqreturn_t (*isr)(int, void *, |
151 irqreturn_t (*isr)(int, void *, |
156 struct pt_regs *), |
152 struct pt_regs *), |
157 struct module *module) |
153 /**< Interrupt-Service-Routine */ |
158 { |
154 struct module *module |
159 ec_device_t *ecd; |
155 /**< Zeiger auf das Modul */ |
|
156 ) |
|
157 { |
|
158 ec_device_t *device; |
160 ec_master_t *master; |
159 ec_master_t *master; |
161 |
160 |
162 if (master_index >= ec_master_count) { |
161 if (master_index >= ec_master_count) { |
163 EC_ERR("Master %i does not exist!\n", master_index); |
162 EC_ERR("Master %i does not exist!\n", master_index); |
164 return NULL; |
163 return NULL; |
165 } |
164 } |
166 |
165 |
167 if (!dev) { |
166 if (!net_dev) { |
168 EC_WARN("Device is NULL!\n"); |
167 EC_WARN("Device is NULL!\n"); |
169 return NULL; |
168 return NULL; |
170 } |
169 } |
171 |
170 |
172 master = ec_masters + master_index; |
171 master = ec_masters + master_index; |
174 if (master->device_registered) { |
173 if (master->device_registered) { |
175 EC_ERR("Master %i already has a device!\n", master_index); |
174 EC_ERR("Master %i already has a device!\n", master_index); |
176 return NULL; |
175 return NULL; |
177 } |
176 } |
178 |
177 |
179 ecd = &master->device; |
178 device = &master->device; |
180 |
179 |
181 if (ec_device_init(ecd, master) < 0) return NULL; |
180 if (ec_device_init(device, master) < 0) return NULL; |
182 |
181 |
183 ecd->dev = dev; |
182 device->dev = net_dev; |
184 ecd->tx_skb->dev = dev; |
183 device->tx_skb->dev = net_dev; |
185 ecd->isr = isr; |
184 device->isr = isr; |
186 ecd->module = module; |
185 device->module = module; |
187 |
186 |
188 master->device_registered = 1; |
187 master->device_registered = 1; |
189 |
188 |
190 return ecd; |
189 return device; |
191 } |
190 } |
192 |
191 |
193 /*****************************************************************************/ |
192 /*****************************************************************************/ |
194 |
193 |
195 /** |
194 /** |
196 Entfernt das EtherCAT-Geraet eines EtherCAT-Masters. |
195 Hebt die Registrierung eines EtherCAT-Gerätes auf. |
197 |
196 */ |
198 @param master_index Der Index des EtherCAT-Masters |
197 |
199 @param ecd Das EtherCAT-Geraet |
198 void EtherCAT_dev_unregister(unsigned int master_index, |
200 */ |
199 /**< Index des EtherCAT-Masters */ |
201 |
200 ec_device_t *device |
202 void EtherCAT_dev_unregister(unsigned int master_index, ec_device_t *ecd) |
201 /**< EtherCAT-Geraet */ |
|
202 ) |
203 { |
203 { |
204 ec_master_t *master; |
204 ec_master_t *master; |
205 |
205 |
206 if (master_index >= ec_master_count) { |
206 if (master_index >= ec_master_count) { |
207 EC_WARN("Master %i does not exist!\n", master_index); |
207 EC_WARN("Master %i does not exist!\n", master_index); |
208 return; |
208 return; |
209 } |
209 } |
210 |
210 |
211 master = ec_masters + master_index; |
211 master = ec_masters + master_index; |
212 |
212 |
213 if (!master->device_registered || &master->device != ecd) { |
213 if (!master->device_registered || &master->device != device) { |
214 EC_WARN("Unable to unregister device!\n"); |
214 EC_WARN("Unable to unregister device!\n"); |
215 return; |
215 return; |
216 } |
216 } |
217 |
217 |
218 master->device_registered = 0; |
218 master->device_registered = 0; |
219 ec_device_clear(ecd); |
219 ec_device_clear(device); |
220 } |
220 } |
221 |
221 |
222 /****************************************************************************** |
222 /****************************************************************************** |
223 * |
223 * |
224 * Echtzeitschnittstelle |
224 * Echtzeitschnittstelle |
228 /** |
228 /** |
229 Reserviert einen bestimmten EtherCAT-Master und das zugehörige Gerät. |
229 Reserviert einen bestimmten EtherCAT-Master und das zugehörige Gerät. |
230 |
230 |
231 Gibt einen Zeiger auf den reservierten EtherCAT-Master zurueck. |
231 Gibt einen Zeiger auf den reservierten EtherCAT-Master zurueck. |
232 |
232 |
233 @param index Index des gewuenschten Masters |
233 \return Zeiger auf EtherCAT-Master oder NULL, wenn Parameter ungueltig. |
234 @returns Zeiger auf EtherCAT-Master oder NULL, wenn Parameter ungueltig. |
234 */ |
235 */ |
235 |
236 |
236 ec_master_t *EtherCAT_rt_request_master(unsigned int index |
237 ec_master_t *EtherCAT_rt_request_master(unsigned int index) |
237 /**< EtherCAT-Master-Index */ |
|
238 ) |
238 { |
239 { |
239 ec_master_t *master; |
240 ec_master_t *master; |
240 |
241 |
241 EC_INFO("===== Starting master %i... =====\n", index); |
242 EC_INFO("===== Starting master %i... =====\n", index); |
242 |
243 |
291 |
292 |
292 /*****************************************************************************/ |
293 /*****************************************************************************/ |
293 |
294 |
294 /** |
295 /** |
295 Gibt einen zuvor angeforderten EtherCAT-Master wieder frei. |
296 Gibt einen zuvor angeforderten EtherCAT-Master wieder frei. |
296 |
297 */ |
297 @param master Zeiger auf den freizugebenden EtherCAT-Master. |
298 |
298 */ |
299 void EtherCAT_rt_release_master(ec_master_t *master /**< EtherCAT-Masdter */) |
299 |
|
300 void EtherCAT_rt_release_master(ec_master_t *master) |
|
301 { |
300 { |
302 unsigned int i, found; |
301 unsigned int i, found; |
303 |
302 |
304 found = 0; |
303 found = 0; |
305 for (i = 0; i < ec_master_count; i++) { |
304 for (i = 0; i < ec_master_count; i++) { |