#include "stdafx.h"
#include <windows.h>
#include <commctrl.h>
#include <iostream>

#include "gpio.h"
#include "gpioRegisters.h"
#include "iomux.h"

using namespace std;

void GPIO::InitializeGPIO(void)
{
	unsigned int uiTemp;

	//GM Get the default values before we play with anything
	DEBUGMSG(1, (_T("Initial GPIO Register Values\n")));
	uiTemp = regRead(IOMUX::GPR);
	DEBUGMSG(1, (_T("Initial GPR		= 0x%8x\n"), uiTemp));
	uiTemp = regRead(gpio1::DR);
	DEBUGMSG(1, (_T("Initial DR		= 0x%8x\n"), uiTemp));
	uiTemp = regRead(gpio1::GDIR);
	DEBUGMSG(1, (_T("Initial GDIR	= 0x%8x\n"), uiTemp));
	uiTemp = regRead(gpio1::PSR);
	DEBUGMSG(1, (_T("Initial PSR		= 0x%8x\n"), uiTemp));
	uiTemp = regRead(gpio1::ICR1);
	DEBUGMSG(1, (_T("Initial ICR1	= 0x%8x\n"), uiTemp));
	uiTemp = regRead(gpio1::ICR2);
	DEBUGMSG(1, (_T("Initial ICR2	= 0x%8x\n"), uiTemp));
	uiTemp = regRead(gpio1::IMR);
	DEBUGMSG(1, (_T("Initial IMR		= 0x%8x\n"), uiTemp));
	uiTemp = regRead(gpio1::ISR);
	DEBUGMSG(1, (_T("Initial ISR		= 0x%8x\n"), uiTemp));
	uiTemp = regRead(IOMUX::GPIO1Mux_gpio1_0_gpio1_1_gpio1_2_gpio1_3);
	DEBUGMSG(1, (_T("\nInitial GPIO1Mux_gpio1_0_gpio1_1_gpio1_2_gpio1_3	= 0x%8x\n"), uiTemp));
	uiTemp = regRead(IOMUX::GPIO1Mux_usb_pwr_usb_oc_usb_byp_usbotg_clk);
	DEBUGMSG(1, (_T("Initial GPIO1Mux_usb_pwr_usb_oc_usb_byp_usbotg_clk	= 0x%8x\n"), uiTemp));
	uiTemp = regRead(IOMUX::GPIO1Pad_gpio1_2_gpio1_3_gpio1_4);
	DEBUGMSG(1, (_T("Initial GPIO1Pad_gpio1_2_gpio1_3_gpio1_4			= 0x%8x\n"), uiTemp));
	uiTemp = regRead(IOMUX::GPIO1Pad_usb_pwr_usb_oc_usb_byp);
	DEBUGMSG(1, (_T("Initial GPIO1Pad_usb_pwr_usb_oc_usb_byp				= 0x%8x\n"), uiTemp));
	uiTemp = regRead(IOMUX::GPIO1Pad_pwmo_gpio1_0_gpio1_1);
	DEBUGMSG(1, (_T("Initial GPIO1Pad_pwmo_gpio1_0_gpio1_1				= 0x%8x\n"), uiTemp));
	uiTemp = regRead(IOMUX::GPIO1Pad_capture_compare_watchdog_rst);
	DEBUGMSG(1, (_T("Initial GPIO1Pad_capture_compare_watchdog_rst		= 0x%8x\n"), uiTemp));

	//GM Setup the IOMUXC
	bitWrite(IOMUX::GPIO1Mux_gpio1_0_gpio1_1_gpio1_2_gpio1_3, IOMUX::SIGNAL_3_OUTPUT, IOMUX::GPIO);
	bitWrite(IOMUX::GPIO1Mux_gpio1_0_gpio1_1_gpio1_2_gpio1_3, IOMUX::SIGNAL_3_INPUT,  IOMUX::NO_INPUTS_SELECTED);

	// Disable GPIO_0 interrupts
	bitWrite(gpio1::IMR, gpio1::GPIO3, 0);

	// Set GPIO_0 as output
	bitWrite(gpio1::GDIR, gpio1::GPIO0, 1);

	uiTemp = regRead(gpio1::IMR);
	DEBUGMSG(1, (_T("New IMR  = 0x%8x\n"), uiTemp));
	uiTemp = regRead(gpio1::GDIR);
	DEBUGMSG(1, (_T("New GDIR = 0x%8x\n"), uiTemp));

	uiTemp = regRead(IOMUX::GPIO1Mux_gpio1_0_gpio1_1_gpio1_2_gpio1_3);
	DEBUGMSG(1, (_T("New GPIO1Mux_gpio1_0_gpio1_1_gpio1_2_gpio1_3   = 0x%8x\n"), uiTemp));
}

void GPIO::SetGPIO( unsigned int bits )
{
	bitWrite(gpio1::DR, bits, 1);	
}

void GPIO::ClearGPIO( unsigned int bits )
{
	bitWrite(gpio1::DR, bits, 0);	
}		

