📄 usb.c
字号:
/************************************************************************
*File : Usb.c *
*By : hugang, hgx2000@mail.china.com *
************************************************************************/
#include "syslib.h"
#include "armusb.h"
extern ARMUSBFLAGS bUSBFlags;
/**************************************************************************
*USB protocol function pointer arrays
**************************************************************************/
void (* const StandardDeviceRequest[])(void) =
{
UsbClassRequestGetStatus, // 0
UsbClassRequestClearFeature, // 1
reserved, // 2
UsbClassRequestSetFeature, // 3
reserved, // 4
UsbClassRequestSetAddress, // 5
UsbClassRequestGetDescriptor, // 6
reserved, // 7
UsbClassRequestGetConfiguration, // 8
UsbClassRequestSetConfiguration, // 9
UsbClassRequestGetInterface, // 10
UsbClassRequestSetInterface, // 12
reserved,
reserved,
reserved,
reserved
};
void (* const VendorDeviceRequest[])(void) =
{
reserved,//USBVendorRequest_WriteCode,
reserved,//USBVendorRequest_ReadCode,
reserved,
reserved,//USBVendorRequest_GetFlashPhase,
reserved,//USBVendorRequest_GetCodeData,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved, // Upper...
reserved,
reserved,
reserved
};
/**************************************************************************
* Public static data
**************************************************************************/
extern CONTROL_XFER ControlData;
/* Functions */
void UsbSuspendChange(void)
{
UsbClassRequestGetStatus();
}
void UsbStallEp0(void)
{
UsbSetEndpointStatus(0, 1);
UsbSetEndpointStatus(1, 1);
}
void UsbStallEp2(void)
{
UsbSetEndpointStatus(4, 1);
UsbSetEndpointStatus(5, 1);
}
void UsbDisconnect(void)
{
USB_DISABLE_INTERRUPT;
// Initialize D12 configuration
UsbSetMode(USB_D12_NOLAZYCLOCK | USB_D12_CLOCKRUNNING,
USB_D12_SETTOONE | USB_D12_CLOCK_12M);
}
void UsbConnect(void)
{
// reset event flags
USB_DISABLE_INTERRUPT;
bUSBFlags.nValue = 0;
UsbSetEndpointStatus(2, 0);
UsbSetEndpointStatus(3, 0);
UsbSetEndpointStatus(4, 0);
UsbSetEndpointStatus(5, 0);
// V2.1 enable normal+sof interrupt
UsbSetDMA(USB_D12_ENDP4INTENABLE | USB_D12_ENDP5INTENABLE);
// Initialize D12 configuration
UsbSetMode(USB_D12_NOLAZYCLOCK |
USB_D12_CLOCKRUNNING |
USB_D12_SOFTCONNECT,
USB_D12_SETTOONE |USB_D12_CLOCK_12M);
USB_ENABLE_INTERRUPT;
}
void UsbReconnect(void)
{
bUSBFlags.bits.bIn_ISR = 1;
UsbClearAllInts();
UsbDisconnect();
waitms(2);
USB_ENABLE_INTERRUPT;
waitms(9);
USB_DISABLE_INTERRUPT;
UsbConnect();
bUSBFlags.bits.bIn_ISR = 0;
}
void UsbInitUnconfig(void)
{
UsbSetEndpointEnable(0); /* Disable all endpoints but EPP0. */
}
void UsbInitConfig(void)
{
UsbSetEndpointEnable(1); /* Enable generic/iso endpoints. */
}
void UsbSingleTransmit(unsigned char* pBuf, unsigned char nLen)
{
if(nLen <= EP0_PACKET_SIZE)
{
UsbWriteEndpoint(1, pBuf, nLen);
}
}
void UsbCodeTransmit(unsigned char * pRomData, unsigned short nLen)
{
ControlData.wCount = 0;
if(ControlData.wLength > nLen) ControlData.wLength = nLen;
ControlData.pData=pRomData;
if(ControlData.wLength >= EP0_PACKET_SIZE)
{
UsbWriteEndpoint(1, pRomData, EP0_PACKET_SIZE);
ControlData.wCount += EP0_PACKET_SIZE;
if(bUSBFlags.bits.bIn_ISR == 0) USB_DISABLE_INTERRUPT;
bUSBFlags.bits.bControl_State = USB_TRANSMIT;
if(bUSBFlags.bits.bIn_ISR == 0) USB_ENABLE_INTERRUPT;
}
else
{
UsbWriteEndpoint(1, pRomData, ControlData.wLength);
ControlData.wCount += ControlData.wLength;
if(bUSBFlags.bits.bIn_ISR == 0) USB_DISABLE_INTERRUPT;
bUSBFlags.bits.bControl_State = USB_IDLE;
if(bUSBFlags.bits.bIn_ISR == 0) USB_ENABLE_INTERRUPT;
}
}
void UsbControlHandler(void)
{
unsigned char nType, nReq , i=0x00;
nType = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
nReq = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
if (nType == USB_STANDARD_REQUEST)
{
(*StandardDeviceRequest[nReq])();
}
else if (nType == USB_VENDOR_REQUEST)
{
(*VendorDeviceRequest[nReq])();
}
else if (nType == USB_CLASS_REQUEST)
{
if (nReq == USB_CLASS_REQUEST_LUN)
{
UsbWriteEndpoint(1,&i,1);
}
}
else
{
UsbStallEp0();
}
}
void UsbClearAllInts(void)
{
UsbReadInterruptRegister();
UsbReadLastTransactionStatus(0);
UsbReadLastTransactionStatus(1);
UsbReadLastTransactionStatus(2);
UsbReadLastTransactionStatus(3);
UsbReadLastTransactionStatus(4);
UsbReadLastTransactionStatus(5);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -