📄 host2131.c
字号:
DescBufLen = pStr->bLength; // set string length
if(!GetDesc(EpAddr,(WORD)(0x02<<8)|STRING,0x0904,pStr->bLength,DBUF))
DescBufLen = 0;
}
}
addr = DBUF;
len = (DescBufLen<ReqLen) ? DescBufLen : ReqLen;
if(SETUPDAT[0] == 0xC0) // if (DIR=IN)
{
while(len) // Move requested data through EP0IN one packet at a time.
{
if(len < EP0BUFF_SIZE)
bc = len;
else
bc = EP0BUFF_SIZE;
for(i=0; i<bc; i++)
*(IN0BUF+i) = *((BYTE xdata *)addr+i);
IN0BC = (BYTE)bc; // Arm endpoint
addr += bc;
len -= bc;
while(EP0CS & 0x04); // Wait for INBSY to clear
}
IN0BC = 0x00; // arm endp, # bytes to xfr
EP0CS |= bmBIT1; // ack handshake phase of device request
}
break;
}
case SL_REFRESH:
{
addr = DBUF;
len = GetDevInfo(DBUF);
if(SETUPDAT[0] == 0xC0) // if (DIR=IN)
{
while(len) // Move requested data through EP0IN one packet at a time.
{
if(len < EP0BUFF_SIZE)
bc = len;
else
bc = EP0BUFF_SIZE;
for(i=0; i<bc; i++)
*(IN0BUF+i) = *((BYTE xdata *)addr+i);
IN0BC = (BYTE)bc; // Arm endpoint
addr += bc;
len -= bc;
while(EP0CS & 0x04); // Wait for INBSY to clear
}
IN0BC = 0x00; // arm endp, # bytes to xfr
EP0CS |= bmBIT1; // ack handshake phase of device request
}
break;
}
case SL_DATA_XFER_START: // Data Transfer with ds Dev
{
EpAddr = SETUPDAT[2]; // Get address and length
EpIdx = SETUPDAT[4];
len = SETUPDAT[6];
addr = OUT_DATA;
if(SETUPDAT[0] == 0xC0) // if (DIR=IN)
{
retDataRW = DataRW(EpAddr,EpIdx,64,len,OUT_DATA);
if((remainder) && (remainder < len))
len -= remainder;
if(!retDataRW)
{
bc = 0;
IN0BC = (BYTE)bc; // Arm endpoint
while(EP0CS & 0x04); // Wait for INBSY to clear
break;
}
while(len) // Move requested data through EP0IN
{ // one packet at a time.
if(len < EP0BUFF_SIZE)
bc = len;
else
bc = EP0BUFF_SIZE;
for(i=0; i<bc; i++)
*(IN0BUF+i) = *((BYTE xdata *)addr+i);
IN0BC = (BYTE)bc; // Arm endpoint
addr += bc;
len -= bc;
while(EP0CS & 0x04); // Wait for INBSY to clear
}
}
else if(SETUPDAT[0] == 0x40) // if (DIR=OUT)
{
while(len) // Move new data through EP0OUT
{ // one packet at a time.
OUT0BC = 0; // Clear bytecount to allow new data in; also stops NAKing
while(EP0CS & 0x08);
bc = OUT0BC; // Get the new bytecount
for(i=0; i<bc; i++)
*((BYTE xdata *)addr+i) = *(OUT0BUF+i);
addr += bc;
len -= bc;
}
retDataRW = DataRW(EpAddr,EpIdx,64,bc,OUT_DATA);
}
break;
}
case SL_TOGGLE_DS_REFRESH:
{
dsPoll = !dsPoll; // toggle downstream poll
*IN0BUF = SETUPDAT[1]; // return command type
IN0BC = 0x01; // arm endp, # bytes to xfr
EP0CS |= bmBIT1; // ack handshake phase of device request
break;
}
case SL_SHOW_REGS:
{
addr = REGBUFF;
len = 16;
for(RegAddr=0; RegAddr<len; RegAddr++)
REGBUFF[RegAddr] = SL811Read(RegAddr);
if(SETUPDAT[0] == 0xC0) // if (DIR=IN)
{
while(len) // Move requested data through EP0IN one packet at a time.
{
if(len < EP0BUFF_SIZE)
bc = len;
else
bc = EP0BUFF_SIZE;
for(i=0; i<bc; i++)
*(IN0BUF+i) = *((BYTE xdata *)addr+i);
IN0BC = (BYTE)bc; // Arm endpoint
addr += bc;
len -= bc;
while(EP0CS & 0x04); // Wait for INBSY to clear
}
IN0BC = 0x00; // arm endp, # bytes to xfr
EP0CS |= bmBIT1; // ack handshake phase of device request
}
break;
}
default:
{
break;
}
}
return( FALSE ); // no errors, cmd handled okay
}
//-----------------------------------------------------------------------------
// USB Interrupt Handlers
// The following functions are called by the USB interrupt jump table.
//-----------------------------------------------------------------------------
// Setup Data Available Interrupt Handler
void ISR_Sudav(void) interrupt 0
{
GotSUD = TRUE; // Set flag
EZUSB_IRQ_CLEAR();
USBIRQ = bmSUDAV; // Clear SUDAV IRQ
}
// Setup Token Interrupt Handler
void ISR_Sutok(void) interrupt 0
{
EZUSB_IRQ_CLEAR();
USBIRQ = bmSUTOK; // Clear SUTOK IRQ
}
void ISR_Sof(void) interrupt 0
{
EZUSB_IRQ_CLEAR();
USBIRQ = bmSOF; // Clear SOF IRQ
}
void ISR_Ures(void) interrupt 0
{
EZUSB_IRQ_CLEAR();
USBIRQ = bmURES; // Clear URES IRQ
}
void ISR_IBN(void) interrupt 0
{
}
void ISR_Susp(void) interrupt 0
{
Sleep = TRUE;
EZUSB_IRQ_CLEAR();
USBIRQ = bmSUSP;
}
void ISR_Ep0in(void) interrupt 0
{
}
void ISR_Ep0out(void) interrupt 0
{
}
void ISR_Ep1in(void) interrupt 0
{
}
void ISR_Ep1out(void) interrupt 0
{
int i;
for(i=0;i<OUT1BC;i++)
HOSTCMD[i] = OUT1BUF[i];
OUT1BC = 0;
BULK_OUT_DONE = TRUE;
EZUSB_IRQ_CLEAR();
OUT07IRQ = bmEP1;
}
void ISR_Ep2in(void) interrupt 0
{
}
void ISR_Ep2out(void) interrupt 0
{
}
void ISR_Ep3in(void) interrupt 0
{
}
void ISR_Ep3out(void) interrupt 0
{
}
void ISR_Ep4in(void) interrupt 0
{
}
void ISR_Ep4out(void) interrupt 0
{
}
void ISR_Ep5in(void) interrupt 0
{
}
void ISR_Ep5out(void) interrupt 0
{
}
void ISR_Ep6in(void) interrupt 0
{
}
void ISR_Ep6out(void) interrupt 0
{
}
void ISR_Ep7in(void) interrupt 0
{
}
void ISR_Ep7out(void) interrupt 0
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -