Skip to content

[Bootloader] Enable USB string descriptors #104

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion bootloaders/zero/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ endif
# Arduino Zero (PID == 0x004D)
CFLAGS_EXTRA?=-D__SAMD21G18A__ -DUSB_PID_HIGH=0x00 -DUSB_PID_LOW=0x4D -DUSB_VID_LOW=0x41 -DUSB_VID_HIGH=0x23
# Genuino Zero (PID == 0x024D)
# CFLAGS_EXTRA?=-D__SAMD21G18A__ -DUSB_PID_HIGH=0x02 -DUSB_PID_LOW=0x4D -DUSB_VID_LOW=0x41 -DUSB_VID_HIGH=0x23
# CFLAGS_EXTRA?=-D__SAMD21G18A__ -DUSB_PID_HIGH=0x02 -DUSB_PID_LOW=0x4D -DUSB_VID_LOW=0x41 -DUSB_VID_HIGH=0x23 -DSTRING_PRODUCT="\"Genuino Zero\""

INCLUDES=-I"$(MODULE_PATH)/tools/CMSIS/4.0.0-atmel/CMSIS/Include/" -I"$(MODULE_PATH)/tools/CMSIS/4.0.0-atmel/Device/ATMEL/"

Expand Down
83 changes: 34 additions & 49 deletions bootloaders/zero/sam_ba_usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,8 @@ const char devDescriptor[] =
USB_PID_HIGH, // idProduct H
0x00, // bcdDevice L, here matching SAM-BA version
0x02, // bcdDevice H
#if 0 // TODO: pending validation
STRING_INDEX_MANUFACTURER, // iManufacturer
STRING_INDEX_PRODUCT, // iProduct
#else
0x00, // iManufacturer
0x00, // iProduct
#endif // 0
0x00, // SerialNumber, should be based on product unique ID
0x01 // bNumConfigs
};
Expand Down Expand Up @@ -195,47 +190,40 @@ void sam_ba_usb_CDC_Enumerate(P_USB_CDC pCdc)
/* Return Device Descriptor */
USB_Write(pCdc->pUsb, devDescriptor, SAM_BA_MIN(sizeof(devDescriptor), wLength), USB_EP_CTRL);
}
else
else if (wValue>>8 == STD_GET_DESCRIPTOR_CONFIGURATION)
{
if (wValue>>8 == STD_GET_DESCRIPTOR_CONFIGURATION)
{
/* Return Configuration Descriptor */
USB_Write(pCdc->pUsb, cfgDescriptor, SAM_BA_MIN(sizeof(cfgDescriptor), wLength), USB_EP_CTRL);
}
else
/* Return Configuration Descriptor */
USB_Write(pCdc->pUsb, cfgDescriptor, SAM_BA_MIN(sizeof(cfgDescriptor), wLength), USB_EP_CTRL);
}
else if (wValue>>8 == STD_GET_DESCRIPTOR_STRING)
{
switch ( wValue & 0xff )
{
#if 0 // TODO: pending validation
if (wValue>>8 == STD_GET_DESCRIPTOR_STRING)
{
switch ( wValue & 0xff )
{
case STRING_INDEX_LANGUAGES:
uint16_t STRING_LANGUAGE[2] = { (STD_GET_DESCRIPTOR_STRING<<8) | 4, 0x0409 };

USB_Write(pCdc->pUsb, (const char*)STRING_LANGUAGE, SAM_BA_MIN(sizeof(STRING_LANGUAGE), wLength), USB_EP_CTRL);
break;

case STRING_INDEX_MANUFACTURER:
USB_SendString(pCdc->pUsb, STRING_MANUFACTURER, strlen(STRING_MANUFACTURER), wLength );
break;

case STRING_INDEX_PRODUCT:
USB_SendString(pCdc->pUsb, STRING_PRODUCT, strlen(STRING_PRODUCT), wLength );
break;
default:
/* Stall the request */
USB_SendStall(pUsb, true);
break;
}
case STRING_INDEX_LANGUAGES: {
uint16_t STRING_LANGUAGE[2] = { (STD_GET_DESCRIPTOR_STRING<<8) | 4, 0x0409 };

USB_Write(pCdc->pUsb, (const char*)STRING_LANGUAGE, SAM_BA_MIN(sizeof(STRING_LANGUAGE), wLength), USB_EP_CTRL);
}
else
#endif // 0
{
break;

case STRING_INDEX_MANUFACTURER:
USB_SendString(pCdc->pUsb, STRING_MANUFACTURER, wLength );
break;

case STRING_INDEX_PRODUCT:
USB_SendString(pCdc->pUsb, STRING_PRODUCT, wLength );
break;
default:
/* Stall the request */
USB_SendStall(pUsb, true);
}
break;
}
}
else
{
/* Stall the request */
USB_SendStall(pUsb, true);
}
break;

case STD_SET_ADDRESS:
Expand Down Expand Up @@ -430,27 +418,24 @@ P_USB_CDC usb_init(void)
return &sam_ba_cdc;
}

