mirror of
https://github.com/esp8266/Arduino.git
synced 2025-06-19 09:42:11 +03:00
usbcv chapter 9 tests: passed
This commit is contained in:
committed by
Cristian Maglie
parent
22c828def0
commit
3a61bc4bd3
@ -64,13 +64,30 @@ static const CDCDescriptor _cdcInterface =
|
|||||||
D_CDCCS(CDC_CALL_MANAGEMENT,1,1), // Device handles call management (not)
|
D_CDCCS(CDC_CALL_MANAGEMENT,1,1), // Device handles call management (not)
|
||||||
D_CDCCS4(CDC_ABSTRACT_CONTROL_MANAGEMENT,6), // SET_LINE_CODING, GET_LINE_CODING, SET_CONTROL_LINE_STATE supported
|
D_CDCCS4(CDC_ABSTRACT_CONTROL_MANAGEMENT,6), // SET_LINE_CODING, GET_LINE_CODING, SET_CONTROL_LINE_STATE supported
|
||||||
D_CDCCS(CDC_UNION,CDC_ACM_INTERFACE,CDC_DATA_INTERFACE), // Communication interface is master, data interface is slave 0
|
D_CDCCS(CDC_UNION,CDC_ACM_INTERFACE,CDC_DATA_INTERFACE), // Communication interface is master, data interface is slave 0
|
||||||
D_ENDPOINT(USB_ENDPOINT_IN (CDC_ENDPOINT_ACM),USB_ENDPOINT_TYPE_INTERRUPT,0x10,0x10/*0x40*/),
|
D_ENDPOINT(USB_ENDPOINT_IN (CDC_ENDPOINT_ACM),USB_ENDPOINT_TYPE_INTERRUPT,0x10, 0x10),
|
||||||
|
|
||||||
// CDC data interface
|
// CDC data interface
|
||||||
D_INTERFACE(CDC_DATA_INTERFACE,2,CDC_DATA_INTERFACE_CLASS,0,0),
|
D_INTERFACE(CDC_DATA_INTERFACE,2,CDC_DATA_INTERFACE_CLASS,0,0),
|
||||||
D_ENDPOINT(USB_ENDPOINT_OUT(CDC_ENDPOINT_OUT),USB_ENDPOINT_TYPE_BULK,512,0),
|
D_ENDPOINT(USB_ENDPOINT_OUT(CDC_ENDPOINT_OUT),USB_ENDPOINT_TYPE_BULK,512,0),
|
||||||
D_ENDPOINT(USB_ENDPOINT_IN (CDC_ENDPOINT_IN ),USB_ENDPOINT_TYPE_BULK,512,0)
|
D_ENDPOINT(USB_ENDPOINT_IN (CDC_ENDPOINT_IN ),USB_ENDPOINT_TYPE_BULK,512,0)
|
||||||
};
|
};
|
||||||
|
static const CDCDescriptor _cdcOtherInterface =
|
||||||
|
{
|
||||||
|
D_IAD(0,2,CDC_COMMUNICATION_INTERFACE_CLASS,CDC_ABSTRACT_CONTROL_MODEL,1),
|
||||||
|
|
||||||
|
// CDC communication interface
|
||||||
|
D_INTERFACE(CDC_ACM_INTERFACE,1,CDC_COMMUNICATION_INTERFACE_CLASS,CDC_ABSTRACT_CONTROL_MODEL,0),
|
||||||
|
D_CDCCS(CDC_HEADER,0x10,0x01), // Header (1.10 bcd)
|
||||||
|
D_CDCCS(CDC_CALL_MANAGEMENT,1,1), // Device handles call management (not)
|
||||||
|
D_CDCCS4(CDC_ABSTRACT_CONTROL_MANAGEMENT,6), // SET_LINE_CODING, GET_LINE_CODING, SET_CONTROL_LINE_STATE supported
|
||||||
|
D_CDCCS(CDC_UNION,CDC_ACM_INTERFACE,CDC_DATA_INTERFACE), // Communication interface is master, data interface is slave 0
|
||||||
|
D_ENDPOINT(USB_ENDPOINT_IN (CDC_ENDPOINT_ACM),USB_ENDPOINT_TYPE_INTERRUPT,0x10, 0x10),
|
||||||
|
|
||||||
|
// CDC data interface
|
||||||
|
D_INTERFACE(CDC_DATA_INTERFACE,2,CDC_DATA_INTERFACE_CLASS,0,0),
|
||||||
|
D_ENDPOINT(USB_ENDPOINT_OUT(CDC_ENDPOINT_OUT),USB_ENDPOINT_TYPE_BULK,64,0),
|
||||||
|
D_ENDPOINT(USB_ENDPOINT_IN (CDC_ENDPOINT_IN ),USB_ENDPOINT_TYPE_BULK,64,0)
|
||||||
|
};
|
||||||
_Pragma("pack()")
|
_Pragma("pack()")
|
||||||
|
|
||||||
int WEAK CDC_GetInterface(uint8_t* interfaceNum)
|
int WEAK CDC_GetInterface(uint8_t* interfaceNum)
|
||||||
@ -79,6 +96,12 @@ int WEAK CDC_GetInterface(uint8_t* interfaceNum)
|
|||||||
return USBD_SendControl(0,&_cdcInterface,sizeof(_cdcInterface));
|
return USBD_SendControl(0,&_cdcInterface,sizeof(_cdcInterface));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int WEAK CDC_GetOtherInterface(uint8_t* interfaceNum)
|
||||||
|
{
|
||||||
|
interfaceNum[0] += 2; // uses 2
|
||||||
|
return USBD_SendControl(0,&_cdcOtherInterface,sizeof(_cdcOtherInterface));
|
||||||
|
}
|
||||||
|
|
||||||
__attribute__ ((long_call, section (".ramfunc")))
|
__attribute__ ((long_call, section (".ramfunc")))
|
||||||
void banzai() {
|
void banzai() {
|
||||||
// Disable all interrupts
|
// Disable all interrupts
|
||||||
|
@ -191,6 +191,7 @@ bool MSC_Data(uint8_t rx,uint8_t tx);
|
|||||||
// CSC 'Driver'
|
// CSC 'Driver'
|
||||||
|
|
||||||
int CDC_GetInterface(uint8_t* interfaceNum);
|
int CDC_GetInterface(uint8_t* interfaceNum);
|
||||||
|
int CDC_GetOtherInterface(uint8_t* interfaceNum);
|
||||||
int CDC_GetDescriptor(int i);
|
int CDC_GetDescriptor(int i);
|
||||||
bool CDC_Setup(Setup& setup);
|
bool CDC_Setup(Setup& setup);
|
||||||
|
|
||||||
|
@ -96,6 +96,7 @@ const DeviceDescriptor USB_DeviceQualifier =
|
|||||||
|
|
||||||
volatile uint32_t _usbConfiguration = 0;
|
volatile uint32_t _usbConfiguration = 0;
|
||||||
volatile uint32_t _usbInitialized = 0;
|
volatile uint32_t _usbInitialized = 0;
|
||||||
|
uint32_t _usbSetInterface = 0;
|
||||||
uint32_t _cdcComposite = 0;
|
uint32_t _cdcComposite = 0;
|
||||||
|
|
||||||
//==================================================================
|
//==================================================================
|
||||||
@ -283,6 +284,24 @@ int USBD_SendInterfaces(void)
|
|||||||
return interfaces;
|
return interfaces;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int USBD_SendOtherInterfaces(void)
|
||||||
|
{
|
||||||
|
int total = 0;
|
||||||
|
uint8_t interfaces = 0;
|
||||||
|
|
||||||
|
#ifdef CDC_ENABLED
|
||||||
|
total = CDC_GetOtherInterface(&interfaces);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HID_ENABLED
|
||||||
|
total += HID_GetInterface(&interfaces);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
total = total; // Get rid of compiler warning
|
||||||
|
TRACE_CORE(printf("=> USBD_SendInterfaces, total=%d interfaces=%d\r\n", total, interfaces);)
|
||||||
|
return interfaces;
|
||||||
|
}
|
||||||
|
|
||||||
// Construct a dynamic configuration descriptor
|
// Construct a dynamic configuration descriptor
|
||||||
// This really needs dynamic endpoint allocation etc
|
// This really needs dynamic endpoint allocation etc
|
||||||
// TODO
|
// TODO
|
||||||
@ -309,6 +328,29 @@ _Pragma("pack()")
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool USBD_SendOtherConfiguration(int maxlen)
|
||||||
|
{
|
||||||
|
// Count and measure interfaces
|
||||||
|
USBD_InitControl(0);
|
||||||
|
//TRACE_CORE(printf("=> USBD_SendConfiguration _cmark1=%d\r\n", _cmark);)
|
||||||
|
int interfaces = USBD_SendOtherInterfaces();
|
||||||
|
//TRACE_CORE(printf("=> USBD_SendConfiguration _cmark2=%d\r\n", _cmark);)
|
||||||
|
//TRACE_CORE(printf("=> USBD_SendConfiguration sizeof=%d\r\n", sizeof(ConfigDescriptor));)
|
||||||
|
|
||||||
|
_Pragma("pack(1)")
|
||||||
|
ConfigDescriptor config = D_OTHERCONFIG(_cmark + sizeof(ConfigDescriptor),interfaces);
|
||||||
|
_Pragma("pack()")
|
||||||
|
//TRACE_CORE(printf("=> USBD_SendConfiguration clen=%d\r\n", config.clen);)
|
||||||
|
|
||||||
|
//TRACE_CORE(printf("=> USBD_SendConfiguration maxlen=%d\r\n", maxlen);)
|
||||||
|
|
||||||
|
// Now send them
|
||||||
|
USBD_InitControl(maxlen);
|
||||||
|
USBD_SendControl(0,&config,sizeof(ConfigDescriptor));
|
||||||
|
USBD_SendOtherInterfaces();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static bool USBD_SendDescriptor(Setup& setup)
|
static bool USBD_SendDescriptor(Setup& setup)
|
||||||
{
|
{
|
||||||
uint8_t t = setup.wValueH;
|
uint8_t t = setup.wValueH;
|
||||||
@ -344,15 +386,12 @@ static bool USBD_SendDescriptor(Setup& setup)
|
|||||||
TRACE_CORE(puts("=> USBD_SendDescriptor : USB_STRING_DESCRIPTOR_TYPE\r\n");)
|
TRACE_CORE(puts("=> USBD_SendDescriptor : USB_STRING_DESCRIPTOR_TYPE\r\n");)
|
||||||
if (setup.wValueL == 0) {
|
if (setup.wValueL == 0) {
|
||||||
desc_addr = (const uint8_t*)&STRING_LANGUAGE;
|
desc_addr = (const uint8_t*)&STRING_LANGUAGE;
|
||||||
printf("St1=%d\n\r", *desc_addr);
|
|
||||||
}
|
}
|
||||||
else if (setup.wValueL == IPRODUCT) {
|
else if (setup.wValueL == IPRODUCT) {
|
||||||
desc_addr = (const uint8_t*)&STRING_IPRODUCT;
|
desc_addr = (const uint8_t*)&STRING_IPRODUCT;
|
||||||
printf("St2=%d\n\r", *desc_addr);
|
|
||||||
}
|
}
|
||||||
else if (setup.wValueL == IMANUFACTURER) {
|
else if (setup.wValueL == IMANUFACTURER) {
|
||||||
desc_addr = (const uint8_t*)&STRING_IMANUFACTURER;
|
desc_addr = (const uint8_t*)&STRING_IMANUFACTURER;
|
||||||
printf("St3=%d\n\r", *desc_addr);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return false;
|
return false;
|
||||||
@ -365,11 +404,14 @@ static bool USBD_SendDescriptor(Setup& setup)
|
|||||||
{
|
{
|
||||||
// Device qualifier descriptor requested
|
// Device qualifier descriptor requested
|
||||||
desc_addr = (const uint8_t*)&USB_DeviceQualifier;
|
desc_addr = (const uint8_t*)&USB_DeviceQualifier;
|
||||||
|
if( *desc_addr > setup.wLength ) {
|
||||||
|
desc_length = setup.wLength;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (USB_OTHER_SPEED_CONFIGURATION == t)
|
else if (USB_OTHER_SPEED_CONFIGURATION == t)
|
||||||
{
|
{
|
||||||
// TODO
|
|
||||||
// Other configuration descriptor requested
|
// Other configuration descriptor requested
|
||||||
|
return USBD_SendOtherConfiguration(setup.wLength);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -575,13 +617,12 @@ static void USB_ISR(void)
|
|||||||
}
|
}
|
||||||
else if (GET_INTERFACE == r)
|
else if (GET_INTERFACE == r)
|
||||||
{
|
{
|
||||||
// TODO
|
|
||||||
TRACE_CORE(puts(">>> EP0 Int: GET_INTERFACE\r\n");)
|
TRACE_CORE(puts(">>> EP0 Int: GET_INTERFACE\r\n");)
|
||||||
UDD_Send8(EP0, setup.wIndex);
|
UDD_Send8(EP0, _usbSetInterface);
|
||||||
}
|
}
|
||||||
else if (SET_INTERFACE == r)
|
else if (SET_INTERFACE == r)
|
||||||
{
|
{
|
||||||
// TODO
|
_usbSetInterface = setup.wValueL;
|
||||||
TRACE_CORE(puts(">>> EP0 Int: SET_INTERFACE\r\n");)
|
TRACE_CORE(puts(">>> EP0 Int: SET_INTERFACE\r\n");)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -287,6 +287,9 @@ _Pragma("pack()")
|
|||||||
#define D_CONFIG(_totalLength,_interfaces) \
|
#define D_CONFIG(_totalLength,_interfaces) \
|
||||||
{ 9, 2, _totalLength,_interfaces, 1, 0, USB_CONFIG_SELF_POWERED, USB_CONFIG_POWER_MA(500) }
|
{ 9, 2, _totalLength,_interfaces, 1, 0, USB_CONFIG_SELF_POWERED, USB_CONFIG_POWER_MA(500) }
|
||||||
|
|
||||||
|
#define D_OTHERCONFIG(_totalLength,_interfaces) \
|
||||||
|
{ 9, 7, _totalLength,_interfaces, 1, 0, USB_CONFIG_SELF_POWERED, USB_CONFIG_POWER_MA(500) }
|
||||||
|
|
||||||
#define D_INTERFACE(_n,_numEndpoints,_class,_subClass,_protocol) \
|
#define D_INTERFACE(_n,_numEndpoints,_class,_subClass,_protocol) \
|
||||||
{ 9, 4, _n, 0, _numEndpoints, _class,_subClass, _protocol, 0 }
|
{ 9, 4, _n, 0, _numEndpoints, _class,_subClass, _protocol, 0 }
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user