Compile PowerSwitch using AVR Studio 4.18

General discussions about V-USB, our firmware-only implementation of a low speed USB device on Atmel's AVR microcontrollers
Post Reply
meneerflappy
Posts: 2
Joined: Tue Dec 29, 2009 6:26 pm

Compile PowerSwitch using AVR Studio 4.18

Post by meneerflappy » Tue Dec 29, 2009 6:49 pm

II have been trying to compile the demo program PowerSwitch using AVR studio.

For this I have created a new project
Copy pasted the contents of main.c into my project file (firmware.c).
Ensured that all the libraries are found in the compiler options

Pressed F7 (build)

The build fails with the following error messages:

rm -rf firmware.o firmware.elf dep/* firmware.hex firmware.eep firmware.lss firmware.map
Build succeeded with 0 Warnings...
avr-gcc -I"C:\compile\firmware" -I"C:\compile\usbdrv" -I"C:\compile\." -mmcu=atmega48 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT firmware.o -MF dep/firmware.o.d -c ../firmware.c
avr-gcc -mmcu=atmega48 -Wl,-Map=firmware.map firmware.o -lc -o firmware.elf
firmware.o: In function `usbFunctionSetup':
C:\compile\default/../firmware.c:90: undefined reference to `usbMsgPtr'
C:\compile\default/../firmware.c:90: undefined reference to `usbMsgPtr'
firmware.o: In function `main':
C:\compile\default/../firmware.c:155: undefined reference to `usbInit'
C:\compile\default/../firmware.c:159: undefined reference to `usbPoll'
make: *** [firmware.elf] Error 1
Build failed with 4 errors and 0 warnings...

At this moment I am just trying to compile the software to see if it might work with my device.

Any suggestions what I can do to improve?

christian
Objective Development
Objective Development
Posts: 1443
Joined: Thu Nov 09, 2006 11:46 am

Re: Compile PowerSwitch using AVR Studio 4.18

Post by christian » Wed Dec 30, 2009 9:33 am

You need to add the USB related files (assembler and C) to your project. Instead of copy/pasteing the contents of main.c, simply add main.c to your project and remove firmware.c.

Also, please make sure that defines like F_CPU and options like the -I options for gcc are set correctly. See the Makefile for details.

meneerflappy
Posts: 2
Joined: Tue Dec 29, 2009 6:26 pm

Re: Compile PowerSwitch using AVR Studio 4.18

Post by meneerflappy » Wed Dec 30, 2009 6:14 pm

Thanx,

it did the trick, the program compiled. Now lets see if I can get the hardware to work :)

r0nfl
Posts: 1
Joined: Wed Oct 27, 2010 10:48 pm

Re: Compile PowerSwitch using AVR Studio 4.18

Post by r0nfl » Wed Oct 27, 2010 11:00 pm

Hey, these are nice hints but I am not sure how to use them.

At the Moment I am working on the "HIDKeys" project:

main.c:

Code: Select all

/* Name: usbconfig.h
 * Project: AVR USB driver
 * Author: Christian Starkjohann
 * Creation Date: 2005-04-01
 * Tabsize: 4
 * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
 * License: GNU GPL v2 (see License.txt) or proprietary (CommercialLicense.txt)
 * This Revision: $Id: usbconfig.h 300 2007-03-29 17:07:35Z cs $
 */

#ifndef __usbconfig_h_included__
#define __usbconfig_h_included__

/*
General Description:
This file contains parts of the USB driver which can be configured and can or
must be adapted to your hardware.

Please note that the usbdrv contains a usbconfig-prototype.h file now. We
recommend that you use that file as a template because it will always list
the newest features and options.
*/

/* ---------------------------- Hardware Config ---------------------------- */

#define USB_CFG_IOPORTNAME      D
/* This is the port where the USB bus is connected. When you configure it to
 * "B", the registers PORTB, PINB and DDRB will be used.
 */
#define USB_CFG_DMINUS_BIT      0
/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
 * This may be any bit in the port.
 */
#define USB_CFG_DPLUS_BIT       2
/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
 * This may be any bit in the port. Please note that D+ must also be connected
 * to interrupt pin INT0!
 */

/* ----------------------- Optional Hardware Config ------------------------ */

