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

📄 mainloop.c

📁 關於USB鼠標
💻 C
字号:
///////////////////////////////////////////////////////////////////////
#include "Common.h"
#include "Hal4Sys.h"
#include "Hal4d12.h"
#include "mainloop.h"
#include "chap_9.h"
#include "d12_hal.h"
#include "conio.h"
///////////////////////////////////////////////////////////////////////

void usb_isr(void);

DEVICE_REQUEST setup_pkt;
u8 UsbReq_Recipient;
u8 UsbReq_Type;
u8 UsbReq_Request;
u8 UsbReq_Dir;
u8 UsbReq_Ep_Dir;

///////////////////////////////////////////////////////////////////////
void (*std_handler[])(void) =
{
	Chap9_GetStatus,
	Chap9_ClearFeature,
	Hal4D12_StallEP0,
	Chap9_SetFeature,
	Hal4D12_StallEP0,
	Chap9_SetAddress,
	Chap9_GetDescriptor,
	Hal4D12_StallEP0,
	Chap9_GetConfiguration,
	Chap9_SetConfiguration,
	Chap9_GetInterface,
	Chap9_SetInterface,
};

void (*class_handler[])(void) =
{
	HID_GetReport,
	HID_GetIDLE,
	HID_GetProtocol,
	HID_SetReport,
	HID_SetIDLE,
	HID_SetProtocol
};

///////////////////////////////////////////////////////////////////////
void usb_main(void)
{   
	u8 exit_flag=0;
	u8 s[16]={0,0,0,0};

	printf("Starting...\n");
	printf("PDIUSBD12 test...\n");
	if(Hal4D12_ReadChipID()==0x1210)
		printf(" PDIUSBD12 found, ChipID=%04x\n",Hal4D12_ReadChipID());
	else
	{
		printf(" No PDIUSBD12 found.\n");
		return;
	}

    Hal4Sys_InitD12();
    usb_reconnect();
	ep0_state = ST_IDLE;

   	// Connect to USB Host
	printf("\nEnter main loop ...Press Enter/Space to exit\n");

    while(!exit_flag)
    {
		////////////////////////////////////////////
		if(s[0]!=0)
		{
			s[0]=0x00; s[1]=0; s[2]=0; s[3]=0;
			Hal4D12_ReadLastTransactionStatus(3);
			Hal4D12_WriteEndpoint(3,4,s);
		}
		if(kbhit())
		{
			switch(getch())
			{
			case '\n':
			case '\r':
			case ' ':
				exit_flag=1;
				break;
			case 0x00:    // BC31 ArrowKey
			case 0xe0:    // VC60 ArrowKey
				switch(getch())
				{
				case 0x4b: // Left Arrow Key
					s[0]=0x00; s[1]=-10; s[2]=0; s[3]=0;
					break;
				case 0x48: // Up Arrow Key
					s[0]=0x00; s[1]=0; s[2]=-10; s[3]=0;
					break;
				case 0x4d: // Right Arrow Key
					s[0]=0x00; s[1]=10; s[2]=0; s[3]=0;
					break;
				case 0x50: // Down Arrow Key
					s[0]=0x00; s[1]=0; s[2]=10; s[3]=0;
					break;
				case 0x53: // Delete Key
					s[0]=0x01; s[1]=0; s[2]=0; s[3]=0;
					break;
				case 0x51: // End Key
					s[0]=0x02; s[1]=0; s[2]=0; s[3]=0;
					break;
				case 0x4f: // PageDown Key
					s[0]=0x04; s[1]=0; s[2]=0; s[3]=0;
					break;
				default:
					break;
				}
				Hal4D12_ReadLastTransactionStatus(3);
				Hal4D12_WriteEndpoint(3,4,s);
				delay_ms(50);
				break;
			default:
				break;
			}
		}
		////////////////////////////////////////////
        if(D12_INT()==0)
           usb_isr();

        if (ep0_state==ST_SETUP)
			setup_handler();
	}

	usb_disconnect();
}

///////////////////////////////////////////////////////////////////////
void usb_disconnect(void)
{
	Hal4D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_4M);
}

///////////////////////////////////////////////////////////////////////
void usb_connect(void)
{
	Hal4D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_4M);
}

///////////////////////////////////////////////////////////////////////
void usb_reconnect(void)
{
    usb_disconnect();
    delay_ms(1000);
	usb_connect();
}

///////////////////////////////////////////////////////////////////////
void setup_handler(void)
{
	u8 len;

    len = Hal4D12_ReadEndpoint(0, sizeof(DEVICE_REQUEST),(u8 *)(&(setup_pkt)));
	
	if(len != sizeof(DEVICE_REQUEST))
	{
		Hal4D12_StallEP0();
		return;
	}
	
	UsbReq_Dir=(setup_pkt.bmRequestType & 0x80)?1:0;
	UsbReq_Ep_Dir=(setup_pkt.wIndex & 0x80)?1:0;
	
	UsbReq_Recipient = setup_pkt.bmRequestType & USB_RECIPIENT;
	UsbReq_Type      = setup_pkt.bmRequestType & USB_REQUEST_TYPE_MASK;
	UsbReq_Request   = setup_pkt.bRequest & USB_REQUEST_MASK;
	
	if ( UsbReq_Dir || (setup_pkt.wLength == 0))
		Hal4D12_AcknowledgeSETUP();
	
	if (UsbReq_Type == USB_STANDARD_REQUEST)
	{
		if(UsbReq_Request<MAX_STD_REQUEST)
			(*std_handler[UsbReq_Request])();
	}
	else if(UsbReq_Type == USB_CLASS_REQUEST)
	{
		if(UsbReq_Request>0x03)
			UsbReq_Request-=0x05;
		(*class_handler[UsbReq_Request-1])();
	}
	else
	{
		ep0_state = ST_STALL;
		Hal4D12_StallEP0();
		return;
	}
	
	if ((!UsbReq_Dir) && (setup_pkt.wLength != 0))
		Hal4D12_AcknowledgeSETUP();

}
///////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -