Free (GPLv2) TCP/IP stack developed by TASS Belgium
Fork of PicoTCP by
modules/pico_dev_mbed_usb.cpp@51:18637a3d071f, 2013-08-03 (annotated)
- Committer:
- daniele
- Date:
- Sat Aug 03 08:50:27 2013 +0000
- Revision:
- 51:18637a3d071f
- Parent:
- 50:c3b337c38feb
Branch for CDC-ECM: Work in progress
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
daniele | 50:c3b337c38feb | 1 | /********************************************************************* |
daniele | 50:c3b337c38feb | 2 | PicoTCP. Copyright (c) 2012 TASS Belgium NV. Some rights reserved. |
daniele | 50:c3b337c38feb | 3 | See LICENSE and COPYING for usage. |
daniele | 50:c3b337c38feb | 4 | Do not redistribute without a written permission by the Copyright |
daniele | 50:c3b337c38feb | 5 | holders. |
daniele | 50:c3b337c38feb | 6 | |
daniele | 50:c3b337c38feb | 7 | Authors: Daniele Lacamera, Julien Duraj |
daniele | 50:c3b337c38feb | 8 | *********************************************************************/ |
daniele | 50:c3b337c38feb | 9 | #include "mbed.h" |
daniele | 50:c3b337c38feb | 10 | #include "USBCDC_ECM.h" |
daniele | 50:c3b337c38feb | 11 | #include "ethernet_api.h" |
daniele | 50:c3b337c38feb | 12 | #include "pico_dev_mbed_usb.h" |
daniele | 50:c3b337c38feb | 13 | |
daniele | 50:c3b337c38feb | 14 | extern "C" { |
daniele | 50:c3b337c38feb | 15 | #include "pico_device.h" |
daniele | 50:c3b337c38feb | 16 | #include "pico_stack.h" |
daniele | 50:c3b337c38feb | 17 | } |
daniele | 50:c3b337c38feb | 18 | |
daniele | 50:c3b337c38feb | 19 | struct pico_device_mbed_usb { |
daniele | 50:c3b337c38feb | 20 | struct pico_device dev; |
daniele | 50:c3b337c38feb | 21 | int bytes_left_in_frame; |
daniele | 50:c3b337c38feb | 22 | USBCDC_ECM *ecm; |
daniele | 50:c3b337c38feb | 23 | }; |
daniele | 50:c3b337c38feb | 24 | |
daniele | 50:c3b337c38feb | 25 | #define ETH_MTU 1514 |
daniele | 50:c3b337c38feb | 26 | static uint8_t buf[ETH_MTU]; |
daniele | 50:c3b337c38feb | 27 | |
daniele | 50:c3b337c38feb | 28 | Serial __pc(p9, p10, "Serial port"); // tx, rx |
daniele | 50:c3b337c38feb | 29 | |
daniele | 50:c3b337c38feb | 30 | extern "C" { |
daniele | 50:c3b337c38feb | 31 | |
daniele | 50:c3b337c38feb | 32 | static int pico_mbed_usb_send(struct pico_device *dev, void *buffer, int len) |
daniele | 50:c3b337c38feb | 33 | { |
daniele | 50:c3b337c38feb | 34 | int ret, sent; |
daniele | 50:c3b337c38feb | 35 | struct pico_device_mbed_usb *mb = (struct pico_device_mbed_usb *) dev; |
daniele | 50:c3b337c38feb | 36 | |
daniele | 50:c3b337c38feb | 37 | if (len > ETH_MTU) |
daniele | 50:c3b337c38feb | 38 | return -1; |
daniele | 50:c3b337c38feb | 39 | ret = mb->ecm->send((uint8_t *)buffer, len); |
daniele | 50:c3b337c38feb | 40 | |
daniele | 50:c3b337c38feb | 41 | if (!ret) |
daniele | 50:c3b337c38feb | 42 | return -1; |
daniele | 50:c3b337c38feb | 43 | return len; |
daniele | 50:c3b337c38feb | 44 | } |
daniele | 50:c3b337c38feb | 45 | |
daniele | 50:c3b337c38feb | 46 | static int pico_mbed_usb_poll(struct pico_device *dev, int loop_score) |
daniele | 50:c3b337c38feb | 47 | { |
daniele | 50:c3b337c38feb | 48 | int size; |
daniele | 50:c3b337c38feb | 49 | struct pico_device_mbed_usb *mb = (struct pico_device_mbed_usb *) dev; |
daniele | 50:c3b337c38feb | 50 | |
daniele | 50:c3b337c38feb | 51 | while(loop_score > 0) |
daniele | 50:c3b337c38feb | 52 | { |
daniele | 50:c3b337c38feb | 53 | bool ret; |
daniele | 50:c3b337c38feb | 54 | /* check for new frame(s) */ |
daniele | 50:c3b337c38feb | 55 | ret = mb->ecm->readEP_NB(buf, (uint32_t *)&size); |
daniele | 50:c3b337c38feb | 56 | |
daniele | 50:c3b337c38feb | 57 | /* return if no frame has arrived */ |
daniele | 50:c3b337c38feb | 58 | if (!ret) |
daniele | 50:c3b337c38feb | 59 | return loop_score; |
daniele | 50:c3b337c38feb | 60 | |
daniele | 50:c3b337c38feb | 61 | /* read and process frame */ |
daniele | 50:c3b337c38feb | 62 | printf("ETH> recv %d bytes: %x:%x\r\n", size, buf[0],buf[1]); |
daniele | 50:c3b337c38feb | 63 | pico_stack_recv(dev, buf, size); |
daniele | 50:c3b337c38feb | 64 | loop_score--; |
daniele | 50:c3b337c38feb | 65 | } |
daniele | 50:c3b337c38feb | 66 | return loop_score; |
daniele | 50:c3b337c38feb | 67 | } |
daniele | 50:c3b337c38feb | 68 | |
daniele | 50:c3b337c38feb | 69 | /* Public interface: create/destroy. */ |
daniele | 50:c3b337c38feb | 70 | void pico_mbed_usb_destroy(struct pico_device *dev) |
daniele | 50:c3b337c38feb | 71 | { |
daniele | 50:c3b337c38feb | 72 | pico_device_destroy(dev); |
daniele | 50:c3b337c38feb | 73 | } |
daniele | 50:c3b337c38feb | 74 | |
daniele | 50:c3b337c38feb | 75 | struct pico_device *pico_mbed_usb_create(char *name, USBCDC_ECM *ecm) |
daniele | 50:c3b337c38feb | 76 | { |
daniele | 50:c3b337c38feb | 77 | std::uint8_t mac[PICO_SIZE_ETH]; |
daniele | 50:c3b337c38feb | 78 | struct pico_device_mbed_usb *mb = (struct pico_device_mbed_usb*) pico_zalloc(sizeof(struct pico_device_mbed_usb)); |
daniele | 50:c3b337c38feb | 79 | |
daniele | 50:c3b337c38feb | 80 | if (!mb) |
daniele | 50:c3b337c38feb | 81 | return NULL; |
daniele | 50:c3b337c38feb | 82 | |
daniele | 50:c3b337c38feb | 83 | if(0 != pico_device_init((struct pico_device *)mb, name, mac)) { |
daniele | 50:c3b337c38feb | 84 | __pc.printf ("ETH> Loop init failed.\n"); |
daniele | 50:c3b337c38feb | 85 | //pico_loop_destroy(mb); |
daniele | 50:c3b337c38feb | 86 | return NULL; |
daniele | 50:c3b337c38feb | 87 | } |
daniele | 50:c3b337c38feb | 88 | mb->ecm = ecm; |
daniele | 50:c3b337c38feb | 89 | mb->dev.send = pico_mbed_usb_send; |
daniele | 50:c3b337c38feb | 90 | mb->dev.poll = pico_mbed_usb_poll; |
daniele | 50:c3b337c38feb | 91 | mb->dev.destroy = pico_mbed_usb_destroy; |
daniele | 50:c3b337c38feb | 92 | mb->bytes_left_in_frame = 0; |
daniele | 50:c3b337c38feb | 93 | |
daniele | 50:c3b337c38feb | 94 | if(0 != ethernet_init()) { |
daniele | 50:c3b337c38feb | 95 | __pc.printf("ETH> Failed to initialize hardware.\r\n"); |
daniele | 50:c3b337c38feb | 96 | pico_device_destroy((struct pico_device *)mb); |
daniele | 50:c3b337c38feb | 97 | return NULL; |
daniele | 50:c3b337c38feb | 98 | } |
daniele | 50:c3b337c38feb | 99 | |
daniele | 50:c3b337c38feb | 100 | __pc.printf("ETH> Device %s created.\r\n", mb->dev.name); |
daniele | 50:c3b337c38feb | 101 | |
daniele | 50:c3b337c38feb | 102 | return (struct pico_device *)mb; |
daniele | 50:c3b337c38feb | 103 | } |
daniele | 50:c3b337c38feb | 104 | |
daniele | 50:c3b337c38feb | 105 | void pico_mbed_usb_get_address(char *mac) |
daniele | 50:c3b337c38feb | 106 | { |
daniele | 50:c3b337c38feb | 107 | /* TODO */ |
daniele | 50:c3b337c38feb | 108 | } |
daniele | 50:c3b337c38feb | 109 | |
daniele | 50:c3b337c38feb | 110 | } |