master/master.c
changeset 74 9bf603942791
parent 73 9f4ea66d89a3
child 77 677967864795
equal deleted inserted replaced
73:9f4ea66d89a3 74:9bf603942791
    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;