/* #define USB_CFG_PULLUP_IOPORTNAME   D */
/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
 * V+, you can connect and disconnect the device from firmware by calling
 * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
 * This constant defines the port on which the pullup resistor is connected.
 */
/* #define USB_CFG_PULLUP_BIT          4 */
/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
 * above) where the 1.5k pullup resistor is connected. See description
 * above for details.
 */

/* --------------------------- Functional Range ---------------------------- */

#define USB_CFG_HAVE_INTRIN_ENDPOINT    1
/* Define this to 1 if you want to compile a version with two endpoints: The
 * default control endpoint 0 and an interrupt-in endpoint 1.
 */
#define USB_CFG_HAVE_INTRIN_ENDPOINT3   0
/* Define this to 1 if you want to compile a version with three endpoints: The
 * default control endpoint 0, an interrupt-in endpoint 1 and an interrupt-in
 * endpoint 3. You must also enable endpoint 1 above.
 */
#define USB_CFG_IMPLEMENT_HALT          0
/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
 * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
 * it is required by the standard. We have made it a config option because it
 * bloats the code considerably.
 */
#define USB_CFG_INTR_POLL_INTERVAL      10
/* If you compile a version with endpoint 1 (interrupt-in), this is the poll
 * interval. The value is in milliseconds and must not be less than 10 ms for
 * low speed devices.
 */
#define USB_CFG_IS_SELF_POWERED         0
/* Define this to 1 if the device has its own power supply. Set it to 0 if the
 * device is powered from the USB bus.
 */
#define USB_CFG_MAX_BUS_POWER           100
/* Set this variable to the maximum USB bus power consumption of your device.
 * The value is in milliamperes. [It will be divided by two since USB
 * communicates power requirements in units of 2 mA.]
 */
#define USB_CFG_IMPLEMENT_FN_WRITE      0
/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
 * transfers. Set it to 0 if you don't need it and want to save a couple of
 * bytes.
 */
#define USB_CFG_IMPLEMENT_FN_READ       0
/* Set this to 1 if you need to send control replies which are generated
 * "on the fly" when usbFunctionRead() is called. If you only want to send
 * data from a static buffer, set it to 0 and return the data from
 * usbFunctionSetup(). This saves a couple of bytes.
 */
#define USB_CFG_IMPLEMENT_FN_WRITEOUT   0
/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoint 1.
 * You must implement the function usbFunctionWriteOut() which receives all
 * interrupt/bulk data sent to endpoint 1.
 */
#define USB_CFG_HAVE_FLOWCONTROL        0
/* Define this to 1 if you want flowcontrol over USB data. See the definition
 * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
 * usbdrv.h.
 */

/* -------------------------- Device Description --------------------------- */

/* We cannot use Obdev's free shared VID/PID pair because this is a HID.
 * We use John Hyde's VID (author of the book "USB Design By Example") for
 * this example instead. John has offered this VID for use by students for
 * non-commercial devices. Well... This example is for demonstration and
 * education only... DO NOT LET DEVICES WITH THIS VID ESCAPE YOUR LAB!
 * The Product-ID is a random number.
 */
#define  USB_CFG_VENDOR_ID       0x42, 0x42
/* USB vendor ID for the device, low byte first. If you have registered your
 * own Vendor ID, define it here. Otherwise you use obdev's free shared
 * VID/PID pair. Be sure to read USBID-License.txt for rules!
 */
#define  USB_CFG_DEVICE_ID       0x31, 0xe1
/* This is the ID of the product, low byte first. It is interpreted in the
 * scope of the vendor ID. If you have registered your own VID with usb.org
 * or if you have licensed a PID from somebody else, define it here. Otherwise
 * you use obdev's free shared VID/PID pair. Be sure to read the rules in
 * USBID-License.txt!
 */
#define USB_CFG_DEVICE_VERSION  0x00, 0x01
/* Version number of the device: Minor number first, then major number.
 */
#define USB_CFG_VENDOR_NAME     'o', 'b', 'd', 'e', 'v', '.', 'a', 't'
#define USB_CFG_VENDOR_NAME_LEN 8
/* These two values define the vendor name returned by the USB device. The name
 * must be given as a list of characters under single quotes. The characters
 * are interpreted as Unicode (UTF-16) entities.
 * If you don't want a vendor name string, undefine these macros.
 * ALWAYS define a vendor name containing your Internet domain name if you use
 * obdev's free shared VID/PID pair. See the file USBID-License.txt for
 * details.
 */
