/*******************************************************************************
 *	NiIest		NI PCI-6143 test program
 *			T.Barnaby,	BEAM Ltd,	2006-01-04
 *******************************************************************************
 *
 */
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <math.h>
#include <sys/io.h>
#include <fcntl.h>
#include <termios.h>
#include <sys/time.h>
#include <sys/mman.h>

#define	DEBUG		0

#if DEBUG
#define	dprintf(fmt, a...)       printf(fmt, ##a);
#else
#define	dprintf(fmt, a...)
#endif

#ifndef MAP_NONCACHED
#define MAP_NONCACHED 0x00020000
#endif

typedef int	Bool;

#define	TRUE	1
#define	FALSE	0

struct Dev {
	volatile void*	m1;
	volatile void*	m2;	
};

void hd(volatile void* data, int nbytes){
	int		nw = nbytes / 4;
	unsigned int*	p = (unsigned int*)data;
	int		n;
	
	for(n = 0; n < nw; n++){
		printf("%8.8x ", *p++);
		if((n % 8) == 7)
			printf("\n");
	}
	printf("\n");
}

void test1(Dev& dev){
	unsigned int*	regs = (unsigned int*)dev.m2;
	unsigned char*	regsb = (unsigned char*)dev.m2;
	unsigned int	v;
	unsigned char*	p = (unsigned char*)&v;
	
	hd(dev.m1, 32);
	hd(dev.m2, 32);
	
	printf("Signature: %x\n", regs[0x50/4]);

	v =  regs[0x54/4];
	printf("Revision: %x %d/%d/%d %d:00\n", v, 2000 + p[3], p[2], p[1], p[0]);

	v =  regs[0x58/4];
	printf("OldestRevision: %x %d/%d/%d %d:00\n", v, 2000 + p[3], p[2], p[1], p[0]);

	printf("FifoStatus: %x\n", regs[0x88/4]);
	printf("FifoLevel: %d\n", regs[0x94/4]);
	printf("FifoFlag: %d\n", regs[0x84/4]);
	printf("FifoDmaThreshold: %x\n", regs[0x90/4]);
	printf("FifoData: %x\n", regs[0x8C/4]);
}

int main(int argc, char** argv){
	int		mfd;
	Dev		dev;
	

	if((mfd = open("/dev/mem", O_RDWR)) < 0){
		fprintf(stderr, "Error: unable to open /dev/mem\n");
		exit(1);
	}
	
	dev.m1 = mmap(0, 4 * 1024, PROT_READ | PROT_WRITE, MAP_SHARED|MAP_NONCACHED, mfd, 0xec002000);
	dev.m2 = mmap(0, 8 * 1024, PROT_READ | PROT_WRITE, MAP_SHARED|MAP_NONCACHED, mfd, 0xec000000);

	printf("Mem: %p %p\n", dev.m1, dev.m2);

	test1(dev);
	
	return 0;
}
 
