I for one welcome our new LUFA overlords
LUFA is so easy to get started with (at least when using WinAVR), it should almost be illegal. I wish libusb would get there, but given our slow rate of getting anything that is convenient for users actually integrated, I doubt we ever will... Anyway, first order of the day is to get the latest LUFA, which we'll pick from SVN. Or you can just pick the latest zip archive from the official website but if you're using LUFA_101122 or earlier, please be aware that there is a bug with the Minimus implementation with regards to the HWB button. To clone from SVN, just have a look here.
Now, the interesting thing of course is, if you look in
LUFA\Drivers\Board
, you'll see that there is a MINIMUS
directory. That means our current test board is supported straight out of the box. Yay!There are a bunch of demos and projects as well, which is also where you measure the usefulness of a library (once again, unlike libusb, which chose to remove proposed samples, despite having a very limited supply of 'em included...). To test LUFA with the Minimus, we're going to pick the Joystick demo from
Demos\Device\ClassDriver
. Of course, we don't have a joystick on our board, and just one usable button, so that'll be a pretty limited "joystick", but Windows should still list the device, and if everything works as expected, we should be able to see our button presses in real-time in Windows device properties, so it's not that bad of a trade-off.Minimus's minimal reconfiguration
The way you set things up for your target board in LUFA is by editing the relevant variables at the top of the makefile. If you go to the
Demos\Device\ClassDriver\Joystick
directory, you'll see that, apart from the source, you only have one makefile
as well as Joystick.aps
, which is the AVR Studio 4 project file that actually calls the makefile
for compilation.There's only very little we need to modify here. If you're using a Minimus board, here's what you want:
# MCU name MCU = at90usb162 # Target architecture (see library "Board Types" documentation). ARCH = AVR8 # Target board BOARD = MINIMUS # Processor frequency. F_CPU = 16000000
Compiling with AVR Studio 5 from the commandline
As pointed out earlier, we're not going to install WinAVR, because that would be too easy. We got a perfectly good
avr-gcc
toolchain installed with AVR Studio 5, so we might as well use it. Oh, and we're not going to use the AVR Studio 4 → AVR Studio 5 conversion process on the .aps
just yet, because:- You might be interested in using AVR Studio 5 for compilation outside of the GUI
- We will run into issues with the default makefile, that are better fixed first from the commandline, before moving to AVR Studio
C:\Program Files (x86)\Atmel\AVR Studio 5.0\extensions\Application\AVR Toolchain\bin;Once that's done, just open a prompt and navigate to the Joystick directory. Then run make, and...
D:\lufa-lib\Demos\Device\ClassDriver\Joystick>make The system cannot find the path specified. The system cannot find the path specified. ECHO is off. -------- begin -------- avr-gcc (AVR_8_bit_GNU_Toolchain_3.2.0_253) 4.5.1 Copyright (C) 2010 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. The system cannot find the path specified. The system cannot find the path specified. -f was unexpected at this time. make: *** [sizebefore] Error 255Dang!
I'll just cut to the chase here:
The "
The system cannot find the path specified.
" occur whenever a "/dev/null
" redirection is done in the Makefile. As to the "-f was unexpected at this time" (now, aren't you glad you found this blog), it occurs from the if test -f $(TARGET).elf
statement that is done in "sizebefore:
". That's right Dorothy, we're not using a UNIX shell anymore...A quick glance at the "
sizebefore:
" and "sizeafter:
" statements tell us that they're completely optional. So let's just remove them, which means that you must change the line:# Default target. all: begin gccversion sizebefore build sizeafter endinto:
# Default target. all: begin gccversion build endAs well as remove these references in the:
# Listing of phony targets. .PHONY : all begin finish end sizebefore sizeafter gccversion \section at the end of the file.
The Joystick's in the mind, man...
Let's try that again, shall we?
D:\lufa-lib\Demos\Device\ClassDriver\Joystick>make The system cannot find the path specified. The system cannot find the path specified. ECHO is off. -------- begin -------- avr-gcc (AVR_8_bit_GNU_Toolchain_3.2.0_253) 4.5.1 Copyright (C) 2010 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. The system cannot find the path specified. The system cannot find the path specified. -f was unexpected at this time. make: *** [sizebefore] Error 255 D:\lufa-lib\Demos\Device\ClassDriver\Joystick>make The system cannot find the path specified. The system cannot find the path specified. ECHO is off. -------- begin -------- avr-gcc (AVR_8_bit_GNU_Toolchain_3.2.0_253) 4.5.1 Copyright (C) 2010 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ECHO is off. Compiling C: Joystick.c avr-gcc -c -mmcu=at90usb162 -I. -gdwarf-2 -DF_CPU=16000000UL -DF_CLOCK=16000000UL -DBOARD=BOARD_MINIMUS -DARCH=ARCH_AVR8 -D USB_DEVICE_ONLY -D FIXED_CONTROL_ENDPOINT_SIZE=8 -D FIXED_NUM_CONFIGURATIONS=1 -D USE_FLASH_DESCRIPTORS -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" -Os -funsigned-char -funsigned-bitfields -ffunction-sections -fno-inline-small-functions -fpack-struct -fshort-enums -fno-strict-aliasing -Wall -Wstrict-prototypes -Wa,-adhlns=./Joystick.lst -I../../../../ -std=c99 -MMD -MP -MF .dep/Joystick.o.d Joystick.c -o Joystick.o In file included from Joystick.h:49:0, from Joystick.c:37: ../../../../LUFA/Drivers/Board/Joystick.h:120:31: fatal error: Board/Joystick.h: No such file or directory compilation terminated. make: *** [Joystick.o] Error 1
That's a bit better. But yeah, the Board does indeed not define a joystick, so let's add a virtual one. The
Joystick.h
from LUFA\Drivers\Board\BUMBLEB
will actually do just fine (it's using Port D but doesn't conflict with our LEDs or switches), so we just copy that file over to LUFA\Drivers\Board\MINIMUS
. Ideally, you want to edit the __JOYSTICK_BUMBLEB_H__
macro in there to __JOYSTICK_MINIMUS_H__
. Then you also need to edit LUFA\Drivers\Board\Joystick.h
to add the lines:#elif (BOARD == BOARD_MINIMUS) #include "MINIMUS/Joystick.h"Alrighty, let's try again...
"Come on makefile, you used to be cool!"
D:\lufa-lib\Demos\Device\ClassDriver\Joystick>make The system cannot find the path specified. The system cannot find the path specified. ECHO is off. -------- begin -------- avr-gcc (AVR_8_bit_GNU_Toolchain_3.2.0_253) 4.5.1 Copyright (C) 2010 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ECHO is off. Compiling C: Joystick.c avr-gcc -c -mmcu=at90usb162 -I. -gdwarf-2 -DF_CPU=16000000UL -DF_CLOCK=16000000UL -DBOARD=BOARD_MINIMUS -DARCH=ARCH_AVR8 -D USB_DEVICE_ONLY -D FIXED_CONTROL_ENDPOINT_SIZE=8 -D FIXED_NUM_CONFIGURATIONS=1 -D USE_FLASH_DESCRIPTORS -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" -Os -funsigned-char -funsigned-bitfields -ffunction-sections -fno-inline-small-functions -fpack-struct -fshort-enums -fno-strict-aliasing -Wall -Wstrict-prototypes -Wa,-adhlns=./Joystick.lst -I../../../../ -std=c99 -MMD -MP -MF .dep/Joystick.o.d Joystick.c -o Joystick.o Joystick.c:188:1: fatal error: opening dependency file .dep/Joystick.o.d: No such file or directory compilation terminated. make: *** [Joystick.o] Error 1Ah, that dreaded "
fatal error: opening dependency file .dep/Joystick.o.d: No such file or directory
" error...Once again, to cut to the chase, you'll notice that we haven't fixed the "
The system cannot find the path specified.
" /dev/null
errors. Well, what do you know, the dependency problems actually comes from the .dep directory creation step not being able to execute because it references /dev/null
.The fix is simple (though output polluting): In the makefile, change the following:
# Create object files directory $(shell mkdir $(OBJDIR) 2>/dev/null) # Include the dependency files. -include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)into:
# Create object files directory $(shell mkdir $(OBJDIR)) # Include the dependency files. -include $(shell mkdir .dep) $(wildcard .dep/*)
Try again.
(...) ECHO is off. Creating load file for Flash: Joystick.hex avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock Joystick.elf Joystick.hex ECHO is off. Creating load file for EEPROM: Joystick.eep avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \ --change-section-lma .eeprom=0 --no-change-warnings -O ihex Joystick.elf Joystick.eep || exit 0 ECHO is off. Creating Extended Listing: Joystick.lss avr-objdump -h -S -z Joystick.elf > Joystick.lss ECHO is off. Creating Symbol Table: Joystick.sym avr-nm -n Joystick.elf > Joystick.sym -------- end --------Yes, we have our hex file!! The system works!
If you flash the hex, you should now get a nice little "LUFA Joystick Demo" in your devices, and if you go to the Game controller settings → Properties, you should be able to see the status of the HWB button in realtime.
Now, using AVR Studio 5 with LUFA wasn't that difficult after all was it?
In the next post, I'll show you how to run everything from the AVR Studio UI, so that you're all set for LUFA development.
Thank you very much for that, saved several hours of hairpulling! :))
ReplyDeleteActually, the /dev/null can be replaced with 'nul' (remove the quotas), but in some awkward reason AVR Toolchain does not include grep utility, so removing the sizebefore and sizeafter branches stays valid.
Best Regards,
Laid.
Thanks very much for this post! I'm pretty sure I would have started breaking things soon trying to decipher those cryptic errors.
ReplyDeleteFour months pass and I forget completely about this problem, and pull my hair out for hours until I find this post again. So, again, thanks!
ReplyDeleteWow, I love when things are well explained and minutely described! Just did the same thing with the Adafruit ATmega32U4 Breakout Board. Just had to do the same Board definitions for Buttons.h as you explained for Joystick.h. Easy-peasy!
ReplyDeleteIf will blog and refer to this at some point at http://dimsos.fridata.dk
Thank you so much.
Regards, Carl.
Hi All,
ReplyDeleteI am new to using AVR Atmel. Wanted to compile LUFA Joystick sample project with AVR studio.
I have followed the steps mentioned in link
I have added exported the PATH in windows environment and run the make.
I have added AVR Toolchain path to the PATH variable before compiling and followed Windows Prerequisites before compiling and get the same error.
I tested in three different laptops and get the same result.
But in one of the Laptop make is recognized. Path variable is same in all the setups. I have checked the make path in the AVR and observed it to be same. something else is different.
After running the make file, following error is seen
The system cannot find the path specified.
The system cannot find the path specified.
""
Begin compilation of project \"Joystick\"...
""
f was unexpected at this time.
make: *** [check-source] Error 255
Source file and configuration file is present in the Joystick directory, but still error occurs while compiling