/* Copyright 2013, Unpublished Work of Technologic Systems
 * All Rights Reserved.
 *
 * THIS WORK IS AN UNPUBLISHED WORK AND CONTAINS CONFIDENTIAL,
 * PROPRIETARY AND TRADE SECRET INFORMATION OF TECHNOLOGIC SYSTEMS.
 * ACCESS TO THIS WORK IS RESTRICTED TO (I) TECHNOLOGIC SYSTEMS 
 * EMPLOYEES WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE
 * OF THEIR ASSIGNMENTS AND (II) ENTITIES OTHER THAN TECHNOLOGIC
 * SYSTEMS WHO HAVE ENTERED INTO APPROPRIATE LICENSE AGREEMENTS.  NO
 * PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED, COPIED, 
 * DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED, 
 * EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED, ADAPTED
 * IN ANY FORM OR BY ANY MEANS, MANUAL, MECHANICAL, CHEMICAL, 
 * ELECTRICAL, ELECTRONIC, OPTICAL, BIOLOGICAL, OR OTHERWISE WITHOUT
 * THE PRIOR WRITTEN PERMISSION AND CONSENT OF TECHNOLOGIC SYSTEMS.
 * ANY USE OR EXPLOITATION OF THIS WORK WITHOUT THE PRIOR WRITTEN
 * CONSENT OF TECHNOLOGIC SYSTEMS COULD SUBJECT THE PERPETRATOR TO
 * CRIMINAL AND CIVIL LIABILITY.
 */


/*******************************************************************************
* Program: 
*    wdtfeeder (ts7670_wdtfeederc)
*    Technologic Systems TS-7670 CPU WDT feeder application
* 
* Summary:
*   This program will accept a 32bit time value in milliseconds to feed the 
*     CPU WDT for.  On first run this application will enable the WDT and
*     make the requested feed.  If the WDT is not fed again within that
*     time frame, the system will reboot. 
*
* Compiling on-board:
*   gcc -Wall -o wdtfeeder ts7670_wdtfeeder.c
*
* Cross-compiling:
*   /path/to/cross-compiler/gcc -Wall -o wdtfeeder ts7670_wdtfeeder.c
*
* Usage:
*   ./wdtfeeder val_in_ms
*
* Version history:
*  10/03/2013 - KB
*    Initial rev for /TS-7670
*******************************************************************************/
#include <assert.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

/*******************************************************************************
* Main: accept input from the command line and act accordingly.
*******************************************************************************/
int main(int argc, char **argv)
{
	int devmem = 0;
	volatile unsigned int *wdtctl = NULL;
	unsigned long int val;
         
	// Check for invalid command line arguments
	if(argc != 2) {
		printf("Usage: %s val_in_ms\n", argv[0]);
		return 1;
	}
   
	val = strtoul(argv[1], NULL, 0);

	devmem = open("/dev/mem", O_RDWR|O_SYNC);
	wdtctl = mmap(0, getpagesize(), PROT_READ|PROT_WRITE, MAP_SHARED, devmem, 0x80056000);
	
	/* Enable WDT */
	wdtctl[0x4/4] = 0x10;

	wdtctl[0x50/4] = val;
	
	return 0;
}
