master/fsm_pdo_assign.c
changeset 1173 2ec9651a6c89
parent 1082 ff06c58e269c
equal deleted inserted replaced
1172:74ee632c3b5e 1173:2ec9651a6c89
   169     for (; fsm->sync_index < EC_MAX_SYNC_MANAGERS; fsm->sync_index++) {
   169     for (; fsm->sync_index < EC_MAX_SYNC_MANAGERS; fsm->sync_index++) {
   170         fsm->pdos = &fsm->slave->config->sync_configs[fsm->sync_index].pdos;
   170         fsm->pdos = &fsm->slave->config->sync_configs[fsm->sync_index].pdos;
   171         
   171         
   172         if (!(fsm->sync = ec_slave_get_sync(fsm->slave, fsm->sync_index))) {
   172         if (!(fsm->sync = ec_slave_get_sync(fsm->slave, fsm->sync_index))) {
   173             if (!list_empty(&fsm->pdos->list)) {
   173             if (!list_empty(&fsm->pdos->list)) {
   174                 EC_ERR("Slave %u does not provide a configuration for sync "
   174                 EC_WARN("Slave %u does not provide a configuration "
   175                         "manager %u!\n", fsm->slave->ring_position,
   175                         "for SM%u!\n", fsm->slave->ring_position,
   176                         fsm->sync_index);
   176                         fsm->sync_index);
   177                 fsm->state = ec_fsm_pdo_assign_state_error;
   177                 fsm->state = ec_fsm_pdo_assign_state_error;
   178                 return;
   178                 return;
   179             }
   179             }
   180             continue;
   180             continue;
   183         // check if assignment has to be altered
   183         // check if assignment has to be altered
   184         if (ec_pdo_list_equal(&fsm->sync->pdos, fsm->pdos))
   184         if (ec_pdo_list_equal(&fsm->sync->pdos, fsm->pdos))
   185             continue;
   185             continue;
   186 
   186 
   187         if (fsm->slave->master->debug_level) {
   187         if (fsm->slave->master->debug_level) {
   188             EC_DBG("Pdo assignment of SM%u differs in slave %u:\n",
   188             EC_DBG("Pdo assignment of SM%u differs:\n", fsm->sync_index);
   189                     fsm->sync_index, fsm->slave->ring_position);
       
   190             EC_DBG("Currently assigned Pdos: ");
   189             EC_DBG("Currently assigned Pdos: ");
   191             ec_pdo_list_print(&fsm->sync->pdos);
   190             ec_pdo_list_print(&fsm->sync->pdos);
   192             printk("\n");
   191             printk("\n");
   193             EC_DBG("Pdos to assign: ");
   192             EC_DBG("Pdos to assign: ");
   194             ec_pdo_list_print(fsm->pdos);
   193             ec_pdo_list_print(fsm->pdos);
   197 
   196 
   198         // Pdo assignment has to be changed. Does the slave support this?
   197         // Pdo assignment has to be changed. Does the slave support this?
   199         if (!(fsm->slave->sii.mailbox_protocols & EC_MBOX_COE)
   198         if (!(fsm->slave->sii.mailbox_protocols & EC_MBOX_COE)
   200                 || (fsm->slave->sii.has_general
   199                 || (fsm->slave->sii.has_general
   201                     && !fsm->slave->sii.coe_details.enable_pdo_assign)) {
   200                     && !fsm->slave->sii.coe_details.enable_pdo_assign)) {
   202             EC_ERR("Slave %u does not support assigning Pdos!\n",
   201             EC_WARN("Slave %u does not support assigning Pdos!\n",
   203                     fsm->slave->ring_position);
   202                     fsm->slave->ring_position);
   204             fsm->state = ec_fsm_pdo_assign_state_error;
   203             fsm->state = ec_fsm_pdo_assign_state_error;
   205             return;
   204             return;
   206         }
   205         }
   207 
   206 
   208         fsm->num_configured_syncs++;
   207         fsm->num_configured_syncs++;
   209 
       
   210         if (fsm->slave->master->debug_level) {
       
   211             EC_DBG("Changing Pdo assignment for SM%u of slave %u.\n",
       
   212                     fsm->sync_index, fsm->slave->ring_position);
       
   213         }
       
   214 
   208 
   215         if (ec_sdo_request_alloc(&fsm->request, 2)) {
   209         if (ec_sdo_request_alloc(&fsm->request, 2)) {
   216             fsm->state = ec_fsm_pdo_assign_state_error;
   210             fsm->state = ec_fsm_pdo_assign_state_error;
   217             return;
   211             return;
   218         }
   212         }
   220         // set mapped Pdo count to zero
   214         // set mapped Pdo count to zero
   221         EC_WRITE_U8(fsm->request.data, 0); // zero Pdos mapped
   215         EC_WRITE_U8(fsm->request.data, 0); // zero Pdos mapped
   222         fsm->request.data_size = 1;
   216         fsm->request.data_size = 1;
   223         ec_sdo_request_address(&fsm->request, 0x1C10 + fsm->sync_index, 0);
   217         ec_sdo_request_address(&fsm->request, 0x1C10 + fsm->sync_index, 0);
   224         ecrt_sdo_request_write(&fsm->request);
   218         ecrt_sdo_request_write(&fsm->request);
       
   219 
   225         if (fsm->slave->master->debug_level)
   220         if (fsm->slave->master->debug_level)
   226             EC_DBG("Setting Pdo count to zero for SM%u.\n", fsm->sync_index);
   221             EC_DBG("Setting Pdo count to zero.\n");
   227 
   222 
   228         fsm->state = ec_fsm_pdo_assign_state_zero_count;
   223         fsm->state = ec_fsm_pdo_assign_state_zero_count;
   229         ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request);
   224         ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request);
   230         ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately
   225         ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately
   231         return;
   226         return;
   232     }
   227     }
   233 
   228 
   234     if (fsm->slave->master->debug_level && !fsm->num_configured_syncs)
   229     if (fsm->slave->master->debug_level && !fsm->num_configured_syncs)
   235         EC_DBG("Pdo assignments of slave %u are already configured"
   230         EC_DBG("Pdo assignments are already configured correctly.\n");
   236                 " correctly.\n", fsm->slave->ring_position);
       
   237     fsm->state = ec_fsm_pdo_assign_state_end;
   231     fsm->state = ec_fsm_pdo_assign_state_end;
   238 }
   232 }
   239 
   233 
   240 /*****************************************************************************/
   234 /*****************************************************************************/
   241 
   235 
   263     EC_WRITE_U16(fsm->request.data, fsm->pdo->index);
   257     EC_WRITE_U16(fsm->request.data, fsm->pdo->index);
   264     fsm->request.data_size = 2;
   258     fsm->request.data_size = 2;
   265     ec_sdo_request_address(&fsm->request,
   259     ec_sdo_request_address(&fsm->request,
   266             0x1C10 + fsm->sync_index, fsm->pdo_count);
   260             0x1C10 + fsm->sync_index, fsm->pdo_count);
   267     ecrt_sdo_request_write(&fsm->request);
   261     ecrt_sdo_request_write(&fsm->request);
       
   262 
   268     if (fsm->slave->master->debug_level)
   263     if (fsm->slave->master->debug_level)
   269         EC_DBG("Assigning Pdo 0x%04X at position %u.\n",
   264         EC_DBG("Assigning Pdo 0x%04X at position %u.\n",
   270                 fsm->pdo->index, fsm->pdo_count);
   265                 fsm->pdo->index, fsm->pdo_count);
   271     
   266     
   272     fsm->state = ec_fsm_pdo_assign_state_add_pdo;
   267     fsm->state = ec_fsm_pdo_assign_state_add_pdo;
   283         )
   278         )
   284 {
   279 {
   285     if (ec_fsm_coe_exec(fsm->fsm_coe)) return;
   280     if (ec_fsm_coe_exec(fsm->fsm_coe)) return;
   286 
   281 
   287     if (!ec_fsm_coe_success(fsm->fsm_coe)) {
   282     if (!ec_fsm_coe_success(fsm->fsm_coe)) {
   288         EC_ERR("Failed to clear Pdo assignment of slave %u.\n",
   283         EC_WARN("Failed to clear Pdo assignment of SM%u.\n", fsm->sync_index);
   289                 fsm->slave->ring_position);
       
   290         fsm->state = ec_fsm_pdo_assign_state_error;
   284         fsm->state = ec_fsm_pdo_assign_state_error;
   291         return;
   285         return;
   292     }
   286     }
   293 
   287 
   294     // assign all Pdos belonging to the current sync manager
   288     // assign all Pdos belonging to the current sync manager
   295     
   289     
   296     // find first Pdo
   290     // find first Pdo
   297     if (!(fsm->pdo = ec_fsm_pdo_assign_next_pdo(fsm, &fsm->pdos->list))) {
   291     if (!(fsm->pdo = ec_fsm_pdo_assign_next_pdo(fsm, &fsm->pdos->list))) {
   298         if (fsm->slave->master->debug_level)
   292         if (fsm->slave->master->debug_level)
   299             EC_DBG("No Pdos to assign for SM%u of slave %u.\n",
   293             EC_DBG("No Pdos to assign.\n");
   300                     fsm->sync_index, fsm->slave->ring_position);
       
   301         ec_fsm_pdo_assign_next_sync(fsm);
   294         ec_fsm_pdo_assign_next_sync(fsm);
   302         return;
   295         return;
   303     }
   296     }
   304 
   297 
   305     // assign first Pdo
   298     // assign first Pdo
   316         )
   309         )
   317 {
   310 {
   318     if (ec_fsm_coe_exec(fsm->fsm_coe)) return;
   311     if (ec_fsm_coe_exec(fsm->fsm_coe)) return;
   319 
   312 
   320     if (!ec_fsm_coe_success(fsm->fsm_coe)) {
   313     if (!ec_fsm_coe_success(fsm->fsm_coe)) {
   321         EC_ERR("Failed to map Pdo 0x%04X for SM%u of slave %u.\n",
   314         EC_WARN("Failed to assign Pdo 0x%04X to position %u in SM%u.\n",
   322                 fsm->pdo->index, fsm->sync_index, fsm->slave->ring_position);
   315                 fsm->pdo->index, fsm->pdo_count, fsm->sync_index);
   323         fsm->state = ec_fsm_pdo_assign_state_error;
   316         fsm->state = ec_fsm_pdo_assign_state_error;
   324         return;
   317         return;
   325     }
   318     }
   326 
   319 
   327     // find next Pdo
   320     // find next Pdo
   329         // no more Pdos to map. write Pdo count
   322         // no more Pdos to map. write Pdo count
   330         EC_WRITE_U8(fsm->request.data, fsm->pdo_count);
   323         EC_WRITE_U8(fsm->request.data, fsm->pdo_count);
   331         fsm->request.data_size = 1;
   324         fsm->request.data_size = 1;
   332         ec_sdo_request_address(&fsm->request, 0x1C10 + fsm->sync_index, 0);
   325         ec_sdo_request_address(&fsm->request, 0x1C10 + fsm->sync_index, 0);
   333         ecrt_sdo_request_write(&fsm->request);
   326         ecrt_sdo_request_write(&fsm->request);
       
   327 
   334         if (fsm->slave->master->debug_level)
   328         if (fsm->slave->master->debug_level)
   335             EC_DBG("Setting number of assigned Pdos to %u.\n",
   329             EC_DBG("Setting number of assigned Pdos to %u.\n",
   336                     fsm->pdo_count);
   330                     fsm->pdo_count);
   337         
   331         
   338         fsm->state = ec_fsm_pdo_assign_state_pdo_count;
   332         fsm->state = ec_fsm_pdo_assign_state_pdo_count;
   355         )
   349         )
   356 {
   350 {
   357     if (ec_fsm_coe_exec(fsm->fsm_coe)) return;
   351     if (ec_fsm_coe_exec(fsm->fsm_coe)) return;
   358 
   352 
   359     if (!ec_fsm_coe_success(fsm->fsm_coe)) {
   353     if (!ec_fsm_coe_success(fsm->fsm_coe)) {
   360         EC_ERR("Failed to set number of assigned Pdos for slave %u.\n",
   354         EC_WARN("Failed to set number of assigned Pdos for SM%u.\n",
   361                 fsm->slave->ring_position);
   355                 fsm->sync_index);
   362         fsm->state = ec_fsm_pdo_assign_state_error;
   356         fsm->state = ec_fsm_pdo_assign_state_error;
   363         return;
   357         return;
   364     }
   358     }
   365 
   359 
   366     if (fsm->slave->master->debug_level)
   360     if (fsm->slave->master->debug_level)
   367         EC_DBG("Successfully configured Pdo assignment for SM%u of"
   361         EC_DBG("Pdo assignment successful for SM%u.\n", fsm->sync_index);
   368                 " slave %u.\n", fsm->sync_index, fsm->slave->ring_position);
       
   369 
   362 
   370     // assignment for this sync manager finished
   363     // assignment for this sync manager finished
   371     ec_fsm_pdo_assign_next_sync(fsm);
   364     ec_fsm_pdo_assign_next_sync(fsm);
   372 }
   365 }
   373 
   366