⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usb.c

📁 avrusb源码
💻 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 + -