📄 usbimpl.c
字号:
if (type == USB_STANDARD_REQUEST)
(*StandardDeviceRequest[req])();
#ifdef _HID_DEVICE
else if (type == USB_CLASS_REQUEST //class request & receive is interface
&& ControlData.DevRequest.bmRequestType&0x1)
(*HidDeviceReuest[req])();
#endif //_HID_DEVICE
else if (type == USB_VENDOR_REQUEST)
(*VendorDeviceRequest[req])();
else
stall_ep0();
}
/*
//*************************************************************************
// USB standard device requests
//*************************************************************************
*/
void get_status(void)
{
//send 2B to pc
u8 endp, txdat[2];
u8 bRecipient = ControlData.DevRequest.bmRequestType & USB_RECIPIENT;
u8 c;
// PRINT("get_status ");
if (bRecipient == USB_RECIPIENT_DEVICE)
{
// if(bEppflags.flags.remote_wakeup == 1)
// txdat[0] = 3;
// else
// txdat[0] = 1;
txdat[0] = 0; //bus power, don't support remote wakeup
txdat[1]=0;
single_transmit(txdat, 2);
}
else if (bRecipient == USB_RECIPIENT_INTERFACE)
{
txdat[0]=0;
txdat[1]=0;
single_transmit(txdat, 2);
}
else if (bRecipient == USB_RECIPIENT_ENDPOINT)
{
endp = (u8)(ControlData.DevRequest.wIndex & MAX_ENDPOINTS);
if (ControlData.DevRequest.wIndex & USB_ENDPOINT_DIRECTION_MASK)
c = D12_SelectEndpoint(endp*2 + 1); // Control-in
else
c = D12_SelectEndpoint(endp*2); // Control-out
if(c & D12_STALL)
txdat[0] = 1; //ep stall
else
txdat[0] = 0; //ep work
txdat[1] = 0;
single_transmit(txdat, 2);
}
else
stall_ep0();
}
void clear_feature(void)
{
u8 endp;
u8 bRecipient = ControlData.DevRequest.bmRequestType & USB_RECIPIENT;
// PRINT("clear_feature ");
if (bRecipient == USB_RECIPIENT_DEVICE
&& ControlData.DevRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
{
// DISABLE_INTERRUPT;
// bEppflags.flags.remote_wakeup = 0;
// ENABLE_INTERRUPT;
single_transmit(0, 0);
}
else if (bRecipient == USB_RECIPIENT_ENDPOINT
&& ControlData.DevRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
{
endp = (u8)(ControlData.DevRequest.wIndex & MAX_ENDPOINTS);
if (ControlData.DevRequest.wIndex & (u8)USB_ENDPOINT_DIRECTION_MASK)
/* clear TX stall for IN on EPn. */
D12_SetEndpointStatus(endp*2 + 1, 0);
else
/* clear RX stall for OUT on EPn. */
D12_SetEndpointStatus(endp*2, 0);
single_transmit(0, 0);
}
else
stall_ep0();
}
void set_feature(void)
{
u8 endp;
u8 bRecipient = ControlData.DevRequest.bmRequestType & USB_RECIPIENT;
// PRINT("set_feature ");
if (bRecipient == USB_RECIPIENT_DEVICE
&& ControlData.DevRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
{
// DISABLE_INTERRUPT;
// bEppflags.flags.remote_wakeup = 1;
// ENABLE_INTERRUPT;
single_transmit(0, 0);
}
else if (bRecipient == USB_RECIPIENT_ENDPOINT
&& ControlData.DevRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
{
endp = (u8)(ControlData.DevRequest.wIndex & MAX_ENDPOINTS);
if (ControlData.DevRequest.wIndex & (u8)USB_ENDPOINT_DIRECTION_MASK)
/* clear TX stall for IN on EPn. */
D12_SetEndpointStatus(endp*2 + 1, 1);
else
/* clear RX stall for OUT on EPn. */
D12_SetEndpointStatus(endp*2, 1);
single_transmit(0, 0);
}
else
stall_ep0();
}
void set_address(void)
{
PRINT("set_address ");
D12_SetAddressEnable((u8)(ControlData.DevRequest.wValue &
DEVICE_ADDRESS_MASK), 1);
single_transmit(0, 0);
}
void get_descriptor(void)
{
u8 bDescriptor = ControlData.DevRequest.wValue>>8;
// PRINT("get_descriptor:");
if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE)
{
PRINT("device ");
code_transmit((u8 code *)&DeviceDescr, sizeof(DEVICE_DESCRIPTOR));
}
else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE)
{
PRINT("Config ");
code_transmit((u8 code *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
}
else if (bDescriptor == USB_INTERFACE_DESCRIPTOR_TYPE)
{
PRINT("interface ");
code_transmit((u8 code *)&InterfaceDescr, sizeof(INTERFACE_DESCRIPTOR));
}
#ifdef _HID_DEVICE
else if (bDescriptor == USB_HID_DESCRIPTOR_TYPE)
{
PRINT("hid ");
code_transmit((u8 code *)&HidDescr, sizeof(HID_DESCRIPTOR));
}
else if (bDescriptor == USB_REPORT_DESCRIPTOR_TYPE)
{
PRINT("report ");
code_transmit((u8 code *)szHidReport, 0x34);
}
#endif //_HID_DEVICE
else if(bDescriptor == USB_STRING_DESCRIPTOR_TYPE) //获取字符描述符
{
PRINT("string");
switch(LSB(ControlData.DevRequest.wValue)) //获取描述符索引
{
case 0:
PRINT("0 ");
code_transmit((u8 code *)&StringLANGID, StringLANGID[0]);
break;
case 1:
PRINT("1 ");
code_transmit((u8 code *)&szManufacturer, szManufacturer[0]);
break;
case 2:
PRINT("2 ");
code_transmit((u8 code *)&szProduct, szProduct[0]);
break;
case 3:
PRINT("3 ");
code_transmit((u8 code *)&szSerialNumber, szSerialNumber[0]);
break;
case 4:
PRINT("4 ");
code_transmit((u8 code *)&szConfiguration, szConfiguration[0]);
break;
case 5:
PRINT("5 ");
code_transmit((u8 code *)&szInterface, szInterface[0]);
break;
case 6:
PRINT("6 ");
code_transmit((u8 code *)&szUserInfo, szUserInfo[0]);
break;
default:
PRINT("default ");
code_transmit((u8 code *)&StringLANGID, 4);
break;
}
}
else
{
stall_ep0();
}
}
void get_configuration(void)
{
u8 c = bEppflags.flags.config;
// PRINT("get_config ");
single_transmit(&c, 1);
}
void set_configuration(void)
{
PRINT("set_config ");
if (ControlData.DevRequest.wValue == 0)
{
/* put device in unconfigured state */
single_transmit(0, 0);
DISABLE_INTERRUPT;
bEppflags.flags.config = 0;
ENABLE_INTERRUPT;
init_unconfig();
}
else if (ControlData.DevRequest.wValue == 1)
{
/* Configure device */
single_transmit(0, 0);
init_unconfig();
init_config();
DISABLE_INTERRUPT;
bEppflags.flags.config = 1;
ENABLE_INTERRUPT;
} else
stall_ep0();
}
void get_interface(void)
{
u8 txdat = 0; /* Only/Current interface = 0 */
// PRINT("get_interface ");
single_transmit(&txdat, 1);
}
void set_interface(void)
{
PRINT("set_interface ");
if (ControlData.DevRequest.wValue == 0
&& ControlData.DevRequest.wIndex == 0)
single_transmit(0, 0);
else
stall_ep0();
}
///////////////////////////////////////////////////////////////
// follow is custom request, read_write_register commmand code is 0xC
/*
void get_firmware_version()
{
u8 i = 0x1;
PRINT("get_firmware_version");
D12_WriteEndpointBuffer(1, &i, 1);
}
void get_buffer_size()
{
u8 i[4] = {0, 0, 0, 0};
PRINT("get_buffer_size");
i[0] = EP1_PACKET_SIZE;
D12_WriteEndpointBuffer(1, i, 4);
}
void trans_data()
{
u8 len, epstatus;
PRINT("trans_data");
if (ControlData.buffer[5] == 0x81)
{
//device to pc
D12_WriteEndpointBuffer(3, Ep1Buf, ControlData.buffer[3]);
}
if (ControlData.buffer[5] == 0x80)
{
epstatus = D12_ReadEndpointStatus(2);
epstatus &= 0x60;
if (epstatus == 0x60)
len = D12_ReadEndpointBuffer(4, Ep1Buf, EP1_PACKET_SIZE);
}
single_transmit(0, 0);
}
*/
//custom request
void read_write_register()
{
// u8 i, len, epstatus;
/*
PRINT("read_write_register");
if (ControlData.DevRequest.bmRequestType & (u8)USB_ENDPOINT_DIRECTION_MASK)
{
if (ControlData.DevRequest.wIndex == GET_FIRMWARE_VERSION
&& ControlData.DevRequest.wValue == 0
&& ControlData.DevRequest.wLength == 1)
get_firmware_version(); //get firmware version, transform 1byte
else if (ControlData.DevRequest.wIndex == GET_BUFFER_SIZE
&& ControlData.DevRequest.wValue == 0
&& ControlData.DevRequest.wLength == 4)
get_buffer_size(); //get buffer size, transform 4 bytes
else
stall_ep0();
}
else
{
if (ControlData.DevRequest.wIndex == TRANS_REQUEST
&& ControlData.DevRequest.wValue == 0
&& ControlData.DevRequest.wLength == 6)
trans_data(); //transform data, 6 bytes
else
stall_ep0();
}
*/
}
//////////////////////////////////////////////////////////
//follow code is used for hid device
#ifdef _HID_DEVICE
void get_report()
{
PRINT("get_report ");
code_transmit(szHidReport, 52);
}
void get_idle()
{
PRINT("get_idle ");
}
void get_protocol()
{
PRINT("get_idle ");
}
void set_report()
{
PRINT("set_report ");
}
void set_idle()
{
PRINT("set_idle ");
stall_ep0();
}
void set_protocol()
{
PRINT("set_protocol ");
}
#endif //_HID_DEVICE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -