📄 host_811.lst
字号:
317 1 while(TRUE)
318 1 {
319 2 //---------------Wait for done interrupt------------------
320 2 while(TRUE) // always ensure requested device is
321 2 { // inserted at all time, then you will
322 3 intr = SL811Read(IntStatus); // wait for interrupt to be done, and
323 3 if((intr & USB_RESET) || (intr & INSERT_REMOVE)) // proceed to parse result from slave
324 3 { // device.
325 4 DATA_STOP = TRUE; // if device is removed, set DATA_STOP
326 4 return FALSE; // flag true, so that main loop will
327 4 } // know this condition and exit gracefully
328 3 if(intr & USB_A_DONE)
329 3 break; // interrupt done !!!
330 3 }
331 2
332 2 SL811Write(IntStatus,INT_CLEAR); // clear interrupt status
333 2 result = SL811Read(EP0Status); // read EP0status register
334 2 remainder = SL811Read(EP0Counter); // remainder value in last pkt xfer
335 2
336 2 //-------------------------ACK----------------------------
337 2 if (result & EP0_ACK) // Transmission ACK
338 2 {
339 3
340 3 // SETUP TOKEN
341 3 if(pid == PID_SETUP) // do nothing for SETUP/OUT token
342 3 break; // exit while(1) immediately
343 3
344 3 // OUT TOKEN
345 3 else if(pid == PID_OUT)
346 3 break;
347 3
348 3 // IN TOKEN
349 3 else if(pid == PID_IN)
350 3 { // for IN token only
351 4 wLen -= (WORD)xferLen; // update remainding wLen value
352 4 cmd ^= 0x40; // toggle DATA0/DATA1
353 4 dataX++; // point to next dataX
354 4
355 4 //------------------------------------------------
356 4 // If host requested for more data than the slave
357 4 // have, and if the slave's data len is a multiple
358 4 // of its endpoint payload size/last xferLen. Do
359 4 // not overwrite data in previous buffer.
360 4 //------------------------------------------------
361 4 if(remainder==xferLen) // empty data detected
362 4 bufLen = 0; // do not overwriten previous data
363 4 else // reset bufLen to zero
364 4 bufLen = xferLen; // update previous buffer length
C51 COMPILER V7.50 HOST_811 10/27/2005 20:00:37 PAGE 7
365 4
366 4 //------------------------------------------------
367 4 // Arm for next data transfer when requested data
368 4 // length have not reach zero, i.e. wLen!=0, and
369 4 // last xferlen of data was completed, i.e.
370 4 // remainder is equal to zero, not a short pkt
371 4 //------------------------------------------------
372 4 if(!remainder && wLen) // remainder==0 when last xferLen
373 4 { // was all completed or wLen!=0
374 5 addr = (dataX & 1) ? data1:data0; // select next address for data
375 5 xferLen = (BYTE)(wLen>=wPayload) ? wPayload:wLen; // get data length required
376 5 if (FULL_SPEED) // sync with SOF transfer
377 5 cmd |= 0x20; // always sync SOF when FS, regardless
378 5 SL811Write(EP0XferLen, xferLen); // select next xfer length
379 5 SL811Write(EP0Address, addr); // data buffer addr
380 5 SL811Write(IntStatus,INT_CLEAR); // is a LS is on Hub.
381 5 SL811Write(EP0Control,cmd); // Enable USB transfer and re-arm
382 5 }
383 4
384 4 //------------------------------------------------
385 4 // Copy last IN token data pkt from prev transfer
386 4 // Check if there was data available during the
387 4 // last data transfer
388 4 //------------------------------------------------
389 4 if(bufLen)
390 4 {
391 5 SL811BufRead(((dataX&1)?data0:data1), buffer, bufLen);
392 5 buffer += bufLen;
393 5 }
394 4
395 4 //------------------------------------------------
396 4 // Terminate on short packets, i.e. remainder!=0
397 4 // a short packet or empty data packet OR when
398 4 // requested data len have completed, i.e.wLen=0
399 4 // For a LOWSPEED device, the 1st device descp,
400 4 // wPayload is default to 64-byte, LS device will
401 4 // only send back a max of 8-byte device descp,
402 4 // and host detect this as a short packet, and
403 4 // terminate with OUT status stage
404 4 //------------------------------------------------
405 4 if(remainder || !wLen)
406 4 break;
407 4 }
408 3 }
409 2
410 2 //-------------------------NAK----------------------------
411 2 if (result & EP0_NAK) // NAK Detected
412 2 {
413 3 if(endpoint==0) // on ep0 during enumeration of LS device
414 3 { // happen when slave is not fast enough,
415 4 SL811Write(IntStatus,INT_CLEAR); // clear interrupt status, need to
416 4 SL811Write(EP0Control,cmd); // re-arm and request for last cmd, IN token
417 4 result = 0; // respond to NAK status only
418 4 }
419 3 else // normal data endpoint, exit now !!! , non-zero ep
420 3 break; // main loop control the interval polling
421 3 }
422 2
423 2 //-----------------------TIMEOUT--------------------------
424 2 if (result & EP0_TIMEOUT) // TIMEOUT Detected
425 2 {
426 3 if(endpoint==0) // happens when hub enumeration
C51 COMPILER V7.50 HOST_811 10/27/2005 20:00:37 PAGE 8
427 3 {
428 4 if(++timeout >= TIMEOUT_RETRY)
429 4 {
430 5 timeout--;
431 5 break; // exit on the timeout detected
432 5 }
433 4 SL811Write(IntStatus,INT_CLEAR); // clear interrupt status, need to
434 4 SL811Write(EP0Control,cmd); // re-arm and request for last cmd again
435 4 }
436 3 else
437 3 { // all other data endpoint, data transfer
438 4 TIMEOUT_ERR = TRUE; // failed, set flag to terminate transfer
439 4 break; // happens when data transfer on a device
440 4 } // through the hub
441 3 }
442 2
443 2 //-----------------------STALL----------------------------
444 2 if (result & EP0_STALL) // STALL detected
445 2 return TRUE; // for unsupported request.
446 2
447 2 //----------------------OVEFLOW---------------------------
448 2 if (result & EP0_OVERFLOW) // OVERFLOW detected
449 2 break;
450 2 //-----------------------ERROR----------------------------
451 2 if (result & EP0_ERROR) // ERROR detected
452 2 break;
453 2 } // end of While(1)
454 1
455 1 if (result & EP0_ACK) // on ACK transmission
456 1 return TRUE; // return OK
457 1
458 1 return FALSE; // fail transmission
459 1 }
460
461 //*****************************************************************************************
462 // Control Endpoint 0's USB Data Xfer
463 // ep0Xfer, endpoint 0 data transfer
464 //*****************************************************************************************
465 int ep0Xfer(BYTE usbaddr, WORD payload, pSetupPKG setup, BYTE *pData)
466 {
467 1 xdata BYTE pid = PID_IN;
468 1 xdata WORD wLen = WordSwap(setup->wLength); // swap back for correct length
469 1 xdata BYTE ep0 = 0; // always endpoint zero
470 1
471 1 //----------------------------------------------------
472 1 // SETUP token with 8-byte request on endpoint 0
473 1 //----------------------------------------------------
474 1 if (!usbXfer(usbaddr, ep0, PID_SETUP, 0, payload, 8, (BYTE*)setup))
475 1 return FALSE;
476 1
477 1 //----------------------------------------------------
478 1 // IN or OUT data stage on endpoint 0
479 1 //----------------------------------------------------
480 1 if (wLen) // if there are data for transfer
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -