ARMGNU ?= arm-none-eabi

DEBUG = 1

KSIZE =		0x20000
HEAPSIZE =	0x30000
FIQSTACK =	0x2000
IRQSTACK =	0x2000
KSTACK =	0x2000
USTACK =	0x2000

LINK = memmap.auto
INIT = initf.auto
STACKS = stacks.auto
TARGET = kernel7.bin
SDTARGET = /Volumes/boot/kernel7.img
DEPS = *.h

COPS = -Wall -O2 -nostdlib -nostartfiles -ffreestanding 

all : $(TARGET)

$(LINK) : memmap Makefile
	cat memmap > $(LINK)
	perl -i -p0e 's/__SIZE__/$(KSIZE)/g' $(LINK)

$(INIT) : *.c  Makefile
	grep _init *.c | awk '{ print "extern void ", $$2, ";" }' > $(INIT)
	grep _init *.c | awk '{ print $$2 , ";" }' >> $(INIT)

F_START = 	$$(($(KSIZE)+$(FIQSTACK)))
I_START = 	$$(($(F_START)+(3*$(FIQSTACK))+$(IRQSTACK)))
K_START =	$$(($(I_START)+(3*$(IRQSTACK))+$(KSTACK)))
U_START =	$$(($(K_START)+(3*$(KSTACK))+$(USTACK)))

$(STACKS) : Makefile
	cat < /dev/null > $(STACKS)
	for i in 3 2 1 0 ; do \
	echo ".equ	FIQSTACK$$i , $$(($(F_START)+$(FIQSTACK)*$$i))" >> $(STACKS) ;\
	echo ".equ	IRQSTACK$$i , $$(($(I_START)+$(IRQSTACK)*$$i))" >> $(STACKS) ;\
	echo ".equ	KSTACK$$i   , $$(($(K_START)+$(KSTACK)*$$i))" >> $(STACKS) ;\
	echo ".equ	USTACK$$i   , $$(($(U_START)+$(USTACK)*$$i))" >> $(STACKS) ;\
	done
	echo ".globl heapstart" >> $(STACKS)
	echo "heapstart: .word $$(($(KSIZE)+(4*$(FIQSTACK))+(4*$(IRQSTACK))+(4*$(KSTACK))+(4*$(USTACK))))" >> $(STACKS)

clean :
	rm -f *.o
	rm -f *.bin
	rm -f *.hex
	rm -f *.elf
	rm -f *.list
	rm -f *.img
	rm -f *.auto

cp : clean $(TARGET)
	cp $(TARGET) $(SDTARGET)

.s.o : 
	$(ARMGNU)-as $< -o $@

.c.o : $(DEPS)
	$(ARMGNU)-gcc $(COPS) -c $< -o $@

OBJECTS := $(patsubst %.s,%.o,$(wildcard *.s)) $(patsubst %.c,%.o,$(wildcard *.c))

$(TARGET) : $(STACKS) $(INIT) $(OBJECTS) $(LINK)
	$(ARMGNU)-ld $(OBJECTS) -T $(LINK) -o kernel7.elf
	$(ARMGNU)-objdump -D kernel7.elf > kernel7.list
	$(ARMGNU)-objcopy kernel7.elf -O ihex kernel7.hex
	$(ARMGNU)-objcopy kernel7.elf -O binary $(TARGET)
	rm -f $(LINK)

