CDC/ECM driver for mbed, based on USBDevice by mbed-official. Uses PicoTCP to access Ethernet USB device. License: GPLv2

Dependents:   USBEthernet_TEST

Fork of USB_Ethernet by Daniele Lacamera

Committer:
daniele
Date:
Sat Aug 03 13:16:14 2013 +0000
Revision:
2:540f6e142d59
Moved to single package

Who changed what in which revision?

UserRevisionLine numberNew 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 Do not redistribute without a written permission by the Copyright
daniele 2:540f6e142d59 5 holders.
daniele 2:540f6e142d59 6
daniele 2:540f6e142d59 7 Authors: Toon Peters, Maxime Vincent
daniele 2:540f6e142d59 8 *********************************************************************/
daniele 2:540f6e142d59 9 #include "mbed.h"
daniele 2:540f6e142d59 10 extern "C" {
daniele 2:540f6e142d59 11 #include "pico_device.h"
daniele 2:540f6e142d59 12 #include "pico_dev_mbed.h"
daniele 2:540f6e142d59 13 #include "pico_stack.h"
daniele 2:540f6e142d59 14 #include "ethernet_api.h"
daniele 2:540f6e142d59 15 }
daniele 2:540f6e142d59 16
daniele 2:540f6e142d59 17 struct pico_device_mbed {
daniele 2:540f6e142d59 18 struct pico_device dev;
daniele 2:540f6e142d59 19 int bytes_left_in_frame;
daniele 2:540f6e142d59 20 };
daniele 2:540f6e142d59 21
daniele 2:540f6e142d59 22 #define ETH_MTU 1514
daniele 2:540f6e142d59 23 uint8_t buf[ETH_MTU];
daniele 2:540f6e142d59 24
daniele 2:540f6e142d59 25 Serial pc(p9, p10, "Serial port"); // tx, rx
daniele 2:540f6e142d59 26
daniele 2:540f6e142d59 27 extern "C" {
daniele 2:540f6e142d59 28
daniele 2:540f6e142d59 29 static int pico_mbed_send(struct pico_device *dev, void *buf, int len)
daniele 2:540f6e142d59 30 {
daniele 2:540f6e142d59 31 int ret, sent;
daniele 2:540f6e142d59 32 struct pico_device_mbed *mb = (struct pico_device_mbed *) dev;
daniele 2:540f6e142d59 33
daniele 2:540f6e142d59 34 if (len > ETH_MTU)
daniele 2:540f6e142d59 35 return -1;
daniele 2:540f6e142d59 36
daniele 2:540f6e142d59 37 /* Write buf content to dev and return amount written */
daniele 2:540f6e142d59 38 ret = ethernet_write((const char *)buf, len);
daniele 2:540f6e142d59 39 sent = ethernet_send();
daniele 2:540f6e142d59 40
daniele 2:540f6e142d59 41 pc.printf("ETH> sent %d bytes\r\n",ret);
daniele 2:540f6e142d59 42 if (len != ret || sent != ret)
daniele 2:540f6e142d59 43 return -1;
daniele 2:540f6e142d59 44 else
daniele 2:540f6e142d59 45 return ret;
daniele 2:540f6e142d59 46 }
daniele 2:540f6e142d59 47
daniele 2:540f6e142d59 48 static int pico_mbed_poll(struct pico_device *dev, int loop_score)
daniele 2:540f6e142d59 49 {
daniele 2:540f6e142d59 50 int len;
daniele 2:540f6e142d59 51 struct pico_device_mbed *mb = (struct pico_device_mbed *) dev;
daniele 2:540f6e142d59 52
daniele 2:540f6e142d59 53 while(loop_score > 0)
daniele 2:540f6e142d59 54 {
daniele 2:540f6e142d59 55 /* check for new frame(s) */
daniele 2:540f6e142d59 56 len = (int) ethernet_receive();
daniele 2:540f6e142d59 57
daniele 2:540f6e142d59 58 /* return if no frame has arrived */
daniele 2:540f6e142d59 59 if (!len)
daniele 2:540f6e142d59 60 return loop_score;
daniele 2:540f6e142d59 61
daniele 2:540f6e142d59 62 /* read and process frame */
daniele 2:540f6e142d59 63 len = ethernet_read((char*)buf, ETH_MTU);
daniele 2:540f6e142d59 64 pc.printf("ETH> recv %d bytes: %x:%x\r\n", len, buf[0],buf[1]);
daniele 2:540f6e142d59 65 pico_stack_recv(dev, buf, len);
daniele 2:540f6e142d59 66 loop_score--;
daniele 2:540f6e142d59 67 }
daniele 2:540f6e142d59 68 return loop_score;
daniele 2:540f6e142d59 69 }
daniele 2:540f6e142d59 70
daniele 2:540f6e142d59 71 /* Public interface: create/destroy. */
daniele 2:540f6e142d59 72 void pico_mbed_destroy(struct pico_device *dev)
daniele 2:540f6e142d59 73 {
daniele 2:540f6e142d59 74 ethernet_free();
daniele 2:540f6e142d59 75 pico_device_destroy(dev);
daniele 2:540f6e142d59 76 }
daniele 2:540f6e142d59 77
daniele 2:540f6e142d59 78 struct pico_device *pico_mbed_create(char *name)
daniele 2:540f6e142d59 79 {
daniele 2:540f6e142d59 80 std::uint8_t mac[PICO_SIZE_ETH];
daniele 2:540f6e142d59 81 struct pico_device_mbed *mb = (struct pico_device_mbed*) pico_zalloc(sizeof(struct pico_device_mbed));
daniele 2:540f6e142d59 82
daniele 2:540f6e142d59 83 if (!mb)
daniele 2:540f6e142d59 84 return NULL;
daniele 2:540f6e142d59 85
daniele 2:540f6e142d59 86 ethernet_address((char *)mac);
daniele 2:540f6e142d59 87 pc.printf("ETH> Set MAC address to: %x:%x:%x:%x:%x:%x\r\n", mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
daniele 2:540f6e142d59 88
daniele 2:540f6e142d59 89 if(0 != pico_device_init((struct pico_device *)mb, name, mac)) {
daniele 2:540f6e142d59 90 pc.printf ("ETH> Loop init failed.\n");
daniele 2:540f6e142d59 91 //pico_loop_destroy(mb);
daniele 2:540f6e142d59 92 return NULL;
daniele 2:540f6e142d59 93 }
daniele 2:540f6e142d59 94
daniele 2:540f6e142d59 95 mb->dev.send = pico_mbed_send;
daniele 2:540f6e142d59 96 mb->dev.poll = pico_mbed_poll;
daniele 2:540f6e142d59 97 mb->dev.destroy = pico_mbed_destroy;
daniele 2:540f6e142d59 98 mb->bytes_left_in_frame = 0;
daniele 2:540f6e142d59 99
daniele 2:540f6e142d59 100 if(0 != ethernet_init()) {
daniele 2:540f6e142d59 101 pc.printf("ETH> Failed to initialize hardware.\r\n");
daniele 2:540f6e142d59 102 pico_device_destroy((struct pico_device *)mb);
daniele 2:540f6e142d59 103 return NULL;
daniele 2:540f6e142d59 104 }
daniele 2:540f6e142d59 105
daniele 2:540f6e142d59 106 // future work: make the mac address configurable
daniele 2:540f6e142d59 107
daniele 2:540f6e142d59 108 pc.printf("ETH> Device %s created.\r\n", mb->dev.name);
daniele 2:540f6e142d59 109
daniele 2:540f6e142d59 110 return (struct pico_device *)mb;
daniele 2:540f6e142d59 111 }
daniele 2:540f6e142d59 112
daniele 2:540f6e142d59 113 void pico_mbed_get_address(char *mac)
daniele 2:540f6e142d59 114 {
daniele 2:540f6e142d59 115 ethernet_address(mac);
daniele 2:540f6e142d59 116 }
daniele 2:540f6e142d59 117
daniele 2:540f6e142d59 118 }