equal
deleted
inserted
replaced
69 /**< Zeiger auf den zurückzusetzenden Master */ |
69 /**< Zeiger auf den zurückzusetzenden Master */ |
70 ) |
70 ) |
71 { |
71 { |
72 unsigned int i; |
72 unsigned int i; |
73 |
73 |
74 if (master->slaves) { |
74 ec_master_clear_slaves(master); |
75 for (i = 0; i < master->slave_count; i++) { |
|
76 ec_slave_clear(master->slaves + i); |
|
77 } |
|
78 kfree(master->slaves); |
|
79 master->slaves = NULL; |
|
80 } |
|
81 master->slave_count = 0; |
|
82 |
75 |
83 for (i = 0; i < master->domain_count; i++) { |
76 for (i = 0; i < master->domain_count; i++) { |
84 ec_domain_clear(master->domains[i]); |
77 ec_domain_clear(master->domains[i]); |
85 kfree(master->domains[i]); |
78 kfree(master->domains[i]); |
86 } |
79 } |
94 } |
87 } |
95 |
88 |
96 /*****************************************************************************/ |
89 /*****************************************************************************/ |
97 |
90 |
98 /** |
91 /** |
|
92 Entfernt alle Slaves. |
|
93 */ |
|
94 |
|
95 void ec_master_clear_slaves(ec_master_t *master /**< EtherCAT-Master */) |
|
96 { |
|
97 unsigned int i; |
|
98 |
|
99 if (master->slaves) { |
|
100 for (i = 0; i < master->slave_count; i++) { |
|
101 ec_slave_clear(master->slaves + i); |
|
102 } |
|
103 kfree(master->slaves); |
|
104 master->slaves = NULL; |
|
105 } |
|
106 master->slave_count = 0; |
|
107 } |
|
108 |
|
109 /*****************************************************************************/ |
|
110 |
|
111 /** |
99 Öffnet das EtherCAT-Geraet des Masters. |
112 Öffnet das EtherCAT-Geraet des Masters. |
100 |
113 |
101 \return 0, wenn alles o.k., < 0, wenn kein Gerät registriert wurde oder |
114 \return 0, wenn alles o.k., < 0, wenn kein Gerät registriert wurde oder |
102 es nicht geoeffnet werden konnte. |
115 es nicht geoeffnet werden konnte. |
103 */ |
116 */ |
150 ec_slave_t *slave; |
163 ec_slave_t *slave; |
151 ec_slave_ident_t *ident; |
164 ec_slave_ident_t *ident; |
152 unsigned int i; |
165 unsigned int i; |
153 unsigned char data[2]; |
166 unsigned char data[2]; |
154 |
167 |
155 if (master->slaves || master->slave_count) { |
168 if (master->slaves || master->slave_count) |
156 printk(KERN_ERR "EtherCAT: Slave scan already done!\n"); |
169 printk(KERN_WARNING "EtherCAT: Slave scan already done!\n"); |
157 return -1; |
170 ec_master_clear_slaves(master); |
158 } |
|
159 |
171 |
160 // Determine number of slaves on bus |
172 // Determine number of slaves on bus |
161 |
173 |
162 ec_frame_init_brd(&frame, master, 0x0000, 4); |
174 ec_frame_init_brd(&frame, master, 0x0000, 4); |
163 if (unlikely(ec_frame_send_receive(&frame) < 0)) return -1; |
175 if (unlikely(ec_frame_send_receive(&frame) < 0)) return -1; |
432 master->domain_count++; |
444 master->domain_count++; |
433 |
445 |
434 return domain; |
446 return domain; |
435 } |
447 } |
436 |
448 |
|
449 /*****************************************************************************/ |
|
450 |
437 /** |
451 /** |
438 Konfiguriert alle Slaves und setzt den Operational-Zustand. |
452 Konfiguriert alle Slaves und setzt den Operational-Zustand. |
439 |
453 |
440 Führt die komplette Konfiguration und Aktivierunge aller registrierten |
454 Führt die komplette Konfiguration und Aktivierunge aller registrierten |
441 Slaves durch. Setzt Sync-Manager und FMMU's, führt die entsprechenden |
455 Slaves durch. Setzt Sync-Manager und FMMU's, führt die entsprechenden |
483 printk(KERN_INFO "EtherCAT: Slave %i was not registered.\n", i); |
497 printk(KERN_INFO "EtherCAT: Slave %i was not registered.\n", i); |
484 continue; |
498 continue; |
485 } |
499 } |
486 |
500 |
487 type = slave->type; |
501 type = slave->type; |
|
502 |
|
503 // Check and reset CRC fault counters |
|
504 ec_slave_check_crc(slave); |
488 |
505 |
489 // Resetting FMMU's |
506 // Resetting FMMU's |
490 if (slave->base_fmmu_count) { |
507 if (slave->base_fmmu_count) { |
491 memset(data, 0x00, EC_FMMU_SIZE * slave->base_fmmu_count); |
508 memset(data, 0x00, EC_FMMU_SIZE * slave->base_fmmu_count); |
492 ec_frame_init_npwr(&frame, master, slave->station_address, 0x0600, |
509 ec_frame_init_npwr(&frame, master, slave->station_address, 0x0600, |
579 |
596 |
580 for (i = 0; i < master->slave_count; i++) |
597 for (i = 0; i < master->slave_count; i++) |
581 { |
598 { |
582 slave = master->slaves + i; |
599 slave = master->slaves + i; |
583 |
600 |
|
601 // CRC-Zählerstände ausgeben |
|
602 ec_slave_check_crc(slave); |
|
603 |
584 if (unlikely(ec_slave_state_change(slave, EC_SLAVE_STATE_INIT) != 0)) |
604 if (unlikely(ec_slave_state_change(slave, EC_SLAVE_STATE_INIT) != 0)) |
585 return -1; |
605 return -1; |
586 } |
606 } |
587 |
607 |
588 return 0; |
608 return 0; |