251 wurde. Wenn ja, wird diesem mit Hilfe eines Spin-Locks |
251 wurde. Wenn ja, wird diesem mit Hilfe eines Spin-Locks |
252 in den angegebenen Speicherbereich kopiert. |
252 in den angegebenen Speicherbereich kopiert. |
253 |
253 |
254 @param ecd EtherCAT-Gerät |
254 @param ecd EtherCAT-Gerät |
255 @param data Zeiger auf den Speicherbereich, in den die |
255 @param data Zeiger auf den Speicherbereich, in den die |
256 empfangenen Daten kopiert werden sollen |
256 empfangenen Daten kopiert werden sollen |
257 @param size Größe des angegebenen Speicherbereichs |
|
258 |
257 |
259 @return Anzahl der kopierten Bytes bei Erfolg, sonst < 0 |
258 @return Anzahl der kopierten Bytes bei Erfolg, sonst < 0 |
260 */ |
259 */ |
261 |
260 |
262 int EtherCAT_device_receive(EtherCAT_device_t *ecd, |
261 int EtherCAT_device_receive(EtherCAT_device_t *ecd, |
263 unsigned char *data, |
262 unsigned char *data) |
264 unsigned int size) |
263 { |
265 { |
|
266 int cnt; |
|
267 |
|
268 if (ecd->state != ECAT_DS_RECEIVED) |
264 if (ecd->state != ECAT_DS_RECEIVED) |
269 { |
265 { |
270 EC_DBG(KERN_ERR "EtherCAT: receive - Nothing received!\n"); |
266 EC_DBG(KERN_ERR "EtherCAT: receive - Nothing received!\n"); |
271 return -1; |
267 return -1; |
272 } |
268 } |
273 |
269 |
274 cnt = min(ecd->rx_data_length, size); |
270 if (ecd->rx_data_length > ECAT_FRAME_BUFFER_SIZE) |
275 memcpy(data,ecd->rx_data, cnt); |
271 { |
276 |
272 EC_DBG(KERN_ERR "EtherCAT: receive - Reveived frame too long (%i Bytes)!\n", |
277 return cnt; |
273 ecd->rx_data_length); |
|
274 return -1; |
|
275 } |
|
276 |
|
277 memcpy(data, ecd->rx_data, ecd->rx_data_length); |
|
278 |
|
279 return ecd->rx_data_length; |
278 } |
280 } |
279 |
281 |
280 /***************************************************************/ |
282 /***************************************************************/ |
281 |
283 |
282 /** |
284 /** |