From e58dc7a506b50717e557182eb1eabcaff5890bec Mon Sep 17 00:00:00 2001 From: Maschell Date: Sat, 10 Feb 2018 17:06:42 +0100 Subject: [PATCH] [Plugins] Added a simple padcon plugin! --- .gitignore | 3 + plugins/padcon/Makefile | 181 +++++++++++++++++++++++++++++++++++++ plugins/padcon/makefile.mk | 18 ++++ plugins/padcon/src/main.c | 42 +++++++++ 4 files changed, 244 insertions(+) create mode 100644 plugins/padcon/Makefile create mode 100644 plugins/padcon/makefile.mk create mode 100644 plugins/padcon/src/main.c diff --git a/.gitignore b/.gitignore index 0122ff9..88953d3 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,8 @@ loader/*.elf example_plugin/bin/* example_plugin/build/* example_plugin_pic/* +plugins/*/bin/* +plugins/*/build/* loader/WiiUPluginLoader.cscope_file_list loader/WiiUPluginLoader.layout + diff --git a/plugins/padcon/Makefile b/plugins/padcon/Makefile new file mode 100644 index 0000000..a314baa --- /dev/null +++ b/plugins/padcon/Makefile @@ -0,0 +1,181 @@ +############################################################################### +# Makefile +# by Alex Chadwick +# +# A makefile script for generation of a brainslug module +############################################################################### +# Hopefully you shouldn't need to change anything in this file. +# Alter makefile.mk to change common settings. + +############################################################################### +# devkitpro settings +ifeq ($(strip $(DEVKITPRO)),) + $(error "Please set DEVKITPRO in your environment. export DEVKITPRO=devkitPro") +endif +ifeq ($(strip $(DEVKITPPC)),) + $(error "Please set DEVKITPPC in your environment. export DEVKITPPC=devkitPPC") +endif + +WUPSDIR := $(DEVKITPRO)/wups +GCC_VER := $(shell $(DEVKITPPC)/bin/powerpc-eabi-gcc -dumpversion) +PORTLIBS := $(DEVKITPRO)/portlibs/ppc + +PATH := $(DEVKITPPC)/bin:$(PATH) +LIB_INC_DIRS := $(DEVKITPPC)/lib/gcc/powerpc-eabi/$(GCC_VER)/include \ + $(DEVKITPPC)/lib/gcc/powerpc-eabi/$(GCC_VER)/include-fixed \ + $(DEVKITPPC)/powerpc-eabi/include \ + $(PORTLIBS)/include \ + $(PORTLIBS)/include/libutils \ + $(WUPSDIR)/include + +include makefile.mk + +LIB_DIRS += $(DEVKITPPC)/lib/gcc/powerpc-eabi/$(GCC_VER) \ + $(DEVKITPPC)/powerpc-eabi/ \ + $(PORTLIBS)/lib +LIBS += c dynamiclibs utils +############################################################################### +# Parameters + +# A comma to make writing commands easier +C := , +# Used to suppress command echo. +Q ?= @ +LOG ?= @echo $@ +# The intermediate directory for compiled object files. +BUILD ?= build +# The name of the assembler listing file to generate. +LIST ?= $(TARGET:.mod=.list) +# The name of the map file to generate. +MAP ?= $(TARGET:.mod=.map) + +INC_DIRS += $(LIB_INC_DIRS) + +############################################################################### +# Compiler settings + +# The toolchain to use. +PREFIX ?= powerpc-eabi- +# Tools to use +AS := $(PREFIX)as +LD := $(PREFIX)ld +CC := $(PREFIX)g++ +OBJDUMP := $(PREFIX)objdump + +# --relocatable: make sure ld doesn't remove relocations wups will need +# -s: strip local symbols to speed linking +# --gc-sections: remove unneeded symbols +# -T: use the linker script specified (to force certain wups sections together) +# -Map: generate a map file +LDFLAGS += --relocatable -s --gc-sections -u wups_load -u wups_meta -u wups_hooks \ + -T $(WUPSDIR)/wups.ld \ + $(patsubst %,-Map %,$(strip $(MAP))) -wrap malloc -wrap free -wrap memalign -wrap calloc -wrap realloc -wrap malloc_usable_size -wrap _malloc_r -wrap _free_r -wrap _realloc_r -wrap _calloc_r -wrap _memalign_r -wrap _malloc_usable_size_r +LD1FLAGS += --relocatable -s \ + -T $(WUPSDIR)/wups_elf.ld -wrap malloc -wrap free -wrap memalign -wrap calloc -wrap realloc -wrap malloc_usable_size -wrap _malloc_r -wrap _free_r -wrap _realloc_r -wrap _calloc_r -wrap _memalign_r -wrap _malloc_usable_size_r + +# -O2: optimise lots +# -Wall: generate lots of warnings +# -x c: compile as C code +# -std=gnu11: use the C11 standard with GNU extensions +# -nostdinc: don't include standard headers (we don't have all the symbols) +# -ffreestanding: we don't have libc; don't expect we do +# -DGEKKO: define the symbol GEKKO (used in some libogc headers) +# -DHW_RVL: define the symbol HW_RVL (used in some libogc headers) +# -D__wii__: define the symbol __wii__ (used in some libogc headers) +# -mrvl: enable wii/gamecube compilation +# -mcpu=750: enable processor specific compilation +# -meabi: enable eabi specific compilation +# -mhard-float: enable hardware floating point instructions +# -fshort-wchar: use 16 bit whcar_t type in keeping with Wii executables +# -fno-common: stop common variables which the loader can't understand +# -msdata-none: do not use r2 or r13 as small data areas +# -memb: enable embedded application specific compilation +# -ffunction-sections: split up functions so linker can garbage collect +# -fdata-sections: split up data so linker can garbage collect +CFLAGS += -shared -fPIC -O0 -Wall -x c -std=c11 -DGEKKO_U -D__wiiu__ -mrvl -mcpu=750 -meabi -mhard-float -fshort-wchar -fno-common -msdata=none -memb -ffunction-sections -fdata-sections + +CFLAGS += -D__LOGGING__ + + + +ifdef DEBUG +else + CFLAGS += -DNDEBUG +endif + +############################################################################### +# Variable init + +# Phony targets +PHONY := + +############################################################################### +# Rule to make everything. +PHONY += all + +all : $(TARGET) + +############################################################################### +# Derived rules + +LDFLAGS += $(patsubst %,-l %,$(LIBS)) $(patsubst %,-l %,$(LIBS)) \ + $(patsubst %,-L %,$(LIB_DIRS)) $(patsubst %,-L %/lib,$(LIB_DIRS)) +CFLAGS += $(patsubst %,-I %,$(INC_DIRS)) \ + $(patsubst %,-I %/include,$(LIB_DIRS)) -iquote src + +OBJECTS := $(patsubst %.c,$(BUILD)/%.c.o,$(filter %.c,$(SRC))) + +############################################################################### +# Special build rules + +# Rule to make the module file. +$(TARGET) : $(BUILD)/output.elf | $(BIN) + $(LOG) + $Q$(LD) $(BUILD)/output.elf $(LDFLAGS) -o $@ + +# Rule to make the module file. +$(BUILD)/output.elf : $(OBJECTS) | $(BIN) $(BUILD) + $(LOG) + $Q$(LD) $(OBJECTS) $(LD1FLAGS) -o $@ + +# Rule to make intermediate directory +$(BUILD) : + $Qmkdir $@ + +# Rule to make output directory +$(BIN) : + $Qmkdir $@ + +############################################################################### +# Standard build rules + +$(BUILD)/%.c.o: %.c | $(BUILD) + $(LOG) + -$Qmkdir -p $(dir $@) + $Q$(CC) -c $(CFLAGS) $< -o $@ + +############################################################################### +# Assembly listing rules + +# Rule to make assembly listing. +PHONY += list +list : $(LIST) + +# Rule to make the listing file. +%.list : $(TARGET) + $(LOG) + -$Qmkdir -p $(dir $@) + $Q$(OBJDUMP) -d $< > $@ + +############################################################################### +# Clean rule + +# Rule to clean files. +PHONY += clean +clean : + $Qrm -rf $(wildcard $(BUILD) $(BIN)) + +############################################################################### +# Phony targets + +.PHONY : $(PHONY) diff --git a/plugins/padcon/makefile.mk b/plugins/padcon/makefile.mk new file mode 100644 index 0000000..3d1d209 --- /dev/null +++ b/plugins/padcon/makefile.mk @@ -0,0 +1,18 @@ +############################################################################### +# Source files + +# The source files to compile. +SRC := src/main.c + +# Include directories +INC_DIRS := src +# Library directories +LIB_DIRS := +# The names of libraries to use. +LIBS := +# The output directory for compiled results. +BIN := bin +# The name of the output file to generate. +TARGET := $(BIN)/$(notdir $(CURDIR)).mod +# C compiler flags +CFLAGS := diff --git a/plugins/padcon/src/main.c b/plugins/padcon/src/main.c new file mode 100644 index 0000000..88b2534 --- /dev/null +++ b/plugins/padcon/src/main.c @@ -0,0 +1,42 @@ +#include +#include +#include "dynamic_libs/os_functions.h" +#include "dynamic_libs/vpad_functions.h" +#include "dynamic_libs/socket_functions.h" +#include "utils/logger.h" + +WUPS_MODULE_NAME("Padcon"); +WUPS_MODULE_VERSION("v1.0"); +WUPS_MODULE_AUTHOR("Maschell"); +WUPS_MODULE_LICENSE("GPL"); + + +INITIALIZE(){ + InitOSFunctionPointers(); + InitSocketFunctionPointers(); + InitVPadFunctionPointers(); + + log_init(); + + log_print("Init of padcon!\n"); +} + +// Both would be possible. +//WUPS_HOOK_INIT(init); + +DECL_FUNCTION(int, VPADRead, int chan, VPADData *buffer, u32 buffer_size, s32 *error) { + int result = real_VPADRead(chan, buffer, buffer_size, error); + if(buffer->btns_r&VPAD_BUTTON_STICK_R) { + int mode; + VPADGetLcdMode(0, (s32*)&mode); // Get current display mode + if(mode != 1) { + VPADSetLcdMode(0, 1); // Turn it off + } + else { + VPADSetLcdMode(0, 0xFF); // Turn it on + } + } + return result; +} + +WUPS_MUST_REPLACE(VPADRead ,WUPS_LOADER_LIBRARY_VPAD, VPADRead);