/**
  *****************************************************************************
  * 						AXI_GPIOؿ⣨ACZ702壩
  *****************************************************************************
  *
  * @File   : AXI_GPIO.c
  * @By     : Sun
  * @Version: V1.3
  * @Date   : 2021 / 12 / 23
  * @Shop	: https://xiaomeige.taobao.com/
  *
  *****************************************************************************
**/

#include "AXI_GPIO.h"

//AXI GPIO
XGpio AXI_GPIO0;

/*****************************************************************************
**  @brief	ʼAXI_GPIO
**  @param	InstPtr		GPIOʵָ
**  @param	DeviceId	GPIO豸ID
**	Sample:	AXI_GPIO_Init(&AXI_GPIO0,GPIO_0_ID);	//ʼAXI GPIO0
*****************************************************************************/
void AXI_GPIO_Init(XGpio *InstPtr, uint16_t DeviceId)
{
	XGpio_Initialize(InstPtr, DeviceId);
}

/**
  *****************************************************
  * @brief	ʼAXI_GPIOж
  * @param	InstPtr		AXI_GPIOָ
  * @param	IntrId		жID
  * @param	Mask		ͨ
  * 					XGPIO_IR_CH1_MASK -> ͨ1
  * 					XGPIO_IR_CH2_MASK -> ͨ2
  * 					XGPIO_IR_MASK -> ͨ1ͨ2
  * @param	Handler		жϷ
  * @usage	//AXI_GPIOжϳʼ,ֻͨ1жϣжϷΪAXI_GPIO_IRQ_Handler
  * 		AXI_GPIO_Intc_Init(&AXI_GPIO0,XPAR_FABRIC_AXI_GPIO_0_IP2INTC_IRPT_INTR,
  * 				XGPIO_IR_CH1_MASK,AXI_GPIO_IRQ_Handler);
  *****************************************************
**/
void AXI_GPIO_Intc_Init(XGpio *InstPtr,uint16_t IntrId, uint32_t Mask,
		Xil_InterruptHandler Handler)
{
	Set_ScuGic_Link(IntrId, 0xA0, HIGH_Level_Sensitive,
			Handler, (void *)InstPtr);

	//GPIOͨжϣGPIO豸ж
	XGpio_InterruptEnable(InstPtr, Mask);
	XGpio_InterruptGlobalEnable(InstPtr);
}

/*****************************************************************************
**  @brief	޸AXI GPIOĳͨĳPINģʽ
**  @param	InstPtr		GPIOʵָ
**  @param	Channel		GPIOͨ12
**  @param	GPIO_Num	GPIOűţ0~31
**  @param	Dir			/OUTPUT(0)ΪINPUT(1)Ϊ
**  Sample:	//Gpio0ͨ1ĵ0Ŷ˿Ϊģʽ
**  		AXI_GPIO_SetPin_Dir(&AXI_GPIO0, XGPIO_IR_CH1_MASK, 0, OUTPUT);
*****************************************************************************/
void AXI_GPIO_SetPin_Dir(XGpio *InstPtr, uint8_t Channel, uint8_t GPIO_Num, uint8_t Dir)
{
	uint32_t Mode;
	Mode = XGpio_GetDataDirection(InstPtr, Channel);
	if(Dir == INPUT)
		Mode = Mode | (1 << GPIO_Num);//ѶӦPinλΪ1
	else if(Dir == OUTPUT)
		Mode = Mode & (~(1 << GPIO_Num));//ѶӦPinλΪ0
	XGpio_SetDataDirection(InstPtr, Channel, Mode);
}

/*****************************************************************************
**  @brief	ضGPIO/͵ƽ,ʹǰøGPIOΪ""ģʽ
**  @param	InstPtr		GPIOʵָ
**  @param	Channel		GPIOͨ12
**  @param	GPIO_Num	GPIOŵıţ0~31
**  @param	Data		ƽߵͣ0Ϊͣ1Ϊ
**  Sample:	//GPIO0ͨ11Žߵƽ
**  		AXI_GPIO_SetPort(&AXI_GPIO0, XGPIO_IR_CH1_MASK, 1, 1);
*****************************************************************************/
void AXI_GPIO_SetPin(XGpio *InstPtr, uint8_t Channel, uint8_t GPIO_Num, uint32_t Data)
{
	if(Data)
		XGpio_DiscreteSet(InstPtr,Channel,1 << GPIO_Num);
	else
		XGpio_DiscreteClear(InstPtr,Channel,1 << GPIO_Num);
}
/*****************************************************************************
**  @brief	ȡضGPIOڵƽ,ʹǰøGPIOΪ""ģʽ
**  @param	InstPtr		GPIOʵָ
**  @param	Channel		GPIOͨ12
**  @param	GPIO_Num	GPIOűţ0ʼ
**  @return زɼGPIOƽֵ0Ϊͣ1Ϊ
**  Sample:	//ɼGPIO0ͨ11Žŵĵƽstate
**  		state = AXI_GPIO_GetPort(&Gpio0, XGPIO_IR_CH1_MASK, 1);
*****************************************************************************/
uint8_t AXI_GPIO_GetPin(XGpio *InstPtr, uint8_t Channel, uint8_t GPIO_Num)
{
	uint32_t State;
	State = XGpio_DiscreteRead(InstPtr,Channel);
	State = (State >> GPIO_Num) & 0x1;
	return State;
}

/*****************************************************************************
**  @brief	趨AXI GPIOĳͨģʽ״̬
**  @param	InstPtr		GPIOʵָ
**  @param	Channel		GPIOͨ12
**  @param	Dir			/0Ϊ1Ϊ룬ÿһλʾһ
**  @param	Data		ƽߵͣ0Ϊͣ1Ϊߣÿһλʾһ
**  Sample:	//Gpio0ͨ1ȫΪģʽȫΪ͵ƽ
**  		AXI_GPIO_Set_Channel(&AXI_GPIO0, XGPIO_IR_CH1_MASK, 0, 0);
*****************************************************************************/
void AXI_GPIO_Set_Channel(XGpio *InstPtr, uint8_t Channel, uint32_t Dri, uint32_t Data)
{
	XGpio_SetDataDirection(InstPtr, Channel, Dri);
	XGpio_DiscreteWrite(InstPtr, Channel, Data);
}
