master/mailbox.c
branchstable-1.1
changeset 1731 60b2aad9d40b
parent 1715 e675450f2174
child 424 b792665b2dba
child 1732 1cc865ba17c2
equal deleted inserted replaced
1730:27a1aee7e254 1731:60b2aad9d40b
   133 }
   133 }
   134 
   134 
   135 /*****************************************************************************/
   135 /*****************************************************************************/
   136 
   136 
   137 /**
   137 /**
       
   138    Mailbox error codes.
       
   139 */
       
   140 
       
   141 const ec_code_msg_t mbox_error_messages[] = {
       
   142     {0x00000001, "MBXERR_SYNTAX"},
       
   143     {0x00000002, "MBXERR_UNSUPPORTEDPROTOCOL"},
       
   144     {0x00000003, "MBXERR_INVAILDCHANNEL"},
       
   145     {0x00000004, "MBXERR_SERVICENOTSUPPORTED"},
       
   146     {0x00000005, "MBXERR_INVALIDHEADER"},
       
   147     {0x00000006, "MBXERR_SIZETOOSHORT"},
       
   148     {0x00000007, "MBXERR_NOMOREMEMORY"},
       
   149     {0x00000008, "MBXERR_INVALIDSIZE"},
       
   150     {}
       
   151 };
       
   152 
       
   153 /*****************************************************************************/
       
   154 
       
   155 /**
   138    Processes received mailbox data.
   156    Processes received mailbox data.
   139    \return pointer to the received data
   157    \return pointer to the received data
   140 */
   158 */
   141 
   159 
   142 uint8_t *ec_slave_mbox_fetch(const ec_slave_t *slave, /**< slave */
   160 uint8_t *ec_slave_mbox_fetch(const ec_slave_t *slave, /**< slave */
   143                              ec_datagram_t *datagram, /**< datagram */
   161                              ec_datagram_t *datagram, /**< datagram */
   144                              uint8_t type, /**< expected mailbox protocol */
   162                              uint8_t *type, /**< expected mailbox protocol */
   145                              size_t *size /**< size of the received data */
   163                              size_t *size /**< size of the received data */
   146                              )
   164                              )
   147 {
   165 {
   148     size_t data_size;
   166     size_t data_size;
   149 
   167 
   150     if ((EC_READ_U8(datagram->data + 5) & 0x0F) != type) {
   168     if ((data_size = EC_READ_U16(datagram->data)) >
   151         EC_ERR("Unexpected mailbox protocol 0x%02X (exp.: 0x%02X) at"
   169         slave->sii_tx_mailbox_size - 6) {
   152                " slave %i!\n", EC_READ_U8(datagram->data + 5), type,
   170         EC_ERR("Corrupt mailbox response detected!\n");
   153                slave->ring_position);
       
   154         return NULL;
   171         return NULL;
   155     }
   172     }
   156 
   173 
   157     if ((data_size = EC_READ_U16(datagram->data)) >
   174     *type = EC_READ_U8(datagram->data + 5) & 0x0F;
   158         slave->sii_tx_mailbox_size - 6) {
   175     *size = data_size;
   159         EC_ERR("Currupt mailbox response detected!\n");
   176 
       
   177     if (*type == 0x00) {
       
   178         const ec_code_msg_t *mbox_msg;
       
   179 	uint16_t code = EC_READ_U16(datagram->data + 8);
       
   180 
       
   181         EC_ERR("Mailbox error response received.\n");
       
   182 	for (mbox_msg = mbox_error_messages; mbox_msg->code; mbox_msg++) {
       
   183             if (mbox_msg->code != code) continue;
       
   184             EC_ERR("Error reply code: 0x%04X: \"%s\".\n",
       
   185                    mbox_msg->code, mbox_msg->message);
       
   186             break;
       
   187         }
       
   188 
       
   189         if (!mbox_msg->code)
       
   190             EC_ERR("Unknown error reply code 0x%04X.\n", code);
       
   191 
   160         return NULL;
   192         return NULL;
   161     }
   193     }
   162 
   194 
   163     *size = data_size;
       
   164     return datagram->data + 6;
   195     return datagram->data + 6;
   165 }
   196 }
   166 
   197 
   167 /*****************************************************************************/
   198 /*****************************************************************************/