一、下載 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