📄 usb.c
字号:
//===================================================================//
// Augest, 25, 2002 The Last Modified Date
// Modified by Dai LiZHou, HIT (dailizhou@0451.com)
//===================================================================//
#include "AvrUsb.H"
#include <string.h>
extern AVRUSBFLAGS bAvrUsbFlags;
/*
//*************************************************************************
// USB protocol function pointer arrays
//*************************************************************************
*/
void (* const StandardDeviceRequest[])(void) =
{
USBClassRequest_GetStatus, // 0
USBClassRequest_ClearFeature, // 1
reserved, // 2
USBClassRequest_SetFeature, // 3
reserved, // 4
USBClassRequest_SetAddress, // 5
USBClassRequest_GetDescriptor, // 6
reserved, // 7
USBClassRequest_GetConfiguration, // 8
USBClassRequest_SetConfiguration, // 9
USBClassRequest_GetInterface, // 10
USBClassRequest_SetInterface, // 12
reserved,
reserved,
reserved,
reserved
};
void (* const VendorDeviceRequest[])(void) =
{
reserved,//USBVendorRequest_WriteCode,
reserved,//USBVendorRequest_ReadCode,
reserved,
reserved,//USBVendorRequest_GetFlashPhase,
reserved,//USBVendorRequest_GetCodeData,
reserved,
USBVendorRequest_LEDON,
USBVendorRequest_LEDOFF,
USBVendorRequest_LEDFlash,
reserved,
reserved,
reserved,
reserved, // Upper...
reserved,
reserved,
reserved
};
/*
//*************************************************************************
// Public static data
//*************************************************************************
*/
extern unsigned long lClockTicks;
CONTROL_XFER ControlData;
/* Functions */
void USB_Suspend_Change(void)
{
}
void USB_Stall_EP0(void)
{
USBD12_SetEndpointStatus(0, 1);
USBD12_SetEndpointStatus(1, 1);
}
void USB_Disconnect(void)
{
CLI();
// Initialize D12 configuration
USBD12_SetMode(USBD12_NOLAZYCLOCK | USBD12_CLOCKRUNNING,
USBD12_SETTOONE | USBD12_CLOCK_12M);
}
void USB_Connect(void)
{
// reset event flags
DISABLE_INTERRUPTS;
bAvrUsbFlags.nValue = 0;
// ENABLE_INTERRUPTS;
USBD12_SetEndpointStatus(2, 0);
USBD12_SetEndpointStatus(3, 0);
USBD12_SetEndpointStatus(4, 0);
USBD12_SetEndpointStatus(5, 0);
// V2.1 enable normal+sof interrupt
USBD12_SetDMA(USBD12_ENDP4INTENABLE | USBD12_ENDP5INTENABLE);
// Initialize D12 configuration
USBD12_SetMode(USBD12_NOLAZYCLOCK |
USBD12_CLOCKRUNNING |
USBD12_SOFTCONNECT,
USBD12_SETTOONE |USBD12_CLOCK_4M);
SEI();
}
void USB_Reconnect(void)
{
unsigned long lClockCount;
bAvrUsbFlags.bits.bIN_ISR = 1;
USB_ClearAllInts();
USB_Disconnect();
Delay(0xff);
ENABLE_INTERRUPTS;
lClockCount = lClockTicks;
while(lClockTicks < lClockCount + 20);
DISABLE_INTERRUPTS;
USB_Connect();
bAvrUsbFlags.bits.bIN_ISR = 0;
}
void USB_Init_Unconfig(void)
{
USBD12_SetEndpointEnable(0); /* Disable all endpoints but EPP0. */
}
void USB_Init_Config(void)
{
USBD12_SetEndpointEnable(1); /* Enable generic/iso endpoints. */
}
void USB_Single_Transmit(unsigned char* pBuf, unsigned char nLen)
{
if(nLen <= EP0_PACKET_SIZE)
{
USBD12_WriteEndpoint(1, pBuf, nLen);
}
}
void USB_Code_Transmit(const 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)
{
USBD12_WriteEndpointRom(1, pRomData, EP0_PACKET_SIZE);
ControlData.wCount += EP0_PACKET_SIZE;
DISABLE_INTERRUPTS;
bAvrUsbFlags.bits.bControl_State = USB_TRANSMIT;
ENABLE_INTERRUPTS;
}
else
{
USBD12_WriteEndpointRom(1, pRomData, ControlData.wLength);
ControlData.wCount += ControlData.wLength;
DISABLE_INTERRUPTS;
bAvrUsbFlags.bits.bControl_State = USB_IDLE;
ENABLE_INTERRUPTS;
}
}
void USB_Control_Handler(void)
{
unsigned char nType, nReq;
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
{
USB_Stall_EP0();
}
}
void USB_ClearAllInts(void)
{
USBD12_ReadInterruptRegister();
USBD12_ReadLastTransactionStatus(0);
USBD12_ReadLastTransactionStatus(1);
USBD12_ReadLastTransactionStatus(2);
USBD12_ReadLastTransactionStatus(3);
USBD12_ReadLastTransactionStatus(4);
USBD12_ReadLastTransactionStatus(5);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -