#include<unistd.h>
#include<sys/types.h>
#include<sys/mman.h>
#include<stdio.h>
#include<fcntl.h>
#include<string.h>

#define TSSTATUS 0x10800000
#define TSJP6 0x22800000

// Queries jumper setting on TS-7200 and exits with return code according to
// jumper status

int main(int argc, char **argv) {
	off_t page;
	unsigned char *dat;
	unsigned short *dat16;
	unsigned char *start;
	int jp = -1, ret;
	int fd = open("/dev/mem", O_RDWR|O_SYNC);

	if (argc != 2 || strcmp("-h", argv[1]) == 0 || 
	  strcmp("--help", argv[1]) == 0) {
		fprintf(stdout, "Usage: jp [number]\n");
		return 1;
	}

	ret = sscanf(argv[1], "%d", &jp);
	if (ret == 0) {
		fprintf(stderr, "Usage: jp [number]\n");
		return 1;
	}

	if (fd == -1) {
		perror("/dev/mem");
		return 1;
	}

	if (jp != 6) {
 		page = TSSTATUS & 0xfffff000;
		start = mmap(0, getpagesize(), PROT_READ|PROT_WRITE,
		  MAP_SHARED, fd, page);
		dat = (unsigned char *)(start + (TSSTATUS & 0xfff));
		switch (jp) {
			case 2:
				return ((*dat & 0x1) ? 0 : 1);
			case 3:
				return ((*dat & 0x2) ? 0 : 1);
			case 4:
				return ((*dat & 0x8) ? 1 : 0);
			case 5:
				return ((*dat & 0x10) ? 1 : 0);
		}
	} else if (jp == 6) {
 		page = TSJP6 & 0xfffff000;
		start = mmap(0, getpagesize(), PROT_READ|PROT_WRITE, 
		  MAP_SHARED, fd, page);
		dat16 = (unsigned short *)(start + (TSJP6 & 0xfff));
		return ((*dat16 & 0x1) ? 0 : 1);
	} 
	close(fd);
	return 1;
}
