Page 1 of 1

Dynamic Serial Number at runtime

Posted: Wed Feb 25, 2009 8:19 pm
by opcode
I have spent quite some time trying to implement a dynamic serial number or device id or any other method of being able to select any one of several identical usb devices without success :(
The Idea is to have several identical devices eg powerswitches, running identical firmware but be individually addressable by means of setting the serial number or device ID at runtime (or even at boot time) via jumper or dipswitch.

I understand that you must define in usbconfig.h:

Code: Select all

#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER USB_PROP_IS_DYNAMIC


and also implement in main.c:

Code: Select all

uchar usbFunctionDescriptor(usbRequest_t *rq)
{
   uchar *p = 0, len = 0;
   if(rq->wValue.bytes[1] == ????????)
   {
   ???????     
   }
   usbMsgPtr = p;
   return len;
}


Does anyone have any working example or information on how to do this ?

Thanks.

Posted: Thu Feb 26, 2009 3:52 am
by Grendel
I didn't use a dynamic serial no. in my project but various other dynamic descriptors -- try something like this:

Code: Select all

uchar usbFunctionDescriptor(usbRequest_t *rq)
{
   uchar *p = 0, len = 0;
   if(rq->wValue.bytes[1] == USBDESCR_STRING &&
      rq->wValue.bytes[0] == [your serial no. str index])
   {
     [build your serial no. str descr. here, have p point to it]

     usbMsgPtr = p;
     len = [your serial no. str descr. len]
   }
   return len;
}


Note that if you build the descriptor in RAM USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER needs to be defined as (USB_PROP_IS_DYNAMIC | USB_PROP_IS_RAM). If you have predefined descriptors in FLASH, USB_PROP_IS_DYNAMIC will do.

Posted: Thu Feb 26, 2009 7:14 pm
by opcode
Thanks Grendel That was enough additional info to get it working :)

in usbconfig.h

Code: Select all

#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER    (USB_PROP_IS_DYNAMIC | USB_PROP_IS_RAM)



in main.c

Code: Select all

#define SERIAL_NUMBER_LENGTH 6 // the number of characters required for your serial number

static int  serialNumberDescriptor[SERIAL_NUMBER_LENGTH + 1];

uchar usbFunctionDescriptor(usbRequest_t *rq)
{
   uchar len = 0;
   usbMsgPtr = 0;
   if (rq->wValue.bytes[1] == USBDESCR_STRING && rq->wValue.bytes[0] == 3) // 3 is the type of string descriptor, in this case the device serial number
   {
      usbMsgPtr = (uchar*)serialNumberDescriptor;
      len = sizeof(serialNumberDescriptor);
   }
   return len;
}


static void SetSerial(void)
{
   serialNumberDescriptor[0] = USB_STRING_DESCRIPTOR_HEADER(SERIAL_NUMBER_LENGTH);
   serialNumberDescriptor[1] = 'S';
   serialNumberDescriptor[2] = 'e';
   serialNumberDescriptor[3] = 'r';
   serialNumberDescriptor[4] = 'i';
   serialNumberDescriptor[5] = 'a';
   serialNumberDescriptor[6] = 'l';
}



You must call SetSerial() before the USB is initialized to generate the serial number!

Bob.