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