Skip to content

Commit cde9dff

Browse files
committed
add 3dslink server demo
1 parent f3c7b94 commit cde9dff

File tree

2 files changed

+372
-0
lines changed

2 files changed

+372
-0
lines changed

network/3dslink-demo/Makefile

Lines changed: 255 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,255 @@
1+
#---------------------------------------------------------------------------------
2+
.SUFFIXES:
3+
#---------------------------------------------------------------------------------
4+
5+
ifeq ($(strip $(DEVKITARM)),)
6+
$(error "Please set DEVKITARM in your environment. export DEVKITARM=<path to>devkitARM")
7+
endif
8+
9+
TOPDIR ?= $(CURDIR)
10+
include $(DEVKITARM)/3ds_rules
11+
12+
#---------------------------------------------------------------------------------
13+
# TARGET is the name of the output
14+
# BUILD is the directory where object files & intermediate files will be placed
15+
# SOURCES is a list of directories containing source code
16+
# DATA is a list of directories containing data files
17+
# INCLUDES is a list of directories containing header files
18+
# GRAPHICS is a list of directories containing graphics files
19+
# GFXBUILD is the directory where converted graphics files will be placed
20+
# If set to $(BUILD), it will statically link in the converted
21+
# files as if they were data files.
22+
#
23+
# NO_SMDH: if set to anything, no SMDH file is generated.
24+
# ROMFS is the directory which contains the RomFS, relative to the Makefile (Optional)
25+
# APP_TITLE is the name of the app stored in the SMDH file (Optional)
26+
# APP_DESCRIPTION is the description of the app stored in the SMDH file (Optional)
27+
# APP_AUTHOR is the author of the app stored in the SMDH file (Optional)
28+
# ICON is the filename of the icon (.png), relative to the project folder.
29+
# If not set, it attempts to use one of the following (in this order):
30+
# - <Project name>.png
31+
# - icon.png
32+
# - <libctru folder>/default_icon.png
33+
#---------------------------------------------------------------------------------
34+
TARGET := $(notdir $(CURDIR))
35+
BUILD := build
36+
SOURCES := source
37+
DATA := data
38+
INCLUDES := include
39+
GRAPHICS := gfx
40+
GFXBUILD := $(BUILD)
41+
#ROMFS := romfs
42+
#GFXBUILD := $(ROMFS)/gfx
43+
44+
#---------------------------------------------------------------------------------
45+
# options for code generation
46+
#---------------------------------------------------------------------------------
47+
ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=hard -mtp=soft
48+
49+
CFLAGS := -g -Wall -O2 -mword-relocations \
50+
-ffunction-sections \
51+
$(ARCH)
52+
53+
CFLAGS += $(INCLUDE) -D__3DS__
54+
55+
CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11
56+
57+
ASFLAGS := -g $(ARCH)
58+
LDFLAGS = -specs=3dsx.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)
59+
60+
LIBS := -lctru -lm
61+
62+
#---------------------------------------------------------------------------------
63+
# list of directories containing libraries, this must be the top level containing
64+
# include and lib
65+
#---------------------------------------------------------------------------------
66+
LIBDIRS := $(CTRULIB)
67+
68+
69+
#---------------------------------------------------------------------------------
70+
# no real need to edit anything past this point unless you need to add additional
71+
# rules for different file extensions
72+
#---------------------------------------------------------------------------------
73+
ifneq ($(BUILD),$(notdir $(CURDIR)))
74+
#---------------------------------------------------------------------------------
75+
76+
export OUTPUT := $(CURDIR)/$(TARGET)
77+
export TOPDIR := $(CURDIR)
78+
79+
export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \
80+
$(foreach dir,$(GRAPHICS),$(CURDIR)/$(dir)) \
81+
$(foreach dir,$(DATA),$(CURDIR)/$(dir))
82+
83+
export DEPSDIR := $(CURDIR)/$(BUILD)
84+
85+
CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
86+
CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp)))
87+
SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))
88+
PICAFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.v.pica)))
89+
SHLISTFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.shlist)))
90+
GFXFILES := $(foreach dir,$(GRAPHICS),$(notdir $(wildcard $(dir)/*.t3s)))
91+
BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*)))
92+
93+
#---------------------------------------------------------------------------------
94+
# use CXX for linking C++ projects, CC for standard C
95+
#---------------------------------------------------------------------------------
96+
ifeq ($(strip $(CPPFILES)),)
97+
#---------------------------------------------------------------------------------
98+
export LD := $(CC)
99+
#---------------------------------------------------------------------------------
100+
else
101+
#---------------------------------------------------------------------------------
102+
export LD := $(CXX)
103+
#---------------------------------------------------------------------------------
104+
endif
105+
#---------------------------------------------------------------------------------
106+
107+
#---------------------------------------------------------------------------------
108+
ifeq ($(GFXBUILD),$(BUILD))
109+
#---------------------------------------------------------------------------------
110+
export T3XFILES := $(GFXFILES:.t3s=.t3x)
111+
#---------------------------------------------------------------------------------
112+
else
113+
#---------------------------------------------------------------------------------
114+
export ROMFS_T3XFILES := $(patsubst %.t3s, $(GFXBUILD)/%.t3x, $(GFXFILES))
115+
export T3XHFILES := $(patsubst %.t3s, $(BUILD)/%.h, $(GFXFILES))
116+
#---------------------------------------------------------------------------------
117+
endif
118+
#---------------------------------------------------------------------------------
119+
120+
export OFILES_SOURCES := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o)
121+
122+
export OFILES_BIN := $(addsuffix .o,$(BINFILES)) \
123+
$(PICAFILES:.v.pica=.shbin.o) $(SHLISTFILES:.shlist=.shbin.o) \
124+
$(addsuffix .o,$(T3XFILES))
125+
126+
export OFILES := $(OFILES_BIN) $(OFILES_SOURCES)
127+
128+
export HFILES := $(PICAFILES:.v.pica=_shbin.h) $(SHLISTFILES:.shlist=_shbin.h) \
129+
$(addsuffix .h,$(subst .,_,$(BINFILES))) \
130+
$(GFXFILES:.t3s=.h)
131+
132+
export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
133+
$(foreach dir,$(LIBDIRS),-I$(dir)/include) \
134+
-I$(CURDIR)/$(BUILD)
135+
136+
export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib)
137+
138+
export _3DSXDEPS := $(if $(NO_SMDH),,$(OUTPUT).smdh)
139+
140+
ifeq ($(strip $(ICON)),)
141+
icons := $(wildcard *.png)
142+
ifneq (,$(findstring $(TARGET).png,$(icons)))
143+
export APP_ICON := $(TOPDIR)/$(TARGET).png
144+
else
145+
ifneq (,$(findstring icon.png,$(icons)))
146+
export APP_ICON := $(TOPDIR)/icon.png
147+
endif
148+
endif
149+
else
150+
export APP_ICON := $(TOPDIR)/$(ICON)
151+
endif
152+
153+
ifeq ($(strip $(NO_SMDH)),)
154+
export _3DSXFLAGS += --smdh=$(CURDIR)/$(TARGET).smdh
155+
endif
156+
157+
ifneq ($(ROMFS),)
158+
export _3DSXFLAGS += --romfs=$(CURDIR)/$(ROMFS)
159+
endif
160+
161+
.PHONY: all clean
162+
163+
#---------------------------------------------------------------------------------
164+
all: $(BUILD) $(GFXBUILD) $(DEPSDIR) $(ROMFS_T3XFILES) $(T3XHFILES)
165+
@$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile
166+
167+
$(BUILD):
168+
@mkdir -p $@
169+
170+
ifneq ($(GFXBUILD),$(BUILD))
171+
$(GFXBUILD):
172+
@mkdir -p $@
173+
endif
174+
175+
ifneq ($(DEPSDIR),$(BUILD))
176+
$(DEPSDIR):
177+
@mkdir -p $@
178+
endif
179+
180+
#---------------------------------------------------------------------------------
181+
clean:
182+
@echo clean ...
183+
@rm -fr $(BUILD) $(TARGET).3dsx $(OUTPUT).smdh $(TARGET).elf $(GFXBUILD)
184+
185+
#---------------------------------------------------------------------------------
186+
$(GFXBUILD)/%.t3x $(BUILD)/%.h : %.t3s
187+
#---------------------------------------------------------------------------------
188+
@echo $(notdir $<)
189+
@tex3ds -i $< -H $(BUILD)/$*.h -d $(DEPSDIR)/$*.d -o $(GFXBUILD)/$*.t3x
190+
191+
#---------------------------------------------------------------------------------
192+
else
193+
194+
#---------------------------------------------------------------------------------
195+
# main targets
196+
#---------------------------------------------------------------------------------
197+
$(OUTPUT).3dsx : $(OUTPUT).elf $(_3DSXDEPS)
198+
199+
$(OFILES_SOURCES) : $(HFILES)
200+
201+
$(OUTPUT).elf : $(OFILES)
202+
203+
#---------------------------------------------------------------------------------
204+
# you need a rule like this for each extension you use as binary data
205+
#---------------------------------------------------------------------------------
206+
%.bin.o %_bin.h : %.bin
207+
#---------------------------------------------------------------------------------
208+
@echo $(notdir $<)
209+
@$(bin2o)
210+
211+
#---------------------------------------------------------------------------------
212+
.PRECIOUS : %.t3x
213+
#---------------------------------------------------------------------------------
214+
%.t3x.o %_t3x.h : %.t3x
215+
#---------------------------------------------------------------------------------
216+
@echo $(notdir $<)
217+
@$(bin2o)
218+
219+
#---------------------------------------------------------------------------------
220+
# rules for assembling GPU shaders
221+
#---------------------------------------------------------------------------------
222+
define shader-as
223+
$(eval CURBIN := $*.shbin)
224+
$(eval DEPSFILE := $(DEPSDIR)/$*.shbin.d)
225+
echo "$(CURBIN).o: $< $1" > $(DEPSFILE)
226+
echo "extern const u8" `(echo $(CURBIN) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end[];" > `(echo $(CURBIN) | tr . _)`.h
227+
echo "extern const u8" `(echo $(CURBIN) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"[];" >> `(echo $(CURBIN) | tr . _)`.h
228+
echo "extern const u32" `(echo $(CURBIN) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size";" >> `(echo $(CURBIN) | tr . _)`.h
229+
picasso -o $(CURBIN) $1
230+
bin2s $(CURBIN) | $(AS) -o $*.shbin.o
231+
endef
232+
233+
%.shbin.o %_shbin.h : %.v.pica %.g.pica
234+
@echo $(notdir $^)
235+
@$(call shader-as,$^)
236+
237+
%.shbin.o %_shbin.h : %.v.pica
238+
@echo $(notdir $<)
239+
@$(call shader-as,$<)
240+
241+
%.shbin.o %_shbin.h : %.shlist
242+
@echo $(notdir $<)
243+
@$(call shader-as,$(foreach file,$(shell cat $<),$(dir $<)$(file)))
244+
245+
#---------------------------------------------------------------------------------
246+
%.t3x %.h : %.t3s
247+
#---------------------------------------------------------------------------------
248+
@echo $(notdir $<)
249+
@tex3ds -i $< -H $*.h -d $*.d -o $*.t3x
250+
251+
-include $(DEPSDIR)/*.d
252+
253+
#---------------------------------------------------------------------------------------
254+
endif
255+
#---------------------------------------------------------------------------------------
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
#include <string.h>
4+
#include <malloc.h>
5+
#include <errno.h>
6+
#include <stdarg.h>
7+
#include <unistd.h>
8+
9+
#include <fcntl.h>
10+
11+
#include <sys/types.h>
12+
13+
#include <sys/socket.h>
14+
#include <netinet/in.h>
15+
#include <arpa/inet.h>
16+
17+
#include <3ds.h>
18+
19+
#define SOC_ALIGN 0x1000
20+
#define SOC_BUFFERSIZE 0x100000
21+
22+
static u32 *SOC_buffer = NULL;
23+
s32 sock = -1, csock = -1;
24+
25+
__attribute__((format(printf,1,2)))
26+
void failExit(const char *fmt, ...);
27+
28+
29+
//---------------------------------------------------------------------------------
30+
void socShutdown() {
31+
//---------------------------------------------------------------------------------
32+
printf("waiting for socExit...\n");
33+
socExit();
34+
35+
}
36+
37+
//---------------------------------------------------------------------------------
38+
int main(int argc, char **argv) {
39+
//---------------------------------------------------------------------------------
40+
int ret;
41+
42+
gfxInitDefault();
43+
44+
// register gfxExit to be run when app quits
45+
// this can help simplify error handling
46+
atexit(gfxExit);
47+
48+
consoleInit(GFX_TOP, NULL);
49+
50+
printf ("\nlibctru 3dslink demo\n\n");
51+
52+
printf ("\nstart 3dslink with -s to see printf output on host\n\n");
53+
54+
// allocate buffer for SOC service
55+
SOC_buffer = (u32*)memalign(SOC_ALIGN, SOC_BUFFERSIZE);
56+
57+
if(SOC_buffer == NULL) {
58+
failExit("memalign: failed to allocate\n");
59+
}
60+
61+
// Now intialise soc:u service
62+
if ((ret = socInit(SOC_buffer, SOC_BUFFERSIZE)) != 0) {
63+
failExit("socInit: 0x%08X\n", (unsigned int)ret);
64+
}
65+
66+
// register socShutdown to run at exit
67+
// atexit functions execute in reverse order so this runs before gfxExit
68+
atexit(socShutdown);
69+
70+
71+
link3dsStdio();
72+
73+
printf("Hello World!\n");
74+
75+
while (aptMainLoop()) {
76+
gspWaitForVBlank();
77+
hidScanInput();
78+
79+
u32 kDown = hidKeysDown();
80+
if (kDown & KEY_START) break;
81+
if (kDown & KEY_A) {
82+
printf("Pressed A!\n");
83+
}
84+
if (kDown & KEY_B) {
85+
printf("Pressed B!\n");
86+
}
87+
}
88+
89+
close(sock);
90+
91+
return 0;
92+
}
93+
94+
//---------------------------------------------------------------------------------
95+
void failExit(const char *fmt, ...) {
96+
//---------------------------------------------------------------------------------
97+
98+
if(sock>0) close(sock);
99+
if(csock>0) close(csock);
100+
101+
va_list ap;
102+
103+
printf(CONSOLE_RED);
104+
va_start(ap, fmt);
105+
vprintf(fmt, ap);
106+
va_end(ap);
107+
printf(CONSOLE_RESET);
108+
printf("\nPress B to exit\n");
109+
110+
while (aptMainLoop()) {
111+
gspWaitForVBlank();
112+
hidScanInput();
113+
114+
u32 kDown = hidKeysDown();
115+
if (kDown & KEY_B) exit(0);
116+
}
117+
}

0 commit comments

Comments
 (0)