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

📄 chap_9.c

📁 關於USB鼠標
💻 C
字号:
///////////////////////////////////////////////////////////////////////

#include "common.h"
#include "hal4Sys.h"
#include "hal4d12.h"
#include "mainloop.h"
#include "chap_9.h"

//#include "ds_ms_kb.h"	
#include "descp_ms.h"
///////////////////////////////////////////////////////////////////////

u8 Slave_IdleRate=0;
u8 Slave_Protocol=0;

extern DEVICE_REQUEST setup_pkt;
extern u8 UsbReq_Recipient;
extern u8 UsbReq_Type;
extern u8 UsbReq_Request;

extern u8 UsbReq_Dir;
extern u8 UsbReq_Ep_Dir;

extern u16 ep0_buf_len;
extern u8 *ep0_buf_pt;

///////////////////////////////////////////////////////////////////////
void Chap9_SetAddress(void)
{
    Hal4D12_SetAddressEnable((u8)(setup_pkt.wValue &
	    DEVICE_ADDRESS_MASK), 1);
    Chap9sup_SingleTransmitEP0(0,0);
}

///////////////////////////////////////////////////////////////////////
void Chap9_GetInterface(void)
{
	u8 tmp=0;
    Chap9sup_SingleTransmitEP0(&tmp,1);
}

///////////////////////////////////////////////////////////////////////
void Chap9_SetInterface(void)
{
	Chap9sup_SingleTransmitEP0(0,0);
}

///////////////////////////////////////////////////////////////////////
void Chap9_GetConfiguration(void)
{
	u8 tmp=1;
    Chap9sup_SingleTransmitEP0(&tmp,1);
}

///////////////////////////////////////////////////////////////////////
void Chap9_SetConfiguration(void)
{
    Hal4D12_SetEndpointEnable(1);
	Chap9sup_SingleTransmitEP0(0,0);
}

///////////////////////////////////////////////////////////////////////
void Chap9_GetStatus(void)
{
	u8 s[2];

	switch(UsbReq_Recipient)
	{
	case USB_RECIPIENT_DEVICE:
	case USB_RECIPIENT_INTERFACE:
	case USB_RECIPIENT_ENDPOINT:
		s[0]=0; s[1]=0;
		break;
	default:
		ep0_state = ST_STALL;
		return;
	}
	
	Chap9sup_SingleTransmitEP0(s,2);
}

///////////////////////////////////////////////////////////////////////
void Chap9_ClearFeature(void)
{
	switch(UsbReq_Recipient)
	{
	case USB_RECIPIENT_DEVICE:
	case USB_RECIPIENT_ENDPOINT:
		break;
		
	default:
		ep0_state = ST_STALL;
		return;
	}
	
	Chap9sup_SingleTransmitEP0(0,0);
}

///////////////////////////////////////////////////////////////////////
void Chap9_SetFeature(void)
{
	switch(UsbReq_Recipient)
	{
	case USB_RECIPIENT_DEVICE:
		if(setup_pkt.wValue == 1) // USB_FEATURE_REMOTE_WAKEUP
			ep0_state = ST_STALL;
		break;
		
	case USB_RECIPIENT_ENDPOINT:
		if( setup_pkt.wValue == 0) // USB_FEATURE_ENDPOINT_STALL
		{
			if (UsbReq_Ep_Dir)
			{
				Hal4D12_SetEndpointStatus((setup_pkt.wIndex<<1)+1, 1);
			}
			else
			{
				Hal4D12_SetEndpointStatus((setup_pkt.wIndex<<1), 1);
			}
		}
		else
			ep0_state = ST_STALL;
		break;
		
	default:
		ep0_state = ST_STALL;
		break;
	}

    if(ep0_state != ST_STALL)
        Chap9sup_SingleTransmitEP0(0,0);
}

