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 /*****************************************************************************/ |