| 266 | } |
| 267 | |
| 268 | rt_ssize_t rt_link_dev_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) |
| 269 | { |
| 270 | RT_ASSERT(dev != RT_NULL); |
| 271 | RT_ASSERT(buffer != RT_NULL); |
| 272 | RT_ASSERT(size != 0); |
| 273 | |
| 274 | struct rt_link_device *rtlink = (struct rt_link_device *)dev; |
| 275 | struct rtlink_recv_list *node; |
| 276 | rt_size_t read_len = 0; |
| 277 | rt_size_t unread_len = 0; |
| 278 | |
| 279 | if (dev->rx_indicate == RT_NULL) |
| 280 | { |
| 281 | /* RT_LINK_RX_BLOCKING, wait service receive data event */ |
| 282 | rt_link_event_recv(&rtlink->service); |
| 283 | } |
| 284 | |
| 285 | if (rt_slist_first(&rtlink->recv_head) != RT_NULL) |
| 286 | { |
| 287 | node = rt_container_of(rt_slist_next(&rtlink->recv_head), struct rtlink_recv_list, list); |
| 288 | unread_len = (node->size) - (node->index); |
| 289 | read_len = (size > unread_len) ? unread_len : size; |
| 290 | rt_memcpy(buffer, (rt_uint8_t *)node->data + node->index, read_len); |
| 291 | node->index += read_len; |
| 292 | |
| 293 | if (node->index >= node->size) |
| 294 | { |
| 295 | rt_slist_remove(&rtlink->recv_head, &node->list); |
| 296 | node->index = 0; |
| 297 | rt_free(node->data); |
| 298 | rt_free(node); |
| 299 | } |
| 300 | if (rt_slist_first(&rtlink->recv_head) != RT_NULL) |
| 301 | { |
| 302 | rt_link_event_send(&rtlink->service); |
| 303 | } |
| 304 | } |
| 305 | return read_len; |
| 306 | } |
| 307 | |
| 308 | rt_ssize_t rt_link_dev_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size) |
| 309 | { |
nothing calls this directly
no test coverage detected