/*
 * main.c
 *
 *  Created on: 2022915
 *      Author: Administrator
 */


#include <stdio.h>
#include "xgpio.h"
#include "xgpiops.h"
#include "xscugic.h"
#include "xparameters_ps.h"
#include "unistd.h"

XGpio Gpio;
XGpioPs GpioPS;
XScuGic Intc;

static volatile u32 IntrFlag; /* Interrupt Handler Flag */

void GpioHandler(void *CallbackRef)
{
	XGpio *GpioPtr = (XGpio *)CallbackRef;

	IntrFlag ++;

	/* Clear the Interrupt */
	XGpio_InterruptClear(GpioPtr, 0x2);
}

int main(void)
{

	//ʼAXI GPIO
	XGpio_Config *ConfigPtr;

	ConfigPtr = XGpio_LookupConfig(XPAR_AXI_GPIO_0_DEVICE_ID);
	XGpio_CfgInitialize(&Gpio, ConfigPtr,  ConfigPtr->BaseAddress);

	XGpio_SetDataDirection(&Gpio, 1, 0);
	XGpio_SetDataDirection(&Gpio, 2, 1);


	XGpioPs_Config *GpioPSConfigPtr;

	GpioPSConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
	XGpioPs_CfgInitialize(&GpioPS, GpioPSConfigPtr,  GpioPSConfigPtr->BaseAddr);

	//ʼSCUGIC
	XScuGic_Config *IntcConfig;

	IntcConfig = XScuGic_LookupConfig(XPAR_SCUGIC_SINGLE_DEVICE_ID);
	XScuGic_CfgInitialize(&Intc, IntcConfig, IntcConfig->CpuBaseAddress);

	//ע쳣
	Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
						(Xil_ExceptionHandler)XScuGic_InterruptHandler,
						&Intc);

	//עжϴ
	XScuGic_Connect(&Intc, XPAR_FABRIC_AXI_GPIO_0_IP2INTC_IRPT_INTR,
					 (Xil_ExceptionHandler)GpioHandler, &Gpio);

	//жȼжź
	XScuGic_SetPriorityTriggerType(&Intc, XPAR_FABRIC_AXI_GPIO_1_IP2INTC_IRPT_INTR, 0xA0, 0x3);

	//SCUGICʹܶӦж
	XScuGic_Enable(&Intc, XPAR_FABRIC_AXI_GPIO_1_IP2INTC_IRPT_INTR);

	//ھʹжźŲ
	XGpio_InterruptEnable(&Gpio, 0x2);
	XGpio_InterruptGlobalEnable(&Gpio);

	//ж
	Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);

	XGpioPs_SetDirectionPin(&GpioPS, 7, 1);
	XGpioPs_SetOutputEnablePin(&GpioPS, 7, 1);
	XGpioPs_WritePin(&GpioPS, 7, 0x0);

	while(1)
	{
		if(IntrFlag > 0)
		{
			IntrFlag--;
			XGpio_DiscreteWrite(&Gpio, 1, 0x1);
			usleep(500000);
			XGpio_DiscreteWrite(&Gpio, 1, 0x0);
			usleep(500000);
		}
		else
		{
			XGpioPs_WritePin(&GpioPS, 7, 0x1);
			usleep(50000);
			XGpioPs_WritePin(&GpioPS, 7, 0x0);
			usleep(50000);
		}
	}
}
