Forum Menu




 


Log in Problems?
New User? Sign Up!
AVR Freaks Forum Index

Post new topic   Reply to topic
View previous topic Printable version Log in to check your private messages View next topic
Author Message
dolulob
PostPosted: Jul 27, 2012 - 09:31 AM
Rookie


Joined: Aug 31, 2011
Posts: 25


Hi,

I am trying to give the LUFA HID-Bootloader a name, that shows up in the PC.

By default the name is just some questionmarks, which doesn't look very nice.

I tried adding the following things to the Bootloader Descriptor.c, but without success

Code:

const USB_Descriptor_Device_t DeviceDescriptor =
{
.
.
.
   .ManufacturerStrIndex   = 0x01,
   .ProductStrIndex        = 0x02,
   .SerialNumStrIndex      = NO_DESCRIPTOR,

   .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS
};


Code:

const USB_Descriptor_String_t PROGMEM ManufacturerString =
{
   .Header                 = {.Size = USB_STRING_LEN(5), .Type = DTYPE_String},

   .UnicodeString          = L"NAME1"
};

const USB_Descriptor_String_t PROGMEM ProductString =
{
   .Header                 = {.Size = USB_STRING_LEN(5), .Type = DTYPE_String},

   .UnicodeString          = L"NAME2"
};


Code:

uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
                                    const uint8_t wIndex,
                                    const void** const DescriptorAddress)
{
   const uint8_t DescriptorType   = (wValue >> 8);
   const uint8_t  DescriptorNumber = (wValue & 0xFF);

   const void* Address = NULL;
   uint16_t    Size    = NO_DESCRIPTOR;
   
   /* If/Else If chain compiles slightly smaller than a switch case */
if (DescriptorType == DTYPE_String)
         switch (DescriptorNumber)
         {
            case 0x00:
               Address = &LanguageString;
               Size    = pgm_read_byte(&LanguageString.Header.Size);
               break;
            case 0x01:
               Address = &ManufacturerString;
               Size    = pgm_read_byte(&ManufacturerString.Header.Size);
               break;
            case 0x02:
               Address = &ProductString;
               Size    = pgm_read_byte(&ProductString.Header.Size);
               break;
         }

   else
...
}


Hope somebody can help...

Mike
 
 View user's profile Send private message  
Reply with quote Back to top
abcminiuser
PostPosted: Jul 27, 2012 - 10:27 AM
Moderator


Joined: Jan 23, 2004
Posts: 9832
Location: Trondheim, Norway

Your code should be correct - however Windows will cache the descriptors to speed up device enumeration after the first time it sees the device. Try changing the VID/PID temporarily to see if it helps, or check the descriptors the PC sees manually with the USBView tool (you can find this on the net).

- Dean Twisted Evil

_________________
Atmel Studio 6.1 is now released, grab it here.
Report AS6/ASF bugs here.
 
 View user's profile Send private message Send e-mail Visit poster's website 
Reply with quote Back to top
12oclocker
PostPosted: Jul 27, 2012 - 05:40 PM
Hangaround


Joined: Apr 19, 2009
Posts: 200


Looks like you are mixing RAM and FLASH descriptors, I dont think you can do that can you?

I just tried this also, and it ends up with unrecognized USB device, problem I am having is I cannot change the HID bootloader example to use flash variables, windows does not correctly detect the device (I just opened a thread on this, and then saw your thread .... http://www.avrfreaks.net/index.php?name ... p;t=123363 )
 
 View user's profile Send private message  
Reply with quote Back to top
abcminiuser
PostPosted: Jul 27, 2012 - 06:37 PM
Moderator


Joined: Jan 23, 2004
Posts: 9832
Location: Trondheim, Norway

You know I didn't even notice that! You actually can mix them if you compile without the USE_*_DESCRIPTORS compile time constant, but it will bloat the code and causes problems in a bootloder on large devices. Just remove the PROGMEM qualifier from the strings.

- Dean Twisted Evil

_________________
Atmel Studio 6.1 is now released, grab it here.
Report AS6/ASF bugs here.
 
 View user's profile Send private message Send e-mail Visit poster's website 
Reply with quote Back to top
12oclocker
PostPosted: Jul 27, 2012 - 07:25 PM
Hangaround


Joined: Apr 19, 2009
Posts: 200


hi dean, i tried that, but its using too much ram, sometimes my strings get corrupted.... what i would really like to do is use flash variables, but its not working on the at90usb1287 for some reason, compiles ok, no errors, but windows does not recognize the device, any ideas?
 
 View user's profile Send private message  
Reply with quote Back to top
abcminiuser
PostPosted: Jul 27, 2012 - 07:37 PM
Moderator


Joined: Jan 23, 2004
Posts: 9832
Location: Trondheim, Norway

Quote:

hi dean, i tried that, but its using too much ram, sometimes my strings get corrupted....


There is no chance this can be the case - the HID bootloader only uses 86 bytes of RAM statically, and a not a whole lot dynamically (on the stack). With an AT90USB1287 there's no chance you are hitting a RAM barrier.

- Dean Twisted Evil

_________________
Atmel Studio 6.1 is now released, grab it here.
Report AS6/ASF bugs here.
 
 View user's profile Send private message Send e-mail Visit poster's website 
Reply with quote Back to top
12oclocker
PostPosted: Jul 27, 2012 - 08:30 PM
Hangaround


Joined: Apr 19, 2009
Posts: 200


humm, ok, I'll look more into the RAM thing, I just noticed after unplugging and plugging the device back in several times, the strings got corrupted (about half the MFG string would get truncated sometimes) I just assumed I must have hit the ram barrier using the unicode strings... I'll do some more investigating, thanks Dean Wink
 
 View user's profile Send private message  
Reply with quote Back to top
12oclocker
PostPosted: Jul 27, 2012 - 10:07 PM
Hangaround


Joined: Apr 19, 2009
Posts: 200


hum, corrupted RAM strings after using the bootloader, flash compare of the bootloader flash section shows that it was not overwritten and is still ok, picture attached.
Maybe I am doing something wrong? I attached my modified code from the descriptor file.




Code:

/*
             LUFA Library
     Copyright (C) Dean Camera, 2012.

  dean [at] fourwalledcubicle [dot] com
           www.lufa-lib.org
*/

/*
  Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com)

  Permission to use, copy, modify, distribute, and sell this
  software and its documentation for any purpose is hereby granted
  without fee, provided that the above copyright notice appear in
  all copies and that both that the copyright notice and this
  permission notice and warranty disclaimer appear in supporting
  documentation, and that the name of the author not be used in
  advertising or publicity pertaining to distribution of the
  software without specific, written prior permission.

  The author disclaim all warranties with regard to this
  software, including all implied warranties of merchantability
  and fitness.  In no event shall the author be liable for any
  special, indirect or consequential damages or any damages
  whatsoever resulting from loss of use, data or profits, whether
  in an action of contract, negligence or other tortious action,
  arising out of or in connection with the use or performance of
  this software.
*/

/** \file
 *
 *  USB Device Descriptors, for library use when in USB device mode. Descriptors are special
 *  computer-readable structures which the host requests upon device enumeration, to determine
 *  the device's capabilities and functions.
 */

#include "Descriptors.h"

/** HID class report descriptor. This is a special descriptor constructed with values from the
 *  USBIF HID class specification to describe the reports and capabilities of the HID device. This
 *  descriptor is parsed by the host and its contents used to determine what data (and in what encoding)
 *  the device will send, and what it may be sent back from the host. Refer to the HID specification for
 *  more details on HID report descriptors.
 */
const USB_Descriptor_HIDReport_Datatype_t HIDReport[] =
{
   HID_RI_USAGE_PAGE(16, 0xFFDC), /* Vendor Page 0xDC */
   HID_RI_USAGE(8, 0xFB), /* Vendor Usage 0xFB */
   HID_RI_COLLECTION(8, 0x01), /* Vendor Usage 1 */
       HID_RI_USAGE(8, 0x02), /* Vendor Usage 2 */
       HID_RI_LOGICAL_MINIMUM(8, 0x00),
       HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
       HID_RI_REPORT_SIZE(8, 0x08),
       HID_RI_REPORT_COUNT(16, HID_REPORT_SIZE),
       HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
   HID_RI_END_COLLECTION(0),
};

//Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests
//the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate
//via the language ID table available at USB.org what languages the device supports for its string descriptors.
const USB_Descriptor_String_t LanguageString =
{
   .Header                 = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String},
   .UnicodeString          = {LANGUAGE_ID_ENG}
};

//Manufacturer descriptor string. This is a Unicode string containing the manufacturer's details in human readable
//form, and is read out upon request by the host when the appropriate string ID is requested, listed in the Device
//Descriptor.
const USB_Descriptor_String_t ManufacturerString =
{
   .Header                 = {.Size = USB_STRING_LEN(40), .Type = DTYPE_String},

   .UnicodeString          = L"www.MyTestCompany.com powered by LUFA"
};

//Product descriptor string. This is a Unicode string containing the product's details in human readable form,
//and is read out upon request by the host when the appropriate string ID is requested, listed in the Device
//Descriptor.
const USB_Descriptor_String_t ProductString =
{
   .Header                 = {.Size = USB_STRING_LEN(24), .Type = DTYPE_String},

   .UnicodeString          = L"My Test Product String for Testing"
};

/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
 *  device characteristics, including the supported USB version, control endpoint size and the
 *  number of device configurations. The descriptor is read out by the USB host when the enumeration
 *  process begins.
 */
const USB_Descriptor_Device_t DeviceDescriptor =
{
   .Header                 = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device},

   .USBSpecification       = VERSION_BCD(01.10),
   .Class                  = USB_CSCP_NoDeviceClass,
   .SubClass               = USB_CSCP_NoDeviceSubclass,
   .Protocol               = USB_CSCP_NoDeviceProtocol,

   .Endpoint0Size          = FIXED_CONTROL_ENDPOINT_SIZE,

   .VendorID               = 0x03EB,
   .ProductID              = 0x2067,
   .ReleaseNumber          = VERSION_BCD(00.01),

   .ManufacturerStrIndex   = 0x01,
   .ProductStrIndex        = 0x02,
   .SerialNumStrIndex      = NO_DESCRIPTOR,

   .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS
};

/** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage
 *  of the device in one of its supported configurations, including information about any device interfaces
 *  and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting
 *  a configuration so that the host may correctly communicate with the USB device.
 */
const USB_Descriptor_Configuration_t ConfigurationDescriptor =
{
   .Config =
      {
         .Header                 = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration},

         .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t),
         .TotalInterfaces        = 1,

         .ConfigurationNumber    = 1,
         .ConfigurationStrIndex  = NO_DESCRIPTOR,

         .ConfigAttributes       = USB_CONFIG_ATTR_RESERVED,

         .MaxPowerConsumption    = USB_CONFIG_POWER_MA(100)
      },

   .HID_Interface =
      {
         .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},

         .InterfaceNumber        = 0x00,
         .AlternateSetting       = 0x00,

         .TotalEndpoints         = 1,

         .Class                  = HID_CSCP_HIDClass,
         .SubClass               = HID_CSCP_NonBootSubclass,
         .Protocol               = HID_CSCP_NonBootProtocol,

         .InterfaceStrIndex      = NO_DESCRIPTOR
      },

   .HID_VendorHID =
      {
         .Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},

         .HIDSpec                = VERSION_BCD(01.11),
         .CountryCode            = 0x00,
         .TotalReportDescriptors = 1,
         .HIDReportType          = HID_DTYPE_Report,
         .HIDReportLength        = sizeof(HIDReport)
      },

   .HID_ReportINEndpoint =
      {
         .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},

         .EndpointAddress        = (ENDPOINT_DIR_IN | HID_IN_EPNUM),
         .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
         .EndpointSize           = HID_IN_EPSIZE,
         .PollingIntervalMS      = 0x01
      },
};

/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors"
 *  documentation) by the application code so that the address and size of a requested descriptor can be given
 *  to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function
 *  is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the
 *  USB host.
 */
uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
                                    const uint8_t wIndex,
                                    const void** const DescriptorAddress)
{
   const uint8_t DescriptorType   = (wValue >> 8);
   const uint8_t DescriptorNumber = (wValue & 0xFF);

   const void* Address = NULL;
   uint16_t    Size    = NO_DESCRIPTOR;


   //If/Else If chain compiles slightly smaller than a switch case
   if (DescriptorType == DTYPE_Device)
   {
      Address = &DeviceDescriptor;
      Size    = sizeof(USB_Descriptor_Device_t);
   }
   else if (DescriptorType == DTYPE_Configuration)
   {
      Address = &ConfigurationDescriptor;
      Size    = sizeof(USB_Descriptor_Configuration_t);
   }
   else if (DescriptorType == DTYPE_String)
   {
      switch (DescriptorNumber)
      {
         case 0x00:
            Address = &LanguageString;
            Size    = pgm_read_byte(&LanguageString.Header.Size);
            break;
         case 0x01:
            Address = &ManufacturerString;
            Size    = pgm_read_byte(&ManufacturerString.Header.Size);
            break;
         case 0x02:
            Address = &ProductString;
            Size    = pgm_read_byte(&ProductString.Header.Size);
            break;
      }
   }
   else if (DescriptorType == HID_DTYPE_HID)
   {
      Address = &ConfigurationDescriptor.HID_VendorHID;
      Size    = sizeof(USB_HID_Descriptor_HID_t);
   }
   else if (DescriptorType == HID_DTYPE_Report)
   {
      Address = &HIDReport;
      Size    = sizeof(HIDReport);
   }

   *DescriptorAddress = Address;
   return Size;
}


 
 View user's profile Send private message  
Reply with quote Back to top
abcminiuser
PostPosted: Jul 27, 2012 - 10:15 PM
Moderator


Joined: Jan 23, 2004
Posts: 9832
Location: Trondheim, Norway

Remove the calls to pgm_read_byte() in the descriptor callback function - the descriptors are located in RAM, so you shouldn't try to read out data from the FLASH memory space.

- Dean Twisted Evil

_________________
Atmel Studio 6.1 is now released, grab it here.
Report AS6/ASF bugs here.
 
 View user's profile Send private message Send e-mail Visit poster's website 
Reply with quote Back to top
12oclocker
PostPosted: Jul 27, 2012 - 10:38 PM
Hangaround


Joined: Apr 19, 2009
Posts: 200


opps! you're right, lol, thanks Dean! Wink
 
 View user's profile Send private message  
Reply with quote Back to top
Display posts from previous:     
Jump to:  
All times are GMT + 1 Hour
Post new topic   Reply to topic
View previous topic Printable version Log in to check your private messages View next topic
Powered by PNphpBB2 © 2003-2006 The PNphpBB Group
Credits