# USBify Project

# Set Target Chip
#  Note that this affects the pin-out for 5V-tolerant button outputs:
#  24FJ64GB002 5V-tolerant button output pins: 14 (RB5), 16 (RB7), 17 (RB8), 18 (RB9)
#  24FJ128GB202 5V-tolerant button output pins: 14 (RB5), 16 (RB7), 17 (RB8)
#TARGET_CHIP := 24FJ64GB002
TARGET_CHIP := 24FJ128GB202

# Enable Microchip USB lib. debugging output
#CFLAGS += -DDEBUG_MODE

# Enable USB Host Shield lib. debugging output (also see settings.h)
#CFLAGS += -DDEBUG_USB_HOST

# Set TinyUSB Lib. (HID Report Descriptor parser) debugging level (1=error, 2=error+warning)
#CFLAGS += -DCFG_TUSB_DEBUG=2

# Enable Bluetooth
BLUETOOTH := ENABLED

ifeq "$(BLUETOOTH)" "ENABLED"
CFLAGS += -DBLUETOOTH
LIB_SRCS += BTD.cpp BTHID.cpp PS3BT.cpp
BT_HEADERS := BTD.h BTHID.h PS4BT.h PS3BT.h
endif

TARGET_FAMILY := PIC24F
XC16DIR := /opt/microchip/xc16/v1.33
MICROCHIP_USB_DIR := ../../../Microchip
LIB_DIR := ../..
HID_LIB_DIR := $(LIB_DIR)/hid_report_parser
VPATH := $(LIB_DIR) $(HID_LIB_DIR)

LIB_SRCS += PS4Parser.cpp parsetools.cpp message.cpp \
 Usb.cpp usbhid.cpp hiduniversal.cpp PS3USB.cpp HIDJoyParser.cpp \
 PS5Parser.cpp hidboot.cpp pic24_arduino.cpp
HID_LIB_SRCS := hid_ri.c hid_rip.c hid_host_utils.c hid_host_joy.c
LIB_OBJS := $(addsuffix .o,$(basename $(LIB_SRCS)))
HID_LIB_OBJS := $(addsuffix .o,$(basename $(HID_LIB_SRCS)))
SRCS = $(LIB_SRCS) $(HID_LIB_SRCS)
OBJS = $(LIB_OBJS) $(HID_LIB_OBJS)

INC_DIRS := $(MICROCHIP_USB_DIR)/Include $(LIB_DIR) $(HID_LIB_DIR) .
INC_FLAGS := $(addprefix -I,$(INC_DIRS))

CFLAGS += -mcpu=$(TARGET_CHIP) -omf=elf -DXPRJ_XC16_24FJ256GA110=XC16_24FJ256GA110 \
 -O1 -mno-eds-warn -no-legacy-libc -msmart-io=1 -Wall -msfr-warn=off \
 -DTARGET=PIC$(TARGET_CHIP) $(INC_FLAGS)
CPPFLAGS += $(CFLAGS) -fno-exceptions -fno-rtti -fno-threadsafe-statics

LDSCRIPT := $(XC16DIR)/support/$(TARGET_FAMILY)/gld/p$(TARGET_CHIP).gld
LDFLAGS += '-p$(TARGET_CHIP)' -Map=firmware.map '--script' '$(LDSCRIPT)' '--heap=2048' \
 '--stack=512' '--check-sections' '--data-init' '--pack-data' '--handles' '--isr' \
 '--no-gc-sections' '--fill-upper=0' '--stackguard=16' '--no-force-link' '--smart-io' \
 '--report-mem' '-L$(XC16DIR)/lib' '-L$(XC16DIR)/lib/$(TARGET_FAMILY)'
LIBS = -lc -lpic30 -lm
CC := $(XC16DIR)/bin/xc16-gcc
CXX := $(XC16DIR)/bin/xc16-g++

all: firmware.hex

## COMPILE
uart_debug.lib: uart_debug.c
	$(CC) $(CFLAGS) -c $< -o $@

