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

📄 usb.c

📁 Philips PIDUSBP11 驱动代码
💻 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 + -