📄 sl811.lst
字号:
245 5 SL811Write(EP0XferLen, xferLen); // select next xfer length
246 5 SL811Write(EP0Address, addr); // data buffer addr
247 5 SL811Write(IntStatus,INT_CLEAR); // is a LS is on Hub.
248 5 SL811Write(EP0Control,cmd); // Enable USB transfer and re-arm
249 5 }
250 4
251 4 //------------------------------------------------
252 4 // Copy last IN token data pkt from prev transfer
253 4 // Check if there was data available during the
254 4 // last data transfer
255 4 //------------------------------------------------
256 4 if(bufLen)
257 4 {
258 5 SL811BufRead(((dataX&1)?data0:data1), usbstack.buffer, bufLen);
259 5 usbstack.buffer += bufLen;
260 5 }
261 4
262 4 //------------------------------------------------
263 4 // Terminate on short packets, i.e. remainder!=0
264 4 // a short packet or empty data packet OR when
265 4 // requested data len have completed, i.e.wLen=0
266 4 // For a LOWSPEED device, the 1st device descp,
267 4 // wPayload is default to 64-byte, LS device will
268 4 // only send back a max of 8-byte device descp,
269 4 // and host detect this as a short packet, and
270 4 // terminate with OUT status stage
271 4 //------------------------------------------------
272 4 if(remainder || !usbstack.wLen)
273 4 break;
274 4 }// PID IN
275 3 }
276 2
277 2 //-------------------------NAK----------------------------
278 2 if (result & EP0_NAK) // NAK Detected
279 2 {
280 3 if(usbstack.endpoint==0) // on ep0 during enumeration of LS device
281 3 { // happen when slave is not fast enough,
282 4 SL811Write(IntStatus,INT_CLEAR); // clear interrupt status, need to
283 4 SL811Write(EP0Control,cmd); // re-arm and request for last cmd, IN token
284 4 result = 0; // respond to NAK status only
285 4 }
286 3 else // normal data endpoint, exit now !!! , non-zero ep
287 3 break; // main loop control the interval polling
288 3 }
289 2
290 2 //-----------------------TIMEOUT--------------------------
291 2 if (result & EP0_TIMEOUT) // TIMEOUT Detected
292 2 {
293 3 if(usbstack.endpoint==0) // happens when hub enumeration
294 3 {
295 4 if(++timeout >= TIMEOUT_RETRY)
296 4 {
297 5 timeout--;
298 5 break; // exit on the timeout detected
299 5 }
300 4 SL811Write(IntStatus,INT_CLEAR); // clear interrupt status, need to
301 4 SL811Write(EP0Control,cmd); // re-arm and request for last cmd again
302 4 }
C51 COMPILER V6.20c SL811 10/09/2005 10:50:56 PAGE 6
303 3 else
304 3 { // all other data endpoint, data transfer
305 4 bXXGFlags.bits.TIMEOUT_ERR = TRUE; // failed, set flag to terminate transfer
306 4 break; // happens when data transfer on a device
307 4 } // through the hub
308 3 }
309 2
310 2 //-----------------------STALL----------------------------
311 2 if (result & EP0_STALL) // STALL detected
312 2 return TRUE; // for unsupported request.
313 2
314 2 //----------------------OVEFLOW---------------------------
315 2 if (result & EP0_OVERFLOW) // OVERFLOW detected
316 2 //result=result;
317 2 break;
318 2 //-----------------------ERROR----------------------------
319 2 if (result & EP0_ERROR) // ERROR detected
320 2 //result=result;
321 2 break;
322 2 } // end of While(1)
323 1
324 1 if (result & EP0_ACK) // on ACK transmission
325 1 return TRUE; // return OK
326 1
327 1 return FALSE; // fail transmission
328 1
329 1 }
330 //*****************************************************************************************
331 // Control Endpoint 0's USB Data Xfer
332 // ep0Xfer, endpoint 0 data transfer
333 //*****************************************************************************************
334 unsigned char ep0Xfer(void)
335 {
336 1 //unsigned char wLen;
337 1
338 1 //wLen=usbstack.wLen;
339 1 usbstack.endpoint=0;
340 1 //----------------------------------------------------
341 1 // SETUP token with 8-byte request on endpoint 0
342 1 //----------------------------------------------------
343 1 usbstack.pid=PID_SETUP;
344 1 usbstack.wLen=8;
345 1 //usbstack.buffer=&usbstack.setup;
346 1 if (!usbXfer())
347 1 return FALSE;
348 1 //DelayMs(10);
349 1 usbstack.pid = PID_IN;
350 1 //----------------------------------------------------
351 1 // IN or OUT data stage on endpoint 0
352 1 //----------------------------------------------------
353 1 usbstack.wLen=usbstack.setup.wLength;
354 1 if (usbstack.wLen) // if there are data for transfer
355 1 {
356 2 if (usbstack.setup.bmRequest & 0x80) // host-to-device : IN token
357 2 {
358 3 usbstack.pid = PID_IN;
359 3
360 3 if(!usbXfer())
361 3 return FALSE;
362 3 //usbstack.wPayload = 0;
363 3 usbstack.pid = PID_OUT;
364 3 }
C51 COMPILER V6.20c SL811 10/09/2005 10:50:56 PAGE 7
365 2 else // device-to-host : OUT token
366 2 {
367 3 usbstack.pid = PID_OUT;
368 3
369 3 if(!usbXfer())
370 3 return FALSE;
371 3 usbstack.pid = PID_IN;
372 3 }
373 2 }
374 1 //DelayMs(10);
375 1 //----------------------------------------------------
376 1 // Status stage IN or OUT zero-length data packet
377 1 //----------------------------------------------------
378 1 usbstack.wLen=0;
379 1 if(!usbXfer())
380 1 return FALSE;
381 1
382 1 return TRUE;
383 1
384 1 }
385
386
387 unsigned char epBulkSend(unsigned char *pBuffer,unsigned int len)
388 {
389 1 usbstack.usbaddr=0x1;
390 1 usbstack.endpoint=usbstack.epbulkout;
391 1 usbstack.pid=PID_OUT;
392 1 usbstack.wPayload=64;
393 1 usbstack.wLen=len;
394 1 usbstack.buffer=pBuffer;
395 1 /*
396 1 while(len>0)
397 1 {
398 1 if (len > usbstack.wPayload)
399 1 usbstack.wLen = usbstack.wPayload;
400 1 else
401 1 usbstack.wLen = len;
402 1 while(!usbXfer());
403 1 //DelayMs(10);
404 1 //return FALSE;
405 1 len-=usbstack.wLen;
406 1 usbstack.buffer=usbstack.buffer+usbstack.wLen;
407 1 //DelayUs(10);
408 1 }
409 1 */
410 1 if(usbstack.wLen)
411 1 {
412 2 while(!usbXfer());
413 2 }
414 1 return TRUE;
415 1 }
416
417 unsigned char epBulkRcv(unsigned char *pBuffer,unsigned int len)
418 {
419 1 usbstack.usbaddr=0x1;
420 1 usbstack.endpoint=usbstack.epbulkin;
421 1 usbstack.pid=PID_IN;
422 1 usbstack.wPayload=64;
423 1 usbstack.wLen=len;
424 1 usbstack.buffer=pBuffer;
425 1 if(usbstack.wLen)
426 1 {
C51 COMPILER V6.20c SL811 10/09/2005 10:50:56 PAGE 8
427 2 while(!usbXfer());
428 2 //return FALSE;
429 2 }
430 1 return TRUE;
431 1 }
432 //*****************************************************************************************
433 // Control endpoint
434 //*****************************************************************************************
435 //void VendorCmd(void)
436 //{
437 // ep0Xfer();
438 //}
439
440 //*****************************************************************************************
441 // Set Device Address :
442 //*****************************************************************************************
443 unsigned char SetAddress(unsigned char addr)
444 {
445 1 usbstack.usbaddr=0;
446 1 usbstack.setup.bmRequest=0;
447 1 usbstack.setup.bRequest=SET_ADDRESS;
448 1 usbstack.setup.wValue=addr;
449 1 usbstack.setup.wIndex=0;
450 1 usbstack.setup.wLength=0;
451 1 //usbstack.buffer=&usbstack.setup;
452 1 return ep0Xfer();
453 1
454 1 }
455
456 //*****************************************************************************************
457 // Set Device Configuration :
458 //*****************************************************************************************
459 unsigned char Set_Configuration(void)
460 {
461 1 //usbstack.usbaddr=usbaddr;
462 1 //usbstack.
463 1 usbstack.setup.bmRequest=0;
464 1 usbstack.setup.bRequest=SET_CONFIG;
465 1 //usbstack.setup.wValue=wVal;
466 1 usbstack.setup.wIndex=0;
467 1 usbstack.setup.wLength=0;
468 1 usbstack.buffer=NULL;
469 1 return ep0Xfer();
470 1
471 1 }
472
473 //*****************************************************************************************
474 // Get Device Descriptor : Device, Configuration, String
475 //*****************************************************************************************
476 unsigned char GetDesc(void)
477 {
478 1
479 1 usbstack.setup.bmRequest=0x80;
480 1 usbstack.setup.bRequest=GET_DESCRIPTOR;
481 1 usbstack.setup.wValue=WordSwap(usbstack.setup.wValue);
482 1
483 1 usbstack.wPayload=uDev.wPayLoad[0];
484 1 //usbstack.buffer=&usbstack.setup;
485 1 return ep0Xfer();
486 1 }
487
488 //*****************************************************************************************
C51 COMPILER V6.20c SL811 10/09/2005 10:50:56 PAGE 9
489 // USB Data Endpoint Read/Write
490 // wLen is in low byte first format
491 //*****************************************************************************************
492 /*
493 unsigned char DataRW(BYTE epaddr)
494 {
495 //xdata BYTE pid = PID_OUT;
496
497 usbstack.pid=PID_OUT;
498 usbstack.endpoint=epaddr&0x0F;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -