master/voe_handler.c
changeset 1218 6f3a973fc29e
parent 1216 e70c4d71cebd
child 1224 784bb76105cd
equal deleted inserted replaced
1217:e8a9785e63c3 1218:6f3a973fc29e
    46 
    46 
    47 /** VoE mailbox type.
    47 /** VoE mailbox type.
    48  */
    48  */
    49 #define EC_MBOX_TYPE_VOE 0xff
    49 #define EC_MBOX_TYPE_VOE 0xff
    50 
    50 
       
    51 /** VoE header size.
       
    52  */
       
    53 #define EC_VOE_HEADER_SIZE 6
       
    54 
    51 /** VoE response timeout in [ms].
    55 /** VoE response timeout in [ms].
    52  */
    56  */
    53 #define EC_VOE_RESPONSE_TIMEOUT 500
    57 #define EC_VOE_RESPONSE_TIMEOUT 500
    54 
    58 
    55 /*****************************************************************************/
    59 /*****************************************************************************/
    75         ec_slave_config_t *sc, /**< Parent slave configuration. */
    79         ec_slave_config_t *sc, /**< Parent slave configuration. */
    76         size_t size /**< Size of memory to reserve. */
    80         size_t size /**< Size of memory to reserve. */
    77         )
    81         )
    78 {
    82 {
    79     voe->config = sc;
    83     voe->config = sc;
       
    84     voe->vendor_id = 0x00000000;
       
    85     voe->vendor_type = 0x0000;
    80     voe->data_size = 0;
    86     voe->data_size = 0;
    81     voe->dir = EC_DIR_INVALID;
    87     voe->dir = EC_DIR_INVALID;
    82     voe->state = ec_voe_handler_state_error;
    88     voe->state = ec_voe_handler_state_error;
    83     voe->request_state = EC_INT_REQUEST_INIT;
    89     voe->request_state = EC_INT_REQUEST_INIT;
    84 
    90 
    85     ec_datagram_init(&voe->datagram);
    91     ec_datagram_init(&voe->datagram);
    86     if (ec_datagram_prealloc(&voe->datagram, size + 6))
    92     if (ec_datagram_prealloc(&voe->datagram,
       
    93                 size + EC_MBOX_HEADER_SIZE + EC_VOE_HEADER_SIZE))
    87         return -1;
    94         return -1;
    88 
    95 
    89     return 0;
    96     return 0;
    90 }
    97 }
    91 
    98 
   102 
   109 
   103 /*****************************************************************************
   110 /*****************************************************************************
   104  * Application interface.
   111  * Application interface.
   105  ****************************************************************************/
   112  ****************************************************************************/
   106 
   113 
       
   114 void ecrt_voe_handler_header(ec_voe_handler_t *voe, uint32_t vendor_id,
       
   115         uint16_t vendor_type)
       
   116 {
       
   117     voe->vendor_id = vendor_id;
       
   118     voe->vendor_type = vendor_type;
       
   119 }
       
   120 
       
   121 /*****************************************************************************/
       
   122 
   107 uint8_t *ecrt_voe_handler_data(ec_voe_handler_t *voe)
   123 uint8_t *ecrt_voe_handler_data(ec_voe_handler_t *voe)
   108 {
   124 {
   109     return voe->datagram.data + 6;
   125     return voe->datagram.data + EC_MBOX_HEADER_SIZE + EC_VOE_HEADER_SIZE;
   110 }
   126 }
   111 
   127 
   112 /*****************************************************************************/
   128 /*****************************************************************************/
   113 
   129 
   114 size_t ecrt_voe_handler_data_size(const ec_voe_handler_t *voe)
   130 size_t ecrt_voe_handler_data_size(const ec_voe_handler_t *voe)
   128 /*****************************************************************************/
   144 /*****************************************************************************/
   129 
   145 
   130 void ecrt_voe_handler_write(ec_voe_handler_t *voe, size_t size)
   146 void ecrt_voe_handler_write(ec_voe_handler_t *voe, size_t size)
   131 {
   147 {
   132     voe->dir = EC_DIR_OUTPUT;
   148     voe->dir = EC_DIR_OUTPUT;
   133     voe->datagram.data_size = size + 6;
   149     voe->data_size = size;
   134     voe->state = ec_voe_handler_state_write_start;
   150     voe->state = ec_voe_handler_state_write_start;
   135     voe->request_state = EC_INT_REQUEST_QUEUED;
   151     voe->request_state = EC_INT_REQUEST_QUEUED;
   136 }
   152 }
   137 
   153 
   138 /*****************************************************************************/
   154 /*****************************************************************************/
   172         voe->request_state = EC_INT_REQUEST_FAILURE;
   188         voe->request_state = EC_INT_REQUEST_FAILURE;
   173         return;
   189         return;
   174     }
   190     }
   175 	
   191 	
   176     if (!(data = ec_slave_mbox_prepare_send(slave, &voe->datagram,
   192     if (!(data = ec_slave_mbox_prepare_send(slave, &voe->datagram,
   177                     EC_MBOX_TYPE_VOE, voe->data_size))) {
   193                     EC_MBOX_TYPE_VOE, EC_VOE_HEADER_SIZE + voe->data_size))) {
   178         voe->state = ec_voe_handler_state_error;
   194         voe->state = ec_voe_handler_state_error;
   179         voe->request_state = EC_INT_REQUEST_FAILURE;
   195         voe->request_state = EC_INT_REQUEST_FAILURE;
   180         return;
   196         return;
   181     }
   197     }
       
   198 
       
   199     EC_WRITE_U32(data,     voe->vendor_id);
       
   200     EC_WRITE_U16(data + 4, voe->vendor_type);
   182 
   201 
   183     voe->retries = EC_FSM_RETRIES;
   202     voe->retries = EC_FSM_RETRIES;
   184     voe->jiffies_start = jiffies;
   203     voe->jiffies_start = jiffies;
   185     voe->state = ec_voe_handler_state_write_response;
   204     voe->state = ec_voe_handler_state_write_response;
   186 }
   205 }
   351         EC_WARN("Received mailbox protocol 0x%02X as response.\n", mbox_prot);
   370         EC_WARN("Received mailbox protocol 0x%02X as response.\n", mbox_prot);
   352         ec_print_data(data, rec_size);
   371         ec_print_data(data, rec_size);
   353         return;
   372         return;
   354     }
   373     }
   355 
   374 
       
   375     if (rec_size < EC_VOE_HEADER_SIZE) {
       
   376         voe->state = ec_voe_handler_state_error;
       
   377         voe->request_state = EC_INT_REQUEST_FAILURE;
       
   378         EC_ERR("Received VoE header is incomplete (%u bytes)!\n", rec_size);
       
   379         return;
       
   380     }
       
   381 
   356     if (master->debug_level) {
   382     if (master->debug_level) {
   357         EC_DBG("VoE data:\n");
   383         EC_DBG("VoE data:\n");
   358         ec_print_data(data, rec_size);
   384         ec_print_data(data, rec_size);
   359     }
   385     }
   360 
   386 
   361     voe->data_size = rec_size;
   387     voe->data_size = rec_size - EC_VOE_HEADER_SIZE;
   362     voe->request_state = EC_INT_REQUEST_SUCCESS;
   388     voe->request_state = EC_INT_REQUEST_SUCCESS;
   363     voe->state = ec_voe_handler_state_end; // success
   389     voe->state = ec_voe_handler_state_end; // success
   364 }
   390 }
   365 
   391 
   366 /*****************************************************************************/
   392 /*****************************************************************************/
   377 
   403 
   378 /*****************************************************************************/
   404 /*****************************************************************************/
   379 
   405 
   380 /** \cond */
   406 /** \cond */
   381 
   407 
       
   408 EXPORT_SYMBOL(ecrt_voe_handler_header);
   382 EXPORT_SYMBOL(ecrt_voe_handler_data);
   409 EXPORT_SYMBOL(ecrt_voe_handler_data);
   383 EXPORT_SYMBOL(ecrt_voe_handler_data_size);
   410 EXPORT_SYMBOL(ecrt_voe_handler_data_size);
   384 EXPORT_SYMBOL(ecrt_voe_handler_read);
   411 EXPORT_SYMBOL(ecrt_voe_handler_read);
   385 EXPORT_SYMBOL(ecrt_voe_handler_write);
   412 EXPORT_SYMBOL(ecrt_voe_handler_write);
   386 EXPORT_SYMBOL(ecrt_voe_handler_execute);
   413 EXPORT_SYMBOL(ecrt_voe_handler_execute);