# Makefile for device driver for test board DAQ
# Jacobsen 20010717


# Remember to make version = the CVS tagged version, or there will be 
# confusion.
ifndef KERNELVER
#	KERNELVER = 2.4.18-26.8.0smp
	KERNELVER = `uname -r`
endif

VERSION         = `cat version.h | awk '{print $3}' | sed -e 's,\",,g'`
RELEASE         = 1
LATEST_FIRMWARE = dor_010m.rbf           #<- KEEP FIRMWARE UPDATED!
NODSB_FIRMWARE  = dor_020m.rbf           #<- non-DSB DOR rev 0 version
TEST_FIRMWARE   = DC_002x.rbf            #<- Extra firmware for loopback test
ICETOP_FIRMWARE = DC_009b.rbf            #<- Probably doesn't work w/ new format
INSTALL         = /usr/local/dor
INSTALL_DRIVER  = $(INSTALL)/driver
INSTALL_FPGA    = $(INSTALL)/fpga
INSTALL_CONF    = $(INSTALL)/conf
INSTALL_BIN     = /usr/local/bin
INSTALL_RC      = /etc/rc.d/init.d
XINETD_DIR      = /etc/xinetd.d
FIRMWARE_CVS    = ../resources/dor-fpga
HEADERS_OK_FILE = .kernel_headers_present
PACKAGENAME     = dor-driver
TMP_SRC_DIR     = $(PACKAGENAME)-$(VERSION)
TARFILENAME     = $(PACKAGENAME)-$(VERSION).tgz
RPMSRC          = /usr/src/redhat/SOURCES
SPECDIR         = /usr/src/redhat/SPECS
SPECSOURCE      = $(PACKAGENAME).spec
SPECFILE        = $(SPECDIR)/$(PACKAGENAME)-$(VERSION)-$(RELEASE).spec
RPMDIR          = /usr/src/redhat/RPMS/i386

# KERNELDIR can be speficied on the command line or environment
ifndef KERNELDIR
        KERNELDIR = /usr/src/linux-2.4
endif

# The headers are taken from the kernel
INCLUDEDIR       = $(KERNELDIR)/include 
ALT_INCLUDEDIR   = /usr/src/morton_patch/linux-2.4.18-26.8.0/include
NOSMP_INCLUDEDIR = /usr/src/linux-2.4.18-26.8.0/include

CFLAGS +=  -Wall -Wno-unused-variable -Wno-unused-function -D__KERNEL__ -DMODULE -I$(INCLUDEDIR) -O2

ALT_CFLAGS +=  -Wall -Wno-unused-variable -Wno-unused-function -D__KERNEL__ -DMODULE -I$(ALT_INCLUDEDIR) -O2

NOSMP_CFLAGS = -Wall -Wno-unused-variable -Wno-unused-function -D__KERNEL__ -DMODULE -O2 -I$(NOSMP_INCLUDEDIR) -DNO_DH_SMP

all:
	make dh.o readwrite dtest domappmode domapptest \
             manyopentest blocktest \
             writemany readmany tcaltest rndpkt dortimer simgps \
	     decodemoni decodetcal decodeeng
	pushd domhub-tools && make && popd

doc: dh.c dh.h
	doxygen Doxyfile.dh

kh.o: kh.c kh.h 
	gcc $(CFLAGS) -c kh.c

$(HEADERS_OK_FILE):
	./configure.pl $(HEADERS_OK_FILE)

dhswpkt.o: dhswpkt.c dhswpkt.h dh.h
	gcc $(CFLAGS) -c dhswpkt.c

dh_main.o: dh.c dh.h dh_tcalib.h dhswpkt.h ackq.h dhbench.h retx.h ioq.h version.h \
	   $(HEADERS_OK_FILE)
	gcc $(CFLAGS) -c dh.c -o dh_main.o

dh.o: dh_main.o dhswpkt.o
	ld -r dh_main.o dhswpkt.o -o dh.o 

benchmark:
	rm -f dh.o dh_main.o crc32.o dhswpkt.o
	gcc $(ALT_CFLAGS) -DBENCHMARK -c dh.c -o dh_main.o
	gcc $(ALT_CFLAGS) -DBENCHMARK -c crc32.c
	gcc $(ALT_CFLAGS) -DBENCHMARK -c dhswpkt.c
	ld -r dh_main.o crc32.o dhswpkt.o -o dh.o

