From 7c8330df7fcf902b2531f6e0584269418b8fec0a Mon Sep 17 00:00:00 2001 From: lifehackerhansol Date: Sun, 21 Jan 2024 19:09:15 -0800 Subject: [PATCH] ak2_sd: Add second build that disables CMD25 Some flashcarts that implement the Acekard AK2 interface has broken CMD25, causing SD corruption and writes not actually working. It makes little sense to duplicate the whole source code for this, so add a preprocessor to disable it, and a second Makefile to use the define. --- build.sh | 10 ++- source/ak2_sd/Makefile_singlewrite | 132 +++++++++++++++++++++++++++++ source/ak2_sd/source/dldi_crt0.s | 6 +- source/ak2_sd/source/sddriver.cpp | 11 +++ 4 files changed, 157 insertions(+), 2 deletions(-) mode change 100644 => 100755 build.sh create mode 100644 source/ak2_sd/Makefile_singlewrite diff --git a/build.sh b/build.sh old mode 100644 new mode 100755 index 45ebd14..722a5d2 --- a/build.sh +++ b/build.sh @@ -14,7 +14,7 @@ set -e # OSS drivers first cd source for FILE in *; do - if [[ $FILE -eq "ttio" ]]; then + if [[ $FILE == "ttio" ]]; then make -C $FILE clean make -C $FILE SDHC=1 clean make -C $FILE @@ -22,6 +22,14 @@ for FILE in *; do make -C $FILE clean make -C $FILE SDHC=1 cp $FILE/*.dldi $OUT + elif [[ $FILE == "ak2_sd" ]]; then + make -C $FILE clean + make -C $FILE -f Makefile_singlewrite clean + make -C $FILE + cp $FILE/*.dldi $OUT + make -C $FILE clean + make -C $FILE -f Makefile_singlewrite + cp $FILE/*.dldi $OUT else make -C $FILE clean make -C $FILE diff --git a/source/ak2_sd/Makefile_singlewrite b/source/ak2_sd/Makefile_singlewrite new file mode 100644 index 0000000..2db023d --- /dev/null +++ b/source/ak2_sd/Makefile_singlewrite @@ -0,0 +1,132 @@ +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- + +ifeq ($(strip $(DEVKITARM)),) +$(error "Please set DEVKITARM in your environment. export DEVKITARM=devkitARM") +endif + +include $(DEVKITARM)/ds_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 +# SPECS is the directory containing the important build and link files +#--------------------------------------------------------------------------------- +export TARGET := $(shell basename $(CURDIR))_singlewrite +BUILD := build +SOURCES := source +DATA := data +INCLUDES := include + +$(warning "SINGLE WRITE ONLY") +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -mthumb-interwork -DTARGET_SINGLE_BLOCK_WRITE_ONLY + +CFLAGS := -g -Wall -O2\ + -mcpu=arm7tdmi -mtune=arm7tdmi -fomit-frame-pointer\ + -ffast-math \ + $(ARCH) + +CFLAGS += $(INCLUDE) -DARM7 -fPIC + +CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions + +ASFLAGS := -g $(ARCH) $(INCLUDE) +LDFLAGS = -nostartfiles -nostdlib -T dldi.ld -g $(ARCH) -Wl,-Map,$(TARGET).map + +LIBS := + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(LIBNDS) + + +#--------------------------------------------------------------------------------- +# 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 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 := $(addsuffix .o,$(BINFILES)) \ + $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) + +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) + +.PHONY: $(BUILD) clean all + +#--------------------------------------------------------------------------------- +all: $(BUILD) + +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) $(TARGET).dldi $(TARGET).elf + + +#--------------------------------------------------------------------------------- +else + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +$(OUTPUT).dldi : $(OUTPUT).elf +$(OUTPUT).elf : $(OFILES) + + +#--------------------------------------------------------------------------------- +%.dldi: %.elf + @$(OBJCOPY) -O binary $< $@ + @echo built ... $(notdir $@) + + +-include $(DEPENDS) + + +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- diff --git a/source/ak2_sd/source/dldi_crt0.s b/source/ak2_sd/source/dldi_crt0.s index e9aa581..ebf82dd 100644 --- a/source/ak2_sd/source/dldi_crt0.s +++ b/source/ak2_sd/source/dldi_crt0.s @@ -19,7 +19,11 @@ @--------------------------------------------------------------------------------- @ Text identifier - can be anything up to 47 chars + terminating null -- 48 bytes .align 4 - .asciz "Acekard AK2 (lifehackerhansol)" +#ifndef TARGET_SINGLE_BLOCK_WRITE_ONLY + .asciz "Acekard AK2" +#else + .asciz "Acekard AK2 (Single-Write version)" +#endif @--------------------------------------------------------------------------------- @ Offsets to important sections within the data -- 32 bytes diff --git a/source/ak2_sd/source/sddriver.cpp b/source/ak2_sd/source/sddriver.cpp index 725585f..1e0b14f 100644 --- a/source/ak2_sd/source/sddriver.cpp +++ b/source/ak2_sd/source/sddriver.cpp @@ -297,6 +297,7 @@ void sddWriteBlocks( u32 addr, u32 blockCount, const void * buffer ) const u8 * pBuffer = (u8 *)buffer; u32 address = _isSDHC ? addr : (addr << 9); +#ifndef TARGET_SINGLE_BLOCK_WRITE_ONLY if( 1 == blockCount ) { u32 sdWriteBlock[2] = { 0xd5050018, address }; sendSDCommandR0( sdWriteBlock ); @@ -319,4 +320,14 @@ void sddWriteBlocks( u32 addr, u32 blockCount, const void * buffer ) //dbg_printf("cmd %d response %08x\n", 0x0C, *(u32 *)response ); waitSDState( 0x00 ); } +#else + u32 sdWriteBlock[2] = { 0xd5050018, address }; + while ( blockCount-- ) { + sendSDCommandR0( sdWriteBlock ); + ioRpgPushData( pBuffer, 512 ); + waitSDState( 0x00 ); + pBuffer += 512; + sdWriteBlock[1] += _isSDHC ? 1 : 0x200; + } +#endif }