# Makefile for DOR driver dh.o and control scripts
# John Jacobsen, jacobsen@npxdesigns.com
# $Id: Makefile,v 1.136 2005/10/10 21:20:43 jacobsen Exp $

ifndef  KERNELVER
	KERNELVER = `uname -r`
endif

VERSION         = `cat version.h | awk '{print $3}' | sed -e 's,\",,g'`
RELEASE         = 1
REV1_FIRMWARE   = com_103g.rbf           #<- KEEP FIRMWARE UPDATED!
REV0_FIRMWARE   = dor_011q.rbf           #<- KEEP FIRMWARE UPDATED!
NODSB_REV0_FW   = dor_020v.rbf           #<- non-DSB DOR rev 0 version
REV1_PCI_FW     = pci_009.rbf            #<- KEEP FIRMWARE UPDATED!

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

# 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
LINUXREV         = $(shell uname -r)
INCLUDEDIR       = /lib/modules/$(LINUXREV)/build/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 

$(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

clean: 
	rm -f *.o *~ \#*\# core* $(HEADERS_OK_FILE)

install:
	@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 on $(INSTALL_BIN)
	install off $(INSTALL_BIN)
	install fvers.pl $(INSTALL_BIN)
	install clock $(INSTALL_BIN)
	install showcomms $(INSTALL_BIN)
	install decodefpga.pl $(INSTALL_BIN)
	install load_dor_params.pl $(INSTALL_BIN)
	install set_dor_params.pl $(INSTALL_BIN)
	install -m 666 dor_params.conf $(INSTALL_CONF)
	install anabench $(INSTALL_BIN)
	install fpga.pl $(INSTALL_BIN)
	ln -f -s $(INSTALL_BIN)/fpga.pl $(INSTALL_BIN)/fpga
	install $(FIRMWARE_CVS)/$(REV0_FIRMWARE) $(INSTALL_FPGA)
	install $(FIRMWARE_CVS)/$(REV1_FIRMWARE) $(INSTALL_FPGA)
	install $(FIRMWARE_CVS)/$(NODSB_REV0_FW) $(INSTALL_FPGA)
	install $(FIRMWARE_CVS)/$(REV1_PCI_FW)   $(INSTALL_FPGA)

	ln -f -s $(INSTALL_FPGA)/$(REV0_FIRMWARE) $(INSTALL_FPGA)/dor-current-rev0.rbf
	ln -f -s $(INSTALL_FPGA)/$(REV1_FIRMWARE) $(INSTALL_FPGA)/dor-current-rev1.rbf
	ln -f -s $(INSTALL_FPGA)/$(NODSB_REV0_FW) $(INSTALL_FPGA)/dor-current-rev0-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 -rev0 $(INSTALL_FPGA)/$(REV0_FIRMWARE) \
	                     -rev1 $(INSTALL_FPGA)/$(REV1_FIRMWARE) -page 1
	./configure_clock.pl external

installnodsb:
	./installfirmware.pl -rev0 $(INSTALL_FPGA)/$(NODSB_REV0_FW) \
	                     -rev1 $(INSTALL_FPGA)/$(REV1_FIRMWARE) -page 1
	./configure_clock.pl internal

# Only do this if you know what you're doing (parm_unlock_pages):
installpci:
	./installfirmware.pl -pci $(INSTALL_FPGA)/$(REV1_PCI_FW) -page 3

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

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 /dev/dhc*w?d?
	/bin/rm -f /dev/simc*w?d?

