From 60c861c0a228771bbb0f120733830fa1b47877cd Mon Sep 17 00:00:00 2001 From: cathery Date: Sun, 12 Jan 2020 05:01:44 +0300 Subject: [PATCH] Re-organize the project --- .gitignore | 10 +- .vscode/c_cpp_properties.json | 7 +- .vscode/tasks.json | 54 +--- ControllerUSB/README.md | 3 - Makefile | 248 ++---------------- SwitchUSB/README.md | 3 - .../contents/690000000000000D/toolbox.json | 5 + .../config}/sys-con/config_dualshock3.ini | 0 .../config}/sys-con/config_dualshock4.ini | 0 .../config}/sys-con/config_global.ini | 0 .../config}/sys-con/config_xbox360.ini | 0 .../config}/sys-con/config_xboxone.ini | 0 .../config}/sys-con/config_xboxoneadapter.ini | 0 .../config}/sys-con/config_xboxorig.ini | 0 {config => common/config}/sys-con/example.ini | 0 .../sys-con/firmware/XboxOneAdapter.bin | Bin source/AppletCompanion/Makefile | 218 +++++++++++++++ source/AppletCompanion/source/main.cpp | 24 ++ .../ControllerLib}/ControllerConfig.h | 0 .../ControllerLib}/ControllerHelpers.cpp | 0 .../ControllerLib}/ControllerHelpers.h | 0 .../ControllerLib}/ControllerTypes.h | 0 .../ControllerLib}/Controllers.h | 0 .../Controllers/Dualshock3Controller.cpp | 0 .../Controllers/Dualshock3Controller.h | 0 .../Controllers/Dualshock4Controller.cpp | 0 .../Controllers/Dualshock4Controller.h | 0 .../Controllers/Xbox360Controller.cpp | 0 .../Controllers/Xbox360Controller.h | 0 .../Controllers/Xbox360WirelessController.cpp | 0 .../Controllers/Xbox360WirelessController.h | 0 .../Controllers/XboxController.cpp | 0 .../Controllers/XboxController.h | 0 .../Controllers/XboxOneAdapter.cpp | 2 +- .../Controllers/XboxOneAdapter.h | 0 .../Controllers/XboxOneAdapter/Firmware.cpp | 0 .../Controllers/XboxOneAdapter/Firmware.h | 0 .../Controllers/XboxOneController.cpp | 2 +- .../Controllers/XboxOneController.h | 0 .../ControllerLib}/IController.h | 0 .../ControllerLib}/IUSBDevice.h | 0 .../ControllerLib}/IUSBEndpoint.h | 0 .../ControllerLib}/IUSBInterface.h | 0 .../include => source/ControllerLib}/Result.h | 0 .../SwitchAbstractedPadHandler.cpp | 0 .../SwitchAbstractedPadHandler.h | 0 .../SwitchControllerHandler.cpp | 0 .../SwitchControllerHandler.h | 0 .../ControllerSwitch}/SwitchHDLHandler.cpp | 0 .../ControllerSwitch}/SwitchHDLHandler.h | 0 .../ControllerSwitch}/SwitchThread.cpp | 0 .../ControllerSwitch}/SwitchThread.h | 0 .../ControllerSwitch}/SwitchUSBDevice.cpp | 0 .../ControllerSwitch}/SwitchUSBDevice.h | 0 .../ControllerSwitch}/SwitchUSBEndpoint.cpp | 0 .../ControllerSwitch}/SwitchUSBEndpoint.h | 0 .../ControllerSwitch}/SwitchUSBInterface.cpp | 0 .../ControllerSwitch}/SwitchUSBInterface.h | 0 .../SwitchVirtualGamepadHandler.cpp | 0 .../SwitchVirtualGamepadHandler.h | 0 source/Makefile | 16 ++ source/README.md | 2 +- source/Sysmodule/Makefile | 235 +++++++++++++++++ config.json => source/Sysmodule/config.json | 0 source/{ => Sysmodule/source}/configFile.cpp | 0 source/{ => Sysmodule/source}/configFile.h | 0 source/{ => Sysmodule/source}/log.c | 0 source/{ => Sysmodule/source}/log.h | 0 source/{ => Sysmodule/source}/main.cpp | 0 source/{ => Sysmodule/source}/mainLoop.cpp | 0 source/{ => Sysmodule/source}/mainLoop.h | 0 {inih => source/inih}/ini.c | 0 {inih => source/inih}/ini.h | 0 source/map.png | Bin 0 -> 49311 bytes source/map.xml | 1 + 75 files changed, 531 insertions(+), 299 deletions(-) delete mode 100644 ControllerUSB/README.md delete mode 100644 SwitchUSB/README.md create mode 100644 common/atmosphere/contents/690000000000000D/toolbox.json rename {config => common/config}/sys-con/config_dualshock3.ini (100%) rename {config => common/config}/sys-con/config_dualshock4.ini (100%) rename {config => common/config}/sys-con/config_global.ini (100%) rename {config => common/config}/sys-con/config_xbox360.ini (100%) rename {config => common/config}/sys-con/config_xboxone.ini (100%) rename {config => common/config}/sys-con/config_xboxoneadapter.ini (100%) rename {config => common/config}/sys-con/config_xboxorig.ini (100%) rename {config => common/config}/sys-con/example.ini (100%) rename {config => common/config}/sys-con/firmware/XboxOneAdapter.bin (100%) create mode 100644 source/AppletCompanion/Makefile create mode 100644 source/AppletCompanion/source/main.cpp rename {ControllerUSB/include => source/ControllerLib}/ControllerConfig.h (100%) rename {ControllerUSB/source => source/ControllerLib}/ControllerHelpers.cpp (100%) rename {ControllerUSB/include => source/ControllerLib}/ControllerHelpers.h (100%) rename {ControllerUSB/include => source/ControllerLib}/ControllerTypes.h (100%) rename {ControllerUSB/include => source/ControllerLib}/Controllers.h (100%) rename {ControllerUSB/source => source/ControllerLib}/Controllers/Dualshock3Controller.cpp (100%) rename {ControllerUSB/include => source/ControllerLib}/Controllers/Dualshock3Controller.h (100%) rename {ControllerUSB/source => source/ControllerLib}/Controllers/Dualshock4Controller.cpp (100%) rename {ControllerUSB/include => source/ControllerLib}/Controllers/Dualshock4Controller.h (100%) rename {ControllerUSB/source => source/ControllerLib}/Controllers/Xbox360Controller.cpp (100%) rename {ControllerUSB/include => source/ControllerLib}/Controllers/Xbox360Controller.h (100%) rename {ControllerUSB/source => source/ControllerLib}/Controllers/Xbox360WirelessController.cpp (100%) rename {ControllerUSB/include => source/ControllerLib}/Controllers/Xbox360WirelessController.h (100%) rename {ControllerUSB/source => source/ControllerLib}/Controllers/XboxController.cpp (100%) rename {ControllerUSB/include => source/ControllerLib}/Controllers/XboxController.h (100%) rename {ControllerUSB/source => source/ControllerLib}/Controllers/XboxOneAdapter.cpp (99%) rename {ControllerUSB/include => source/ControllerLib}/Controllers/XboxOneAdapter.h (100%) rename {ControllerUSB/source => source/ControllerLib}/Controllers/XboxOneAdapter/Firmware.cpp (100%) rename {ControllerUSB/include => source/ControllerLib}/Controllers/XboxOneAdapter/Firmware.h (100%) rename {ControllerUSB/source => source/ControllerLib}/Controllers/XboxOneController.cpp (99%) rename {ControllerUSB/include => source/ControllerLib}/Controllers/XboxOneController.h (100%) rename {ControllerUSB/include => source/ControllerLib}/IController.h (100%) rename {ControllerUSB/include => source/ControllerLib}/IUSBDevice.h (100%) rename {ControllerUSB/include => source/ControllerLib}/IUSBEndpoint.h (100%) rename {ControllerUSB/include => source/ControllerLib}/IUSBInterface.h (100%) rename {ControllerUSB/include => source/ControllerLib}/Result.h (100%) rename {SwitchUSB/source => source/ControllerSwitch}/SwitchAbstractedPadHandler.cpp (100%) rename {SwitchUSB/include => source/ControllerSwitch}/SwitchAbstractedPadHandler.h (100%) rename {SwitchUSB/source => source/ControllerSwitch}/SwitchControllerHandler.cpp (100%) rename {SwitchUSB/include => source/ControllerSwitch}/SwitchControllerHandler.h (100%) rename {SwitchUSB/source => source/ControllerSwitch}/SwitchHDLHandler.cpp (100%) rename {SwitchUSB/include => source/ControllerSwitch}/SwitchHDLHandler.h (100%) rename {SwitchUSB/source => source/ControllerSwitch}/SwitchThread.cpp (100%) rename {SwitchUSB/include => source/ControllerSwitch}/SwitchThread.h (100%) rename {SwitchUSB/source => source/ControllerSwitch}/SwitchUSBDevice.cpp (100%) rename {SwitchUSB/include => source/ControllerSwitch}/SwitchUSBDevice.h (100%) rename {SwitchUSB/source => source/ControllerSwitch}/SwitchUSBEndpoint.cpp (100%) rename {SwitchUSB/include => source/ControllerSwitch}/SwitchUSBEndpoint.h (100%) rename {SwitchUSB/source => source/ControllerSwitch}/SwitchUSBInterface.cpp (100%) rename {SwitchUSB/include => source/ControllerSwitch}/SwitchUSBInterface.h (100%) rename {SwitchUSB/source => source/ControllerSwitch}/SwitchVirtualGamepadHandler.cpp (100%) rename {SwitchUSB/include => source/ControllerSwitch}/SwitchVirtualGamepadHandler.h (100%) create mode 100644 source/Makefile create mode 100644 source/Sysmodule/Makefile rename config.json => source/Sysmodule/config.json (100%) rename source/{ => Sysmodule/source}/configFile.cpp (100%) rename source/{ => Sysmodule/source}/configFile.h (100%) rename source/{ => Sysmodule/source}/log.c (100%) rename source/{ => Sysmodule/source}/log.h (100%) rename source/{ => Sysmodule/source}/main.cpp (100%) rename source/{ => Sysmodule/source}/mainLoop.cpp (100%) rename source/{ => Sysmodule/source}/mainLoop.h (100%) rename {inih => source/inih}/ini.c (100%) rename {inih => source/inih}/ini.h (100%) create mode 100644 source/map.png create mode 100644 source/map.xml diff --git a/.gitignore b/.gitignore index dfa199d..11ff6fd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,9 @@ -buildApplet/* -buildSysmodule/* +*.d +*.o +*.lst +*.map +main +out/* *.nro *.nacp *.elf @@ -9,5 +13,3 @@ buildSysmodule/* *.code-workspace *.flag *.zip -*.xml -*.png diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index a98045a..a7845d9 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -3,14 +3,13 @@ { "name": "AArch64 libnx", "includePath": [ - "${workspaceFolder}/build", "${DEVKITPRO}/devkitA64/lib/gcc/aarch64-none-elf/*/include/", "${DEVKITPRO}/devkitA64/aarch64-none-elf/include/", "${DEVKITPRO}/portlibs/switch/include/", "${DEVKITPRO}/libnx/include/", - "ControllerUSB/include", - "SwitchUSB/include", - "inih/" + "source/ControllerLib", + "source/ControllerSwitch", + "source/inih" ], "defines": [ "SWITCH", diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 6e04616..723d68e 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -2,10 +2,10 @@ "version": "2.0.0", "tasks": [ { - "label": "Build Sysmodule", + "label": "Build Release", "type": "shell", "promptOnClose": true, - "command": "make sysmodule -j8", + "command": "make", "presentation": { "reveal": "always", "panel": "shared" @@ -27,60 +27,14 @@ } }, { - "label": "Build Applet", + "label": "Clean", "type": "shell", "promptOnClose": true, - "command": "make applet -j8", + "command": "make clean", "presentation": { "reveal": "always", "panel": "shared" }, - "problemMatcher": { - "owner": "cpp", - "pattern": { - "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", - "file": 1, - "line": 2, - "column": 3, - "severity": 4, - "message": 5 - } - }, - "group": { - "kind": "build", - "isDefault": true - } - }, - { - "label": "Clean Applet", - "type": "shell", - "promptOnClose": true, - "command": "make cleanApplet -j8", - "presentation": { - "reveal": "always", - "panel": "new" - }, - "problemMatcher": { - "owner": "cpp", - "pattern": { - "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", - "file": 1, - "line": 2, - "column": 3, - "severity": 4, - "message": 5 - } - } - }, - { - "label": "Clean Sysmodule", - "type": "shell", - "promptOnClose": true, - "command": "make cleanSysmodule -j8", - "presentation": { - "reveal": "always", - "panel": "new" - }, "problemMatcher": { "owner": "cpp", "pattern": { diff --git a/ControllerUSB/README.md b/ControllerUSB/README.md deleted file mode 100644 index ff1abae..0000000 --- a/ControllerUSB/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# ControllerUSB - -Small controller driver library. Since it is up to the user to provide the USB implementation, this library becomes platform independent. diff --git a/Makefile b/Makefile index d8198e3..93bb9d8 100644 --- a/Makefile +++ b/Makefile @@ -1,235 +1,19 @@ -#--------------------------------------------------------------------------------- -.SUFFIXES: -#--------------------------------------------------------------------------------- +.PHONY: all build clean -ifeq ($(strip $(DEVKITPRO)),) -$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=/devkitpro") -endif +all: build + rm -rf out + mkdir -p out/atmosphere/contents/690000000000000D/flags + mkdir -p out/config/sys-con + mkdir -p out/switch/ + touch out/atmosphere/contents/690000000000000D/flags/boot2.flag + cp source/Sysmodule/sys-con.nsp out/atmosphere/contents/690000000000000D/exefs.nsp + cp source/AppletCompanion/sys-con.nro out/switch/sys-con.nro + cp -r common/. out/ + @echo [DONE] sys-con compiled successfully. All files have been placed in out/ -TOPDIR ?= $(CURDIR) -include $(DEVKITPRO)/libnx/switch_rules +build: + $(MAKE) -C source/ -#--------------------------------------------------------------------------------- -# TARGET is the name of the output -# BUILD is the directory where object files & intermediate files will be placed -# SOURCES is a list of directories containing source code -# DATA is a list of directories containing data files -# INCLUDES is a list of directories containing header files -# ROMFS is the directory containing data to be added to RomFS, relative to the Makefile (Optional) -# -# NO_ICON: if set to anything, do not use icon. -# NO_NACP: if set to anything, no .nacp file is generated. -# APP_TITLE is the name of the app stored in the .nacp file (Optional) -# APP_AUTHOR is the author of the app stored in the .nacp file (Optional) -# APP_VERSION is the version of the app stored in the .nacp file (Optional) -# APP_TITLEID is the titleID of the app stored in the .nacp file (Optional) -# ICON is the filename of the icon (.jpg), relative to the project folder. -# If not set, it attempts to use one of the following (in this order): -# - .jpg -# - icon.jpg -# - /default_icon.jpg -# -# CONFIG_JSON is the filename of the NPDM config file (.json), relative to the project folder. -# If not set, it attempts to use one of the following (in this order): -# - .json -# - config.json -# If a JSON file is provided or autodetected, an ExeFS PFS0 (.nsp) is built instead -# of a homebrew executable (.nro). This is intended to be used for sysmodules. -# NACP building is skipped as well. -#--------------------------------------------------------------------------------- -TARGET := sys-con -SOURCES := source SwitchUSB/source ControllerUSB/source ControllerUSB/source/Controllers ControllerUSB/source/Controllers/XboxOneAdapter inih -DATA := data -INCLUDES := include SwitchUSB/include ControllerUSB/include inih -#ROMFS := romfs - -#--------------------------------------------------------------------------------- -# options for code generation -#--------------------------------------------------------------------------------- -ARCH := -march=armv8-a+crc+crypto -mtune=cortex-a57 -mtp=soft -fPIE - -CFLAGS := -g -Wall -O2 -ffunction-sections \ - $(ARCH) $(DEFINES) $(BUILD_CFLAGS) - -CFLAGS += $(INCLUDE) -D__SWITCH__ - -CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=c++17 - -ASFLAGS := -g $(ARCH) -LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) - -LIBS := -lnx - -#--------------------------------------------------------------------------------- -# list of directories containing libraries, this must be the top level containing -# include and lib -#--------------------------------------------------------------------------------- -LIBDIRS := $(PORTLIBS) $(LIBNX) - - -#--------------------------------------------------------------------------------- -# no real need to edit anything past this point unless you need to add additional -# rules for different file extensions -#--------------------------------------------------------------------------------- -ifneq ($(BUILD),$(notdir $(CURDIR))) -#--------------------------------------------------------------------------------- - -export OUTPUT := $(CURDIR)/$(TARGET) -export TOPDIR := $(CURDIR) - -export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ - $(foreach dir,$(DATA),$(CURDIR)/$(dir)) - -export DEPSDIR := $(CURDIR)/$(BUILD) - -CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) -CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) -SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) -BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) - -#--------------------------------------------------------------------------------- -# use CXX for linking C++ projects, CC for standard C -#--------------------------------------------------------------------------------- -ifeq ($(strip $(CPPFILES)),) -#--------------------------------------------------------------------------------- - export LD := $(CC) -#--------------------------------------------------------------------------------- -else -#--------------------------------------------------------------------------------- - export LD := $(CXX) -#--------------------------------------------------------------------------------- -endif -#--------------------------------------------------------------------------------- - -export OFILES_BIN := $(addsuffix .o,$(BINFILES)) -export OFILES_SRC := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) -export OFILES := $(OFILES_BIN) $(OFILES_SRC) -export HFILES_BIN := $(addsuffix .h,$(subst .,_,$(BINFILES))) - -export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ - $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ - -I$(CURDIR)/$(BUILD) - -export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) - -ifeq ($(strip $(CONFIG_JSON)),) - jsons := $(wildcard *.json) - ifneq (,$(findstring $(TARGET).json,$(jsons))) - export APP_JSON := $(TOPDIR)/$(TARGET).json - else - ifneq (,$(findstring config.json,$(jsons))) - export APP_JSON := $(TOPDIR)/config.json - endif - endif -else - export APP_JSON := $(TOPDIR)/$(CONFIG_JSON) -endif - -ifeq ($(strip $(ICON)),) - icons := $(wildcard *.jpg) - ifneq (,$(findstring $(TARGET).jpg,$(icons))) - export APP_ICON := $(TOPDIR)/$(TARGET).jpg - else - ifneq (,$(findstring icon.jpg,$(icons))) - export APP_ICON := $(TOPDIR)/icon.jpg - endif - endif -else - export APP_ICON := $(TOPDIR)/$(ICON) -endif - -ifeq ($(strip $(NO_ICON)),) - export NROFLAGS += --icon=$(APP_ICON) -endif - -ifeq ($(strip $(NO_NACP)),) - export NROFLAGS += --nacp=$(CURDIR)/$(TARGET).nacp -endif - -ifneq ($(APP_TITLEID),) - export NACPFLAGS += --titleid=$(APP_TITLEID) -endif - -ifneq ($(ROMFS),) - export NROFLAGS += --romfsdir=$(CURDIR)/$(ROMFS) -endif - -.PHONY: all buildApplet buildSysmodule applet sysmodule cleanApplet cleanSysmodule - -#--------------------------------------------------------------------------------- -all: sysmodule - -buildApplet: - @echo building applet ... - @[ -d $@ ] || mkdir -p $@ - @$(MAKE) --no-print-directory \ - BUILD=$@ -C $@ -f $(CURDIR)/Makefile \ - DEPSDIR=$(CURDIR)/$@ \ - BUILD_CFLAGS="-D__APPLET__" \ - makeNRO - -buildSysmodule: - @echo building sysmodule ... - @[ -d $@ ] || mkdir -p $@ - @$(MAKE) --no-print-directory \ - BUILD=$@ -C $@ -f $(CURDIR)/Makefile \ - DEPSDIR=$(CURDIR)/$@ \ - makeNSP - -applet: buildApplet - -sysmodule: buildSysmodule - -cleanApplet: - @echo clean applet ... - @rm -fr buildApplet $(TARGET).nro $(TARGET).nacp $(TARGET).elf - -cleanSysmodule: - @echo clean sysmodule ... - @rm -fr buildSysmodule exefs.nsp $(TARGET).nsp $(TARGET).nso $(TARGET).npdm $(TARGET).elf - -# Makefile commands -#--------------------------------------------------------------------------------- -else -.PHONY: makeNRO makeNSP - -DEPENDS := $(OFILES:.o=.d) - -#--------------------------------------------------------------------------------- -# main targets -#--------------------------------------------------------------------------------- -makeNRO: $(OUTPUT).nro - -makeNSP: $(OUTPUT).nsp - -#TODO: add an option to make exefs.nsp instead of $(OUTPUT).nsp - -ifeq ($(strip $(NO_NACP)),) -$(OUTPUT).nro : $(OUTPUT).elf $(OUTPUT).nacp -else -$(OUTPUT).nro : $(OUTPUT).elf -endif - - - -$(OUTPUT).nsp : $(OUTPUT).nso $(OUTPUT).npdm - -$(OUTPUT).nso : $(OUTPUT).elf - -$(OUTPUT).elf : $(OFILES) - -$(OFILES_SRC) : $(HFILES_BIN) - -#--------------------------------------------------------------------------------- -# you need a rule like this for each extension you use as binary data -#--------------------------------------------------------------------------------- -%.bin.o %_bin.h : %.bin -#--------------------------------------------------------------------------------- - @echo $(notdir $<) - @$(bin2o) - --include $(DEPENDS) - -#--------------------------------------------------------------------------------------- -endif -#--------------------------------------------------------------------------------------- +clean: + $(MAKE) -C source/ clean + rm -rf out \ No newline at end of file diff --git a/SwitchUSB/README.md b/SwitchUSB/README.md deleted file mode 100644 index c9110f9..0000000 --- a/SwitchUSB/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# SwitchUSB - -Switch implementation for ControllerUSB library. diff --git a/common/atmosphere/contents/690000000000000D/toolbox.json b/common/atmosphere/contents/690000000000000D/toolbox.json new file mode 100644 index 0000000..a89be0a --- /dev/null +++ b/common/atmosphere/contents/690000000000000D/toolbox.json @@ -0,0 +1,5 @@ +{ + "name" : "sys-con", + "tid" : "690000000000000D", + "requires_reboot": false +} diff --git a/config/sys-con/config_dualshock3.ini b/common/config/sys-con/config_dualshock3.ini similarity index 100% rename from config/sys-con/config_dualshock3.ini rename to common/config/sys-con/config_dualshock3.ini diff --git a/config/sys-con/config_dualshock4.ini b/common/config/sys-con/config_dualshock4.ini similarity index 100% rename from config/sys-con/config_dualshock4.ini rename to common/config/sys-con/config_dualshock4.ini diff --git a/config/sys-con/config_global.ini b/common/config/sys-con/config_global.ini similarity index 100% rename from config/sys-con/config_global.ini rename to common/config/sys-con/config_global.ini diff --git a/config/sys-con/config_xbox360.ini b/common/config/sys-con/config_xbox360.ini similarity index 100% rename from config/sys-con/config_xbox360.ini rename to common/config/sys-con/config_xbox360.ini diff --git a/config/sys-con/config_xboxone.ini b/common/config/sys-con/config_xboxone.ini similarity index 100% rename from config/sys-con/config_xboxone.ini rename to common/config/sys-con/config_xboxone.ini diff --git a/config/sys-con/config_xboxoneadapter.ini b/common/config/sys-con/config_xboxoneadapter.ini similarity index 100% rename from config/sys-con/config_xboxoneadapter.ini rename to common/config/sys-con/config_xboxoneadapter.ini diff --git a/config/sys-con/config_xboxorig.ini b/common/config/sys-con/config_xboxorig.ini similarity index 100% rename from config/sys-con/config_xboxorig.ini rename to common/config/sys-con/config_xboxorig.ini diff --git a/config/sys-con/example.ini b/common/config/sys-con/example.ini similarity index 100% rename from config/sys-con/example.ini rename to common/config/sys-con/example.ini diff --git a/config/sys-con/firmware/XboxOneAdapter.bin b/common/config/sys-con/firmware/XboxOneAdapter.bin similarity index 100% rename from config/sys-con/firmware/XboxOneAdapter.bin rename to common/config/sys-con/firmware/XboxOneAdapter.bin diff --git a/source/AppletCompanion/Makefile b/source/AppletCompanion/Makefile new file mode 100644 index 0000000..8cff2d7 --- /dev/null +++ b/source/AppletCompanion/Makefile @@ -0,0 +1,218 @@ +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- + +ifeq ($(strip $(DEVKITPRO)),) +$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=/devkitpro") +endif + +TOPDIR ?= $(CURDIR) +include $(DEVKITPRO)/libnx/switch_rules + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# DATA is a list of directories containing data files +# INCLUDES is a list of directories containing header files +# ROMFS is the directory containing data to be added to RomFS, relative to the Makefile (Optional) +# +# NO_ICON: if set to anything, do not use icon. +# NO_NACP: if set to anything, no .nacp file is generated. +# APP_TITLE is the name of the app stored in the .nacp file (Optional) +# APP_AUTHOR is the author of the app stored in the .nacp file (Optional) +# APP_VERSION is the version of the app stored in the .nacp file (Optional) +# APP_TITLEID is the titleID of the app stored in the .nacp file (Optional) +# ICON is the filename of the icon (.jpg), relative to the project folder. +# If not set, it attempts to use one of the following (in this order): +# - .jpg +# - icon.jpg +# - /default_icon.jpg +# +# CONFIG_JSON is the filename of the NPDM config file (.json), relative to the project folder. +# If not set, it attempts to use one of the following (in this order): +# - .json +# - config.json +# If a JSON file is provided or autodetected, an ExeFS PFS0 (.nsp) is built instead +# of a homebrew executable (.nro). This is intended to be used for sysmodules. +# NACP building is skipped as well. +#--------------------------------------------------------------------------------- +TARGET := sys-con +BUILD := build +SOURCES := source +DATA := data +INCLUDES := include +#ROMFS := romfs + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -march=armv8-a+crc+crypto -mtune=cortex-a57 -mtp=soft -fPIE + +CFLAGS := -g -Wall -O2 -ffunction-sections \ + $(ARCH) $(DEFINES) $(BUILD_CFLAGS) + +CFLAGS += $(INCLUDE) -D__SWITCH__ + +CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=c++17 + +ASFLAGS := -g $(ARCH) +LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) + +LIBS := -lnx + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(PORTLIBS) $(LIBNX) + + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/$(TARGET) +export TOPDIR := $(CURDIR) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) +#--------------------------------------------------------------------------------- + export LD := $(CC) +#--------------------------------------------------------------------------------- +else +#--------------------------------------------------------------------------------- + export LD := $(CXX) +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- + +export OFILES_BIN := $(addsuffix .o,$(BINFILES)) +export OFILES_SRC := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) +export OFILES := $(OFILES_BIN) $(OFILES_SRC) +export HFILES_BIN := $(addsuffix .h,$(subst .,_,$(BINFILES))) + +export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) + +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) + +ifeq ($(strip $(CONFIG_JSON)),) + jsons := $(wildcard *.json) + ifneq (,$(findstring $(TARGET).json,$(jsons))) + export APP_JSON := $(TOPDIR)/$(TARGET).json + else + ifneq (,$(findstring config.json,$(jsons))) + export APP_JSON := $(TOPDIR)/config.json + endif + endif +else + export APP_JSON := $(TOPDIR)/$(CONFIG_JSON) +endif + +ifeq ($(strip $(ICON)),) + icons := $(wildcard *.jpg) + ifneq (,$(findstring $(TARGET).jpg,$(icons))) + export APP_ICON := $(TOPDIR)/$(TARGET).jpg + else + ifneq (,$(findstring icon.jpg,$(icons))) + export APP_ICON := $(TOPDIR)/icon.jpg + endif + endif +else + export APP_ICON := $(TOPDIR)/$(ICON) +endif + +ifeq ($(strip $(NO_ICON)),) + export NROFLAGS += --icon=$(APP_ICON) +endif + +ifeq ($(strip $(NO_NACP)),) + export NROFLAGS += --nacp=$(CURDIR)/$(TARGET).nacp +endif + +ifneq ($(APP_TITLEID),) + export NACPFLAGS += --titleid=$(APP_TITLEID) +endif + +ifneq ($(ROMFS),) + export NROFLAGS += --romfsdir=$(CURDIR)/$(ROMFS) +endif + +.PHONY: $(BUILD) clean all + +#--------------------------------------------------------------------------------- +all: $(BUILD) + +$(BUILD): + @echo building applet companion ... + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory \ + -C $@ -f $(CURDIR)/Makefile \ + makeNRO + +clean: + @echo cleaning applet companion ... + @rm -fr $(BUILD) $(TARGET).nro $(TARGET).nacp $(TARGET).elf + +# Makefile commands +#--------------------------------------------------------------------------------- +else +.PHONY: makeNRO makeNSP + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +makeNRO: $(OUTPUT).nro + +makeNSP: $(OUTPUT).nsp + +#TODO: add an option to make exefs.nsp instead of $(OUTPUT).nsp + +ifeq ($(strip $(NO_NACP)),) +$(OUTPUT).nro : $(OUTPUT).elf $(OUTPUT).nacp +else +$(OUTPUT).nro : $(OUTPUT).elf +endif + + + +$(OUTPUT).nsp : $(OUTPUT).nso $(OUTPUT).npdm + +$(OUTPUT).nso : $(OUTPUT).elf + +$(OUTPUT).elf : $(OFILES) + +$(OFILES_SRC) : $(HFILES_BIN) + +#--------------------------------------------------------------------------------- +# you need a rule like this for each extension you use as binary data +#--------------------------------------------------------------------------------- +%.bin.o %_bin.h : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- diff --git a/source/AppletCompanion/source/main.cpp b/source/AppletCompanion/source/main.cpp new file mode 100644 index 0000000..9e3ddd8 --- /dev/null +++ b/source/AppletCompanion/source/main.cpp @@ -0,0 +1,24 @@ +#include "switch.h" +#include + +int main() +{ + consoleInit(NULL); + + printf("Hello\n"); + + while(appletMainLoop()) + { + hidScanInput(); + u64 kDown = 0; + for (u8 controller = 0; controller < 10; controller++) + kDown |= hidKeysDown(static_cast(controller)); + + if (kDown & KEY_PLUS || kDown & KEY_B) + break; + consoleUpdate(NULL); + } + + consoleExit(NULL); + return 0; +} \ No newline at end of file diff --git a/ControllerUSB/include/ControllerConfig.h b/source/ControllerLib/ControllerConfig.h similarity index 100% rename from ControllerUSB/include/ControllerConfig.h rename to source/ControllerLib/ControllerConfig.h diff --git a/ControllerUSB/source/ControllerHelpers.cpp b/source/ControllerLib/ControllerHelpers.cpp similarity index 100% rename from ControllerUSB/source/ControllerHelpers.cpp rename to source/ControllerLib/ControllerHelpers.cpp diff --git a/ControllerUSB/include/ControllerHelpers.h b/source/ControllerLib/ControllerHelpers.h similarity index 100% rename from ControllerUSB/include/ControllerHelpers.h rename to source/ControllerLib/ControllerHelpers.h diff --git a/ControllerUSB/include/ControllerTypes.h b/source/ControllerLib/ControllerTypes.h similarity index 100% rename from ControllerUSB/include/ControllerTypes.h rename to source/ControllerLib/ControllerTypes.h diff --git a/ControllerUSB/include/Controllers.h b/source/ControllerLib/Controllers.h similarity index 100% rename from ControllerUSB/include/Controllers.h rename to source/ControllerLib/Controllers.h diff --git a/ControllerUSB/source/Controllers/Dualshock3Controller.cpp b/source/ControllerLib/Controllers/Dualshock3Controller.cpp similarity index 100% rename from ControllerUSB/source/Controllers/Dualshock3Controller.cpp rename to source/ControllerLib/Controllers/Dualshock3Controller.cpp diff --git a/ControllerUSB/include/Controllers/Dualshock3Controller.h b/source/ControllerLib/Controllers/Dualshock3Controller.h similarity index 100% rename from ControllerUSB/include/Controllers/Dualshock3Controller.h rename to source/ControllerLib/Controllers/Dualshock3Controller.h diff --git a/ControllerUSB/source/Controllers/Dualshock4Controller.cpp b/source/ControllerLib/Controllers/Dualshock4Controller.cpp similarity index 100% rename from ControllerUSB/source/Controllers/Dualshock4Controller.cpp rename to source/ControllerLib/Controllers/Dualshock4Controller.cpp diff --git a/ControllerUSB/include/Controllers/Dualshock4Controller.h b/source/ControllerLib/Controllers/Dualshock4Controller.h similarity index 100% rename from ControllerUSB/include/Controllers/Dualshock4Controller.h rename to source/ControllerLib/Controllers/Dualshock4Controller.h diff --git a/ControllerUSB/source/Controllers/Xbox360Controller.cpp b/source/ControllerLib/Controllers/Xbox360Controller.cpp similarity index 100% rename from ControllerUSB/source/Controllers/Xbox360Controller.cpp rename to source/ControllerLib/Controllers/Xbox360Controller.cpp diff --git a/ControllerUSB/include/Controllers/Xbox360Controller.h b/source/ControllerLib/Controllers/Xbox360Controller.h similarity index 100% rename from ControllerUSB/include/Controllers/Xbox360Controller.h rename to source/ControllerLib/Controllers/Xbox360Controller.h diff --git a/ControllerUSB/source/Controllers/Xbox360WirelessController.cpp b/source/ControllerLib/Controllers/Xbox360WirelessController.cpp similarity index 100% rename from ControllerUSB/source/Controllers/Xbox360WirelessController.cpp rename to source/ControllerLib/Controllers/Xbox360WirelessController.cpp diff --git a/ControllerUSB/include/Controllers/Xbox360WirelessController.h b/source/ControllerLib/Controllers/Xbox360WirelessController.h similarity index 100% rename from ControllerUSB/include/Controllers/Xbox360WirelessController.h rename to source/ControllerLib/Controllers/Xbox360WirelessController.h diff --git a/ControllerUSB/source/Controllers/XboxController.cpp b/source/ControllerLib/Controllers/XboxController.cpp similarity index 100% rename from ControllerUSB/source/Controllers/XboxController.cpp rename to source/ControllerLib/Controllers/XboxController.cpp diff --git a/ControllerUSB/include/Controllers/XboxController.h b/source/ControllerLib/Controllers/XboxController.h similarity index 100% rename from ControllerUSB/include/Controllers/XboxController.h rename to source/ControllerLib/Controllers/XboxController.h diff --git a/ControllerUSB/source/Controllers/XboxOneAdapter.cpp b/source/ControllerLib/Controllers/XboxOneAdapter.cpp similarity index 99% rename from ControllerUSB/source/Controllers/XboxOneAdapter.cpp rename to source/ControllerLib/Controllers/XboxOneAdapter.cpp index ccda7e9..816fd03 100644 --- a/ControllerUSB/source/Controllers/XboxOneAdapter.cpp +++ b/source/ControllerLib/Controllers/XboxOneAdapter.cpp @@ -1,7 +1,7 @@ #include "Controllers/XboxOneAdapter.h" #include "Controllers/XboxOneAdapter/Firmware.h" #include -#include "../../source/log.h" +#include "../../Sysmodule/source/log.h" #include #include "cstring" diff --git a/ControllerUSB/include/Controllers/XboxOneAdapter.h b/source/ControllerLib/Controllers/XboxOneAdapter.h similarity index 100% rename from ControllerUSB/include/Controllers/XboxOneAdapter.h rename to source/ControllerLib/Controllers/XboxOneAdapter.h diff --git a/ControllerUSB/source/Controllers/XboxOneAdapter/Firmware.cpp b/source/ControllerLib/Controllers/XboxOneAdapter/Firmware.cpp similarity index 100% rename from ControllerUSB/source/Controllers/XboxOneAdapter/Firmware.cpp rename to source/ControllerLib/Controllers/XboxOneAdapter/Firmware.cpp diff --git a/ControllerUSB/include/Controllers/XboxOneAdapter/Firmware.h b/source/ControllerLib/Controllers/XboxOneAdapter/Firmware.h similarity index 100% rename from ControllerUSB/include/Controllers/XboxOneAdapter/Firmware.h rename to source/ControllerLib/Controllers/XboxOneAdapter/Firmware.h diff --git a/ControllerUSB/source/Controllers/XboxOneController.cpp b/source/ControllerLib/Controllers/XboxOneController.cpp similarity index 99% rename from ControllerUSB/source/Controllers/XboxOneController.cpp rename to source/ControllerLib/Controllers/XboxOneController.cpp index f909730..ee2c1c1 100644 --- a/ControllerUSB/source/Controllers/XboxOneController.cpp +++ b/source/ControllerLib/Controllers/XboxOneController.cpp @@ -1,6 +1,6 @@ #include "Controllers/XboxOneController.h" #include -#include "../../source/log.h" +#include "../../Sysmodule/source/log.h" static ControllerConfig _xboxoneControllerConfig{}; diff --git a/ControllerUSB/include/Controllers/XboxOneController.h b/source/ControllerLib/Controllers/XboxOneController.h similarity index 100% rename from ControllerUSB/include/Controllers/XboxOneController.h rename to source/ControllerLib/Controllers/XboxOneController.h diff --git a/ControllerUSB/include/IController.h b/source/ControllerLib/IController.h similarity index 100% rename from ControllerUSB/include/IController.h rename to source/ControllerLib/IController.h diff --git a/ControllerUSB/include/IUSBDevice.h b/source/ControllerLib/IUSBDevice.h similarity index 100% rename from ControllerUSB/include/IUSBDevice.h rename to source/ControllerLib/IUSBDevice.h diff --git a/ControllerUSB/include/IUSBEndpoint.h b/source/ControllerLib/IUSBEndpoint.h similarity index 100% rename from ControllerUSB/include/IUSBEndpoint.h rename to source/ControllerLib/IUSBEndpoint.h diff --git a/ControllerUSB/include/IUSBInterface.h b/source/ControllerLib/IUSBInterface.h similarity index 100% rename from ControllerUSB/include/IUSBInterface.h rename to source/ControllerLib/IUSBInterface.h diff --git a/ControllerUSB/include/Result.h b/source/ControllerLib/Result.h similarity index 100% rename from ControllerUSB/include/Result.h rename to source/ControllerLib/Result.h diff --git a/SwitchUSB/source/SwitchAbstractedPadHandler.cpp b/source/ControllerSwitch/SwitchAbstractedPadHandler.cpp similarity index 100% rename from SwitchUSB/source/SwitchAbstractedPadHandler.cpp rename to source/ControllerSwitch/SwitchAbstractedPadHandler.cpp diff --git a/SwitchUSB/include/SwitchAbstractedPadHandler.h b/source/ControllerSwitch/SwitchAbstractedPadHandler.h similarity index 100% rename from SwitchUSB/include/SwitchAbstractedPadHandler.h rename to source/ControllerSwitch/SwitchAbstractedPadHandler.h diff --git a/SwitchUSB/source/SwitchControllerHandler.cpp b/source/ControllerSwitch/SwitchControllerHandler.cpp similarity index 100% rename from SwitchUSB/source/SwitchControllerHandler.cpp rename to source/ControllerSwitch/SwitchControllerHandler.cpp diff --git a/SwitchUSB/include/SwitchControllerHandler.h b/source/ControllerSwitch/SwitchControllerHandler.h similarity index 100% rename from SwitchUSB/include/SwitchControllerHandler.h rename to source/ControllerSwitch/SwitchControllerHandler.h diff --git a/SwitchUSB/source/SwitchHDLHandler.cpp b/source/ControllerSwitch/SwitchHDLHandler.cpp similarity index 100% rename from SwitchUSB/source/SwitchHDLHandler.cpp rename to source/ControllerSwitch/SwitchHDLHandler.cpp diff --git a/SwitchUSB/include/SwitchHDLHandler.h b/source/ControllerSwitch/SwitchHDLHandler.h similarity index 100% rename from SwitchUSB/include/SwitchHDLHandler.h rename to source/ControllerSwitch/SwitchHDLHandler.h diff --git a/SwitchUSB/source/SwitchThread.cpp b/source/ControllerSwitch/SwitchThread.cpp similarity index 100% rename from SwitchUSB/source/SwitchThread.cpp rename to source/ControllerSwitch/SwitchThread.cpp diff --git a/SwitchUSB/include/SwitchThread.h b/source/ControllerSwitch/SwitchThread.h similarity index 100% rename from SwitchUSB/include/SwitchThread.h rename to source/ControllerSwitch/SwitchThread.h diff --git a/SwitchUSB/source/SwitchUSBDevice.cpp b/source/ControllerSwitch/SwitchUSBDevice.cpp similarity index 100% rename from SwitchUSB/source/SwitchUSBDevice.cpp rename to source/ControllerSwitch/SwitchUSBDevice.cpp diff --git a/SwitchUSB/include/SwitchUSBDevice.h b/source/ControllerSwitch/SwitchUSBDevice.h similarity index 100% rename from SwitchUSB/include/SwitchUSBDevice.h rename to source/ControllerSwitch/SwitchUSBDevice.h diff --git a/SwitchUSB/source/SwitchUSBEndpoint.cpp b/source/ControllerSwitch/SwitchUSBEndpoint.cpp similarity index 100% rename from SwitchUSB/source/SwitchUSBEndpoint.cpp rename to source/ControllerSwitch/SwitchUSBEndpoint.cpp diff --git a/SwitchUSB/include/SwitchUSBEndpoint.h b/source/ControllerSwitch/SwitchUSBEndpoint.h similarity index 100% rename from SwitchUSB/include/SwitchUSBEndpoint.h rename to source/ControllerSwitch/SwitchUSBEndpoint.h diff --git a/SwitchUSB/source/SwitchUSBInterface.cpp b/source/ControllerSwitch/SwitchUSBInterface.cpp similarity index 100% rename from SwitchUSB/source/SwitchUSBInterface.cpp rename to source/ControllerSwitch/SwitchUSBInterface.cpp diff --git a/SwitchUSB/include/SwitchUSBInterface.h b/source/ControllerSwitch/SwitchUSBInterface.h similarity index 100% rename from SwitchUSB/include/SwitchUSBInterface.h rename to source/ControllerSwitch/SwitchUSBInterface.h diff --git a/SwitchUSB/source/SwitchVirtualGamepadHandler.cpp b/source/ControllerSwitch/SwitchVirtualGamepadHandler.cpp similarity index 100% rename from SwitchUSB/source/SwitchVirtualGamepadHandler.cpp rename to source/ControllerSwitch/SwitchVirtualGamepadHandler.cpp diff --git a/SwitchUSB/include/SwitchVirtualGamepadHandler.h b/source/ControllerSwitch/SwitchVirtualGamepadHandler.h similarity index 100% rename from SwitchUSB/include/SwitchVirtualGamepadHandler.h rename to source/ControllerSwitch/SwitchVirtualGamepadHandler.h diff --git a/source/Makefile b/source/Makefile new file mode 100644 index 0000000..6e878f8 --- /dev/null +++ b/source/Makefile @@ -0,0 +1,16 @@ +COMPONENTS := AppletCompanion Sysmodule +TOPTARGETS := all clean + +.PHONY: $(TOPTARGETS) $(COMPONENTS) + +all: $(COMPONENTS) + +AppletCompanion: + $(MAKE) -C $@ -j$(nproc) + +Sysmodule: + $(MAKE) -C $@ buildSysmodule -j$(nproc) + +clean: + $(MAKE) -C AppletCompanion clean + $(MAKE) -C Sysmodule cleanSysmodule \ No newline at end of file diff --git a/source/README.md b/source/README.md index f8a6b36..ba3bb0e 100644 --- a/source/README.md +++ b/source/README.md @@ -1,2 +1,2 @@ ### File structure -![](https://i.imgur.com/hyYdbqG.png) +![](map.png) diff --git a/source/Sysmodule/Makefile b/source/Sysmodule/Makefile new file mode 100644 index 0000000..b06883f --- /dev/null +++ b/source/Sysmodule/Makefile @@ -0,0 +1,235 @@ +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- + +ifeq ($(strip $(DEVKITPRO)),) +$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=/devkitpro") +endif + +TOPDIR ?= $(CURDIR) +include $(DEVKITPRO)/libnx/switch_rules + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# DATA is a list of directories containing data files +# INCLUDES is a list of directories containing header files +# ROMFS is the directory containing data to be added to RomFS, relative to the Makefile (Optional) +# +# NO_ICON: if set to anything, do not use icon. +# NO_NACP: if set to anything, no .nacp file is generated. +# APP_TITLE is the name of the app stored in the .nacp file (Optional) +# APP_AUTHOR is the author of the app stored in the .nacp file (Optional) +# APP_VERSION is the version of the app stored in the .nacp file (Optional) +# APP_TITLEID is the titleID of the app stored in the .nacp file (Optional) +# ICON is the filename of the icon (.jpg), relative to the project folder. +# If not set, it attempts to use one of the following (in this order): +# - .jpg +# - icon.jpg +# - /default_icon.jpg +# +# CONFIG_JSON is the filename of the NPDM config file (.json), relative to the project folder. +# If not set, it attempts to use one of the following (in this order): +# - .json +# - config.json +# If a JSON file is provided or autodetected, an ExeFS PFS0 (.nsp) is built instead +# of a homebrew executable (.nro). This is intended to be used for sysmodules. +# NACP building is skipped as well. +#--------------------------------------------------------------------------------- +TARGET := sys-con +SOURCES := source ../ControllerSwitch ../ControllerLib ../ControllerLib/Controllers ../ControllerLib/Controllers/XboxOneAdapter ../inih +DATA := data +INCLUDES := include ../ControllerSwitch ../ControllerLib ../inih +#ROMFS := romfs + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -march=armv8-a+crc+crypto -mtune=cortex-a57 -mtp=soft -fPIE + +CFLAGS := -g -Wall -O2 -ffunction-sections \ + $(ARCH) $(DEFINES) $(BUILD_CFLAGS) + +CFLAGS += $(INCLUDE) -D__SWITCH__ + +CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=c++17 + +ASFLAGS := -g $(ARCH) +LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) + +LIBS := -lnx + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(PORTLIBS) $(LIBNX) + + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/$(TARGET) +export TOPDIR := $(CURDIR) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) +#--------------------------------------------------------------------------------- + export LD := $(CC) +#--------------------------------------------------------------------------------- +else +#--------------------------------------------------------------------------------- + export LD := $(CXX) +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- + +export OFILES_BIN := $(addsuffix .o,$(BINFILES)) +export OFILES_SRC := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) +export OFILES := $(OFILES_BIN) $(OFILES_SRC) +export HFILES_BIN := $(addsuffix .h,$(subst .,_,$(BINFILES))) + +export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) + +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) + +ifeq ($(strip $(CONFIG_JSON)),) + jsons := $(wildcard *.json) + ifneq (,$(findstring $(TARGET).json,$(jsons))) + export APP_JSON := $(TOPDIR)/$(TARGET).json + else + ifneq (,$(findstring config.json,$(jsons))) + export APP_JSON := $(TOPDIR)/config.json + endif + endif +else + export APP_JSON := $(TOPDIR)/$(CONFIG_JSON) +endif + +ifeq ($(strip $(ICON)),) + icons := $(wildcard *.jpg) + ifneq (,$(findstring $(TARGET).jpg,$(icons))) + export APP_ICON := $(TOPDIR)/$(TARGET).jpg + else + ifneq (,$(findstring icon.jpg,$(icons))) + export APP_ICON := $(TOPDIR)/icon.jpg + endif + endif +else + export APP_ICON := $(TOPDIR)/$(ICON) +endif + +ifeq ($(strip $(NO_ICON)),) + export NROFLAGS += --icon=$(APP_ICON) +endif + +ifeq ($(strip $(NO_NACP)),) + export NROFLAGS += --nacp=$(CURDIR)/$(TARGET).nacp +endif + +ifneq ($(APP_TITLEID),) + export NACPFLAGS += --titleid=$(APP_TITLEID) +endif + +ifneq ($(ROMFS),) + export NROFLAGS += --romfsdir=$(CURDIR)/$(ROMFS) +endif + +.PHONY: all buildApplet buildSysmodule applet sysmodule cleanApplet cleanSysmodule + +#--------------------------------------------------------------------------------- +all: sysmodule + +buildApplet: + @echo building applet ... + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory \ + BUILD=$@ -C $@ -f $(CURDIR)/Makefile \ + DEPSDIR=$(CURDIR)/$@ \ + BUILD_CFLAGS="-D__APPLET__" \ + makeNRO + +buildSysmodule: + @echo building sysmodule ... + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory \ + BUILD=$@ -C $@ -f $(CURDIR)/Makefile \ + DEPSDIR=$(CURDIR)/$@ \ + makeNSP + +applet: buildApplet + +sysmodule: buildSysmodule + +cleanApplet: + @echo clean applet ... + @rm -fr buildApplet $(TARGET).nro $(TARGET).nacp $(TARGET).elf + +cleanSysmodule: + @echo clean sysmodule ... + @rm -fr buildSysmodule exefs.nsp $(TARGET).nsp $(TARGET).nso $(TARGET).npdm $(TARGET).elf + +# Makefile commands +#--------------------------------------------------------------------------------- +else +.PHONY: makeNRO makeNSP + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +makeNRO: $(OUTPUT).nro + +makeNSP: $(OUTPUT).nsp + +#TODO: add an option to make exefs.nsp instead of $(OUTPUT).nsp + +ifeq ($(strip $(NO_NACP)),) +$(OUTPUT).nro : $(OUTPUT).elf $(OUTPUT).nacp +else +$(OUTPUT).nro : $(OUTPUT).elf +endif + + + +$(OUTPUT).nsp : $(OUTPUT).nso $(OUTPUT).npdm + +$(OUTPUT).nso : $(OUTPUT).elf + +$(OUTPUT).elf : $(OFILES) + +$(OFILES_SRC) : $(HFILES_BIN) + +#--------------------------------------------------------------------------------- +# you need a rule like this for each extension you use as binary data +#--------------------------------------------------------------------------------- +%.bin.o %_bin.h : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- diff --git a/config.json b/source/Sysmodule/config.json similarity index 100% rename from config.json rename to source/Sysmodule/config.json diff --git a/source/configFile.cpp b/source/Sysmodule/source/configFile.cpp similarity index 100% rename from source/configFile.cpp rename to source/Sysmodule/source/configFile.cpp diff --git a/source/configFile.h b/source/Sysmodule/source/configFile.h similarity index 100% rename from source/configFile.h rename to source/Sysmodule/source/configFile.h diff --git a/source/log.c b/source/Sysmodule/source/log.c similarity index 100% rename from source/log.c rename to source/Sysmodule/source/log.c diff --git a/source/log.h b/source/Sysmodule/source/log.h similarity index 100% rename from source/log.h rename to source/Sysmodule/source/log.h diff --git a/source/main.cpp b/source/Sysmodule/source/main.cpp similarity index 100% rename from source/main.cpp rename to source/Sysmodule/source/main.cpp diff --git a/source/mainLoop.cpp b/source/Sysmodule/source/mainLoop.cpp similarity index 100% rename from source/mainLoop.cpp rename to source/Sysmodule/source/mainLoop.cpp diff --git a/source/mainLoop.h b/source/Sysmodule/source/mainLoop.h similarity index 100% rename from source/mainLoop.h rename to source/Sysmodule/source/mainLoop.h diff --git a/inih/ini.c b/source/inih/ini.c similarity index 100% rename from inih/ini.c rename to source/inih/ini.c diff --git a/inih/ini.h b/source/inih/ini.h similarity index 100% rename from inih/ini.h rename to source/inih/ini.h diff --git a/source/map.png b/source/map.png new file mode 100644 index 0000000000000000000000000000000000000000..bce66465e465a6e00c34e77c461574d8919c5985 GIT binary patch literal 49311 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 TU299iga4!@6(rKdbszsPBSFgo literal 0 HcmV?d00001 diff --git a/source/map.xml b/source/map.xml new file mode 100644 index 0000000..6a7d690 --- /dev/null +++ b/source/map.xml @@ -0,0 +1 @@ +7V3bcto6FP0aHpPx/fJYSNJ0JmeaadrT9tFgAT41FjUigX79kbGEsRBgYkuyKe1Ma8vyTXuvtS/aFj1zMFt9TIP59B8YgrhnaOGqZ971DEPXHQ//l7WsSYvtuHnLJI1C0lY0vER/AGnUSOsyCsGi1BFBGKNoXm4cwSQBI1RqC9IUvpW7jWFcvus8mIC9hpdREO+3fo9CNKUvpmnFgUcQTabk1p5NDgyD0a9JCpcJuV/PMMebP/nhWUCvRfovpkEI33aazPueOUghRPnWbDUAcTa4dNjy8x4OHN0+dwoSVOUEd/b47edYf/kygfHo95/x3NO/3JCrvAbxEtDXcGJ8vf4UH3Im2dYAJiiFcQzSp2hID+P7FD3IC6I1HdTNsIDsxho+/DaNEHiZB6Ps6BvWo+zyaBbjPR1vjqM4HsAYpng/gQnu1F/gG/7aysPGLUEcTRK8PcJvC3DPfhwMQfwMFxGKYOnAK0hRhOX7xHSYRWGYPd+2wwdyySFECM6yB8EvSh8ESzP78/CwfZqdI/4g+7t98eyCYHVQLPpW2BhFAM4ASte4CznB1N1bOz+JQOiGatjbrj46Bu023dFGk8IoIDCYbG9QqALeINpwhmZYZ2nGy1uERtOrcjSsHFvyIKphuPaeavhUBXb1AvNwfb2Y3Iy12ef7KIH96QA9PyZjNLpxD+pFNkIZA+eixK2/lxm39f8FaRgkQdFQaEZ+4pA2zIIouR3N59sDKdsVP/KQ05bfugl9OyAhjhwPCs3yy0JzXQ6eDY7QzAawzJWZ7+4NCgixFSS7MEVTOIFJEN8Xrf3ysBV9niCck8H6DyC0JiY9WCJYHko8gun6R3b+rU13f5LLbXbuVqW9Ndk7KIIFXKZEtw68J/EfgnQC0GkdzsbgqEBTEAcoei17CjzpbE79kKbBeqfDHEYJWuxc+TlrKPTEtst64viMAT+vP97In6DQk+2r1FAdwXDfaNNFwd3RVcPdddTCvQT2AvuNw50O9Em8Z72aBXw9+Sim49bJR/dbJR/63EJIL/eU/41StAzij8EMzIPwMUiw95l2mwdtvcyDpr2NWHaY0JDKhLqm742LDKitIvRjZ3sHaHivwFm2s94FXe4tuZLcJb2qv9Q4PN/lLxU5GaJhlnbcYdo7wT7lYXlH+4vxsHSRLlbONh+GOEoNRgiEz02RDUkFbE+2b7Vb7cbN/lXORJ7JMBEnaubykC0sAPPVWnxplEI9ra5SimnaF0ApVAoCKeXx7kkMkRAKUe/P7LEIJ66TyyKuUmemcGB+7hw56czIIh6nIvFQKbYk1qDPLRCqRZb+MuIMg50wMTVepKF7vPkSUdi01WBTekxvVo3pLa9VOLONq3zK8hGTBN9zgDwmPboHwfxJyVmMlBvwhWzzKviy4J1WAdO5OjX1ZWo0LtN3hVMOO13tHQ+OTvSvHRxxCxs6lXw/VHXAFbdo4vAl8QRXbEanJrUUyY0/crYKLnCZ8Fn3j2dW2P52r0kmODqCQmKvT0XY1fF4y2EE6e3nQeTObztqfHnqMuw4DJUndfTz6KMGK9Aa2pNsbsjx/w0mAarbTGXaAf//XL6xmMSsbh3nG7a/pUtIzNJq6auzW0NzzXZl8Ohzi7Ei3176d+A1whe4LCNiKjciJkdsCh1MeRbCqGohLCEWoi6xn/Aj2e6mI4PX1QSV3eD1qvpGibQtvG4I5vVP2TcJm2tcFLWrDw/sv4TIzapEbreSyM900E0pDrqaLFM3iLyqvlHmbAuR8zy9Jon8Pgnnue5eEo/L9NC5eUslUJSQuKWZl2o1crJZ2mTKuE8WuBlH+4uhaTqEAqtmLiTwxma0jGqfUyljyXTP6NeQVxN7OORWkL2tJVP63GLxeCEB0x4kLdWQdNSUp3cDknZVSDaeLqsHSVsGJC/D9WURacg0kvw5+06Vk8pwmqvWd7ueUtSJLOe+WwbxYgpHv8xLqS1w2clhhxN0ulKBp8Y7bTHw3G4AT+S6NFvgWRcLPJ1j8aQCT1fjg7YYeF43gOcJBN6PIVyZjnapqOMtDCUXdNdiaF6Nc/tBJ3LNgAx0nxNwqaDjzWvIdTENpaA7c35aAujcqpZOyYSIbul8X+ngGgHsCY6MYnZXpB0uuGBxO+02HegGK06NQwiaVCtsqbXC56VSJRCCJ80Kv48RDIfrxx0khOP9xfCBJ9JFKPjg63oOLo8TeCswm4IogW/p1Hy1/I51y96Pct84x+zvUUtd1O9XPjCVDC4r3fyN6n+pwroHpwrhVLgTVDhC6COGk65ThsEuxqv8gwZfbdnrmbF8DdqoWiPRsu+EfJE1El/AYhmjroPKYhhY6qemXNf8L05Kc8ej1ZG6xUzjO6c+FWL7N2xYj42gEBYYwWQcTR6iGLSACer98AVrXpUzgaF2HSGlWTt+1qLq97otydrZirN2RwdRcJQ+2BBD10lhP3VnSYzT+aygNnXXQlY4K6hXzwonXARFrCAy+N5ZDhTE83Zk9BumBZ6zILd88y+eVz+yBlV7M/oau0z3cVZguzNTgmJYwRBZ0U0qbb5HeKDBYtGiyf9a3LD97TUiqBvejzP5UqlBcUpB5WQff0DanVNglq+1zROfQ9pH+4thBqqsV3Nzrk7ldCBdqZi1Dpm1x072N8k6YmLNjchMVf4B0ddpCoKw2xaGTSJyP7BtKFOFd4vfi87lXPwqt3n/Pw== \ No newline at end of file