📄 sl811.lst
字号:
187 3 // OUT TOKEN
188 3 else if(usbstack.pid == PID_OUT)
189 3 {
190 4 usbstack.wLen -= (WORD)xferLen;
191 4 usbstack.buffer += xferLen;
192 4 //cmd ^=0x40;
193 4 //dataX++;
194 4
195 4 if(!usbstack.wLen)
196 4 break;
197 4 ////////////////////////////////////
198 4 if (usbstack.wLen >= usbstack.wPayload) // select proper data payload
199 4 xferLen = usbstack.wPayload; // limit to wPayload size
200 4 else // else take < payload len
201 4 xferLen = usbstack.wLen;
202 4
203 4 ////////////////////////////////////
204 4 //if(bufLen)
205 4 {
206 5 //addr = (dataX & 1) ? data1:data0;
207 5 addr=data0;
208 5
209 5 SL811BufWrite(addr,usbstack.buffer,xferLen);
210 5
211 5 cmd = sDATA0_WR;
212 5 bXXGFlags.bits.bData1 = uDev.bData1[usbstack.endpoint];
213 5 uDev.bData1[usbstack.endpoint] = (uDev.bData1[usbstack.endpoint] ? 0 : 1); // DataToggle
214 5
215 5 if(bXXGFlags.bits.bData1)
216 5 cmd |= 0x40;
217 5 // always sync SOF when FS, regardless
218 5 SL811Write(EP0XferLen, xferLen); // select next xfer length
219 5 SL811Write(EP0Address, addr); // data buffer addr
220 5 SL811Write(IntStatus,INT_CLEAR); // is a LS is on Hub.
221 5 SL811Write(EP0Control,cmd); // Enable USB transfer and re-arm
222 5 }
223 4
224 4 } //PID OUT
225 3 // IN TOKEN
226 3 else if(usbstack.pid == PID_IN)
227 3 { // for IN token only
228 4 usbstack.wLen -= (WORD)xferLen; // update remainding wLen value
229 4 cmd ^= 0x40; // toggle DATA0/DATA1
230 4 dataX++; // point to next dataX
231 4
232 4 //------------------------------------------------
233 4 // If host requested for more data than the slave
234 4 // have, and if the slave's data len is a multiple
235 4 // of its endpoint payload size/last xferLen. Do
236 4 // not overwrite data in previous buffer.
237 4 //------------------------------------------------
238 4 if(remainder==xferLen) // empty data detected
239 4 bufLen = 0; // do not overwriten previous data
240 4 else // reset bufLen to zero
241 4 bufLen = xferLen; // update previous buffer length
C51 COMPILER V7.00 SL811 09/22/2005 17:57:50 PAGE 5
242 4
243 4 //------------------------------------------------
244 4 // Arm for next data transfer when requested data
245 4 // length have not reach zero, i.e. wLen!=0, and
246 4 // last xferlen of data was completed, i.e.
247 4 // remainder is equal to zero, not a short pkt
248 4 //------------------------------------------------
249 4 if(!remainder && usbstack.wLen) // remainder==0 when last xferLen
250 4 { // was all completed or wLen!=0
251 5 addr = (dataX & 1) ? data1:data0; // select next address for data
252 5 xferLen = (BYTE)(usbstack.wLen>=usbstack.wPayload) ? usbstack.wPayload:usbstack.wLen; // get data len
-gth required
253 5 //if (FULL_SPEED) // sync with SOF transfer
254 5 cmd |= 0x20; // always sync SOF when FS, regardless
255 5 SL811Write(EP0XferLen, xferLen); // select next xfer length
256 5 SL811Write(EP0Address, addr); // data buffer addr
257 5 SL811Write(IntStatus,INT_CLEAR); // is a LS is on Hub.
258 5 SL811Write(EP0Control,cmd); // Enable USB transfer and re-arm
259 5 }
260 4
261 4 //------------------------------------------------
262 4 // Copy last IN token data pkt from prev transfer
263 4 // Check if there was data available during the
264 4 // last data transfer
265 4 //------------------------------------------------
266 4 if(bufLen)
267 4 {
268 5 SL811BufRead(((dataX&1)?data0:data1), usbstack.buffer, bufLen);
269 5 usbstack.buffer += bufLen;
270 5 }
271 4
272 4 //------------------------------------------------
273 4 // Terminate on short packets, i.e. remainder!=0
274 4 // a short packet or empty data packet OR when
275 4 // requested data len have completed, i.e.wLen=0
276 4 // For a LOWSPEED device, the 1st device descp,
277 4 // wPayload is default to 64-byte, LS device will
278 4 // only send back a max of 8-byte device descp,
279 4 // and host detect this as a short packet, and
280 4 // terminate with OUT status stage
281 4 //------------------------------------------------
282 4 if(remainder || !usbstack.wLen)
283 4 break;
284 4 }// PID IN
285 3 }
286 2
287 2 //-------------------------NAK----------------------------
288 2 if (result & EP0_NAK) // NAK Detected
289 2 {
290 3 if(usbstack.endpoint==0) // on ep0 during enumeration of LS device
291 3 { // happen when slave is not fast enough,
292 4 SL811Write(IntStatus,INT_CLEAR); // clear interrupt status, need to
293 4 SL811Write(EP0Control,cmd); // re-arm and request for last cmd, IN token
294 4 result = 0; // respond to NAK status only
295 4 }
296 3 else // normal data endpoint, exit now !!! , non-zero ep
297 3 break; // main loop control the interval polling
298 3 }
299 2
300 2 //-----------------------TIMEOUT--------------------------
301 2 if (result & EP0_TIMEOUT) // TIMEOUT Detected
302 2 {
C51 COMPILER V7.00 SL811 09/22/2005 17:57:50 PAGE 6
303 3 if(usbstack.endpoint==0) // happens when hub enumeration
304 3 {
305 4 if(++timeout >= TIMEOUT_RETRY)
306 4 {
307 5 timeout--;
308 5 break; // exit on the timeout detected
309 5 }
310 4 SL811Write(IntStatus,INT_CLEAR); // clear interrupt status, need to
311 4 SL811Write(EP0Control,cmd); // re-arm and request for last cmd again
312 4 }
313 3 else
314 3 { // all other data endpoint, data transfer
315 4 bXXGFlags.bits.TIMEOUT_ERR = TRUE; // failed, set flag to terminate transfer
316 4 break; // happens when data transfer on a device
317 4 } // through the hub
318 3 }
319 2
320 2 //-----------------------STALL----------------------------
321 2 if (result & EP0_STALL) // STALL detected
322 2 return TRUE; // for unsupported request.
323 2
324 2 //----------------------OVEFLOW---------------------------
325 2 if (result & EP0_OVERFLOW) // OVERFLOW detected
326 2 //result=result;
327 2 break;
328 2 //-----------------------ERROR----------------------------
329 2 if (result & EP0_ERROR) // ERROR detected
330 2 //result=result;
331 2 break;
332 2 } // end of While(1)
333 1
334 1 if (result & EP0_ACK) // on ACK transmission
335 1 return TRUE; // return OK
336 1
337 1 return FALSE; // fail transmission
338 1
339 1 }
340 //*****************************************************************************************
341 // Control Endpoint 0's USB Data Xfer
342 // ep0Xfer, endpoint 0 data transfer
343 //*****************************************************************************************
344 unsigned char ep0Xfer(void)
345 {
346 1 //unsigned char wLen;
347 1
348 1 //wLen=usbstack.wLen;
349 1 usbstack.endpoint=0;
350 1 //----------------------------------------------------
351 1 // SETUP token with 8-byte request on endpoint 0
352 1 //----------------------------------------------------
353 1 usbstack.pid=PID_SETUP;
354 1 usbstack.wLen=8;
355 1 //usbstack.buffer=&usbstack.setup;
356 1 if (!usbXfer())
357 1 return FALSE;
358 1 //DelayMs(10);
359 1 usbstack.pid = PID_IN;
360 1 //----------------------------------------------------
361 1 // IN or OUT data stage on endpoint 0
362 1 //----------------------------------------------------
363 1 usbstack.wLen=usbstack.setup.wLength;
364 1 if (usbstack.wLen) // if there are data for transfer
C51 COMPILER V7.00 SL811 09/22/2005 17:57:50 PAGE 7
365 1 {
366 2 if (usbstack.setup.bmRequest & 0x80) // host-to-device : IN token
367 2 {
368 3 usbstack.pid = PID_IN;
369 3
370 3 if(!usbXfer())
371 3 return FALSE;
372 3 //usbstack.wPayload = 0;
373 3 usbstack.pid = PID_OUT;
374 3 }
375 2 else // device-to-host : OUT token
376 2 {
377 3 usbstack.pid = PID_OUT;
378 3
379 3 if(!usbXfer())
380 3 return FALSE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -