2015年7月25日 星期六

UnoJoy HexFiles Compile and Flash

系統環境:Debian Linux 8.0

一、下載 Source Code
UnoJoy 官方下載: https://github.com/AlanChatham/UnoJoy

二、安裝刷 Arduino 韌體工具
安裝 Flash 工具「dfu-programmer」及編譯工具「avr-gcc」:
su
apt-get update
apt-get install dfu-programmer
apt-get install gcc-avr avr-libc binutils-avr gdb-avr avrdude

三、燒入 Arduino .ino Code
以官方軟體 Arduino IDE 寫好程式,直接燒入。

四、編譯並燒至 Firmware

Step 1. Compile .c to .o
avr-gcc -DF_CPU=16000000UL -mmcu=atmega8u2 -funsigned-char -funsigned-bitfields -Os -fpack-struct -fshort-enums -Wall -c UnoJoy.c -o UnoJoy.o

avr-gcc -DF_CPU=16000000UL -mmcu=atmega8u2 -funsigned-char -funsigned-bitfields -Os -fpack-struct -fshort-enums -Wall -c usb_gamepad.c -o usb_gamepad.o

Step 2. Compile .o to .elf
avr-gcc -mmcu=atmega8u2 -o UnoJoy.elf UnoJoy.o usb_gamepad.o

Step 3. Compile .elf to .hex
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature UnoJoy.elf UnoJoy.hex

Step 4. switch DFU mode
參考教學(適用 Arduino UNO R1/R2):https://www.arduino.cc/en/Hacking/DFUProgramming8U2
若是使用 Arduino UNO R3 版本,直接做短路 Reset 步驟,無需焊電阻。

可以使用 Linux 指令查看:
watch -n 1 'dmesg| grep -i arduino'

正常情況,
R1/R2 焊完 10K 電阻,短路後會顯示 DFU Mode;
而 R3 直接短路後,可能無輸出訊息。

Step 5. 燒入 Hex File 至 Flash Memory
(atmega8u2 晶片)
sudo dfu-programmer at90usb82 erase
sudo dfu-programmer at90usb82 flash UnoJoy.hex
sudo dfu-programmer at90usb82 reset

(atmega16u2 晶片)
sudo dfu-programmer atmega16u2 erase
sudo dfu-programmer atmega16u2 flash UnoJoy.hex
sudo dfu-programmer atmega16u2 reset

此時,將 Arduino 插入 Host 端會顯示為一支搖桿,
並且無法使用 Arduino IDE 做程式燒錄,
必須再燒 firmware 回原廠設定。

五、UnoJoy Joystick 回原為 Arduino UNO
找到檔案 Arduino-usbserial-uno.hex ,
同樣用 DFU Mode ,並以指令 dfu-programmer 指令做燒錄動作。

補充:自編一個 Makefile:
##############################################################################
# UnoJoy Test Makefile
##############################################################################
# AVR Libc Reference Manual
# http://www.atmel.com/webdoc/AVRLibcReferenceManual/group__util__delay.html

# Toolchain
OBJCOPY = avr-objcopy
CC = avr-gcc
F_CPU = -DF_CPU=16000000UL
MMCU = -mmcu=atmega8u2
C_FLAGS = $(F_CPU)
C_FLAGS += $(MMCU)
C_FLAGS += -funsigned-char
C_FLAGS += -funsigned-bitfields
C_FLAGS += -Os
C_FLAGS += -fpack-struct
C_FLAGS += -fshort-enums
C_FLAGS += -Wall

# Target source file
UNOJOY = UnoJoy
GAMEPAD= usb_gamepad
C_UNOJOY = $(UNOJOY).c
C_GAMEPAD = $(GAMEPAD).c

# Compile output file
O_UNOJOY = TEST_UnoJoy.o
O_GAMEPAD = TEST_gamepad.o
ELF_FILE = TEST.elf
HEX_FILE = TEST.hex
##############################################################################
all: $(ELF_FILE)
        @echo ============ HexFiles Creating ============
        $(OBJCOPY) -O ihex -R .eeprom -R .fuse -R .lock -R .signature $(ELF_FILE) $(HEX_FILE)

$(ELF_FILE): $(O_UNOJOY) $(O_GAMEPAD)
        @echo ============ ELF File Creating ============
        $(CC) $(MMCU) -o $@ $(O_UNOJOY) $(O_GAMEPAD)

$(O_UNOJOY): $(C_UNOJOY)
        @echo  ============ Compile $(C_UNOJOY) ============
        $(CC) $(C_FLAGS) -c $< -o $@

$(O_GAMEPAD): $(C_GAMEPAD)
        @echo ============ Compile $(C_GAMEPAD) ============
        $(CC) $(C_FLAGS) -c $< -o $@

clean:
        @echo "rm -f $(O_UNOJOY)" 
        @echo "rm -f $(O_GAMEPAD)"
        @echo "rm -f $(ELF_FILE)"
        @echo "rm -f $(HEX_FILE)"
        @echo ============ Clean: ALL ============
        @rm -f $(O_UNOJOY) $(O_GAMEPAD) $(ELF_FILE) $(HEX_FILE)




執行編譯檔案: make
清除編譯檔案:make clean


Reference:

  http://www.atmel.com/webdoc/AVRLibcReferenceManual/using_tools_1using_sel_gcc_opts.html