Michael Spencer / Mbed 2 deprecated LaOS

Dependencies:   mbed

Committer:
Michael J. Spencer
Date:
Wed Mar 05 06:14:02 2014 -0800
Revision:
1:f5ac63519541
Initial commit.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Michael J. Spencer 1:f5ac63519541 1
Michael J. Spencer 1:f5ac63519541 2 /*
Michael J. Spencer 1:f5ac63519541 3 Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com)
Michael J. Spencer 1:f5ac63519541 4
Michael J. Spencer 1:f5ac63519541 5 Permission is hereby granted, free of charge, to any person obtaining a copy
Michael J. Spencer 1:f5ac63519541 6 of this software and associated documentation files (the "Software"), to deal
Michael J. Spencer 1:f5ac63519541 7 in the Software without restriction, including without limitation the rights
Michael J. Spencer 1:f5ac63519541 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
Michael J. Spencer 1:f5ac63519541 9 copies of the Software, and to permit persons to whom the Software is
Michael J. Spencer 1:f5ac63519541 10 furnished to do so, subject to the following conditions:
Michael J. Spencer 1:f5ac63519541 11
Michael J. Spencer 1:f5ac63519541 12 The above copyright notice and this permission notice shall be included in
Michael J. Spencer 1:f5ac63519541 13 all copies or substantial portions of the Software.
Michael J. Spencer 1:f5ac63519541 14
Michael J. Spencer 1:f5ac63519541 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Michael J. Spencer 1:f5ac63519541 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Michael J. Spencer 1:f5ac63519541 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Michael J. Spencer 1:f5ac63519541 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Michael J. Spencer 1:f5ac63519541 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Michael J. Spencer 1:f5ac63519541 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
Michael J. Spencer 1:f5ac63519541 21 THE SOFTWARE.
Michael J. Spencer 1:f5ac63519541 22 */
Michael J. Spencer 1:f5ac63519541 23
Michael J. Spencer 1:f5ac63519541 24 // #include "rpc.h"
Michael J. Spencer 1:f5ac63519541 25
Michael J. Spencer 1:f5ac63519541 26 #include "UsbSerial.h"
Michael J. Spencer 1:f5ac63519541 27
Michael J. Spencer 1:f5ac63519541 28 //#define __DEBUG
Michael J. Spencer 1:f5ac63519541 29 #include "dbg/dbg.h"
Michael J. Spencer 1:f5ac63519541 30
Michael J. Spencer 1:f5ac63519541 31 #include "netCfg.h"
Michael J. Spencer 1:f5ac63519541 32 #if NET_USB_SERIAL
Michael J. Spencer 1:f5ac63519541 33
Michael J. Spencer 1:f5ac63519541 34 namespace mbed {
Michael J. Spencer 1:f5ac63519541 35
Michael J. Spencer 1:f5ac63519541 36 #define BUF_LEN 64
Michael J. Spencer 1:f5ac63519541 37 #define FLUSH_TMOUT 100000 //US
Michael J. Spencer 1:f5ac63519541 38
Michael J. Spencer 1:f5ac63519541 39 UsbSerial::UsbSerial(UsbDevice* pDevice, int epIn, int epOut, const char* name /*= NULL*/) : Stream(name), m_epIn(pDevice, epIn, true, USB_BULK, BUF_LEN), m_epOut(pDevice, epOut, false, USB_BULK, BUF_LEN),
Michael J. Spencer 1:f5ac63519541 40 m_pInCbItem(NULL), m_pInCbMeth(NULL), m_pOutCbItem(NULL), m_pOutCbMeth(NULL)
Michael J. Spencer 1:f5ac63519541 41 {
Michael J. Spencer 1:f5ac63519541 42 m_inBufEven = new char[BUF_LEN];
Michael J. Spencer 1:f5ac63519541 43 m_inBufOdd = new char[BUF_LEN];
Michael J. Spencer 1:f5ac63519541 44 m_pInBufPos = m_inBufUsr = m_inBufEven;
Michael J. Spencer 1:f5ac63519541 45 m_inBufTrmt = m_inBufOdd;
Michael J. Spencer 1:f5ac63519541 46
Michael J. Spencer 1:f5ac63519541 47 m_outBufEven = new char[BUF_LEN];
Michael J. Spencer 1:f5ac63519541 48 m_outBufOdd = new char[BUF_LEN];
Michael J. Spencer 1:f5ac63519541 49 m_pOutBufPos = m_outBufUsr = m_outBufEven;
Michael J. Spencer 1:f5ac63519541 50 m_outBufTrmt = m_outBufOdd;
Michael J. Spencer 1:f5ac63519541 51
Michael J. Spencer 1:f5ac63519541 52 m_inBufLen = m_outBufLen = 0;
Michael J. Spencer 1:f5ac63519541 53
Michael J. Spencer 1:f5ac63519541 54 DBG("Starting RX'ing on in ep\n");
Michael J. Spencer 1:f5ac63519541 55
Michael J. Spencer 1:f5ac63519541 56 m_timeout = false;
Michael J. Spencer 1:f5ac63519541 57
Michael J. Spencer 1:f5ac63519541 58 m_epIn.setOnCompletion(this, &UsbSerial::onEpInTransfer);
Michael J. Spencer 1:f5ac63519541 59 m_epOut.setOnCompletion(this, &UsbSerial::onEpOutTransfer);
Michael J. Spencer 1:f5ac63519541 60
Michael J. Spencer 1:f5ac63519541 61 startRx();
Michael J. Spencer 1:f5ac63519541 62 }
Michael J. Spencer 1:f5ac63519541 63
Michael J. Spencer 1:f5ac63519541 64 UsbSerial::~UsbSerial()
Michael J. Spencer 1:f5ac63519541 65 {
Michael J. Spencer 1:f5ac63519541 66 delete[] m_inBufEven;
Michael J. Spencer 1:f5ac63519541 67 delete[] m_inBufOdd;
Michael J. Spencer 1:f5ac63519541 68 delete[] m_outBufEven;
Michael J. Spencer 1:f5ac63519541 69 delete[] m_outBufOdd;
Michael J. Spencer 1:f5ac63519541 70 }
Michael J. Spencer 1:f5ac63519541 71
Michael J. Spencer 1:f5ac63519541 72 void UsbSerial::baud(int baudrate) {
Michael J. Spencer 1:f5ac63519541 73 //
Michael J. Spencer 1:f5ac63519541 74 }
Michael J. Spencer 1:f5ac63519541 75
Michael J. Spencer 1:f5ac63519541 76 void UsbSerial::format(int bits, int parity, int stop) {
Michael J. Spencer 1:f5ac63519541 77 //
Michael J. Spencer 1:f5ac63519541 78 }
Michael J. Spencer 1:f5ac63519541 79
Michael J. Spencer 1:f5ac63519541 80 #if 0 //For doc only
Michael J. Spencer 1:f5ac63519541 81 template <class T>
Michael J. Spencer 1:f5ac63519541 82 void attach(T* pCbItem, void (T::*pCbMeth)())
Michael J. Spencer 1:f5ac63519541 83 {
Michael J. Spencer 1:f5ac63519541 84 m_pCbItem = (CDummy*) pCbItem;
Michael J. Spencer 1:f5ac63519541 85 m_pCbMeth = (void (CDummy::*)()) pCbMeth;
Michael J. Spencer 1:f5ac63519541 86 }
Michael J. Spencer 1:f5ac63519541 87 #endif
Michael J. Spencer 1:f5ac63519541 88
Michael J. Spencer 1:f5ac63519541 89 int UsbSerial::_getc() {
Michael J. Spencer 1:f5ac63519541 90 NVIC_DisableIRQ(US_TICKER_TIMER_IRQn);
Michael J. Spencer 1:f5ac63519541 91 NVIC_DisableIRQ(USB_IRQn);
Michael J. Spencer 1:f5ac63519541 92 char c;
Michael J. Spencer 1:f5ac63519541 93 c = *m_pInBufPos;
Michael J. Spencer 1:f5ac63519541 94 m_pInBufPos++;
Michael J. Spencer 1:f5ac63519541 95 NVIC_EnableIRQ(USB_IRQn);
Michael J. Spencer 1:f5ac63519541 96 NVIC_EnableIRQ(US_TICKER_TIMER_IRQn);
Michael J. Spencer 1:f5ac63519541 97 return c;
Michael J. Spencer 1:f5ac63519541 98 }
Michael J. Spencer 1:f5ac63519541 99
Michael J. Spencer 1:f5ac63519541 100 int UsbSerial::_putc(int c) {
Michael J. Spencer 1:f5ac63519541 101 NVIC_DisableIRQ(US_TICKER_TIMER_IRQn);
Michael J. Spencer 1:f5ac63519541 102 NVIC_DisableIRQ(USB_IRQn);
Michael J. Spencer 1:f5ac63519541 103 if( (m_pOutBufPos - m_outBufUsr) < BUF_LEN )
Michael J. Spencer 1:f5ac63519541 104 {
Michael J. Spencer 1:f5ac63519541 105 *m_pOutBufPos = (char) c;
Michael J. Spencer 1:f5ac63519541 106 m_pOutBufPos++;
Michael J. Spencer 1:f5ac63519541 107 }
Michael J. Spencer 1:f5ac63519541 108 else
Michael J. Spencer 1:f5ac63519541 109 {
Michael J. Spencer 1:f5ac63519541 110 DBG("NO WAY!!!\n");
Michael J. Spencer 1:f5ac63519541 111 }
Michael J. Spencer 1:f5ac63519541 112 #if 1
Michael J. Spencer 1:f5ac63519541 113 if( (m_pOutBufPos - m_outBufUsr) >= BUF_LEN ) //Must flush
Michael J. Spencer 1:f5ac63519541 114 {
Michael J. Spencer 1:f5ac63519541 115 if(m_timeout)
Michael J. Spencer 1:f5ac63519541 116 m_txTimeout.detach();
Michael J. Spencer 1:f5ac63519541 117 startTx();
Michael J. Spencer 1:f5ac63519541 118 }
Michael J. Spencer 1:f5ac63519541 119 else
Michael J. Spencer 1:f5ac63519541 120 {
Michael J. Spencer 1:f5ac63519541 121 /*if(m_timeout)
Michael J. Spencer 1:f5ac63519541 122 m_txTimeout.detach();
Michael J. Spencer 1:f5ac63519541 123 m_timeout = true;
Michael J. Spencer 1:f5ac63519541 124 m_txTimeout.attach_us(this, &UsbSerial::startTx, FLUSH_TMOUT);*/
Michael J. Spencer 1:f5ac63519541 125 if(!m_timeout)
Michael J. Spencer 1:f5ac63519541 126 {
Michael J. Spencer 1:f5ac63519541 127 m_timeout = true;
Michael J. Spencer 1:f5ac63519541 128 m_txTimeout.attach_us(this, &UsbSerial::startTx, FLUSH_TMOUT);
Michael J. Spencer 1:f5ac63519541 129 }
Michael J. Spencer 1:f5ac63519541 130 }
Michael J. Spencer 1:f5ac63519541 131 #endif
Michael J. Spencer 1:f5ac63519541 132 //startTx();
Michael J. Spencer 1:f5ac63519541 133 NVIC_EnableIRQ(USB_IRQn);
Michael J. Spencer 1:f5ac63519541 134 NVIC_EnableIRQ(US_TICKER_TIMER_IRQn);
Michael J. Spencer 1:f5ac63519541 135 return c;
Michael J. Spencer 1:f5ac63519541 136 }
Michael J. Spencer 1:f5ac63519541 137
Michael J. Spencer 1:f5ac63519541 138 int UsbSerial::readable() {
Michael J. Spencer 1:f5ac63519541 139 NVIC_DisableIRQ(US_TICKER_TIMER_IRQn);
Michael J. Spencer 1:f5ac63519541 140 NVIC_DisableIRQ(USB_IRQn);
Michael J. Spencer 1:f5ac63519541 141 int res;
Michael J. Spencer 1:f5ac63519541 142 if( (m_pInBufPos - m_inBufUsr) < m_inBufLen )
Michael J. Spencer 1:f5ac63519541 143 {
Michael J. Spencer 1:f5ac63519541 144 //DBG("\r\nREADABLE\r\n");
Michael J. Spencer 1:f5ac63519541 145 res = true;
Michael J. Spencer 1:f5ac63519541 146 }
Michael J. Spencer 1:f5ac63519541 147 else
Michael J. Spencer 1:f5ac63519541 148 {
Michael J. Spencer 1:f5ac63519541 149 //DBG("\r\nNOT READABLE\r\n");
Michael J. Spencer 1:f5ac63519541 150 startRx(); //Try to swap packets & start another transmission
Michael J. Spencer 1:f5ac63519541 151 res = ((m_pInBufPos - m_inBufUsr) < m_inBufLen )?true:false;
Michael J. Spencer 1:f5ac63519541 152 }
Michael J. Spencer 1:f5ac63519541 153 NVIC_EnableIRQ(USB_IRQn);
Michael J. Spencer 1:f5ac63519541 154 NVIC_EnableIRQ(US_TICKER_TIMER_IRQn);
Michael J. Spencer 1:f5ac63519541 155 return (bool)res;
Michael J. Spencer 1:f5ac63519541 156 }
Michael J. Spencer 1:f5ac63519541 157
Michael J. Spencer 1:f5ac63519541 158 int UsbSerial::writeable() {
Michael J. Spencer 1:f5ac63519541 159 NVIC_DisableIRQ(US_TICKER_TIMER_IRQn);
Michael J. Spencer 1:f5ac63519541 160 NVIC_DisableIRQ(USB_IRQn);
Michael J. Spencer 1:f5ac63519541 161 // DBG("\r\nWRITEABLE???\r\n");
Michael J. Spencer 1:f5ac63519541 162 int res = (bool)( (m_pOutBufPos - m_outBufUsr) < BUF_LEN);
Michael J. Spencer 1:f5ac63519541 163 NVIC_EnableIRQ(USB_IRQn);
Michael J. Spencer 1:f5ac63519541 164 NVIC_EnableIRQ(US_TICKER_TIMER_IRQn);
Michael J. Spencer 1:f5ac63519541 165 return res;
Michael J. Spencer 1:f5ac63519541 166 }
Michael J. Spencer 1:f5ac63519541 167
Michael J. Spencer 1:f5ac63519541 168 void UsbSerial::onReadable()
Michael J. Spencer 1:f5ac63519541 169 {
Michael J. Spencer 1:f5ac63519541 170 if(m_pInCbItem && m_pInCbMeth)
Michael J. Spencer 1:f5ac63519541 171 (m_pInCbItem->*m_pInCbMeth)();
Michael J. Spencer 1:f5ac63519541 172 }
Michael J. Spencer 1:f5ac63519541 173
Michael J. Spencer 1:f5ac63519541 174 void UsbSerial::onWriteable()
Michael J. Spencer 1:f5ac63519541 175 {
Michael J. Spencer 1:f5ac63519541 176 if(m_pOutCbItem && m_pOutCbMeth)
Michael J. Spencer 1:f5ac63519541 177 (m_pOutCbItem->*m_pOutCbMeth)();
Michael J. Spencer 1:f5ac63519541 178 }
Michael J. Spencer 1:f5ac63519541 179
Michael J. Spencer 1:f5ac63519541 180 void UsbSerial::onEpInTransfer()
Michael J. Spencer 1:f5ac63519541 181 {
Michael J. Spencer 1:f5ac63519541 182 int len = m_epIn.status();
Michael J. Spencer 1:f5ac63519541 183 DBG("RX transfer completed w len=%d\n",len);
Michael J. Spencer 1:f5ac63519541 184 startRx();
Michael J. Spencer 1:f5ac63519541 185 if(len > 0)
Michael J. Spencer 1:f5ac63519541 186 onReadable();
Michael J. Spencer 1:f5ac63519541 187 }
Michael J. Spencer 1:f5ac63519541 188
Michael J. Spencer 1:f5ac63519541 189 void UsbSerial::onEpOutTransfer()
Michael J. Spencer 1:f5ac63519541 190 {
Michael J. Spencer 1:f5ac63519541 191 int len = m_epOut.status();
Michael J. Spencer 1:f5ac63519541 192 DBG("TX transfer completed w len=%d\n",len);
Michael J. Spencer 1:f5ac63519541 193 if(m_timeout)
Michael J. Spencer 1:f5ac63519541 194 m_txTimeout.detach();
Michael J. Spencer 1:f5ac63519541 195 startTx();
Michael J. Spencer 1:f5ac63519541 196 if(len > 0)
Michael J. Spencer 1:f5ac63519541 197 onWriteable();
Michael J. Spencer 1:f5ac63519541 198 }
Michael J. Spencer 1:f5ac63519541 199
Michael J. Spencer 1:f5ac63519541 200 void UsbSerial::startTx()
Michael J. Spencer 1:f5ac63519541 201 {
Michael J. Spencer 1:f5ac63519541 202
Michael J. Spencer 1:f5ac63519541 203 DBG("Transfer>\n");
Michael J. Spencer 1:f5ac63519541 204
Michael J. Spencer 1:f5ac63519541 205 m_timeout = false;
Michael J. Spencer 1:f5ac63519541 206
Michael J. Spencer 1:f5ac63519541 207 // m_txTimeout.detach();
Michael J. Spencer 1:f5ac63519541 208
Michael J. Spencer 1:f5ac63519541 209 if(!(m_pOutBufPos - m_outBufUsr))
Michael J. Spencer 1:f5ac63519541 210 {
Michael J. Spencer 1:f5ac63519541 211 DBG("?!?!?\n");
Michael J. Spencer 1:f5ac63519541 212 return;
Michael J. Spencer 1:f5ac63519541 213 }
Michael J. Spencer 1:f5ac63519541 214
Michael J. Spencer 1:f5ac63519541 215 if( m_epOut.status() == USBERR_PROCESSING )
Michael J. Spencer 1:f5ac63519541 216 {
Michael J. Spencer 1:f5ac63519541 217 //Wait & retry
Michael J. Spencer 1:f5ac63519541 218 //m_timeout = true;
Michael J. Spencer 1:f5ac63519541 219 //m_txTimeout.attach_us(this, &UsbSerial::startTx, FLUSH_TMOUT);
Michael J. Spencer 1:f5ac63519541 220 DBG("Ep is busy...\n");
Michael J. Spencer 1:f5ac63519541 221 return;
Michael J. Spencer 1:f5ac63519541 222 }
Michael J. Spencer 1:f5ac63519541 223
Michael J. Spencer 1:f5ac63519541 224 if( m_epOut.status() < 0 )
Michael J. Spencer 1:f5ac63519541 225 {
Michael J. Spencer 1:f5ac63519541 226 DBG("Tx trying again...\n");
Michael J. Spencer 1:f5ac63519541 227 m_epOut.transfer((volatile uint8_t*)m_outBufTrmt, m_outBufLen);
Michael J. Spencer 1:f5ac63519541 228 return;
Michael J. Spencer 1:f5ac63519541 229 }
Michael J. Spencer 1:f5ac63519541 230
Michael J. Spencer 1:f5ac63519541 231 m_outBufLen = m_pOutBufPos - m_outBufUsr;
Michael J. Spencer 1:f5ac63519541 232
Michael J. Spencer 1:f5ac63519541 233 //Swap buffers
Michael J. Spencer 1:f5ac63519541 234 volatile char* swapBuf = m_outBufUsr;
Michael J. Spencer 1:f5ac63519541 235 m_outBufUsr = m_outBufTrmt;
Michael J. Spencer 1:f5ac63519541 236 m_outBufTrmt = swapBuf;
Michael J. Spencer 1:f5ac63519541 237
Michael J. Spencer 1:f5ac63519541 238 m_epOut.transfer((volatile uint8_t*)m_outBufTrmt, m_outBufLen);
Michael J. Spencer 1:f5ac63519541 239
Michael J. Spencer 1:f5ac63519541 240 m_pOutBufPos = m_outBufUsr;
Michael J. Spencer 1:f5ac63519541 241
Michael J. Spencer 1:f5ac63519541 242 }
Michael J. Spencer 1:f5ac63519541 243
Michael J. Spencer 1:f5ac63519541 244 void UsbSerial::startRx()
Michael J. Spencer 1:f5ac63519541 245 {
Michael J. Spencer 1:f5ac63519541 246 if( (m_pInBufPos - m_inBufUsr) < m_inBufLen )
Michael J. Spencer 1:f5ac63519541 247 {
Michael J. Spencer 1:f5ac63519541 248 //User buf is not empty, cannot swap now...
Michael J. Spencer 1:f5ac63519541 249 return;
Michael J. Spencer 1:f5ac63519541 250 }
Michael J. Spencer 1:f5ac63519541 251 int len = m_epIn.status();
Michael J. Spencer 1:f5ac63519541 252 if( len == USBERR_PROCESSING )
Michael J. Spencer 1:f5ac63519541 253 {
Michael J. Spencer 1:f5ac63519541 254 //Previous transmission not completed
Michael J. Spencer 1:f5ac63519541 255 return;
Michael J. Spencer 1:f5ac63519541 256 }
Michael J. Spencer 1:f5ac63519541 257 if( len < 0 )
Michael J. Spencer 1:f5ac63519541 258 {
Michael J. Spencer 1:f5ac63519541 259 DBG("Rx trying again...\n");
Michael J. Spencer 1:f5ac63519541 260 m_epIn.transfer((volatile uint8_t*)m_inBufTrmt, BUF_LEN); //Start another transmission
Michael J. Spencer 1:f5ac63519541 261 return;
Michael J. Spencer 1:f5ac63519541 262 }
Michael J. Spencer 1:f5ac63519541 263
Michael J. Spencer 1:f5ac63519541 264 m_inBufLen = len;
Michael J. Spencer 1:f5ac63519541 265
Michael J. Spencer 1:f5ac63519541 266 //Swap buffers
Michael J. Spencer 1:f5ac63519541 267 volatile char* swapBuf = m_inBufUsr;
Michael J. Spencer 1:f5ac63519541 268 m_inBufUsr = m_inBufTrmt;
Michael J. Spencer 1:f5ac63519541 269 m_inBufTrmt = swapBuf;
Michael J. Spencer 1:f5ac63519541 270 m_pInBufPos = m_inBufUsr;
Michael J. Spencer 1:f5ac63519541 271
Michael J. Spencer 1:f5ac63519541 272 DBG("Starting new transfer\n");
Michael J. Spencer 1:f5ac63519541 273 m_epIn.transfer((volatile uint8_t*)m_inBufTrmt, BUF_LEN); //Start another transmission
Michael J. Spencer 1:f5ac63519541 274
Michael J. Spencer 1:f5ac63519541 275 }
Michael J. Spencer 1:f5ac63519541 276
Michael J. Spencer 1:f5ac63519541 277 #ifdef MBED_RPC
Michael J. Spencer 1:f5ac63519541 278 const struct rpc_method *UsbSerial::get_rpc_methods() {
Michael J. Spencer 1:f5ac63519541 279 static const rpc_method methods[] = {
Michael J. Spencer 1:f5ac63519541 280 { "readable", rpc_method_caller<int, UsbSerial, &UsbSerial::readable> },
Michael J. Spencer 1:f5ac63519541 281 { "writeable", rpc_method_caller<int, UsbSerial, &UsbSerial::writeable> },
Michael J. Spencer 1:f5ac63519541 282 RPC_METHOD_SUPER(Stream)
Michael J. Spencer 1:f5ac63519541 283 };
Michael J. Spencer 1:f5ac63519541 284 return methods;
Michael J. Spencer 1:f5ac63519541 285 }
Michael J. Spencer 1:f5ac63519541 286
Michael J. Spencer 1:f5ac63519541 287 struct rpc_class *UsbSerial::get_rpc_class() {
Michael J. Spencer 1:f5ac63519541 288 static const rpc_function funcs[] = {
Michael J. Spencer 1:f5ac63519541 289 /*{ "new", rpc_function_caller<const char*, UsbDevice*, int, int, const char*, Base::construct<UsbSerial,UsbDevice*,int,int,const char*> > },*/ //RPC is buggy
Michael J. Spencer 1:f5ac63519541 290 RPC_METHOD_END
Michael J. Spencer 1:f5ac63519541 291 };
Michael J. Spencer 1:f5ac63519541 292 static rpc_class c = { "UsbSerial", funcs, NULL };
Michael J. Spencer 1:f5ac63519541 293 return &c;
Michael J. Spencer 1:f5ac63519541 294 }
Michael J. Spencer 1:f5ac63519541 295 #endif
Michael J. Spencer 1:f5ac63519541 296
Michael J. Spencer 1:f5ac63519541 297 } // namespace mbed
Michael J. Spencer 1:f5ac63519541 298
Michael J. Spencer 1:f5ac63519541 299 #endif
Michael J. Spencer 1:f5ac63519541 300