mirror of
https://github.com/arduino/Arduino.git
synced 2024-12-02 13:24:12 +01:00
[USB] use plugged modules name to create iSerial field
This commit is contained in:
parent
bf609ecc4c
commit
b945df9220
@ -50,6 +50,15 @@ int PluggableUSB_::getDescriptor(USBSetup& setup)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PluggableUSB_::getShortName(char *iSerialNum)
|
||||||
|
{
|
||||||
|
PluggableUSBModule* node;
|
||||||
|
for (node = rootNode; node; node = node->next) {
|
||||||
|
iSerialNum += node->getShortName(iSerialNum);
|
||||||
|
}
|
||||||
|
*iSerialNum = 0;
|
||||||
|
}
|
||||||
|
|
||||||
bool PluggableUSB_::setup(USBSetup& setup)
|
bool PluggableUSB_::setup(USBSetup& setup)
|
||||||
{
|
{
|
||||||
PluggableUSBModule* node;
|
PluggableUSBModule* node;
|
||||||
|
@ -35,6 +35,7 @@ protected:
|
|||||||
virtual bool setup(USBSetup& setup) = 0;
|
virtual bool setup(USBSetup& setup) = 0;
|
||||||
virtual int getInterface(uint8_t* interfaceCount) = 0;
|
virtual int getInterface(uint8_t* interfaceCount) = 0;
|
||||||
virtual int getDescriptor(USBSetup& setup) = 0;
|
virtual int getDescriptor(USBSetup& setup) = 0;
|
||||||
|
virtual uint8_t getShortName(char *name) { name[0] = 'A'+pluggedInterface; return 1; }
|
||||||
|
|
||||||
uint8_t pluggedInterface;
|
uint8_t pluggedInterface;
|
||||||
uint8_t pluggedEndpoint;
|
uint8_t pluggedEndpoint;
|
||||||
@ -55,6 +56,7 @@ public:
|
|||||||
int getInterface(uint8_t* interfaceCount);
|
int getInterface(uint8_t* interfaceCount);
|
||||||
int getDescriptor(USBSetup& setup);
|
int getDescriptor(USBSetup& setup);
|
||||||
bool setup(USBSetup& setup);
|
bool setup(USBSetup& setup);
|
||||||
|
void getShortName(char *iSerialNum);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint8_t lastIf;
|
uint8_t lastIf;
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
#include "USBAPI.h"
|
#include "USBAPI.h"
|
||||||
#include "PluggableUSB.h"
|
#include "PluggableUSB.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
#if defined(USBCON)
|
#if defined(USBCON)
|
||||||
|
|
||||||
@ -69,10 +70,10 @@ const u8 STRING_MANUFACTURER[] PROGMEM = USB_MANUFACTURER;
|
|||||||
|
|
||||||
// DEVICE DESCRIPTOR
|
// DEVICE DESCRIPTOR
|
||||||
const DeviceDescriptor USB_DeviceDescriptor =
|
const DeviceDescriptor USB_DeviceDescriptor =
|
||||||
D_DEVICE(0x00,0x00,0x00,64,USB_VID,USB_PID,0x100,IMANUFACTURER,IPRODUCT,0,1);
|
D_DEVICE(0x00,0x00,0x00,64,USB_VID,USB_PID,0x100,IMANUFACTURER,IPRODUCT,ISERIAL,1);
|
||||||
|
|
||||||
const DeviceDescriptor USB_DeviceDescriptorB =
|
const DeviceDescriptor USB_DeviceDescriptorB =
|
||||||
D_DEVICE(0xEF,0x02,0x01,64,USB_VID,USB_PID,0x100,IMANUFACTURER,IPRODUCT,0,1);
|
D_DEVICE(0xEF,0x02,0x01,64,USB_VID,USB_PID,0x100,IMANUFACTURER,IPRODUCT,ISERIAL,1);
|
||||||
|
|
||||||
//==================================================================
|
//==================================================================
|
||||||
//==================================================================
|
//==================================================================
|
||||||
@ -409,11 +410,12 @@ int USB_SendControl(u8 flags, const void* d, int len)
|
|||||||
// Send a USB descriptor string. The string is stored in PROGMEM as a
|
// Send a USB descriptor string. The string is stored in PROGMEM as a
|
||||||
// plain ASCII string but is sent out as UTF-16 with the correct 2-byte
|
// plain ASCII string but is sent out as UTF-16 with the correct 2-byte
|
||||||
// prefix
|
// prefix
|
||||||
static bool USB_SendStringDescriptor(const u8*string_P, u8 string_len) {
|
static bool USB_SendStringDescriptor(const u8*string_P, u8 string_len, uint8_t flags) {
|
||||||
SendControl(2 + string_len * 2);
|
SendControl(2 + string_len * 2);
|
||||||
SendControl(3);
|
SendControl(3);
|
||||||
|
bool pgm = flags & TRANSFER_PGM;
|
||||||
for(u8 i = 0; i < string_len; i++) {
|
for(u8 i = 0; i < string_len; i++) {
|
||||||
bool r = SendControl(pgm_read_byte(&string_P[i]));
|
bool r = SendControl(pgm ? pgm_read_byte(&string_P[i]) : string_P[i]);
|
||||||
r &= SendControl(0); // high byte
|
r &= SendControl(0); // high byte
|
||||||
if(!r) {
|
if(!r) {
|
||||||
return false;
|
return false;
|
||||||
@ -495,10 +497,17 @@ bool SendDescriptor(USBSetup& setup)
|
|||||||
desc_addr = (const u8*)&STRING_LANGUAGE;
|
desc_addr = (const u8*)&STRING_LANGUAGE;
|
||||||
}
|
}
|
||||||
else if (setup.wValueL == IPRODUCT) {
|
else if (setup.wValueL == IPRODUCT) {
|
||||||
return USB_SendStringDescriptor(STRING_PRODUCT, strlen(USB_PRODUCT));
|
return USB_SendStringDescriptor(STRING_PRODUCT, strlen(USB_PRODUCT), TRANSFER_PGM);
|
||||||
}
|
}
|
||||||
else if (setup.wValueL == IMANUFACTURER) {
|
else if (setup.wValueL == IMANUFACTURER) {
|
||||||
return USB_SendStringDescriptor(STRING_MANUFACTURER, strlen(USB_MANUFACTURER));
|
return USB_SendStringDescriptor(STRING_MANUFACTURER, strlen(USB_MANUFACTURER), TRANSFER_PGM);
|
||||||
|
}
|
||||||
|
else if (setup.wValueL == ISERIAL) {
|
||||||
|
#ifdef PLUGGABLE_USB_ENABLED
|
||||||
|
char name[ISERIAL_MAX_LEN];
|
||||||
|
PluggableUSB().getShortName(name);
|
||||||
|
return USB_SendStringDescriptor((uint8_t*)name, strlen(name), 0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
|
@ -24,6 +24,8 @@
|
|||||||
#define USB_ENDPOINTS 5 // AtMegaxxU2
|
#define USB_ENDPOINTS 5 // AtMegaxxU2
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define ISERIAL_MAX_LEN 20
|
||||||
|
|
||||||
#define CDC_INTERFACE_COUNT 2
|
#define CDC_INTERFACE_COUNT 2
|
||||||
#define CDC_ENPOINT_COUNT 3
|
#define CDC_ENPOINT_COUNT 3
|
||||||
|
|
||||||
@ -41,4 +43,4 @@
|
|||||||
|
|
||||||
#define IMANUFACTURER 1
|
#define IMANUFACTURER 1
|
||||||
#define IPRODUCT 2
|
#define IPRODUCT 2
|
||||||
|
#define ISERIAL 3
|
@ -57,6 +57,16 @@ int HID_::getDescriptor(USBSetup& setup)
|
|||||||
return total;
|
return total;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t HID_::getShortName(char *name)
|
||||||
|
{
|
||||||
|
name[0] = 'H';
|
||||||
|
name[1] = 'I';
|
||||||
|
name[2] = 'D';
|
||||||
|
name[3] = 'A' + (descriptorSize & 0x0F);
|
||||||
|
name[4] = 'A' + ((descriptorSize >> 4) & 0x0F);
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
|
||||||
void HID_::AppendDescriptor(HIDSubDescriptor *node)
|
void HID_::AppendDescriptor(HIDSubDescriptor *node)
|
||||||
{
|
{
|
||||||
if (!rootNode) {
|
if (!rootNode) {
|
||||||
|
@ -96,6 +96,7 @@ protected:
|
|||||||
int getInterface(uint8_t* interfaceCount);
|
int getInterface(uint8_t* interfaceCount);
|
||||||
int getDescriptor(USBSetup& setup);
|
int getDescriptor(USBSetup& setup);
|
||||||
bool setup(USBSetup& setup);
|
bool setup(USBSetup& setup);
|
||||||
|
uint8_t getShortName(char* name);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint8_t epType[1];
|
uint8_t epType[1];
|
||||||
|
Loading…
Reference in New Issue
Block a user