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