CDC/ECM driver for mbed, based on USBDevice by mbed-official. Uses PicoTCP to access Ethernet USB device. License: GPLv2
Fork of USB_Ethernet by
modules/pico_dev_loop.c@2:540f6e142d59, 2013-08-03 (annotated)
- Committer:
- daniele
- Date:
- Sat Aug 03 13:16:14 2013 +0000
- Revision:
- 2:540f6e142d59
Moved to single package
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
daniele | 2:540f6e142d59 | 1 | /********************************************************************* |
daniele | 2:540f6e142d59 | 2 | PicoTCP. Copyright (c) 2012 TASS Belgium NV. Some rights reserved. |
daniele | 2:540f6e142d59 | 3 | See LICENSE and COPYING for usage. |
daniele | 2:540f6e142d59 | 4 | |
daniele | 2:540f6e142d59 | 5 | Authors: Daniele Lacamera |
daniele | 2:540f6e142d59 | 6 | *********************************************************************/ |
daniele | 2:540f6e142d59 | 7 | |
daniele | 2:540f6e142d59 | 8 | |
daniele | 2:540f6e142d59 | 9 | #include "pico_device.h" |
daniele | 2:540f6e142d59 | 10 | #include "pico_dev_loop.h" |
daniele | 2:540f6e142d59 | 11 | #include "pico_stack.h" |
daniele | 2:540f6e142d59 | 12 | |
daniele | 2:540f6e142d59 | 13 | |
daniele | 2:540f6e142d59 | 14 | #define LOOP_MTU 1500 |
daniele | 2:540f6e142d59 | 15 | static uint8_t l_buf[LOOP_MTU]; |
daniele | 2:540f6e142d59 | 16 | static int l_bufsize = 0; |
daniele | 2:540f6e142d59 | 17 | |
daniele | 2:540f6e142d59 | 18 | |
daniele | 2:540f6e142d59 | 19 | static int pico_loop_send(struct pico_device *dev, void *buf, int len) |
daniele | 2:540f6e142d59 | 20 | { |
daniele | 2:540f6e142d59 | 21 | if (len > LOOP_MTU) |
daniele | 2:540f6e142d59 | 22 | return 0; |
daniele | 2:540f6e142d59 | 23 | |
daniele | 2:540f6e142d59 | 24 | if (l_bufsize == 0) { |
daniele | 2:540f6e142d59 | 25 | memcpy(l_buf, buf, len); |
daniele | 2:540f6e142d59 | 26 | l_bufsize+=len; |
daniele | 2:540f6e142d59 | 27 | return len; |
daniele | 2:540f6e142d59 | 28 | } |
daniele | 2:540f6e142d59 | 29 | return 0; |
daniele | 2:540f6e142d59 | 30 | } |
daniele | 2:540f6e142d59 | 31 | |
daniele | 2:540f6e142d59 | 32 | static int pico_loop_poll(struct pico_device *dev, int loop_score) |
daniele | 2:540f6e142d59 | 33 | { |
daniele | 2:540f6e142d59 | 34 | if (loop_score <= 0) |
daniele | 2:540f6e142d59 | 35 | return 0; |
daniele | 2:540f6e142d59 | 36 | |
daniele | 2:540f6e142d59 | 37 | if (l_bufsize > 0) { |
daniele | 2:540f6e142d59 | 38 | pico_stack_recv(dev, l_buf, l_bufsize); |
daniele | 2:540f6e142d59 | 39 | l_bufsize = 0; |
daniele | 2:540f6e142d59 | 40 | loop_score--; |
daniele | 2:540f6e142d59 | 41 | } |
daniele | 2:540f6e142d59 | 42 | return loop_score; |
daniele | 2:540f6e142d59 | 43 | } |
daniele | 2:540f6e142d59 | 44 | |
daniele | 2:540f6e142d59 | 45 | /* Public interface: create/destroy. */ |
daniele | 2:540f6e142d59 | 46 | |
daniele | 2:540f6e142d59 | 47 | void pico_loop_destroy(struct pico_device *dev) |
daniele | 2:540f6e142d59 | 48 | { |
daniele | 2:540f6e142d59 | 49 | } |
daniele | 2:540f6e142d59 | 50 | |
daniele | 2:540f6e142d59 | 51 | struct pico_device *pico_loop_create(void) |
daniele | 2:540f6e142d59 | 52 | { |
daniele | 2:540f6e142d59 | 53 | struct pico_device *loop = pico_zalloc(sizeof(struct pico_device)); |
daniele | 2:540f6e142d59 | 54 | if (!loop) |
daniele | 2:540f6e142d59 | 55 | return NULL; |
daniele | 2:540f6e142d59 | 56 | |
daniele | 2:540f6e142d59 | 57 | if( 0 != pico_device_init((struct pico_device *)loop, "loop", NULL)) { |
daniele | 2:540f6e142d59 | 58 | dbg ("Loop init failed.\n"); |
daniele | 2:540f6e142d59 | 59 | pico_loop_destroy((struct pico_device *)loop); |
daniele | 2:540f6e142d59 | 60 | return NULL; |
daniele | 2:540f6e142d59 | 61 | } |
daniele | 2:540f6e142d59 | 62 | loop->send = pico_loop_send; |
daniele | 2:540f6e142d59 | 63 | loop->poll = pico_loop_poll; |
daniele | 2:540f6e142d59 | 64 | loop->destroy = pico_loop_destroy; |
daniele | 2:540f6e142d59 | 65 | dbg("Device %s created.\n", loop->name); |
daniele | 2:540f6e142d59 | 66 | return (struct pico_device *)loop; |
daniele | 2:540f6e142d59 | 67 | } |
daniele | 2:540f6e142d59 | 68 |