master/slave.c
changeset 446 8fede404c01f
parent 423 862ff892cf18
child 448 e4b76dc7910c
equal deleted inserted replaced
445:3b7eec329112 446:8fede404c01f
   134     slave->current_state = EC_SLAVE_STATE_UNKNOWN;
   134     slave->current_state = EC_SLAVE_STATE_UNKNOWN;
   135     slave->configured = 0;
   135     slave->configured = 0;
   136     slave->error_flag = 0;
   136     slave->error_flag = 0;
   137     slave->online = 1;
   137     slave->online = 1;
   138     slave->fmmu_count = 0;
   138     slave->fmmu_count = 0;
   139     slave->registered = 0;
       
   140 
   139 
   141     slave->coupler_index = 0;
   140     slave->coupler_index = 0;
   142     slave->coupler_subindex = 0xFFFF;
   141     slave->coupler_subindex = 0xFFFF;
   143 
   142 
   144     slave->base_type = 0;
   143     slave->base_type = 0;
   241         list_del(&sdo->list);
   240         list_del(&sdo->list);
   242         kobject_del(&sdo->kobj);
   241         kobject_del(&sdo->kobj);
   243         kobject_put(&sdo->kobj);
   242         kobject_put(&sdo->kobj);
   244     }
   243     }
   245 
   244 
   246     // free SDO kobject
   245     // free SDO kobject FIXME
   247     if (slave->sdo_dictionary_fetched) kobject_del(&slave->sdo_kobj);
   246     if (slave->sdo_dictionary_fetched) kobject_del(&slave->sdo_kobj);
   248     kobject_put(&slave->sdo_kobj);
   247     kobject_put(&slave->sdo_kobj);
   249 
   248 
   250     // free all SDO configurations
   249     // free all SDO configurations
   251     list_for_each_entry_safe(sdodata, next_sdodata, &slave->sdo_confs, list) {
   250     list_for_each_entry_safe(sdodata, next_sdodata, &slave->sdo_confs, list) {
   256 
   255 
   257     if (slave->eeprom_data) kfree(slave->eeprom_data);
   256     if (slave->eeprom_data) kfree(slave->eeprom_data);
   258     if (slave->new_eeprom_data) kfree(slave->new_eeprom_data);
   257     if (slave->new_eeprom_data) kfree(slave->new_eeprom_data);
   259 
   258 
   260     kfree(slave);
   259     kfree(slave);
       
   260 }
       
   261 
       
   262 /*****************************************************************************/
       
   263 
       
   264 /**
       
   265    Reset slave from operation mode.
       
   266 */
       
   267 
       
   268 void ec_slave_reset(ec_slave_t *slave /**< EtherCAT slave */)
       
   269 {
       
   270     slave->fmmu_count = 0;
       
   271 }
       
   272 
       
   273 /*****************************************************************************/
       
   274 
       
   275 /**
       
   276  */
       
   277 
       
   278 void ec_slave_request_state(ec_slave_t *slave, /**< ETherCAT slave */
       
   279                             ec_slave_state_t state /**< new state */
       
   280                             )
       
   281 {
       
   282     slave->requested_state = state;
       
   283     slave->error_flag = 0;
   261 }
   284 }
   262 
   285 
   263 /*****************************************************************************/
   286 /*****************************************************************************/
   264 
   287 
   265 /**
   288 /**
   512     fmmu->domain = domain;
   535     fmmu->domain = domain;
   513     fmmu->sync = sync;
   536     fmmu->sync = sync;
   514     fmmu->logical_start_address = 0;
   537     fmmu->logical_start_address = 0;
   515 
   538 
   516     slave->fmmu_count++;
   539     slave->fmmu_count++;
   517     slave->registered = 1;
       
   518 
   540 
   519     return 0;
   541     return 0;
   520 }
   542 }
   521 
   543 
   522 /*****************************************************************************/
   544 /*****************************************************************************/
   808     ec_slave_t *slave = container_of(kobj, ec_slave_t, kobj);
   830     ec_slave_t *slave = container_of(kobj, ec_slave_t, kobj);
   809 
   831 
   810     if (attr == &attr_state) {
   832     if (attr == &attr_state) {
   811         char state[EC_STATE_STRING_SIZE];
   833         char state[EC_STATE_STRING_SIZE];
   812         if (!strcmp(buffer, "INIT\n"))
   834         if (!strcmp(buffer, "INIT\n"))
   813             slave->requested_state = EC_SLAVE_STATE_INIT;
   835             ec_slave_request_state(slave, EC_SLAVE_STATE_INIT);
   814         else if (!strcmp(buffer, "PREOP\n"))
   836         else if (!strcmp(buffer, "PREOP\n"))
   815             slave->requested_state = EC_SLAVE_STATE_PREOP;
   837             ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP);
   816         else if (!strcmp(buffer, "SAVEOP\n"))
   838         else if (!strcmp(buffer, "SAVEOP\n"))
   817             slave->requested_state = EC_SLAVE_STATE_SAVEOP;
   839             ec_slave_request_state(slave, EC_SLAVE_STATE_SAVEOP);
   818         else if (!strcmp(buffer, "OP\n"))
   840         else if (!strcmp(buffer, "OP\n"))
   819             slave->requested_state = EC_SLAVE_STATE_OP;
   841             ec_slave_request_state(slave, EC_SLAVE_STATE_OP);
   820         else {
   842         else {
   821             EC_ERR("Invalid slave state \"%s\"!\n", buffer);
   843             EC_ERR("Invalid slave state \"%s\"!\n", buffer);
   822             return -EINVAL;
   844             return -EINVAL;
   823         }
   845         }
   824 
   846 
   825         ec_state_string(slave->requested_state, state);
   847         ec_state_string(slave->requested_state, state);
   826         EC_INFO("Accepted new state %s for slave %i.\n",
   848         EC_INFO("Accepted new state %s for slave %i.\n",
   827                 state, slave->ring_position);
   849                 state, slave->ring_position);
   828         slave->error_flag = 0;
       
   829         return size;
   850         return size;
   830     }
   851     }
   831     else if (attr == &attr_eeprom) {
   852     else if (attr == &attr_eeprom) {
   832         if (!ec_slave_write_eeprom(slave, buffer, size))
   853         if (!ec_slave_write_eeprom(slave, buffer, size))
   833             return size;
   854             return size;