Skip to content

Commit

Permalink
ak2_sd: Add second build that disables CMD25
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
lifehackerhansol committed Jan 22, 2024
1 parent c0a9e26 commit 7c8330d
Show file tree
Hide file tree
Showing 4 changed files with 157 additions and 2 deletions.
10 changes: 9 additions & 1 deletion build.sh
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,22 @@ 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
cp $FILE/*.dldi $OUT
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
Expand Down
132 changes: 132 additions & 0 deletions source/ak2_sd/Makefile_singlewrite
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
#---------------------------------------------------------------------------------
.SUFFIXES:
#---------------------------------------------------------------------------------

ifeq ($(strip $(DEVKITARM)),)
$(error "Please set DEVKITARM in your environment. export DEVKITARM=<path to>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
#---------------------------------------------------------------------------------------
6 changes: 5 additions & 1 deletion source/ak2_sd/source/dldi_crt0.s
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
11 changes: 11 additions & 0 deletions source/ak2_sd/source/sddriver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 );
Expand All @@ -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
}

0 comments on commit 7c8330d

Please sign in to comment.