#if 0 // TODO: pending validation
/*----------------------------------------------------------------------------
* \brief Send a USB descriptor string.
*
* The input string is plain ASCII but is sent out as UTF-16 with the correct 2-byte prefix.
*/
uint32_t USB_SendString(Usb *pUsb, const char* ascii_string, uint8_t length, uint8_t maxLength)
uint32_t USB_SendString(Usb *pUsb, const char* ascii_string, uint8_t maxLength)
{
uint8_t string_descriptor[255]; // Max USB-allowed string length
uint16_t* unicode_string=(uint16_t*)(string_descriptor+2); // point on 3 bytes of descriptor
int resulting_length;

int resulting_length = 1;
string_descriptor[0] = (strlen(ascii_string)<<1) + 2;
string_descriptor[1] = STD_GET_DESCRIPTOR_STRING;

for ( ; *ascii_string && (length>=0) && (resulting_length<(maxLength>>1)) ; ascii_string++, length--, resulting_length++ )
for ( resulting_length = 1 ; *ascii_string && (resulting_length<maxLength>>1) ; resulting_length++ )
{
*unicode_string++ = (uint16_t)(*ascii_string);
*unicode_string++ = (uint16_t)(*ascii_string++);
}

string_descriptor[0] = (resulting_length<<1);
string_descriptor[1] = STD_GET_DESCRIPTOR_STRING;

return USB_Write(pUsb, (const char*)unicode_string, resulting_length, USB_EP_CTRL);
return USB_Write(pUsb, (const char*)string_descriptor, resulting_length<<1, USB_EP_CTRL);
}
#endif // 0
6 changes: 1 addition & 5 deletions bootloaders/zero/sam_ba_usb.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,11 +66,9 @@
#define FEATURE_DEVICE_REMOTE_WAKEUP (1u)
#define FEATURE_TEST_MODE (2u)

#if 0 // TODO: pending validation
#define STRING_INDEX_LANGUAGES (0x00u)
#define STRING_INDEX_MANUFACTURER (0x01u)
#define STRING_INDEX_PRODUCT (0x02u)
#endif // 0

#define SAM_BA_MIN(a, b) (((a) < (b)) ? (a) : (b))

Expand All @@ -96,9 +94,7 @@ P_USB_CDC usb_init(void);

void sam_ba_usb_CDC_Enumerate(P_USB_CDC pCdc);

#if 0 // TODO: pending validation
uint32_t USB_SendString(Usb *pUsb, const char* ascii_string, uint8_t length, uint8_t maxLength);
#endif // 0
uint32_t USB_SendString(Usb *pUsb, const char* ascii_string, uint8_t maxLength);

extern USB_CDC sam_ba_cdc;

Expand Down
Binary file modified bootloaders/zero/samd21_sam_ba.bin
100644 → 100755
Binary file not shown.
Loading