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