First step: AutoIP compiled in and working

Dependencies:   mbed

Committer:
darran
Date:
Fri Jun 18 15:54:21 2010 +0000
Revision:
1:4218cacaf696
Parent:
0:55a05330f8cc

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
darran 0:55a05330f8cc 1
darran 0:55a05330f8cc 2 /*
darran 0:55a05330f8cc 3 Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com)
darran 0:55a05330f8cc 4
darran 0:55a05330f8cc 5 Permission is hereby granted, free of charge, to any person obtaining a copy
darran 0:55a05330f8cc 6 of this software and associated documentation files (the "Software"), to deal
darran 0:55a05330f8cc 7 in the Software without restriction, including without limitation the rights
darran 0:55a05330f8cc 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
darran 0:55a05330f8cc 9 copies of the Software, and to permit persons to whom the Software is
darran 0:55a05330f8cc 10 furnished to do so, subject to the following conditions:
darran 0:55a05330f8cc 11
darran 0:55a05330f8cc 12 The above copyright notice and this permission notice shall be included in
darran 0:55a05330f8cc 13 all copies or substantial portions of the Software.
darran 0:55a05330f8cc 14
darran 0:55a05330f8cc 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
darran 0:55a05330f8cc 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
darran 0:55a05330f8cc 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
darran 0:55a05330f8cc 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
darran 0:55a05330f8cc 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
darran 0:55a05330f8cc 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
darran 0:55a05330f8cc 21 THE SOFTWARE.
darran 0:55a05330f8cc 22 */
darran 0:55a05330f8cc 23
darran 0:55a05330f8cc 24 /*
darran 0:55a05330f8cc 25
darran 0:55a05330f8cc 26 This is a wrapper around Serial if for lwIP (acts as a serial driver)
darran 0:55a05330f8cc 27
darran 0:55a05330f8cc 28 See sio.h for functions to be implemented
darran 0:55a05330f8cc 29
darran 0:55a05330f8cc 30 sio_fd_t is a void* defined type, we use it as a SerialBuf ptr
darran 0:55a05330f8cc 31
darran 0:55a05330f8cc 32
darran 0:55a05330f8cc 33
darran 0:55a05330f8cc 34 */
darran 0:55a05330f8cc 35
darran 0:55a05330f8cc 36
darran 0:55a05330f8cc 37 #include "netCfg.h"
darran 0:55a05330f8cc 38 #if NET_PPP
darran 0:55a05330f8cc 39
darran 0:55a05330f8cc 40
darran 0:55a05330f8cc 41 #define MAX_SERIAL_PORTS 8
darran 0:55a05330f8cc 42
darran 0:55a05330f8cc 43 #include "lwip/sio.h"
darran 0:55a05330f8cc 44 #include "mbed.h"
darran 0:55a05330f8cc 45 #include "sioMgr.h"
darran 0:55a05330f8cc 46
darran 0:55a05330f8cc 47 //extern "C" {
darran 0:55a05330f8cc 48
darran 0:55a05330f8cc 49 /**
darran 0:55a05330f8cc 50 * Opens a serial device for communication.
darran 0:55a05330f8cc 51 *
darran 0:55a05330f8cc 52 * @param devnum device number
darran 0:55a05330f8cc 53 * @return handle to serial device if successful, NULL otherwise
darran 0:55a05330f8cc 54 */
darran 0:55a05330f8cc 55 sio_fd_t sio_open(u8_t devnum)
darran 0:55a05330f8cc 56 {
darran 0:55a05330f8cc 57 SerialBuf* pIf = SioMgr::getIf(devnum);
darran 0:55a05330f8cc 58 if(pIf == NULL)
darran 0:55a05330f8cc 59 return NULL;
darran 0:55a05330f8cc 60
darran 0:55a05330f8cc 61 //Got a SerialBuf* object
darran 0:55a05330f8cc 62 //WARN: It HAS to be initialised (instanciated + attached to a Serial obj)
darran 0:55a05330f8cc 63
darran 0:55a05330f8cc 64 return (sio_fd_t*) pIf;
darran 0:55a05330f8cc 65 }
darran 0:55a05330f8cc 66
darran 0:55a05330f8cc 67 /**
darran 0:55a05330f8cc 68 * Sends a single character to the serial device.
darran 0:55a05330f8cc 69 *
darran 0:55a05330f8cc 70 * @param c character to send
darran 0:55a05330f8cc 71 * @param fd serial device handle
darran 0:55a05330f8cc 72 *
darran 0:55a05330f8cc 73 * @note This function will block until the character can be sent.
darran 0:55a05330f8cc 74 */
darran 0:55a05330f8cc 75 void sio_send(u8_t c, sio_fd_t fd)
darran 0:55a05330f8cc 76 {
darran 0:55a05330f8cc 77 SerialBuf* pIf = (SerialBuf*) fd;
darran 0:55a05330f8cc 78 //while(!pIf->writeable());
darran 0:55a05330f8cc 79 pIf->putc( (char) c );
darran 0:55a05330f8cc 80 }
darran 0:55a05330f8cc 81
darran 0:55a05330f8cc 82 /**
darran 0:55a05330f8cc 83 * Receives a single character from the serial device.
darran 0:55a05330f8cc 84 *
darran 0:55a05330f8cc 85 * @param fd serial device handle
darran 0:55a05330f8cc 86 *
darran 0:55a05330f8cc 87 * @note This function will block until a character is received.
darran 0:55a05330f8cc 88 */
darran 0:55a05330f8cc 89 u8_t sio_recv(sio_fd_t fd)
darran 0:55a05330f8cc 90 {
darran 0:55a05330f8cc 91 SerialBuf* pIf = (SerialBuf*) fd;
darran 0:55a05330f8cc 92 pIf->setReadMode(false);
darran 0:55a05330f8cc 93 while(!pIf->readable());
darran 0:55a05330f8cc 94 return (u8_t) pIf->getc();
darran 0:55a05330f8cc 95 }
darran 0:55a05330f8cc 96
darran 0:55a05330f8cc 97 /**
darran 0:55a05330f8cc 98 * Reads from the serial device.
darran 0:55a05330f8cc 99 *
darran 0:55a05330f8cc 100 * @param fd serial device handle
darran 0:55a05330f8cc 101 * @param data pointer to data buffer for receiving
darran 0:55a05330f8cc 102 * @param len maximum length (in bytes) of data to receive
darran 0:55a05330f8cc 103 * @return number of bytes actually received - may be 0 if aborted by sio_read_abort
darran 0:55a05330f8cc 104 *
darran 0:55a05330f8cc 105 * @note This function will block until data can be received. The blocking
darran 0:55a05330f8cc 106 * can be cancelled by calling sio_read_abort().
darran 0:55a05330f8cc 107 */
darran 0:55a05330f8cc 108 static volatile bool m_abort = false;
darran 0:55a05330f8cc 109 u32_t sio_read(sio_fd_t fd, u8_t *data, u32_t len)
darran 0:55a05330f8cc 110 {
darran 0:55a05330f8cc 111 u32_t recvd = 0; //bytes received
darran 0:55a05330f8cc 112 SerialBuf* pIf = (SerialBuf*) fd;
darran 0:55a05330f8cc 113 pIf->setReadMode(false);
darran 0:55a05330f8cc 114 while(!m_abort && len)
darran 0:55a05330f8cc 115 {
darran 0:55a05330f8cc 116 while(!pIf->readable());
darran 0:55a05330f8cc 117 *data = (u8_t) pIf->getc();
darran 0:55a05330f8cc 118 data++;
darran 0:55a05330f8cc 119 len--;
darran 0:55a05330f8cc 120 recvd++;
darran 0:55a05330f8cc 121 }
darran 0:55a05330f8cc 122 m_abort = false;
darran 0:55a05330f8cc 123 return recvd;
darran 0:55a05330f8cc 124 }
darran 0:55a05330f8cc 125
darran 0:55a05330f8cc 126 /**
darran 0:55a05330f8cc 127 * Tries to read from the serial device. Same as sio_read but returns
darran 0:55a05330f8cc 128 * immediately if no data is available and never blocks.
darran 0:55a05330f8cc 129 *
darran 0:55a05330f8cc 130 * @param fd serial device handle
darran 0:55a05330f8cc 131 * @param data pointer to data buffer for receiving
darran 0:55a05330f8cc 132 * @param len maximum length (in bytes) of data to receive
darran 0:55a05330f8cc 133 * @return number of bytes actually received
darran 0:55a05330f8cc 134 */
darran 0:55a05330f8cc 135 u32_t sio_tryread(sio_fd_t fd, u8_t *data, u32_t len)
darran 0:55a05330f8cc 136 {
darran 0:55a05330f8cc 137 u32_t recvd = 0; //bytes received
darran 0:55a05330f8cc 138 SerialBuf* pIf = (SerialBuf*) fd;
darran 0:55a05330f8cc 139 pIf->setReadMode(false);
darran 0:55a05330f8cc 140 while(len)
darran 0:55a05330f8cc 141 {
darran 0:55a05330f8cc 142 /* if(!pIf->readable())
darran 0:55a05330f8cc 143 {
darran 0:55a05330f8cc 144 wait_ms(4);
darran 0:55a05330f8cc 145 }*/
darran 0:55a05330f8cc 146 if(!pIf->readable())
darran 0:55a05330f8cc 147 {
darran 0:55a05330f8cc 148 return recvd;
darran 0:55a05330f8cc 149 }
darran 0:55a05330f8cc 150 *data = (u8_t) pIf->getc();
darran 0:55a05330f8cc 151 data++;
darran 0:55a05330f8cc 152 len--;
darran 0:55a05330f8cc 153 recvd++;
darran 0:55a05330f8cc 154 }
darran 0:55a05330f8cc 155 return recvd;
darran 0:55a05330f8cc 156 }
darran 0:55a05330f8cc 157
darran 0:55a05330f8cc 158 /**
darran 0:55a05330f8cc 159 * Writes to the serial device.
darran 0:55a05330f8cc 160 *
darran 0:55a05330f8cc 161 * @param fd serial device handle
darran 0:55a05330f8cc 162 * @param data pointer to data to send
darran 0:55a05330f8cc 163 * @param len length (in bytes) of data to send
darran 0:55a05330f8cc 164 * @return number of bytes actually sent
darran 0:55a05330f8cc 165 *
darran 0:55a05330f8cc 166 * @note This function will block until all data can be sent.
darran 0:55a05330f8cc 167 */
darran 0:55a05330f8cc 168 u32_t sio_write(sio_fd_t fd, u8_t *data, u32_t len)
darran 0:55a05330f8cc 169 {
darran 0:55a05330f8cc 170 u32_t sent = 0; //bytes sent
darran 0:55a05330f8cc 171 SerialBuf* pIf = (SerialBuf*) fd;
darran 0:55a05330f8cc 172 while(len)
darran 0:55a05330f8cc 173 {
darran 0:55a05330f8cc 174 //while(!pIf->writeable());
darran 0:55a05330f8cc 175 pIf->putc(*data);
darran 0:55a05330f8cc 176 data++;
darran 0:55a05330f8cc 177 len--;
darran 0:55a05330f8cc 178 sent++;
darran 0:55a05330f8cc 179 }
darran 0:55a05330f8cc 180 return sent; //Well, this is bound to be len if no interrupt mechanism
darran 0:55a05330f8cc 181 }
darran 0:55a05330f8cc 182
darran 0:55a05330f8cc 183 /**
darran 0:55a05330f8cc 184 * Aborts a blocking sio_read() call.
darran 0:55a05330f8cc 185 *
darran 0:55a05330f8cc 186 * @param fd serial device handle
darran 0:55a05330f8cc 187 */
darran 0:55a05330f8cc 188 void sio_read_abort(sio_fd_t fd)
darran 0:55a05330f8cc 189 {
darran 0:55a05330f8cc 190 m_abort = true;
darran 0:55a05330f8cc 191 }
darran 0:55a05330f8cc 192
darran 0:55a05330f8cc 193 //}
darran 0:55a05330f8cc 194
darran 0:55a05330f8cc 195 #endif
darran 0:55a05330f8cc 196