master/fsm_master.c
branchstable-1.3
changeset 1746 72e7507b3f1b
parent 1745 07fd94c5119d
equal deleted inserted replaced
1745:07fd94c5119d 1746:72e7507b3f1b
    58 void ec_fsm_master_state_configure_slave(ec_fsm_master_t *);
    58 void ec_fsm_master_state_configure_slave(ec_fsm_master_t *);
    59 void ec_fsm_master_state_clear_addresses(ec_fsm_master_t *);
    59 void ec_fsm_master_state_clear_addresses(ec_fsm_master_t *);
    60 void ec_fsm_master_state_scan_slaves(ec_fsm_master_t *);
    60 void ec_fsm_master_state_scan_slaves(ec_fsm_master_t *);
    61 void ec_fsm_master_state_write_eeprom(ec_fsm_master_t *);
    61 void ec_fsm_master_state_write_eeprom(ec_fsm_master_t *);
    62 void ec_fsm_master_state_sdodict(ec_fsm_master_t *);
    62 void ec_fsm_master_state_sdodict(ec_fsm_master_t *);
       
    63 void ec_fsm_master_state_pdomap(ec_fsm_master_t *);
    63 void ec_fsm_master_state_sdo_request(ec_fsm_master_t *);
    64 void ec_fsm_master_state_sdo_request(ec_fsm_master_t *);
    64 void ec_fsm_master_state_end(ec_fsm_master_t *);
    65 void ec_fsm_master_state_end(ec_fsm_master_t *);
    65 void ec_fsm_master_state_error(ec_fsm_master_t *);
    66 void ec_fsm_master_state_error(ec_fsm_master_t *);
    66 
    67 
    67 /*****************************************************************************/
    68 /*****************************************************************************/
    88     // init sub-state-machines
    89     // init sub-state-machines
    89     ec_fsm_slave_init(&fsm->fsm_slave, fsm->datagram);
    90     ec_fsm_slave_init(&fsm->fsm_slave, fsm->datagram);
    90     ec_fsm_sii_init(&fsm->fsm_sii, fsm->datagram);
    91     ec_fsm_sii_init(&fsm->fsm_sii, fsm->datagram);
    91     ec_fsm_change_init(&fsm->fsm_change, fsm->datagram);
    92     ec_fsm_change_init(&fsm->fsm_change, fsm->datagram);
    92     ec_fsm_coe_init(&fsm->fsm_coe, fsm->datagram);
    93     ec_fsm_coe_init(&fsm->fsm_coe, fsm->datagram);
       
    94     ec_fsm_coe_map_init(&fsm->fsm_coe_map, &fsm->fsm_coe);
    93 }
    95 }
    94 
    96 
    95 /*****************************************************************************/
    97 /*****************************************************************************/
    96 
    98 
    97 /**
    99 /**
   103     // clear sub-state machines
   105     // clear sub-state machines
   104     ec_fsm_slave_clear(&fsm->fsm_slave);
   106     ec_fsm_slave_clear(&fsm->fsm_slave);
   105     ec_fsm_sii_clear(&fsm->fsm_sii);
   107     ec_fsm_sii_clear(&fsm->fsm_sii);
   106     ec_fsm_change_clear(&fsm->fsm_change);
   108     ec_fsm_change_clear(&fsm->fsm_change);
   107     ec_fsm_coe_clear(&fsm->fsm_coe);
   109     ec_fsm_coe_clear(&fsm->fsm_coe);
       
   110     ec_fsm_coe_map_clear(&fsm->fsm_coe_map);
   108 }
   111 }
   109 
   112 
   110 /*****************************************************************************/
   113 /*****************************************************************************/
   111 
   114 
   112 /**
   115 /**
   327         list_del_init(&request->list); // dequeue
   330         list_del_init(&request->list); // dequeue
   328         request->state = EC_REQUEST_IN_PROGRESS;
   331         request->state = EC_REQUEST_IN_PROGRESS;
   329         up(&master->eeprom_sem);
   332         up(&master->eeprom_sem);
   330 
   333 
   331         slave = request->slave;
   334         slave = request->slave;
   332         if (slave->online_state == EC_SLAVE_OFFLINE || slave->error_flag) {
   335         if (slave->online_state == EC_SLAVE_OFFLINE) {
   333             EC_ERR("Discarding EEPROM data, slave %i not ready.\n",
   336             EC_ERR("Discarding EEPROM data, slave %i offline.\n",
   334                     slave->ring_position);
   337                     slave->ring_position);
   335             request->state = EC_REQUEST_FAILURE;
   338             request->state = EC_REQUEST_FAILURE;
   336             wake_up(&master->eeprom_queue);
   339             wake_up(&master->eeprom_queue);
   337             continue;
   340             continue;
   338         }
   341         }
   341         if (master->debug_level)
   344         if (master->debug_level)
   342             EC_DBG("Writing EEPROM data to slave %i...\n",
   345             EC_DBG("Writing EEPROM data to slave %i...\n",
   343                     slave->ring_position);
   346                     slave->ring_position);
   344         fsm->eeprom_request = request;
   347         fsm->eeprom_request = request;
   345         fsm->eeprom_index = 0;
   348         fsm->eeprom_index = 0;
   346         ec_fsm_sii_write(&fsm->fsm_sii, request->slave, request->offset,
   349         ec_fsm_sii_write(&fsm->fsm_sii, request->slave, request->word_offset,
   347                 request->words, EC_FSM_SII_NODE);
   350                 request->data, EC_FSM_SII_NODE);
   348         fsm->state = ec_fsm_master_state_write_eeprom;
   351         fsm->state = ec_fsm_master_state_write_eeprom;
   349         fsm->state(fsm); // execute immediately
   352         fsm->state(fsm); // execute immediately
   350         return 1;
   353         return 1;
   351     }
   354     }
   352 
   355 
   380             list_entry(master->sdo_requests.next, ec_sdo_request_t, list);
   383             list_entry(master->sdo_requests.next, ec_sdo_request_t, list);
   381         list_del_init(&request->list); // dequeue
   384         list_del_init(&request->list); // dequeue
   382         request->state = EC_REQUEST_IN_PROGRESS;
   385         request->state = EC_REQUEST_IN_PROGRESS;
   383         up(&master->sdo_sem);
   386         up(&master->sdo_sem);
   384 
   387 
   385         slave = request->sdo->slave;
   388         slave = request->entry->sdo->slave;
   386         if (slave->current_state == EC_SLAVE_STATE_INIT ||
   389         if (slave->current_state == EC_SLAVE_STATE_INIT ||
   387                 slave->online_state == EC_SLAVE_OFFLINE ||
   390                 slave->online_state == EC_SLAVE_OFFLINE ||
   388                 slave->error_flag) {
   391                 slave->error_flag) {
   389             EC_ERR("Discarding SDO request, slave %i not ready.\n",
   392             EC_ERR("Discarding SDO request, slave %i not ready.\n",
   390                     slave->ring_position);
   393                     slave->ring_position);
   412 }
   415 }
   413 
   416 
   414 /*****************************************************************************/
   417 /*****************************************************************************/
   415 
   418 
   416 /**
   419 /**
       
   420  * Check for slaves that are not configured and configure them.
   417  */
   421  */
   418 
   422 
   419 int ec_fsm_master_action_configure(
   423 int ec_fsm_master_action_configure(
   420         ec_fsm_master_t *fsm /**< master state machine */
   424         ec_fsm_master_t *fsm /**< master state machine */
   421         )
   425         )
   519             ec_fsm_coe_dictionary(&fsm->fsm_coe, slave);
   523             ec_fsm_coe_dictionary(&fsm->fsm_coe, slave);
   520             ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately
   524             ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately
   521             return;
   525             return;
   522         }
   526         }
   523 
   527 
       
   528         // check, if slaves have their PDO mapping to be read.
       
   529         list_for_each_entry(slave, &master->slaves, list) {
       
   530             if (!(slave->sii_mailbox_protocols & EC_MBOX_COE)
       
   531                 || slave->pdo_mapping_fetched
       
   532                 || !slave->sdo_dictionary_fetched
       
   533                 || slave->current_state == EC_SLAVE_STATE_INIT
       
   534                 || slave->online_state == EC_SLAVE_OFFLINE) continue;
       
   535 
       
   536             if (master->debug_level) {
       
   537                 EC_DBG("Fetching PDO mapping from slave %i via CoE.\n",
       
   538                        slave->ring_position);
       
   539             }
       
   540 
       
   541             slave->pdo_mapping_fetched = 1;
       
   542 
       
   543             // start fetching PDO mapping
       
   544             fsm->idle = 0;
       
   545             fsm->state = ec_fsm_master_state_pdomap;
       
   546             ec_fsm_coe_map_start(&fsm->fsm_coe_map, slave);
       
   547             ec_fsm_coe_map_exec(&fsm->fsm_coe_map); // execute immediately
       
   548             return;
       
   549         }
       
   550 
   524         // check for pending EEPROM write operations.
   551         // check for pending EEPROM write operations.
   525         if (ec_fsm_master_action_process_eeprom(fsm))
   552         if (ec_fsm_master_action_process_eeprom(fsm))
   526             return; // EEPROM write request found
   553             return; // EEPROM write request found
   527     }
   554     }
   528 
   555 
   943         fsm->state = ec_fsm_master_state_error;
   970         fsm->state = ec_fsm_master_state_error;
   944         return;
   971         return;
   945     }
   972     }
   946 
   973 
   947     fsm->eeprom_index++;
   974     fsm->eeprom_index++;
   948     if (fsm->eeprom_index < request->size) {
   975     if (fsm->eeprom_index < request->word_size) {
   949         ec_fsm_sii_write(&fsm->fsm_sii, slave,
   976         ec_fsm_sii_write(&fsm->fsm_sii, slave,
   950                 request->offset + fsm->eeprom_index,
   977                 request->word_offset + fsm->eeprom_index,
   951                 request->words + fsm->eeprom_index,
   978                 request->data + fsm->eeprom_index * 2,
   952                 EC_FSM_SII_NODE);
   979                 EC_FSM_SII_NODE);
   953         ec_fsm_sii_exec(&fsm->fsm_sii); // execute immediately
   980         ec_fsm_sii_exec(&fsm->fsm_sii); // execute immediately
   954         return;
   981         return;
   955     }
   982     }
   956 
   983 
   957     // finished writing EEPROM
   984     // finished writing EEPROM
   958     if (master->debug_level)
   985     if (master->debug_level)
   959         EC_DBG("Finished writing EEPROM data to slave %i.\n",
   986         EC_DBG("Finished writing %u words of EEPROM data to slave %u.\n",
   960                 slave->ring_position);
   987                 request->word_size, slave->ring_position);
   961     request->state = EC_REQUEST_COMPLETE;
   988     request->state = EC_REQUEST_COMPLETE;
   962     wake_up(&master->eeprom_queue);
   989     wake_up(&master->eeprom_queue);
   963 
   990 
   964     // TODO: Evaluate new EEPROM contents!
   991     // TODO: Evaluate new EEPROM contents!
   965 
   992 
  1001 }
  1028 }
  1002 
  1029 
  1003 /*****************************************************************************/
  1030 /*****************************************************************************/
  1004 
  1031 
  1005 /**
  1032 /**
       
  1033  * Scan the PDO mapping of a slave.
       
  1034  */
       
  1035 
       
  1036 void ec_fsm_master_state_pdomap(
       
  1037         ec_fsm_master_t *fsm /**< master state machine */
       
  1038         )
       
  1039 {
       
  1040     if (ec_fsm_coe_map_exec(&fsm->fsm_coe_map)) return;
       
  1041 
       
  1042     if (!ec_fsm_coe_map_success(&fsm->fsm_coe_map)) {
       
  1043         fsm->state = ec_fsm_master_state_error;
       
  1044         return;
       
  1045     }
       
  1046 
       
  1047     // fetching of PDO mapping finished
       
  1048     fsm->state = ec_fsm_master_state_end;
       
  1049 }
       
  1050 
       
  1051 /*****************************************************************************/
       
  1052 
       
  1053 /**
  1006    Master state: SDO REQUEST.
  1054    Master state: SDO REQUEST.
  1007 */
  1055 */
  1008 
  1056 
  1009 void ec_fsm_master_state_sdo_request(ec_fsm_master_t *fsm /**< master state machine */)
  1057 void ec_fsm_master_state_sdo_request(ec_fsm_master_t *fsm /**< master state machine */)
  1010 {
  1058 {