master/fsm_foe.c
changeset 1465 3099d78343ea
parent 1446 85ea5af50175
child 1543 373cd456dc26
equal deleted inserted replaced
1464:be932bb417b8 1465:3099d78343ea
    44 
    44 
    45 /** Maximum time in ms to wait for responses when reading out the dictionary.
    45 /** Maximum time in ms to wait for responses when reading out the dictionary.
    46  */
    46  */
    47 #define EC_FSM_FOE_TIMEOUT 3000
    47 #define EC_FSM_FOE_TIMEOUT 3000
    48 
    48 
       
    49 /** Mailbox type FoE.
       
    50  */
    49 #define EC_MBOX_TYPE_FILEACCESS 0x04
    51 #define EC_MBOX_TYPE_FILEACCESS 0x04
    50 
    52 
       
    53 /** Size of the FoE header.
       
    54  */
    51 #define EC_FOE_HEADER_SIZE 6
    55 #define EC_FOE_HEADER_SIZE 6
    52 // uint8_t  OpCode
    56 // uint8_t  OpCode
    53 // uint8_t  reserved
    57 // uint8_t  reserved
    54 // uint32_t PacketNo, Password, ErrorCode
    58 // uint32_t PacketNo, Password, ErrorCode
    55 
    59 
   150     return fsm->state == ec_fsm_foe_end;
   154     return fsm->state == ec_fsm_foe_end;
   151 }
   155 }
   152 
   156 
   153 /*****************************************************************************/
   157 /*****************************************************************************/
   154 
   158 
       
   159 /** Prepares an FoE transfer.
       
   160  */
   155 void ec_fsm_foe_transfer(
   161 void ec_fsm_foe_transfer(
   156         ec_fsm_foe_t *fsm, /**< State machine. */
   162         ec_fsm_foe_t *fsm, /**< State machine. */
   157         ec_slave_t *slave, /**< EtherCAT slave. */
   163         ec_slave_t *slave, /**< EtherCAT slave. */
   158         ec_foe_request_t *request /**< Sdo request. */
   164         ec_foe_request_t *request /**< Sdo request. */
   159         )
   165         )
   261     return 0;
   267     return 0;
   262 }
   268 }
   263 
   269 
   264 /*****************************************************************************/
   270 /*****************************************************************************/
   265 
   271 
   266 void ec_fsm_foe_write(ec_fsm_foe_t *fsm /**< finite state machine */)
   272 /** Start a write operation.
       
   273  */
       
   274 void ec_fsm_foe_write(
       
   275         ec_fsm_foe_t *fsm /**< FoE statemachine. */
       
   276         )
   267 {
   277 {
   268     fsm->tx_buffer = fsm->request->buffer;
   278     fsm->tx_buffer = fsm->request->buffer;
   269     fsm->tx_buffer_size = fsm->request->data_size;
   279     fsm->tx_buffer_size = fsm->request->data_size;
   270     fsm->tx_buffer_offset = 0;
   280     fsm->tx_buffer_offset = 0;
   271 
   281 
   274 
   284 
   275     fsm->state = ec_fsm_foe_write_start;
   285     fsm->state = ec_fsm_foe_write_start;
   276 }
   286 }
   277 
   287 
   278 /*****************************************************************************/
   288 /*****************************************************************************/
   279 /**
   289 
   280    Initializes the SII write state machine.
   290 /** Initializes the FoE write state machine.
   281 */
   291  */
   282 
       
   283 void ec_fsm_foe_write_start(ec_fsm_foe_t *fsm /**< finite state machine */)
   292 void ec_fsm_foe_write_start(ec_fsm_foe_t *fsm /**< finite state machine */)
   284 {
   293 {
   285     ec_slave_t *slave = fsm->slave;
   294     ec_slave_t *slave = fsm->slave;
   286 
   295 
   287     fsm->tx_buffer_offset = 0;
   296     fsm->tx_buffer_offset = 0;
   307     fsm->state = ec_fsm_foe_state_wrq_sent;
   316     fsm->state = ec_fsm_foe_state_wrq_sent;
   308 }
   317 }
   309 
   318 
   310 /*****************************************************************************/
   319 /*****************************************************************************/
   311 
   320 
   312 void ec_fsm_foe_state_ack_check(ec_fsm_foe_t *fsm)
   321 /** Check for acknowledge.
       
   322  */
       
   323 void ec_fsm_foe_state_ack_check(
       
   324         ec_fsm_foe_t *fsm /**< FoE statemachine. */
       
   325         )
   313 {
   326 {
   314     ec_datagram_t *datagram = fsm->datagram;
   327     ec_datagram_t *datagram = fsm->datagram;
   315     ec_slave_t *slave = fsm->slave;
   328     ec_slave_t *slave = fsm->slave;
   316 
   329 
   317 #ifdef DEBUG_FOE
   330 #ifdef DEBUG_FOE
   357     fsm->state = ec_fsm_foe_state_ack_read;
   370     fsm->state = ec_fsm_foe_state_ack_read;
   358 }
   371 }
   359 
   372 
   360 /*****************************************************************************/
   373 /*****************************************************************************/
   361 
   374 
   362 void ec_fsm_foe_state_ack_read(ec_fsm_foe_t *fsm)
   375 /** Acknowledge a read operation.
   363 {
   376  */
   364 
   377 void ec_fsm_foe_state_ack_read(
       
   378         ec_fsm_foe_t *fsm /**< FoE statemachine. */
       
   379         )
       
   380 {
   365     ec_datagram_t *datagram = fsm->datagram;
   381     ec_datagram_t *datagram = fsm->datagram;
   366     ec_slave_t *slave = fsm->slave;
   382     ec_slave_t *slave = fsm->slave;
   367     uint8_t *data, mbox_prot;
   383     uint8_t *data, mbox_prot;
   368     uint8_t opCode;
   384     uint8_t opCode;
   369     size_t rec_size;
   385     size_t rec_size;
   431     }
   447     }
   432     ec_foe_set_tx_error(fsm, FOE_ACK_ERROR);
   448     ec_foe_set_tx_error(fsm, FOE_ACK_ERROR);
   433 }
   449 }
   434 
   450 
   435 /*****************************************************************************/
   451 /*****************************************************************************/
   436 /**
   452 
   437    State: WRQ SENT.
   453 /** State: WRQ SENT.
   438    Checks is the previous transmit datagram succeded and sends the next
   454  *
   439    fragment, if necessary.
   455  * Checks is the previous transmit datagram succeded and sends the next
   440 */
   456  * fragment, if necessary.
   441 
   457  */
   442 void ec_fsm_foe_state_wrq_sent(ec_fsm_foe_t *fsm)
   458 void ec_fsm_foe_state_wrq_sent(
       
   459         ec_fsm_foe_t *fsm /**< FoE statemachine. */
       
   460         )
   443 {
   461 {
   444     ec_datagram_t *datagram = fsm->datagram;
   462     ec_datagram_t *datagram = fsm->datagram;
   445     ec_slave_t *slave = fsm->slave;
   463     ec_slave_t *slave = fsm->slave;
   446 
   464 
   447 #ifdef DEBUG_FOE
   465 #ifdef DEBUG_FOE
   472     fsm->retries = EC_FSM_RETRIES;
   490     fsm->retries = EC_FSM_RETRIES;
   473     fsm->state = ec_fsm_foe_state_ack_check;
   491     fsm->state = ec_fsm_foe_state_ack_check;
   474 }
   492 }
   475 
   493 
   476 /*****************************************************************************/
   494 /*****************************************************************************/
   477 /**
   495 
   478    State: WRQ SENT.
   496 /** State: WRQ SENT.
   479    Checks is the previous transmit datagram succeded and sends the next
   497  *
   480    fragment, if necessary.
   498  * Checks is the previous transmit datagram succeded and sends the next
   481 */
   499  * fragment, if necessary.
   482 
   500  */
   483 void ec_fsm_foe_state_data_sent(ec_fsm_foe_t *fsm)
   501 void ec_fsm_foe_state_data_sent(
       
   502         ec_fsm_foe_t *fsm /**< Foe statemachine. */
       
   503         )
   484 {
   504 {
   485     ec_datagram_t *datagram = fsm->datagram;
   505     ec_datagram_t *datagram = fsm->datagram;
   486     ec_slave_t *slave = fsm->slave;
   506     ec_slave_t *slave = fsm->slave;
   487 
   507 
   488 #ifdef DEBUG_FOE
   508 #ifdef DEBUG_FOE
   541 }
   561 }
   542 
   562 
   543 
   563 
   544 /*****************************************************************************/
   564 /*****************************************************************************/
   545 
   565 
   546 int ec_foe_prepare_send_ack(ec_fsm_foe_t *foe)
   566 /** Prepare to send an acknowledge.
       
   567  */
       
   568 int ec_foe_prepare_send_ack(
       
   569         ec_fsm_foe_t *foe /**< FoE statemachine. */
       
   570         )
   547 {
   571 {
   548     uint8_t *data;
   572     uint8_t *data;
   549 
   573 
   550     data = ec_slave_mbox_prepare_send(foe->slave, foe->datagram,
   574     data = ec_slave_mbox_prepare_send(foe->slave, foe->datagram,
   551             EC_MBOX_TYPE_FILEACCESS, EC_FOE_HEADER_SIZE);
   575             EC_MBOX_TYPE_FILEACCESS, EC_FOE_HEADER_SIZE);
   557 
   581 
   558     return 0;
   582     return 0;
   559 }
   583 }
   560 
   584 
   561 /*****************************************************************************/
   585 /*****************************************************************************/
   562 /**
   586 
   563    State: RRQ SENT.
   587 /** State: RRQ SENT.
   564    Checks is the previous transmit datagram succeded and sends the next
   588  *
   565    fragment, if necessary.
   589  * Checks is the previous transmit datagram succeded and sends the next
   566 */
   590  * fragment, if necessary.
   567 
   591  */
   568 void ec_fsm_foe_state_rrq_sent( ec_fsm_foe_t *fsm ) {
   592 void ec_fsm_foe_state_rrq_sent(
       
   593         ec_fsm_foe_t *fsm /**< FoE statemachine. */
       
   594         )
       
   595 {
   569     ec_datagram_t *datagram = fsm->datagram;
   596     ec_datagram_t *datagram = fsm->datagram;
   570     ec_slave_t *slave = fsm->slave;
   597     ec_slave_t *slave = fsm->slave;
   571 
   598 
   572 #ifdef DEBUG_FOE
   599 #ifdef DEBUG_FOE
   573     printk("ec_foe_state_rrq_sent()\n");
   600     printk("ec_foe_state_rrq_sent()\n");
   598     fsm->state = ec_fsm_foe_state_data_check;
   625     fsm->state = ec_fsm_foe_state_data_check;
   599 }
   626 }
   600 
   627 
   601 /*****************************************************************************/
   628 /*****************************************************************************/
   602 
   629 
   603 void ec_fsm_foe_read(ec_fsm_foe_t *fsm /**< finite state machine */)
   630 /** Start a read operation.
       
   631  */
       
   632 void ec_fsm_foe_read(
       
   633         ec_fsm_foe_t *fsm /**< FoE state machine. */
       
   634         )
   604 {
   635 {
   605     fsm->state = ec_fsm_foe_read_start;
   636     fsm->state = ec_fsm_foe_read_start;
   606     fsm->rx_filename = fsm->request->file_name;
   637     fsm->rx_filename = fsm->request->file_name;
   607     fsm->rx_filename_len = strlen(fsm->rx_filename);
   638     fsm->rx_filename_len = strlen(fsm->rx_filename);
   608 
   639 
   610     fsm->rx_buffer_size = fsm->request->buffer_size;
   641     fsm->rx_buffer_size = fsm->request->buffer_size;
   611 }
   642 }
   612 
   643 
   613 /*****************************************************************************/
   644 /*****************************************************************************/
   614 
   645 
   615 void ec_fsm_foe_read_start(ec_fsm_foe_t *fsm /**< finite state machine */)
   646 /** Starting state for read operations.
       
   647  */
       
   648 void ec_fsm_foe_read_start(
       
   649         ec_fsm_foe_t *fsm /**< FoE statemachine. */
       
   650         )
   616 {
   651 {
   617     size_t current_size;
   652     size_t current_size;
   618     ec_slave_t *slave = fsm->slave;
   653     ec_slave_t *slave = fsm->slave;
   619 
   654 
   620     fsm->rx_buffer_offset = 0;
   655     fsm->rx_buffer_offset = 0;
   643     fsm->state = ec_fsm_foe_state_rrq_sent;
   678     fsm->state = ec_fsm_foe_state_rrq_sent;
   644 }
   679 }
   645 
   680 
   646 /*****************************************************************************/
   681 /*****************************************************************************/
   647 
   682 
   648 void ec_fsm_foe_state_data_check ( ec_fsm_foe_t *fsm ) {
   683 /** Check for data.
       
   684  */
       
   685 void ec_fsm_foe_state_data_check(
       
   686         ec_fsm_foe_t *fsm /**< FoE statemachine. */
       
   687         )
       
   688 {
   649     ec_datagram_t *datagram = fsm->datagram;
   689     ec_datagram_t *datagram = fsm->datagram;
   650     ec_slave_t *slave = fsm->slave;
   690     ec_slave_t *slave = fsm->slave;
   651 
   691 
   652 #ifdef DEBUG_FOE
   692 #ifdef DEBUG_FOE
   653     printk("ec_fsm_foe_state_data_check()\n");
   693     printk("ec_fsm_foe_state_data_check()\n");
   692 
   732 
   693 }
   733 }
   694 
   734 
   695 /*****************************************************************************/
   735 /*****************************************************************************/
   696 
   736 
   697 void ec_fsm_foe_state_data_read(ec_fsm_foe_t *fsm)
   737 /** Start reading data.
       
   738  */
       
   739 void ec_fsm_foe_state_data_read(
       
   740         ec_fsm_foe_t *fsm /**< FoE statemachine. */
       
   741         )
   698 {
   742 {
   699     size_t rec_size;
   743     size_t rec_size;
   700     uint8_t *data, opCode, packet_no, mbox_prot;
   744     uint8_t *data, opCode, packet_no, mbox_prot;
   701 
   745 
   702     ec_datagram_t *datagram = fsm->datagram;
   746     ec_datagram_t *datagram = fsm->datagram;
   813     }
   857     }
   814 }
   858 }
   815 
   859 
   816 /*****************************************************************************/
   860 /*****************************************************************************/
   817 
   861 
   818 void ec_fsm_foe_state_sent_ack( ec_fsm_foe_t *fsm ) {
   862 /** Sent an acknowledge.
   819 
   863  */
       
   864 void ec_fsm_foe_state_sent_ack(
       
   865         ec_fsm_foe_t *fsm /**< FoE statemachine. */
       
   866         )
       
   867 {
   820     ec_datagram_t *datagram = fsm->datagram;
   868     ec_datagram_t *datagram = fsm->datagram;
   821     ec_slave_t *slave = fsm->slave;
   869     ec_slave_t *slave = fsm->slave;
   822 
   870 
   823 #ifdef DEBUG_FOE
   871 #ifdef DEBUG_FOE
   824     printk("ec_foe_state_sent_ack()\n");
   872     printk("ec_foe_state_sent_ack()\n");
   857     }
   905     }
   858 }
   906 }
   859 
   907 
   860 /*****************************************************************************/
   908 /*****************************************************************************/
   861 
   909 
   862 void ec_foe_set_tx_error(ec_fsm_foe_t *fsm, uint32_t errorcode)
   910 /** Set an error code and go to the send error state.
       
   911  */
       
   912 void ec_foe_set_tx_error(
       
   913         ec_fsm_foe_t *fsm, /**< FoE statemachine. */
       
   914         uint32_t errorcode /**< FoE error code. */
       
   915         )
   863 {
   916 {
   864     fsm->tx_errors++;
   917     fsm->tx_errors++;
   865     fsm->request->result = errorcode;
   918     fsm->request->result = errorcode;
   866     fsm->state = ec_fsm_foe_error;
   919     fsm->state = ec_fsm_foe_error;
   867 }
   920 }
   868 
   921 
   869 /*****************************************************************************/
   922 /*****************************************************************************/
   870 
   923 
   871 void ec_foe_set_rx_error(ec_fsm_foe_t *fsm, uint32_t errorcode)
   924 /** Set an error code and go to the receive error state.
       
   925  */
       
   926 void ec_foe_set_rx_error(
       
   927         ec_fsm_foe_t *fsm, /**< FoE statemachine. */
       
   928         uint32_t errorcode /**< FoE error code. */
       
   929         )
   872 {
   930 {
   873     fsm->rx_errors++;
   931     fsm->rx_errors++;
   874     fsm->request->result = errorcode;
   932     fsm->request->result = errorcode;
   875     fsm->state = ec_fsm_foe_error;
   933     fsm->state = ec_fsm_foe_error;
   876 }
   934 }