debug.o: debug.c
	$(CC) $(CFLAGS) -c $< -o $@

hid_host_joy.o: hid_host_joy.c hid_host_joy.h hid_host_utils.h hid_ri.h hid_rip.h stdbool.h
	$(CC) $(CFLAGS) -std=c99 -c $< -o $(addprefix $(HID_LIB_DIR)/,$@)

usb_host.o: $(MICROCHIP_USB_DIR)/USB/usb_host.c
	$(CC) $(CFLAGS) -c $< -o $@

TimeDelay.o: $(MICROCHIP_USB_DIR)/Common/TimeDelay.c
	$(CC) $(CFLAGS) -c $< -o $@

Flash_Operations.o: $(MICROCHIP_USB_DIR)/DEE_Emulation_16-bit/Flash_Operations.s
	$(CC) $(CFLAGS) -c $< -o $@

DEE_Emulation_16-bit.o: $(MICROCHIP_USB_DIR)/DEE_Emulation_16-bit/DEE_Emulation_16-bit.c DEE_Emulation_16-bit.h
	$(CC) $(CFLAGS) -c $< -o $@

usb_config.o: usb_config.c
	$(CC) $(CFLAGS) -c $< -o $@

minilibstdc++.o: minilibstdc++.cpp
	$(CXX) $(CPPFLAGS) -c $< -o $@

vec2usb.o: vec2usb.cpp
	$(CXX) $(CPPFLAGS) -c $< -o $@

.c.o:
	$(CC) $(CFLAGS) -std=c99 -c $< -o $@

.cpp.o:
	$(CXX) $(CPPFLAGS) -c $< -o $@

## LINK
firmware.elf: uart_debug.lib debug.o Flash_Operations.o DEE_Emulation_16-bit.o vec2usb.o \
	minilibstdc++.o usb_host.o usb_config.o TimeDelay.o \
	$(addprefix $(HID_LIB_DIR)/,$(HID_LIB_OBJS)) $(LIB_OBJS)
	$(XC16DIR)/bin/xc16-ld $(LDFLAGS) $^ $(LIBS) -o $@

## BIN2HEX
firmware.hex: firmware.elf
	$(XC16DIR)/bin/xc16-bin2hex $<

## CLEAN
.PHONY: clean
clean:
	$(RM) usb_config.o usb_host.o Flash_Operations.o DEE_Emulation_16-bit.o minilibstdc++.o vec2usb.o \
	firmware.elf firmware.hex firmware.map $(LIB_OBJS) minilibstdc++.o firmware.o usb_host.o TimeDelay.o \
	uart_debug.lib debug.o $(addprefix $(HID_LIB_DIR)/,$(HID_LIB_OBJS))

vec2usb.o: HardwareProfile.h PS4USB.h hiduniversal.h \
 usbhid.h Usb.h inttypes.h \
 version_helper.h settings.h macros.h \
 printhex.h message.h hexdump.h \
 sink_parser.h address.h usb_ch9.h \
 UsbCore.h parsetools.h confdescparser.h \
 hidusagestr.h PS4Parser.h controllerEnums.h \
 pic24_arduino.h PS3USB.h  PS5Parser.h PS5USB.h \
  hidboot.h HIDJoyParser.h HIDJoyUSB.h \
 usb_config.h usb_host_internal.h hid.h $(BT_HEADERS)

## WRITE
# Write firmware to Microcontroller using command-line programmer interfaces
PK2DeviceFilePATH = /usr/share/pk2

# PICKIT 2/3
pkwrite: firmware.hex
	pk2cmd -B$(PK2DeviceFilePATH) -A3.3 -PPIC$(TARGET_CHIP) -Ffirmware.hex -J -M

# LVICSP
pgmwrite: firmware.hex
	picpgm -pic PIC$(TARGET_CHIP) -p firmware.hex

pgmwriteq: firmware.hex
	picpgm -pic PIC$(TARGET_CHIP) -no_verify -p firmware.hex