nosmp:
	gcc $(NOSMP_CFLAGS) -c dh.c

tcaltest: tcaltest.c dh_tcalib.h
	gcc -Wall -o tcaltest tcaltest.c

readmany: readmany.c 
	gcc -Wall -o readmany readmany.c

rndpkt: rndpkt.c
	gcc -Wall -o rndpkt rndpkt.c

dtest: dtest.c
	gcc -Wall -lcurses -o dtest dtest.c

domappmode: domappmode.c domapp.h
	gcc -Wall -o domappmode domappmode.c

manyopentest: manyopentest.c
	gcc -Wall -o manyopentest manyopentest.c

blocktest: blocktest.c
	gcc -Wall -o blocktest blocktest.c

domapptest: domapptest.c domapp.h
	gcc -Wall -o domapptest domapptest.c

readwrite: readwrite.c
	gcc -Wall -o readwrite readwrite.c

interact: interact.c
	gcc -Wall -o interact interact.c

writemany: writemany.c
	gcc -Wall -o writemany writemany.c

dortimer: dortimer.c
	gcc -Wall -o dortimer dortimer.c

simgps: simgps.c
	gcc -Wall -o simgps simgps.c

decodemoni: decodemoni.c
	gcc -Wall decodemoni.c -o decodemoni

decodeeng: decodeeng.c
	gcc -Wall -g -o decodeeng decodeeng.c

decodetcal: decodetcal.c
	gcc -Wall -g -o decodetcal decodetcal.c

clean: 
	rm -f *.o *.class *~ \#*\# core* $(HEADERS_OK_FILE) rndpkt tcaltest readwrite dtest \
		domappmode domapptest dtest decodemoni decodetcal decodeeng manyopentest blocktest

install: dh.o readwrite
	@if [ ! -e /dev/dhc0w0dA ]; then make devfiles; fi
	@if [ ! -d $(INSTALL) ]; then mkdir $(INSTALL); fi
	@if [ ! -d $(INSTALL_FPGA) ]; then mkdir $(INSTALL_FPGA); fi
	@if [ ! -d $(INSTALL_DRIVER) ]; then mkdir $(INSTALL_DRIVER); fi
	@if [ ! -d $(INSTALL_CONF) ]; then mkdir $(INSTALL_CONF); fi
	@if [ ! -f $(INSTALL_CONF)/default_fpga_page ]; \
		then echo 0 > $(INSTALL_CONF)/default_fpga_page; fi
	install dh.o $(INSTALL_DRIVER)
	install readwrite $(INSTALL_BIN)
	install on $(INSTALL_BIN)
	install off $(INSTALL_BIN)
	install fvers.pl $(INSTALL_BIN)
	install driverstatus.pl $(INSTALL_BIN)
	install -m 0644 driverstatus.xinetd $(XINETD_DIR)/driverstatus
	install softboot $(INSTALL_BIN)
	install echomode.pl $(INSTALL_BIN)
	install clock $(INSTALL_BIN)
	install icebootmode.pl $(INSTALL_BIN)
	install showtemp $(INSTALL_BIN)
	install showcomms $(INSTALL_BIN)
	install domappmode $(INSTALL_BIN)
	install domapptest $(INSTALL_BIN)
	install blocktest $(INSTALL_BIN)
	install manyopentest $(INSTALL_BIN)
	install decodemoni $(INSTALL_BIN)
	install decodetcal $(INSTALL_BIN)
	install decodeeng  $(INSTALL_BIN)
	install upload_domapp.pl $(INSTALL_BIN)
	install anabench $(INSTALL_BIN)
	install dtest $(INSTALL_BIN)
	install tcaltest $(INSTALL_BIN)
	install fpga.pl $(INSTALL_BIN)
	install se.pl $(INSTALL_BIN)
	install sb.pl $(INSTALL_BIN)
	install stagedtests.pl $(INSTALL_BIN)
	install newpkttest.pl $(INSTALL_BIN)
	install moat $(INSTALL_BIN)
	install simgps $(INSTALL_BIN)
	install dortimer $(INSTALL_BIN)
	pushd domhub-tools && make install && popd
	ln -f -s $(INSTALL_BIN)/fpga.pl $(INSTALL_BIN)/fpga
	@if [ ! -e $(FIRMWARE_CVS)/$(LATEST_FIRMWARE) ];\
		then echo "Firmware version not found: " $(FIRMWARE_CVS)/$(LATEST_FIRMWARE);\
		exit 1; \
	fi
	install $(FIRMWARE_CVS)/$(LATEST_FIRMWARE) $(INSTALL_FPGA)
	if [  -e $(FIRMWARE_CVS)/$(TEST_FIRMWARE) ];\
		then install $(FIRMWARE_CVS)/$(TEST_FIRMWARE) $(INSTALL_FPGA);\
	fi
	if [  -e $(FIRMWARE_CVS)/$(ICETOP_FIRMWARE) ];\
		then install $(FIRMWARE_CVS)/$(ICETOP_FIRMWARE) $(INSTALL_FPGA);\
	fi

	install $(FIRMWARE_CVS)/$(NODSB_FIRMWARE) $(INSTALL_FPGA)
	ln -f -s $(INSTALL_FPGA)/$(LATEST_FIRMWARE) $(INSTALL_FPGA)/dor-current.rbf
	ln -f -s $(INSTALL_FPGA)/$(NODSB_FIRMWARE) $(INSTALL_FPGA)/dor-current-nodsb.rbf
	install dhrc $(INSTALL_RC)


