diff --git a/Makefile b/Makefile index 59a6d0c..fe40ec1 100644 --- a/Makefile +++ b/Makefile @@ -29,7 +29,7 @@ OBJCOPY=$(TCPREFIX)objcopy AR=$(TCPREFIX)ar RANLIB=$(TCPREFIX)ranlib -INCLUDE=-Iinclude -Imcdapi +INCLUDE=-Iinclude CFLAGS=-mcpu=5474\ -Wall\ -g\ @@ -41,8 +41,8 @@ CFLAGS=-mcpu=5474\ -Wa,--register-prefix-optional SRCDIR=sources -MCDSRC=mcdapi -OBJDIR=objs +TRGTDIRS= ./firebee ./m5484lite +OBJDIRS=$(patsubst %, %/objs,$(TRGTDIRS)) # Linker control file. The final $(LDCFILE) is intermediate only (preprocessed version of $(LDCSRC) LDCFILE=bas.lk @@ -53,9 +53,9 @@ LDCBFS=bashflash.lk # this Makefile can create the BaS to flash or an arbitrary ram address (for BDM debugging). See # below for the definition of TARGET_ADDRESS -FLASH_EXEC=bas.m5484lite.$(EXE) bas.firebee.$(EXE) -RAM_EXEC=ram.m5484lite.$(EXE) ram.firebee.$(EXE) -BASFLASH_EXEC=basflash.m5484lite.$(EXE) basflash.firebee.$(EXE) +FLASH_EXEC=bas.$(EXE) +RAM_EXEC=ram.$(EXE) +BASFLASH_EXEC=basflash.$(EXE) CSRCS= \ $(SRCDIR)/sysinit.c \ @@ -78,7 +78,13 @@ CSRCS= \ $(SRCDIR)/xhdi_interface.c \ $(SRCDIR)/pci.c \ $(SRCDIR)/dspi.c \ - $(SRCDIR)/driver_vec.c + $(SRCDIR)/driver_vec.c \ + $(SRCDIR)/MCD_dmaApi.c \ + $(SRCDIR)/MCD_tasks.c \ + $(SRCDIR)/MCD_tasksInit.c \ + \ + $(SRCDIR)/basflash.c \ + $(SRCDIR)/basflash_start.c ASRCS= \ $(SRCDIR)/startcf.S \ @@ -89,86 +95,99 @@ ASRCS= \ $(SRCDIR)/illegal_instruction.S \ $(SRCDIR)/xhdi_vec.S -MCDSRCS=\ - $(MCDSRC)/MCD_dmaApi.c \ - $(MCDSRC)/MCD_tasks.c \ - $(MCDSRC)/MCD_tasksInit.c +COBJS=$(patsubst $(SRCDIR)/%.o,%.o,$(patsubst %.c,%.o,$(CSRCS))) +AOBJS=$(patsubst $(SRCDIR)/%.o,%.o,$(patsubst %.S,%.o,$(ASRCS))) -COBJS=$(patsubst $(SRCDIR)/%.o,$(OBJDIR)/%.o,$(patsubst %.c,%.o,$(CSRCS))) -AOBJS=$(patsubst $(SRCDIR)/%.o,$(OBJDIR)/%.o,$(patsubst %.S,%.o,$(ASRCS))) -MCDOBJS=$(patsubst $(MCDSRCS)/%.o,$(OBJDIR)/%.o,$(patsubst %.c,%.o,$(MCDSRCS))) - -OBJS=$(COBJS) $(AOBJS) $(MCDOBJS) +OBJS=$(COBJS) $(AOBJS) LIBBAS=libbas.a +LIBS=$(patsubst %,%/$(LIBBAS),$(TRGTDIRS)) + all: fls ram bfl lib -fls: $(FLASH_EXEC) -ram: $(RAM_EXEC) -bfl: $(BASFLASH_EXEC) -lib: $(LIBBAS) +fls: $(patsubst %,%/$(FLASH_EXEC),$(TRGTDIRS)) +ram: $(patsubst %,%/$(RAM_EXEC),$(TRGTDIRS)) +bfl: $(patsubst %,%/$(BASFLASH_EXEC),$(TRGTDIRS)) +lib: $(LIBS) .PHONY clean: - @ rm -f $(FLASH_EXEC) $(patsubst %.elf, %.s19, $(FLASH_EXEC)) \ - $(RAM_EXEC) $(patsubst %.elf, %.s19, $(RAM_EXEC)) \ - $(BASFLASH_EXEC) $(patsubst %.elf, %.s19, $(BASFLASH_EXEC)) $(OBJDIR)/basflash.o $(OBJDIR)/basflash_start.o \ - $(OBJS) $(LIBBAS) \ - bas.lk bas.map ram.lk ram.map basflash.lk basflash.map depend - -bas.m5484l.$(EXE): MACHINE=MACHINE_M5484LITE -bas.firebee.$(EXE): MACHINE=MACHINE_FIREBEE -$(FLASH_EXEC): CFLAGS += -D$(MACHINE) -$(FLASH_EXEC): LDCFILE=bas.lk -$(FLASH_EXEC): MAPFILE=bas.map + for d in $(TRGTDIRS);\ + do rm -f $$d/$(FLASH_EXEC) $(patsubst %.elf, %.s19, $$d/$(FLASH_EXEC)) \ + $$d/$(RAM_EXEC) $(patsubst %.elf, %.s19, $$d/$(RAM_EXEC)) \ + $d$/$(BASFLASH_EXEC) $(patsubst %.elf, %.s19, $$d/$(BASFLASH_EXEC)) $$d/$(OBJDIR)/basflash.o $$d/$(OBJDIR)/basflash_start.o \ + $$d/objs/* $$d/$(LIBBAS) \ + $$d/bas.lk $$d/bas.map $$d/ram.lk $$d/ram.map $$d/basflash.lk $$d/basflash.map depend; \ + done -ram.m5484l.$(EXE): MACHINE=MACHINE_M5484LITE -ram.firebee.$(EXE): MACHINE=MACHINE_FIREBEE -$(RAM_EXEC): CFLAGS += -D$(MACHINE) -$(RAM_EXEC): LDCFILE=ram.lk -$(RAM_EXEC): MAPFILE=ram.map +# flags for targets +m5484lite/bas.$(EXE): MACHINE=MACHINE_M5484LITE +firebee/bas.$(EXE): MACHINE=MACHINE_FIREBEE +m5484lite/ram.$(EXE): MACHINE=MACHINE_M5484LITE +firebee/ram.$(EXE): MACHINE=MACHINE_FIREBEE +m5484lite/basflash.$(EXE): MACHINE=MACHINE_M5484LITE +firebee/basflash.$(EXE): MACHINE=MACHINE_FIREBEE - -basflash.m5484l.$(EXE): MACHINE=MACHINE_M5484LITE -basflash.firebee.$(EXE): MACHINE=MACHINE_FIREBEE -$(BASFLASH_EXEC): CFLAGS += -D$(MACHINE) -$(BASFLASH_EXEC): LDCFILE=basflash.lk -$(BASFLASH_EXEC): MAPFILE=basflash.map - - -# the final link stage (BaS in RAM and BaS in flash) -$(FLASH_EXEC) $(RAM_EXEC): $(LIBBAS) $(LDCSRC) - $(CPP) $(INCLUDE) -P -DFORMAT=$(FORMAT) -D$(MACHINE) $(LDCSRC) -o $(LDCFILE) - $(LD) --oformat $(FORMAT) -Map $(MAPFILE) --cref -T $(LDCFILE) -o $@ -ifeq ($(COMPILE_ELF),Y) - $(OBJCOPY) -O srec $@ $(basename $@).s19 +# +# generate pattern rules for different object files +# +define CC_TEMPLATE +ifeq (firebee,$(1)) + MACHINE=MACHINE_FIREBEE else - objcopy -I srec -O elf32-big --alt-machine-code 4 $@ $(basename $@).elf + MACHINE=MACHINE_M5484LITE +endif +$(1)/objs/%.o:$(SRCDIR)/%.c + $(CC) $$(CFLAGS) -D$$(MACHINE) $(INCLUDE) -c $$< -o $$@ + +$(1)/objs/%.o:$(SRCDIR)/%.S + $(CC) $$(CFLAGS) -Wa,--bitwise-or -D$$(MACHINE) $(INCLUDE) -c $$< -o $$@ +endef +$(foreach DIR,$(TRGTDIRS),$(eval $(call CC_TEMPLATE,$(DIR)))) + +# +# generate pattern rules for libraries +# +define AR_TEMPLATE +$(1)_OBJS=$(patsubst %,$(1)/objs/%,$(OBJS)) +$(1)/$(LIBBAS): $$($(1)_OBJS) + $(AR) rv $$@ $$? + $(RANLIB) $$@ +endef +$(foreach DIR,$(TRGTDIRS),$(eval $(call AR_TEMPLATE,$(DIR)))) + +# +# define pattern rules for binaries +# +define EX_TEMPLATE +$(1)_MAPFILE=$(1)/$$(basename $$FLASH_EXEC).map +$(1)/$$(FLASH_EXEC) $(1)/$$(RAM_EXEC): $(1)/$(LIBBAS) $(LDCSRC) + $(CPP) $(INCLUDE) -DOBJDIR=$(1)/objs -P -DFORMAT=$$(FORMAT) -D$$(MACHINE) $(LDCSRC) -o $(1)/$$(LDCFILE) + $(LD) --oformat $$(FORMAT) -Map $(1)_MAPFILE --cref -T $(1)/$$(LDCFILE) -o $$@ +ifeq ($(COMPILE_ELF),Y) + $(OBJCOPY) -O srec $$@ $(basename $$@).s19 +else + objcopy -I srec -O elf32big --alt-machine-code 4 $$@ $(basename $$@).elf endif -# the basflash (SD-card executable called from BaS) final link stage -$(BASFLASH_EXEC): $(OBJDIR)/basflash.o $(OBJDIR)/basflash_start.o $(LIBBAS) $(LDCBFL) - $(CPP) $(INCLUDE) -P -DFORMAT=$(FORMAT) -D$(MACHINE) $(LDCBSRC) -o $(LDCFILE) - $(LD) --oformat $(FORMAT) -Map $(MAPFILE) --cref -T $(LDCFILE) -L. -lbas -o $@ +$(1)_MAPFILE_BFL=$(1)/$$(basename $$(BASFLASH_EXEC)).map +$(1)/$$(BASFLASH_EXEC): $(1)/objs/basflash.o $(1)/objs/basflash_start.o $(1)/$(LIBBAS) $(LDCBFL) + $(CPP) $(INCLUDE) -P -DOBJDIR=$(1)/objs -DFORMAT=$$(FORMAT) -D$$(MACHINE) $(LDCBSRC) -o $(1)/$$(LDCFILE) + $(LD) --oformat $$(FORMAT) -Map $(1)_MAPFILE_BFL --cref -T $(1)/$$(LDCFILE) -L$(1) -lbas -o $$@ ifeq ($(COMPILE_ELF),Y) - $(OBJCOPY) -O srec $@ $(basename $@).s19 + $(OBJCOPY) -O srec $$@ $(basename $$@).s19 else - objcopy -I srec -O elf32-big --alt-machine-code 4 $@ $(basename $@).elf -endif + objcopy -I srec -O elf32big --alt-machine-code 4 $$@ $(basename $$@).elf +endif +endef +$(foreach DIR,$(TRGTDIRS),$(eval $(call EX_TEMPLATE,$(DIR)))) -# (re)create library. Currently suboptimal because it rewrites the whole lib even if only a single object changed -$(LIBBAS): $(OBJS) - $(AR) rv $@ $(OBJS) - $(RANLIB) $@ - -$(OBJDIR)/%.o:$(SRCDIR)/%.c - $(CC) -c $(CFLAGS) $(INCLUDE) $< -o $@ - -$(OBJDIR)/%.o:$(SRCDIR)/%.S - $(CC) -c $(CFLAGS) -Wa,--bitwise-or $(INCLUDE) $< -o $@ depend: $(ASRCS) $(CSRCS) - $(CC) $(CFLAGS) $(INCLUDE) -M $(ASRCS) $(CSRCS) | sed -e 's/^\(.*\).o:/$(OBJDIR)\/\1.o:/' > depend + - rm -f depend + for d in $(TRGTDIRS);\ + do $(CC) $(CFLAGS) $(INCLUDE) -M $(ASRCS) $(CSRCS) | sed -e "s#^\(.*\).o:#$$d/objs/\1.o:#" >> depend; \ + done ifneq (clean,$(MAKECMDGOALS)) diff --git a/bas.lk.in b/bas.lk.in index 81bc402..8c03109 100644 --- a/bas.lk.in +++ b/bas.lk.in @@ -21,40 +21,40 @@ SECTIONS /* BaS in ROM */ .text : { - objs/startcf.o(.text) /* this one is the entry point so it must be the first */ + OBJDIR/startcf.o(.text) /* this one is the entry point so it must be the first */ - objs/sysinit.o(.text) - objs/fault_vectors.o(.text) + OBJDIR/sysinit.o(.text) + OBJDIR/fault_vectors.o(.text) #ifdef MACHINE_FIREBEE - objs/init_fpga.o(.text) + OBJDIR/init_fpga.o(.text) #endif /* MACHINE_FIREBEE */ - objs/wait.o(.text) - objs/exceptions.o(.text) - objs/illegal_instruction.o(.text) - objs/supervisor.o(.text) - objs/mmu.o(.text) - objs/pci.o(.text) + OBJDIR/wait.o(.text) + OBJDIR/exceptions.o(.text) + OBJDIR/illegal_instruction.o(.text) + OBJDIR/supervisor.o(.text) + OBJDIR/mmu.o(.text) + OBJDIR/pci.o(.text) - objs/BaS.o(.text) - objs/wait.o(.text) + OBJDIR/BaS.o(.text) + OBJDIR/wait.o(.text) /* put other routines into the same segment (RAM) as BaS.o */ - objs/unicode.o(.text) - objs/mmc.o(.text) - objs/ff.o(.text) - objs/sd_card.o(.text) - objs/s19reader.o(.text) - objs/bas_printf.o(.text) - objs/bas_string.o(.text) - objs/printf_helper.o(.text) - objs/cache.o(.text) - objs/dma.o(.text) - mcdapi/MCD_dmaApi.o(.text) - mcdapi/MCD_tasks.o(.text) - mcdapi/MCD_tasksInit.o(.text) - objs/xhdi_sd.o(.text) - objs/xhdi_interface.o(.text) - objs/xhdi_vec.o(.text) + OBJDIR/unicode.o(.text) + OBJDIR/mmc.o(.text) + OBJDIR/ff.o(.text) + OBJDIR/sd_card.o(.text) + OBJDIR/s19reader.o(.text) + OBJDIR/bas_printf.o(.text) + OBJDIR/bas_string.o(.text) + OBJDIR/printf_helper.o(.text) + OBJDIR/cache.o(.text) + OBJDIR/dma.o(.text) + OBJDIR/MCD_dmaApi.o(.text) + OBJDIR/MCD_tasks.o(.text) + OBJDIR/MCD_tasksInit.o(.text) + OBJDIR/xhdi_sd.o(.text) + OBJDIR/xhdi_interface.o(.text) + OBJDIR/xhdi_vec.o(.text) /* * if we compile to RAM anyway, there is no need to copy anything diff --git a/basflash.lk.in b/basflash.lk.in index 396530a..109310c 100644 --- a/basflash.lk.in +++ b/basflash.lk.in @@ -15,8 +15,8 @@ SECTIONS { .text : { - objs/basflash_start.o(.text) - objs/basflash.o(.text) + OBJDIR/basflash_start.o(.text) + OBJDIR/basflash.o(.text) *(.data) *(.bss)