TMC32_QJB/USB/USB_enum.c
2026-04-30 16:23:12 +08:00

424 lines
14 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/********************************************************************************
* Copyright (c) 2012, Beijing Tongfang Microelectroics Co., Ltd.
* All rights reserved.
* Module: USB
* Author: Yang Song
* Version: V1.0
* History:
* 2012-09-24 Original version
********************************************************************************/
#include "global.h"
/***************************************************************************
* Const Name : usbDeviceDescriptor
* Description: Device Descriptor for get descriptor standard request
**************************************************************************/
const u8 usbHidKbdDeviceDescriptor[] = { //HID keyboard 设备
0x12, // length
0x01, // Fixed device
0x10,0x01, // USB 1.1
0x00,
0x00,
0x00,
EP0PKTSIZE, // Default max ep0 packet length
//0xE6,0x08, // VID
//0x37,0x34, // CCID PID
0xf1,0x26, // VID
0x01,0x88, // CCID3 PID
0x00,0x01, // Device release number
0x01, // Index of string descriptor describing manufacturer
0x02, // Index of string descriptor describing product
0x03, // Index of string descriptor describing the devices serial number
0x01, // Number of possible configurations
};
const u8 usbHidPosDeviceDescriptor[] = { //HID POS 设备
0x12, // length
0x01, // Fixed device
0x10,0x01, // USB 1.1
0x00,
0x00,
0x00,
EP0PKTSIZE, // Default max ep0 packet length
//0xE6,0x08, // VID
//0x37,0x34, // CCID PID
0xf1,0x26, // VID
0x03,0x88, // CCID3 PID
0x00,0x01, // Device release number
0x01, // Index of string descriptor describing manufacturer
0x02, // Index of string descriptor describing product
0x03, // Index of string descriptor describing the devices serial number
0x01, // Number of possible configurations
};
const u8 usbVspDeviceDescriptor[] = { //虚拟串口
0x12, // length
0x01, // Fixed device
0x10,0x01, // USB 1.1
0x02, // CDC 通信类设备
0x00,
0x00,
EP0PKTSIZE, // Default max ep0 packet length
//0xE6,0x08, // VID
//0x37,0x34, // CCID PID
0xf1,0x26, // VID?
0x02,0x88, // CCID3 PID?
0x00,0x01, // Device release number
0x01, // Index of string descriptor describing manufacturer
0x02, // Index of string descriptor describing product
0x03, // Index of string descriptor describing the devices serial number
0x01, // Number of possible configurations
};
/***************************************************************************
* Const Name : usbConfigDescriptor
* Description: Config Descriptor for get descriptor standard request
**************************************************************************/
const u8 usbHidKbdConfigDescriptor[] = {
0x09, // length
0x02, // Fixed config
HIDKBD_CFG_LEN,0x00,
0x01, // Only support 2 interface by this configuratio
0x01, // Configuration Value is 1
0x00, // Index of string descriptor describing this configuration
0xe0, // support remote wake up
0x32, // 100mA
};
const u8 usbHidPosConfigDescriptor[] = {
0x09, // length
0x02, // Fixed config
HIDPOS_CFG_LEN,0x00,
0x01, // Only support 2 interface by this configuratio
0x01, // Configuration Value is 1
0x00, // Index of string descriptor describing this configuration
0xe0, // support remote wake up
0x32, // 100mA
};
/***************************************************************************
* Const Name : usbManufacturerStringDescriptor
* Description: String Descriptor for get descriptor standard request
**************************************************************************/
const u8 usbManufacturerStringDescriptor[] = {
0x08, // bLength
0x03, // bDescriptorType
0x54,0x00, // T
0x4D,0x00, // M
0x43,0x00, // C
};
/***************************************************************************
* Const Name : usbProductStringDescriptor
* Description: String Descriptor for get descriptor standard request
**************************************************************************/
//const u8 usbProductStringDescriptor[] = {
//0x08,
//0x03,
//0x31,0x00, // 1
//0x32,0x00, // 2
//0x33,0x00, // 3
//};
/***************************************************************************
* Const Name : usbVspProductStringDescriptor
* Description: String Descriptor for get descriptor standard request
**************************************************************************/
const u8 usbVspProductStringDescriptor[] = {
0x36,
0x03,
0x56, 0x00, //V
0x69, 0x00, //i
0x72, 0x00, //r
0x74, 0x00, //t
0x75, 0x00, //u
0x61, 0x00, //a
0x6C, 0x00, //l
0x20, 0x00, //
0x43, 0x00, //C
0x6F, 0x00, //o
0x6D, 0x00, //m
0x50, 0x00, //P
0x6F, 0x00, //o
0x72, 0x00, //r
0x74, 0x00, //t
0x20, 0x00, //
0x69, 0x00, //i
0x6E, 0x00, //n
0x20, 0x00, //
0x46, 0x00, //F
0x53, 0x00, //S
0x20, 0x00, //
0x4D, 0x00, //M
0x6F, 0x00, //o
0x64, 0x00, //d
0x65, 0x00, //e
};
/***************************************************************************
* Const Name : usbHidPosProductStringDescriptor
* Description: String Descriptor for get descriptor standard request
**************************************************************************/
const u8 usbHidPosProductStringDescriptor[] = {
0x0E,
0x03,
0x48, 0x00, //H
0x49, 0x00, //I
0x44, 0x00, //D
0x50, 0x00, //P
0x4F, 0x00, //O
0x53, 0x00, //S
};
/***************************************************************************
* Const Name : usbHidKbdProductStringDescriptor
* Description: String Descriptor for get descriptor standard request
**************************************************************************/
const u8 usbHidKbdProductStringDescriptor[] = {
0x18,
0x03,
0x48, 0x00, //H
0x49, 0x00, //I
0x44, 0x00, //D
0x4B, 0x00, //K
0x65, 0x00, //e
0x79, 0x00, //y
0x42, 0x00, //B
0x6F, 0x00, //o
0x61, 0x00, //a
0x72, 0x00, //r
0x64, 0x00 //d
};
/***************************************************************************
* Const Name : usbSerialNumberStringDescriptor
* Description: String Descriptor for get descriptor standard request
**************************************************************************/
const u8 usbSerialNumberStringDescriptor[] = { //todo
0x1E,
0x03,
0x31,0x00, // 1
0x32,0x00, // 2
0x33,0x00, // 3
0x34,0x00, // 4
0x35,0x00, // 5
0x36,0x00, // 6
0x37,0x00, // 7
0x38,0x00, // 8
0x39,0x00, // 9
0x30,0x00, // 0
0x61,0x00, // a
0x62,0x00, // b
0x63,0x00, // c
0x64,0x00, // d
};
/***************************************************************************
* Function: usbStdReqGetDeviceDescriptor
* Description: Deal with get device descriptor request
* Input: NULL
* Output: NULL
* Return: NULL
* Other: NULL
**************************************************************************/
void usbStdReqGetDeviceDescriptor(void)
{
u8 *usbDeviceDescriptor;
gCommFlag = USB;
if(g_bUsbDevType == USBDEVTYPE_HIDPOS)
{
usbDeviceDescriptor = (u8 *)usbHidPosDeviceDescriptor;
}
else if(g_bUsbDevType == USBDEVTYPE_HIDKBD)
{
usbDeviceDescriptor = (u8 *)usbHidKbdDeviceDescriptor;
}
else if(g_bUsbDevType == USBDEVTYPE_VSP)
{
usbDeviceDescriptor = (u8 *)usbVspDeviceDescriptor;
}
Memcpy(USBbuf,(u8 *)usbDeviceDescriptor,usbDeviceDescriptor[0]);
// if((st_usbDeviceRequest.wLength == 0x40) || ((USB_Time == 0)&&(st_usbDeviceRequest.wLength > EP0PKTSIZE)))
// g_sUsbEp0TxLen = EP0PKTSIZE;
// else
if(st_usbDeviceRequest.wLength > usbDeviceDescriptor[0])
g_sUsbEp0TxLen = usbDeviceDescriptor[0];
else
g_sUsbEp0TxLen = st_usbDeviceRequest.wLength;
g_sUsbEp0TxLen = g_sUsbEp0TxLen > EP0PKTSIZE ? EP0PKTSIZE : g_sUsbEp0TxLen;
usbEpnTxAll(0, USBbuf, g_sUsbEp0TxLen);
// if(g_sUsbEp0TxLen == EP0PKTSIZE)
// {
// delay(0x2000);
// if(!EP0STSCXSTS)
// {
// usbEpnTxAll(0, USBbuf+EP0PKTSIZE, usbDeviceDescriptor[0]-EP0PKTSIZE);
// }
// }
}
/***************************************************************************
* Function: usbStdReqGetDeviceDescriptor
* Description: Deal with get config descriptor request
* Input: NULL
* Output: NULL
* Return: NULL
* Other: NULL
**************************************************************************/
void usbStdReqGetConfigDescriptor(void)
{
u16 copy_config_descriptor_len;
if(g_bUsbDevType == USBDEVTYPE_HIDPOS)
{
Memcpy(USBbuf,(u8 *)usbHidPosConfigDescriptor,usbHidPosConfigDescriptor[0]);
copy_config_descriptor_len = usbHidPosConfigDescriptor[0];
Memcpy(USBbuf + usbHidPosConfigDescriptor[0],(u8 *)usbHidPosInterfaceDescriptor,usbHidPosInterfaceDescriptor[0]);
copy_config_descriptor_len += usbHidPosInterfaceDescriptor[0];
Memcpy(USBbuf + copy_config_descriptor_len,(u8 *)usbHidPosDeviceClassDescriptor,usbHidPosDeviceClassDescriptor[0]);
copy_config_descriptor_len += usbHidPosDeviceClassDescriptor[0];
Memcpy(USBbuf + copy_config_descriptor_len,(u8 *)(usbHidPosEndpointDescriptor+1),usbHidPosEndpointDescriptor[0]);
copy_config_descriptor_len += usbHidPosEndpointDescriptor[0];
}
else if(g_bUsbDevType == USBDEVTYPE_HIDKBD)
{
Memcpy(USBbuf,(u8 *)usbHidKbdConfigDescriptor,usbHidKbdConfigDescriptor[0]);
copy_config_descriptor_len = usbHidKbdConfigDescriptor[0];
Memcpy(USBbuf + usbHidKbdConfigDescriptor[0],(u8 *)usbHidKbdInterfaceDescriptor,usbHidKbdInterfaceDescriptor[0]);
copy_config_descriptor_len += usbHidKbdInterfaceDescriptor[0];
Memcpy(USBbuf + copy_config_descriptor_len,(u8 *)usbHidKbdDeviceClassDescriptor,usbHidKbdDeviceClassDescriptor[0]);
copy_config_descriptor_len += usbHidKbdDeviceClassDescriptor[0];
Memcpy(USBbuf + copy_config_descriptor_len,(u8 *)(usbHidKbdEndpointDescriptor+1),usbHidKbdEndpointDescriptor[0]);
copy_config_descriptor_len += usbHidKbdEndpointDescriptor[0];
//增加轮询速度
Memcpy(USBbuf + copy_config_descriptor_len,(u8 *)(&gConfgBuf.HIDPollRate),1);
copy_config_descriptor_len += 1;
}
else if(g_bUsbDevType == USBDEVTYPE_VSP)
{
Memcpy(USBbuf ,(u8 *)usbVspConfigDescriptor, VSP_CFG_LEN);
copy_config_descriptor_len = VSP_CFG_LEN;
//提前取出一部分参数
memcpy(g_bVspLineCoding, (u8*)vspLineCoding, 7);
}
if(st_usbDeviceRequest.wLength >= copy_config_descriptor_len)
g_sUsbEp0TxLen = copy_config_descriptor_len;
else
g_sUsbEp0TxLen = st_usbDeviceRequest.wLength;
usbEpnTxAll(0, USBbuf, g_sUsbEp0TxLen);
}
/***************************************************************************
* Function: usbStdReqGetDeviceDescriptor
* Description: Deal with get string descriptor request
* Input: NULL
* Output: NULL
* Return: NULL
* Other: NULL
**************************************************************************/
void usbStdReqGetStringDescriptor(void)
{
u8 * usbProductStringDescriptor;
if((st_usbDeviceRequest.wValue & 0x00FF) == 0x00) // For answering 1st Get_Descriport(String),Language ID,index= 0
{
USBbuf[0] = 0x04; // bLength
USBbuf[1] = 0x03; // bDescriptorType
USBbuf[2] = 0x09; // wLANGID = 0409,English(US)
USBbuf[3] = 0x04;
if(st_usbDeviceRequest.wLength >= 4)
g_sUsbEp0TxLen = 4;
else
g_sUsbEp0TxLen = st_usbDeviceRequest.wLength;
usbEpnTxAll(0, USBbuf, g_sUsbEp0TxLen);
return;
}
else if((st_usbDeviceRequest.wValue & 0x00FF) == 0x01) // index = 1
{
Memcpy(USBbuf,(u8 *)usbManufacturerStringDescriptor,usbManufacturerStringDescriptor[0]);
if((st_usbDeviceRequest.wLength != 0xFF) && (st_usbDeviceRequest.wLength != 0x01F4) && (st_usbDeviceRequest.wLength < usbManufacturerStringDescriptor[0]))
g_sUsbEp0TxLen = st_usbDeviceRequest.wLength;
else
g_sUsbEp0TxLen = usbManufacturerStringDescriptor[0];
usbEpnTxAll(0, USBbuf, g_sUsbEp0TxLen);
return;
}
else if((st_usbDeviceRequest.wValue & 0x00FF) == 0x02) // index = 2
{
if(g_bUsbDevType == USBDEVTYPE_HIDPOS)
{
usbProductStringDescriptor = (u8*)usbHidPosProductStringDescriptor;
}
else if(g_bUsbDevType == USBDEVTYPE_HIDKBD)
{
usbProductStringDescriptor = (u8*)usbHidKbdProductStringDescriptor;
}
else if(g_bUsbDevType == USBDEVTYPE_VSP)
{
usbProductStringDescriptor = (u8*)usbVspProductStringDescriptor;
}
Memcpy(USBbuf,(u8 *)usbProductStringDescriptor,usbProductStringDescriptor[0]);
if((st_usbDeviceRequest.wLength != 0xFF) && (st_usbDeviceRequest.wLength != 0x01F4) && (st_usbDeviceRequest.wLength < usbProductStringDescriptor[0]))
g_sUsbEp0TxLen = st_usbDeviceRequest.wLength;
else
g_sUsbEp0TxLen = usbProductStringDescriptor[0];
usbEpnTxAll(0, USBbuf, g_sUsbEp0TxLen);
return;
}
else if((st_usbDeviceRequest.wValue & 0x00FF) == 0x03) // index = 3
{
Memcpy(USBbuf,(u8 *)usbSerialNumberStringDescriptor,usbSerialNumberStringDescriptor[0]);
if((st_usbDeviceRequest.wLength != 0xFF) && (st_usbDeviceRequest.wLength != 0x01F4) && (st_usbDeviceRequest.wLength < usbSerialNumberStringDescriptor[0]))
g_sUsbEp0TxLen = st_usbDeviceRequest.wLength;
else
g_sUsbEp0TxLen = usbSerialNumberStringDescriptor[0];
usbEpnTxAll(0, USBbuf, g_sUsbEp0TxLen);
return;
}
#if CCID
else //if((st_usbDeviceRequest.wValue & 0x00FF) == 0x04)
{
Memcpy(USBbuf,(u8 *)ccidReaderStringDescriptor,ccidReaderStringDescriptor[0]);
if((st_usbDeviceRequest.wLength < ccidReaderStringDescriptor[0]))
g_sUsbEp0TxLen = st_usbDeviceRequest.wLength;
else
g_sUsbEp0TxLen = ccidReaderStringDescriptor[0];
usbEpnTxAll(0, USBbuf, g_sUsbEp0TxLen);
return;
}
#endif
else
{
EP0SENDSTALL;//修改苹果兼容性, 因为键盘的接口描述符字符串索引给了0x07但是苹果设备获取此字符串导致一直在回送nak
}
}