# The following installs the latest firmware on DOR card page 1
# Skip this step if you do not want to overwrite page 1 on your
# DOR cards, or if you do not wish to automatically load page 1
# when your DOM Hub boots:
installfw:
	./installfirmware.pl $(INSTALL_FPGA)/$(LATEST_FIRMWARE) 1

installnodsb:
	./installfirmware.pl $(INSTALL_FPGA)/$(NODSB_FIRMWARE) 1

chkconfig:
	/sbin/chkconfig --level 2345 dhrc on
	/sbin/chkconfig --list | grep dhrc

devfiles:
	rm -f /dev/dhc?w?d?
	rm -f /dev/simc?w?d?
	touch /tmp/devfiles
	chmod 0600 /tmp/devfiles
	perl ./make_domhub_device_files.pl > /tmp/devfiles
	sh /tmp/devfiles
	rm /tmp/devfiles

tar:
	rm -rf /tmp/$(TMP_SRC_DIR)
	mkdir /tmp/$(TMP_SRC_DIR)
	rm -f /tmp/$(TARFILENAME)
	cp -Rp ../../dor-driver/* /tmp/$(TMP_SRC_DIR)
	cd /tmp && tar czf /tmp/$(TARFILENAME) $(TMP_SRC_DIR)
	mv /tmp/$(TARFILENAME) .

install-tar:
	@if [ ! -f $(TARFILENAME) ] ; then make tar; fi
	cp $(TARFILENAME) $(RPMSRC)

rpm: 
	make KERNELVER=$(KERNELVER) tar
	make KERNELVER=$(KERNELVER) install-tar
	echo "Kernelver is "$(KERNELVER)
	cp $(SPECSOURCE) $(SPECFILE)
	rpmbuild -bb \
	  -D "KERNELVER $(KERNELVER)" \
	  -D "VER_FROM_MAKE $(VERSION) " \
	  -D "REL_FROM_MAKE $(RELEASE) " \
		$(SPECFILE) \
		&& cp $(RPMDIR)/$(PACKAGENAME)-$(VERSION)-$(RELEASE).i386.rpm \
	             ./$(PACKAGENAME)-$(VERSION)-$(RELEASE)_kernel-$(KERNELVER).i386.rpm

uninstall:
	/bin/rm -rf $(INSTALL_FPGA) $(INSTALL_DRIVER) $(INSTALL_CONF)
	@if [ -d $(INSTALL) ]; then rmdir $(INSTALL); fi
	@if [ -f $(INSTALL_RC)/dhrc ]; then \
		/sbin/chkconfig --level 0123456 dhrc off; \
		/sbin/chkconfig --list | grep dhrc; \
	fi
	/bin/rm -f $(INSTALL_RC)/dhrc
	/bin/rm -f $(XINETD_DIR)/driverstatus

	/bin/rm -f /dev/dhc*w?d?
	/bin/rm -f /dev/simc*w?d?

