Forum Rule: Always post complete source code & details to reproduce any issue!
Results 1 to 4 of 4

Thread: c compile errors due to avr updates

  1. #1
    Junior Member
    Join Date
    Jul 2019
    Posts
    1

    c compile errors due to avr updates

    I have errors compiling the example.c code from usb_serial example found here:
    https://www.pjrc.com/teensy/usb_serial.html
    I have Teensy 2.0++ and I use avr-libc (1:2.0.0+Atmel3.6.0-1).

    Errors attached, but basically, it says that:
    Code:
    usb_serial.c:167:24: error: variable ‘config1_descriptor’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
    From a google search, I understand that this is due to avr library updates.
    Can you advise how to fix this? I believe other example code will also produce such errors.

    P.S. I know I should be doing this in Arduino IDE, however, I want to do it in C.
    Attached Files Attached Files

  2. #2
    Senior Member+ defragster's Avatar
    Join Date
    Feb 2015
    Posts
    8,792
    Without the code posted there is no sure clear answer.

    Some things need to be made "const" or "PROGMEM" needs to be removed.

    Even with code - Not presenting and testing under IDE only assures we have no idea about creating a repro case as the build env is unknown.

    Though not sure build matters as PROGMEM things have to be const to work in any case.

  3. #3
    Junior Member
    Join Date
    Jul 2019
    Posts
    3
    Seeing the same in Blinky usb_debug_only.c.... It looks like all the descriptors are stuffed in PROGMEM and static, but not const.... I do not think any of them are changed, so const should be fine...

    Code:
    // Descriptors are the data that your computer reads when it auto-detects
    // this USB device (called "enumeration" in USB lingo).  The most commonly
    // changed items are editable at the top of this file.  Changing things
    // in here should only be done by those who've read chapter 9 of the USB
    // spec and relevant portions of any USB class specifications!
    
    
    static uint8_t PROGMEM device_descriptor[] = {
    	18,					// bLength
    	1,					// bDescriptorType
    	0x00, 0x02,				// bcdUSB
    	0,					// bDeviceClass
    	0,					// bDeviceSubClass
    	0,					// bDeviceProtocol
    	ENDPOINT0_SIZE,				// bMaxPacketSize0
    	LSB(VENDOR_ID), MSB(VENDOR_ID),		// idVendor
    	LSB(PRODUCT_ID), MSB(PRODUCT_ID),	// idProduct
    	0x00, 0x01,				// bcdDevice
    	1,					// iManufacturer
    	2,					// iProduct
    	0,					// iSerialNumber
    	1					// bNumConfigurations
    };
    
    static uint8_t PROGMEM hid_report_descriptor[] = {
    	0x06, 0x31, 0xFF,			// Usage Page 0xFF31 (vendor defined)
    	0x09, 0x74,				// Usage 0x74
    	0xA1, 0x53,				// Collection 0x53
    	0x75, 0x08,				// report size = 8 bits
    	0x15, 0x00,				// logical minimum = 0
    	0x26, 0xFF, 0x00,			// logical maximum = 255
    	0x95, DEBUG_TX_SIZE,			// report count
    	0x09, 0x75,				// usage
    	0x81, 0x02,				// Input (array)
    	0xC0					// end collection
    };
    
    #define CONFIG1_DESC_SIZE (9+9+9+7)
    #define HID_DESC2_OFFSET  (9+9)
    static uint8_t PROGMEM config1_descriptor[CONFIG1_DESC_SIZE] = {
    	// configuration descriptor, USB spec 9.6.3, page 264-266, Table 9-10
    	9, 					// bLength;
    	2,					// bDescriptorType;
    	LSB(CONFIG1_DESC_SIZE),			// wTotalLength
    	MSB(CONFIG1_DESC_SIZE),
    	1,					// bNumInterfaces
    	1,					// bConfigurationValue
    	0,					// iConfiguration
    	0xC0,					// bmAttributes
    	50,					// bMaxPower
    	// interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
    	9,					// bLength
    	4,					// bDescriptorType
    	0,					// bInterfaceNumber
    	0,					// bAlternateSetting
    	1,					// bNumEndpoints
    	0x03,					// bInterfaceClass (0x03 = HID)
    	0x00,					// bInterfaceSubClass
    	0x00,					// bInterfaceProtocol
    	0,					// iInterface
    	// HID interface descriptor, HID 1.11 spec, section 6.2.1
    	9,					// bLength
    	0x21,					// bDescriptorType
    	0x11, 0x01,				// bcdHID
    	0,					// bCountryCode
    	1,					// bNumDescriptors
    	0x22,					// bDescriptorType
    	sizeof(hid_report_descriptor),		// wDescriptorLength
    	0,
    	// endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
    	7,					// bLength
    	5,					// bDescriptorType
    	DEBUG_TX_ENDPOINT | 0x80,		// bEndpointAddress
    	0x03,					// bmAttributes (0x03=intr)
    	DEBUG_TX_SIZE, 0,			// wMaxPacketSize
    	1					// bInterval
    };
    
    // If you're desperate for a little extra code memory, these strings
    // can be completely removed if iManufacturer, iProduct, iSerialNumber
    // in the device desciptor are changed to zeros.
    struct usb_string_descriptor_struct {
    	uint8_t bLength;
    	uint8_t bDescriptorType;
    	int16_t wString[];
    };
    static struct usb_string_descriptor_struct PROGMEM string0 = {
    	4,
    	3,
    	{0x0409}
    };
    static struct usb_string_descriptor_struct PROGMEM string1 = {
    	sizeof(STR_MANUFACTURER),
    	3,
    	STR_MANUFACTURER
    };
    static struct usb_string_descriptor_struct PROGMEM string2 = {
    	sizeof(STR_PRODUCT),
    	3,
    	STR_PRODUCT
    };

  4. #4
    Junior Member
    Join Date
    Jul 2019
    Posts
    3
    Yep.... just adding the missing const works just fine:

    Code:
    // Descriptors are the data that your computer reads when it auto-detects
    // this USB device (called "enumeration" in USB lingo).  The most commonly
    // changed items are editable at the top of this file.  Changing things
    // in here should only be done by those who've read chapter 9 of the USB
    // spec and relevant portions of any USB class specifications!
    
    
    static const uint8_t PROGMEM device_descriptor[] = {
    	18,					// bLength
    	1,					// bDescriptorType
    	0x00, 0x02,				// bcdUSB
    	0,					// bDeviceClass
    	0,					// bDeviceSubClass
    	0,					// bDeviceProtocol
    	ENDPOINT0_SIZE,				// bMaxPacketSize0
    	LSB(VENDOR_ID), MSB(VENDOR_ID),		// idVendor
    	LSB(PRODUCT_ID), MSB(PRODUCT_ID),	// idProduct
    	0x00, 0x01,				// bcdDevice
    	1,					// iManufacturer
    	2,					// iProduct
    	0,					// iSerialNumber
    	1					// bNumConfigurations
    };
    
    static const uint8_t PROGMEM hid_report_descriptor[] = {
    	0x06, 0x31, 0xFF,			// Usage Page 0xFF31 (vendor defined)
    	0x09, 0x74,				// Usage 0x74
    	0xA1, 0x53,				// Collection 0x53
    	0x75, 0x08,				// report size = 8 bits
    	0x15, 0x00,				// logical minimum = 0
    	0x26, 0xFF, 0x00,			// logical maximum = 255
    	0x95, DEBUG_TX_SIZE,			// report count
    	0x09, 0x75,				// usage
    	0x81, 0x02,				// Input (array)
    	0xC0					// end collection
    };
    
    #define CONFIG1_DESC_SIZE (9+9+9+7)
    #define HID_DESC2_OFFSET  (9+9)
    static const uint8_t PROGMEM config1_descriptor[CONFIG1_DESC_SIZE] = {
    	// configuration descriptor, USB spec 9.6.3, page 264-266, Table 9-10
    	9, 					// bLength;
    	2,					// bDescriptorType;
    	LSB(CONFIG1_DESC_SIZE),			// wTotalLength
    	MSB(CONFIG1_DESC_SIZE),
    	1,					// bNumInterfaces
    	1,					// bConfigurationValue
    	0,					// iConfiguration
    	0xC0,					// bmAttributes
    	50,					// bMaxPower
    	// interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
    	9,					// bLength
    	4,					// bDescriptorType
    	0,					// bInterfaceNumber
    	0,					// bAlternateSetting
    	1,					// bNumEndpoints
    	0x03,					// bInterfaceClass (0x03 = HID)
    	0x00,					// bInterfaceSubClass
    	0x00,					// bInterfaceProtocol
    	0,					// iInterface
    	// HID interface descriptor, HID 1.11 spec, section 6.2.1
    	9,					// bLength
    	0x21,					// bDescriptorType
    	0x11, 0x01,				// bcdHID
    	0,					// bCountryCode
    	1,					// bNumDescriptors
    	0x22,					// bDescriptorType
    	sizeof(hid_report_descriptor),		// wDescriptorLength
    	0,
    	// endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
    	7,					// bLength
    	5,					// bDescriptorType
    	DEBUG_TX_ENDPOINT | 0x80,		// bEndpointAddress
    	0x03,					// bmAttributes (0x03=intr)
    	DEBUG_TX_SIZE, 0,			// wMaxPacketSize
    	1					// bInterval
    };
    
    // If you're desperate for a little extra code memory, these strings
    // can be completely removed if iManufacturer, iProduct, iSerialNumber
    // in the device desciptor are changed to zeros.
    struct usb_string_descriptor_struct {
    	uint8_t bLength;
    	uint8_t bDescriptorType;
    	int16_t wString[];
    };
    static const struct usb_string_descriptor_struct PROGMEM string0 = {
    	4,
    	3,
    	{0x0409}
    };
    static const struct usb_string_descriptor_struct PROGMEM string1 = {
    	sizeof(STR_MANUFACTURER),
    	3,
    	STR_MANUFACTURER
    };
    static const struct usb_string_descriptor_struct PROGMEM string2 = {
    	sizeof(STR_PRODUCT),
    	3,
    	STR_PRODUCT
    };
    
    // This table defines which descriptor data is sent for each specific
    // request from the host (in wValue and wIndex).
    static const struct descriptor_list_struct {
    	uint16_t	wValue;
    	uint16_t	wIndex;
    	const uint8_t	*addr;
    	uint8_t		length;
    } PROGMEM descriptor_list[] = {
    	{0x0100, 0x0000, device_descriptor, sizeof(device_descriptor)},
    	{0x0200, 0x0000, config1_descriptor, sizeof(config1_descriptor)},
    	{0x2200, 0x0000, hid_report_descriptor, sizeof(hid_report_descriptor)},
    	{0x2100, 0x0000, config1_descriptor+HID_DESC2_OFFSET, 9},
    	{0x0300, 0x0000, (const uint8_t *)&string0, 4},
    	{0x0301, 0x0409, (const uint8_t *)&string1, sizeof(STR_MANUFACTURER)},
    	{0x0302, 0x0409, (const uint8_t *)&string2, sizeof(STR_PRODUCT)}
    };

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •