📄 chap_9.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 + -