#define USB_CFG_DEVICE_NAME     'H', 'I', 'D', 'K', 'e', 'y', 's'
#define USB_CFG_DEVICE_NAME_LEN 7
/* Same as above for the device name. If you don't want a device name, undefine
 * the macros. See the file USBID-License.txt before you assign a name.
 */
/*#define USB_CFG_SERIAL_NUMBER   'N', 'o', 'n', 'e' */
/*#define USB_CFG_SERIAL_NUMBER_LEN   0 */
/* Same as above for the serial number. If you don't want a serial number,
 * undefine the macros.
 * It may be useful to provide the serial number through other means than at
 * compile time. See the section about descriptor properties below for how
 * to fine tune control over USB descriptors such as the string descriptor
 * for the serial number.
 */
#define USB_CFG_DEVICE_CLASS    0   /* specify the class at the interface level */
#define USB_CFG_DEVICE_SUBCLASS 0
/* See USB specification if you want to conform to an existing device class.
 */
#define USB_CFG_INTERFACE_CLASS     0x03    /* HID class */
#define USB_CFG_INTERFACE_SUBCLASS  0       /* no boot interface */
#define USB_CFG_INTERFACE_PROTOCOL  0       /* no protocol */
/* See USB specification if you want to conform to an existing device class or
 * protocol.
 */
#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH    35  /* total length of report descriptor */
/* Define this to the length of the HID report descriptor, if you implement
 * an HID device. Otherwise don't define it or define it to 0.
 */

/* ------------------- Fine Control over USB Descriptors ------------------- */
/* If you don't want to use the driver's default USB descriptors, you can
 * provide our own. These can be provided as (1) fixed length static data in
 * flash memory, (2) fixed length static data in RAM or (3) dynamically at
 * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
 * information about this function.
 * Descriptor handling is configured through the descriptor's properties. If
 * no properties are defined or if they are 0, the default descriptor is used.
 * Possible properties are:
 *   + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
 *     at runtime via usbFunctionDescriptor().
 *   + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
 *     in static memory is in RAM, not in flash memory.
 *   + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
 *     the driver must know the descriptor's length. The descriptor itself is
 *     found at the address of a well known identifier (see below).
 * List of static descriptor names (must be declared PROGMEM if in flash):
 *   char usbDescriptorDevice[];
 *   char usbDescriptorConfiguration[];
 *   char usbDescriptorHidReport[];
 *   char usbDescriptorString0[];
 *   int usbDescriptorStringVendor[];
 *   int usbDescriptorStringDevice[];
 *   int usbDescriptorStringSerialNumber[];
 * Other descriptors can't be provided statically, they must be provided
 * dynamically at runtime.
 *
 * Descriptor properties are or-ed or added together, e.g.:
 * #define USB_CFG_DESCR_PROPS_DEVICE   (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
 *
 * The following descriptors are defined:
 *   USB_CFG_DESCR_PROPS_DEVICE
 *   USB_CFG_DESCR_PROPS_CONFIGURATION
 *   USB_CFG_DESCR_PROPS_STRINGS
 *   USB_CFG_DESCR_PROPS_STRING_0
 *   USB_CFG_DESCR_PROPS_STRING_VENDOR
 *   USB_CFG_DESCR_PROPS_STRING_PRODUCT
 *   USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
 *   USB_CFG_DESCR_PROPS_HID
 *   USB_CFG_DESCR_PROPS_HID_REPORT
 *   USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
 *
 */

#define USB_CFG_DESCR_PROPS_DEVICE                  0
#define USB_CFG_DESCR_PROPS_CONFIGURATION           0
#define USB_CFG_DESCR_PROPS_STRINGS                 0
#define USB_CFG_DESCR_PROPS_STRING_0                0
#define USB_CFG_DESCR_PROPS_STRING_VENDOR           0
#define USB_CFG_DESCR_PROPS_STRING_PRODUCT          0
#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER    0
#define USB_CFG_DESCR_PROPS_HID                     0
#define USB_CFG_DESCR_PROPS_HID_REPORT              0
#define USB_CFG_DESCR_PROPS_UNKNOWN                 0

/* ----------------------- Optional MCU Description ------------------------ */

/* The following configurations have working defaults in usbdrv.h. You
 * usually don't need to set them explicitly. Only if you want to run
 * the driver on a device which is not yet supported or with a compiler
 * which is not fully supported (such as IAR C) or if you use a differnt
 * interrupt than INT0, you may have to define some of these.
 */
/* #define USB_INTR_CFG            MCUCR */
/* #define USB_INTR_CFG_SET        ((1 << ISC00) | (1 << ISC01)) */
/* #define USB_INTR_CFG_CLR        0 */
/* #define USB_INTR_ENABLE         GIMSK */
/* #define USB_INTR_ENABLE_BIT     INT0 */
/* #define USB_INTR_PENDING        GIFR */
/* #define USB_INTR_PENDING_BIT    INTF0 */

#endif /* __usbconfig_h_included__ */



The console output is:

Code: Select all

rm -rf main.o  HID-Keys.elf dep/* HID-Keys.hex HID-Keys.eep HID-Keys.lss HID-Keys.map
Build succeeded with 0 Warnings...
avr-gcc  -mmcu=atmega8 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT main.o -MF dep/main.o.d  -c  ../main.c
../main.c:11:1: warning: "F_CPU" redefined
<command-line>: warning: this is the location of the previous definition
../main.c: In function 'main':
../main.c:283: warning: implicit declaration of function 'usbInterruptIsReady'
../main.c:288: warning: implicit declaration of function 'usbSetInterrupt'
avr-gcc -mmcu=atmega8 -Wl,-Map=HID-Keys.map main.o     -o HID-Keys.elf
main.o: In function `usbFunctionSetup':
E:\Progs\AVR_Projekte\HID-Keys\default/../main.c:233: undefined reference to `usbMsgPtr'
E:\Progs\AVR_Projekte\HID-Keys\default/../main.c:233: undefined reference to `usbMsgPtr'
E:\Progs\AVR_Projekte\HID-Keys\default/../main.c:240: undefined reference to `usbMsgPtr'
E:\Progs\AVR_Projekte\HID-Keys\default/../main.c:240: undefined reference to `usbMsgPtr'
main.o: In function `main':
E:\Progs\AVR_Projekte\HID-Keys\default/../main.c:261: undefined reference to `usbInit'
E:\Progs\AVR_Projekte\HID-Keys\default/../main.c:266: undefined reference to `usbPoll'
E:\Progs\AVR_Projekte\HID-Keys\default/../main.c:283: undefined reference to `usbInterruptIsReady'
E:\Progs\AVR_Projekte\HID-Keys\default/../main.c:288: undefined reference to `usbSetInterrupt'
make: *** [HID-Keys.elf] Error 1
Build failed with 8 errors and 4 warnings...



Then I add "-l" to the Custom compilation Options. The console output is now:

Code: Select all

rm -rf main.o  HID-Keys.elf dep/* HID-Keys.hex HID-Keys.eep HID-Keys.lss HID-Keys.map
Build succeeded with 0 Warnings...
avr-gcc  -mmcu=atmega8 -Wall -gdwarf-2 -std=gnu99   -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -l  -MD -MP -MT main.o -MF dep/main.o.d  -c  ../main.c
cc1.exe: error: to generate dependencies you must specify either -M or -MM
make: *** [main.o] Error 1
Build failed with 1 errors and 0 warnings...



ok... I am not getting an idea what to do now. Adding "-M" to the Custom compilation Options gets this from the console:

Code: Select all

rm -rf main.o  HID-Keys.elf dep/* HID-Keys.hex HID-Keys.eep HID-Keys.lss HID-Keys.map
Build succeeded with 0 Warnings...
avr-gcc  -mmcu=atmega8 -Wall -gdwarf-2 -std=gnu99    -l   -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -M  -MD -MP -MT main.o -MF dep/main.o.d  -c  ../main.c
avr-gcc -mmcu=atmega8 -Wl,-Map=HID-Keys.map main.o     -o HID-Keys.elf
avr-gcc: main.o: No such file or directory
make: *** [HID-Keys.elf] Error 1
Build failed with 1 errors and 0 warnings...



I have got no idea. I have added the usbdrvasm.S and usbdrvasm.asm to "Other Files" in AVR Studio 4.18 build 716. What am I doing wrong?

Post Reply