///////////////////////////////////////////////////////////////////////
void Chap9_GetDescriptor(void)
{
	u8 desc_type;   // descriptor type
	u8 desc_idx;    // descriptor index
	u8 desc_if;     // interface number

	desc_type=(u8)(setup_pkt.wValue>>8); 
	desc_idx =(u8)(setup_pkt.wValue&0xff);
	desc_if  =(u8)setup_pkt.wIndex;

	ep0_state=ST_IDLE;

	printf("Get Descriptor:%02x,%02x\n",desc_type,desc_idx);

    switch(desc_type)
    {
    case USB_DEVICE_DESCRIPTOR_TYPE:
        ep0_buf_len = DEV_LEN;
	    ep0_buf_pt  = Dev_Descp;
        break;
    case USB_CONFIGURATION_DESCRIPTOR_TYPE:
        ep0_buf_len = CFG_LEN;
	    ep0_buf_pt  = Cfg_Descp;
        break;
    case USB_STRING_DESCRIPTOR_TYPE:
        switch(desc_idx)
        {
        case STR_INDEX_LANGUAGE:
        	ep0_buf_len = LangString[0];
	        ep0_buf_pt  = LangString;
            break;
        case STR_INDEX_MANUFACTURER:
       	    ep0_buf_len = MfgString[0];
	        ep0_buf_pt  = MfgString;
            break;
        case STR_INDEX_PRODUCT:
           	ep0_buf_len = ProdString[0];
	        ep0_buf_pt  = ProdString;
            break;
        default:
            ep0_state = ST_STALL;
            break;
        }
        break;
	////////////////////////////////////////
	case USB_HID_DEV_TYPE:
		ep0_buf_len = HID_LEN;
		switch(desc_if)
		{
		case 0:
			ep0_buf_pt  = Cfg_Descp+18;
			break;
		case 1:
			ep0_buf_pt  = Cfg_Descp+43;
			break;
		default:
			ep0_state = ST_STALL;
			break;
		}
		break;
	case USB_HID_REPORT_TYPE:
		switch(desc_if)
		{
		case 0:
			ep0_buf_len = REP_LEN;
			ep0_buf_pt  = Rep_Descp;
			break;
		//case 1:
		//	ep0_buf_len = REP_LEN1;
		//	ep0_buf_pt  = Rep_Descp1;
		//	break;
		default:
			ep0_state = ST_STALL;
			break;
		}
		break;
	////////////////////////////////////////
    default:
        ep0_state = ST_STALL;
        break;
    }

	if(ep0_buf_len>setup_pkt.wLength)
		ep0_buf_len=setup_pkt.wLength;

	show_buf("Desc:",ep0_buf_pt,ep0_buf_len);

    if(ep0_state != ST_STALL)
        Chap9sup_BurstTransmitEP0();
}

///////////////////////////////////////////////////////////////////////
void Chap9sup_SingleTransmitEP0(u8 * buf, u8 len)
{
    ep0_buf_len = len;
    if(ep0_buf_len == 0)
        ep0_state = ST_HANDOUT;
    else
        ep0_state = ST_HANDIN;

    Hal4D12_SingleTransmitEP0(buf, len);
}

///////////////////////////////////////////////////////////////////////
void Chap9sup_BurstTransmitEP0( void )
{
    if(ep0_buf_len > setup_pkt.wLength)
        ep0_buf_len = setup_pkt.wLength;

	if( ep0_buf_len >= EP0_PACKET_SIZE)
    {
        Hal4D12_WriteEndpoint(1, EP0_PACKET_SIZE, ep0_buf_pt);
		ep0_buf_pt += EP0_PACKET_SIZE;
		ep0_buf_len -= EP0_PACKET_SIZE;

		ep0_state = ST_DATAIN;
	}
	else
	{
        Hal4D12_WriteEndpoint(1, (u8)ep0_buf_len, ep0_buf_pt );
		ep0_buf_len = 0;

		ep0_state = ST_HANDIN;
	}
}

///////////////////////////////////////////////////////////////////////
void HID_GetReport(void)
{
}

///////////////////////////////////////////////////////////////////////
void HID_SetReport(void)
{
	Chap9sup_SingleTransmitEP0(0,0);
}

///////////////////////////////////////////////////////////////////////
void HID_GetIDLE(void)
{
    Chap9sup_SingleTransmitEP0(&Slave_IdleRate,1);
}

///////////////////////////////////////////////////////////////////////
void HID_SetIDLE(void)
{
	Chap9sup_SingleTransmitEP0(0,0);
}

///////////////////////////////////////////////////////////////////////
void HID_GetProtocol(void)
{
    Chap9sup_SingleTransmitEP0(&Slave_Protocol,1);
}

///////////////////////////////////////////////////////////////////////
void HID_SetProtocol(void)
{
	Chap9sup_SingleTransmitEP0(0,0);
}
///////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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