📄 usb_isr.c
字号:
}
else
{
gEp0Status.pData = (BYTE *)&ZERO_PACKET;
gEp0Status.uNumBytes = 2;
}
}
else
{
ForceStall();
}
}
}
break;
default:
ForceStall();
break;
}
if (gEp0Status.bEpState != EP_STALL)
{
WRITE_REGISTER(E0CSR, rbSOPRDY);
gEp0Status.bEpState = EP_TX;
}
}
void ClearFeature(void)
{
if ((gDeviceStatus.bDevState != DEV_CONFIGURED) ||
(gSetup.bmRequestType == IN_DEVICE) ||
(gSetup.bmRequestType == IN_INTERFACE) ||
gSetup.wValue.c[MSB] || gSetup.wIndex.c[MSB] ||
gSetup.wLength.c[MSB] || gSetup.wLength.c[LSB])
{
ForceStall();
}
else
{
if ((gSetup.bmRequestType == IN_ENDPOINT) &&
(gSetup.wValue.c[LSB] == ENDPOINT_HALT) &&
((gSetup.wIndex.c[LSB] == IN_EP1) ||
(gSetup.wIndex.c[LSB] == OUT_EP2)))
{
if (gSetup.wIndex.c[LSB] == IN_EP1)
{
WRITE_REGISTER(INDEX, EP1_IN_IDX);
WRITE_REGISTER(EINCSRL, rbInCLRDT);
gEp1InStatus.bEpState = EP_IDLE;
}
else
{
WRITE_REGISTER(INDEX, EP2_OUT_IDX);
WRITE_REGISTER(EINCSRL, rbInCLRDT);
gEp2OutStatus.bEpState = EP_IDLE;
}
}
else
{
ForceStall();
}
}
WRITE_REGISTER(INDEX, EP0_IDX);
if (gEp0Status.bEpState != EP_STALL)
{
WRITE_REGISTER(E0CSR, (rbSOPRDY |rbDATAEND));
}
}
void SetFeature(void)
{
if ((gDeviceStatus.bDevState != DEV_CONFIGURED) ||
(gSetup.bmRequestType == IN_DEVICE) ||
(gSetup.bmRequestType == IN_INTERFACE) ||
gSetup.wValue.c[MSB] || gSetup.wIndex.c[MSB] ||
gSetup.wLength.c[MSB] || gSetup.wLength.c[LSB])
{
ForceStall();
}
else
{
if ((gSetup.bmRequestType == IN_ENDPOINT) &&
(gSetup.wValue.c[LSB] == ENDPOINT_HALT) &&
((gSetup.wIndex.c[LSB] == IN_EP1) ||
(gSetup.wIndex.c[LSB] == OUT_EP2)))
{
if (gSetup.wIndex.c[LSB] == IN_EP1)
{
WRITE_REGISTER(INDEX, EP1_IN_IDX);
WRITE_REGISTER(EINCSRL, rbInSDSTL);
gEp1InStatus.bEpState = EP_HALT;
}
else
{
WRITE_REGISTER(INDEX, EP2_OUT_IDX);
WRITE_REGISTER(EINCSRL, rbOutSDSTL);
gEp2OutStatus.bEpState = EP_HALT;
}
}
else
{
ForceStall();
}
}
WRITE_REGISTER(INDEX, EP0_IDX);
if (gEp0Status.bEpState != EP_STALL)
{
WRITE_REGISTER(E0CSR, (rbSOPRDY |rbDATAEND));
}
}
void SetAddress(void)
{
if ((gSetup.bmRequestType != IN_DEVICE) ||
gSetup.wIndex.c[MSB] || gSetup.wIndex.c[LSB] ||
gSetup.wLength.c[MSB] || gSetup.wLength.c[LSB] ||
gSetup.wValue.c[MSB] || (gSetup.wValue.c[LSB] & 0x80))
{
ForceStall();
}
gEp0Status.bEpState = EP_ADDRESS;
if (gSetup.wValue.c[LSB] != 0)
{
gDeviceStatus.bDevState = DEV_ADDRESS;
}
else
{
gDeviceStatus.bDevState = DEV_DEFAULT;
}
if (gEp0Status.bEpState != EP_STALL)
{
WRITE_REGISTER(E0CSR, (rbSOPRDY | rbDATAEND));
}
}
void GetDescriptor(void)
{
switch(gSetup.wValue.c[MSB])
{
case DSC_DEVICE:
gEp0Status.pData = (BYTE *)&gDevice_Desc;
gEp0Status.uNumBytes = gDevice_Desc.bLength;
break;
case DSC_CONFIG:
gEp0Status.pData = (BYTE *)&gConfig_Desc;
gEp0Status.uNumBytes = gConfig_Desc.wTotalLength.c[MSB] + 256*gConfig_Desc.wTotalLength.c[LSB];
break;
case DSC_INTERFACE:
gEp0Status.pData = (BYTE *)&gInterface_Desc;
gEp0Status.uNumBytes = gInterface_Desc.bLength;
case DSC_ENDPOINT:
if ((gSetup.wValue.c[LSB] == IN_EP1) ||
(gSetup.wValue.c[LSB] == OUT_EP2))
{
if (gSetup.wValue.c[LSB] == IN_EP1)
{
gEp0Status.pData = (BYTE *)&gEndpoint1_Desc;
gEp0Status.uNumBytes = gEndpoint1_Desc.bLength;
}
else
{
gEp0Status.pData = (BYTE *)&gEndpoint2_Desc;
gEp0Status.uNumBytes = gEndpoint2_Desc.bLength;
}
}
else
{
ForceStall();
}
break;
default:
ForceStall();
break;
}
if (gSetup.wValue.c[MSB] == DSC_DEVICE ||
gSetup.wValue.c[MSB] == DSC_CONFIG ||
gSetup.wValue.c[MSB] == DSC_INTERFACE ||
gSetup.wValue.c[MSB] == DSC_ENDPOINT)
{
if ((gSetup.wLength.c[LSB] < gEp0Status.uNumBytes) &&
(gSetup.wLength.c[MSB] == 0))
{
gEp0Status.uNumBytes = gSetup.wLength.i;
}
}
if (gEp0Status.bEpState != EP_STALL)
{
WRITE_REGISTER(E0CSR, rbSOPRDY);
gEp0Status.bEpState = EP_TX;
}
}
void GetConfiguration(void)
{
if ((gSetup.bmRequestType != OUT_DEVICE) ||
gSetup.wValue.c[MSB] || gSetup.wValue.c[LSB] ||
gSetup.wIndex.c[MSB] || gSetup.wIndex.c[LSB] ||
gSetup.wLength.c[MSB] || (gSetup.wLength.c[LSB] != 1))
{
ForceStall();
}
else
{
if (gDeviceStatus.bDevState == DEV_CONFIGURED)
{
gEp0Status.pData = (BYTE *)&ONES_PACKET;
gEp0Status.uNumBytes = 1;
}
if (gDeviceStatus.bDevState == DEV_ADDRESS)
{
gEp0Status.pData = (BYTE *)&ZERO_PACKET;
gEp0Status.uNumBytes = 1;
}
}
if (gEp0Status.bEpState != EP_STALL)
{
WRITE_REGISTER(E0CSR, rbSOPRDY);
gEp0Status.bEpState = EP_TX;
}
}
void SetConfiguration(void)
{
if ((gDeviceStatus.bDevState == DEV_DEFAULT) ||
(gSetup.bmRequestType != IN_DEVICE) ||
gSetup.wIndex.c[MSB] || gSetup.wIndex.c[LSB] ||
gSetup.wLength.c[MSB] || gSetup.wLength.c[LSB] ||
gSetup.wValue.c[MSB] || (gSetup.wValue.c[LSB] > 1))
{
ForceStall();
}
else
{
if (gSetup.wValue.c[LSB] > 0)
{
gDeviceStatus.bDevState = DEV_CONFIGURED;
gEp1InStatus.bEpState = EP_IDLE;
gEp2OutStatus.bEpState = EP_IDLE;
WRITE_REGISTER(INDEX, EP1_IN_IDX);
WRITE_REGISTER(EINCSRH, rbInDIRSEL);
WRITE_REGISTER(INDEX, EP0_IDX);
}
else
{
gDeviceStatus.bDevState = DEV_ADDRESS;
gEp1InStatus.bEpState = EP_HALT;
gEp2OutStatus.bEpState = EP_HALT;
}
}
if (gEp0Status.bEpState != EP_STALL)
{
WRITE_REGISTER(E0CSR, (rbSOPRDY | rbDATAEND));
}
}
void GetInterface(void)
{
if ((gDeviceStatus.bDevState != DEV_CONFIGURED) ||
(gSetup.bmRequestType != OUT_INTERFACE) ||
gSetup.wValue.c[MSB] || gSetup.wValue.c[LSB] ||
gSetup.wIndex.c[MSB] || gSetup.wIndex.c[LSB] ||
gSetup.wLength.c[MSB] || (gSetup.wLength.c[LSB] != 1))
{
ForceStall();
}
else
{
gEp0Status.pData = (BYTE *)&ZERO_PACKET;
gEp0Status.uNumBytes = 1;
}
if (gEp0Status.bEpState != EP_STALL)
{
WRITE_REGISTER(E0CSR, rbSOPRDY);
gEp0Status.bEpState = EP_TX;
}
}
void SetInterface(void)
{
if ((gSetup.bmRequestType != IN_INTERFACE) ||
gSetup.wLength.c[MSB] || gSetup.wLength.c[LSB] ||
gSetup.wValue.c[MSB] || gSetup.wValue.c[LSB] ||
gSetup.wIndex.c[MSB] || gSetup.wIndex.c[LSB])
{
ForceStall();
}
if (gEp0Status.bEpState != EP_STALL)
{
WRITE_REGISTER(E0CSR, (rbSOPRDY | rbDATAEND));
}
}
void ForceStall(void)
{
WRITE_REGISTER(INDEX, EP0_IDX);
WRITE_REGISTER(E0CSR, rbSDSTL);
gEp0Status.bEpState = EP_STALL;
}
//----------------------------------------------------
//Low-level FIFO function
//----------------------------------------------------
void FIFORead(BYTE bEp, UINT uNumBytes, BYTE * pData)
{
BYTE bTargetReg;
UINT i;
if (uNumBytes)
{
bTargetReg = bEp;
USB0ADR = (bTargetReg & 0x3F);
USB0ADR |= 0xC0; // auto read and initiate
for (i=0; i<(uNumBytes-1); i++)
{
while(USB0ADR & 0x80);
pData[i] = USB0DAT;
}
USB0ADR = (bTargetReg & 0xBF); // clear auto-read
while(USB0ADR & 0x80);
pData[i] = USB0DAT; // read the last byte
}
}
void FIFOWrite(BYTE bEp, UINT uNumBytes, BYTE * pData)
{
BYTE bTargetReg;
UINT i;
if (uNumBytes)
{
bTargetReg = bEp;
while(USB0ADR & 0x80);
USB0ADR = (bTargetReg & 0x3F);
for (i=0; i<uNumBytes; i++)
{
while(USB0ADR & 0x80);
USB0DAT = pData[i];
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -