⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xllp_gpio.c

📁 Windows CE 6.0 BSP for VOIP sample phone. Intel PXA270 platform.
💻 C
📖 第 1 页 / 共 2 页
字号:
 */
XLLP_UINT32_T XllpGpioGetFallingDetectEnable 
     (P_XLLP_GPIO_T pGPIO, XLLP_UINT32_T aGpioPin)
/**
 * Read GFER: 
 * return 1=falling edge detect enable, 0=falling edge detect disable
 */
	{
	XLLP_UINT32_T aGpioPinMask;

	aGpioPinMask = 0x1 << (aGpioPin & 0x1F);

	if(aGpioPin > 95)
		return (pGPIO->GFER3 & aGpioPinMask);
	else if(aGpioPin > 63) 
		return (pGPIO->GFER2 & aGpioPinMask);
	else if(aGpioPin > 31) 
		return (pGPIO->GFER1 & aGpioPinMask);
	else return (pGPIO->GFER0 & aGpioPinMask);
	}

/*
 * aGpioPinArray[]=array of GPIO pins
 * aGpioPinArray[0] = size of array
 * Disable Falling Edge Detect
 */
void XllpGpioSetFallingEdgeDetectDisable 
     (P_XLLP_GPIO_T pGPIO, XLLP_UINT32_T aGpioPinArray[])
	{
	XLLP_UINT32_T LockID;
	XLLP_UINT32_T aGpioPinMask;
	XLLP_UINT32_T aSizeArray;
	XLLP_UINT32_T aMask0, aMask1, aMask2, aMask3;
	XLLP_BOOL_T aSet0, aSet1, aSet2, aSet3;
	XLLP_UINT32_T i;

	//determine size of array
	aSizeArray = aGpioPinArray[0];
	aMask0=aMask1=aMask2=aMask3=0;
	aSet0=aSet1=aSet2=aSet3=XLLP_FALSE;

	for(i=1; i<=aSizeArray; i++)
	{
		aGpioPinMask = 0x1u << (aGpioPinArray[i] & 0x1F);
		if(aGpioPinArray[i] > 95)
		{
			aMask3 |= aGpioPinMask;
			aSet3=XLLP_TRUE;
		}
		else if(aGpioPinArray[i] > 63)
		{
			aMask2 |= aGpioPinMask;
			aSet2=XLLP_TRUE;
		}
		else if(aGpioPinArray[i] > 31)
		{
			aMask1 |= aGpioPinMask;
			aSet1=XLLP_TRUE;
		}
		else
		{
			aMask0 |= aGpioPinMask;
			aSet0=XLLP_TRUE;
		}
	}
	if(aSet3)
	{
		LockID = XllpLock(GFER3);
		pGPIO->GFER3=((pGPIO->GFER3&~aMask3)&~XLLP_GPIO_PIN_RESERVED_BITS);
		XllpUnlock(LockID);
	}
	if(aSet2)
	{
		LockID = XllpLock(GFER2);
		pGPIO->GFER2=((pGPIO->GFER2)&~aMask2);
		XllpUnlock(LockID);
	}
	if(aSet1)
	{
		LockID = XllpLock(GFER1);
		pGPIO->GFER1=((pGPIO->GFER1)&~aMask1);
		XllpUnlock(LockID);
	}
	if(aSet0)
	{
		LockID = XllpLock(GFER0);
		pGPIO->GFER0=((pGPIO->GFER0)&~aMask0);
		XllpUnlock(LockID);
	}
	}

/*
 * aGpioPinArray[]=array of GPIO pins
 * aGpioPinArray[0] = size of array
 * Enable Falling Edge Detect
 */
void XllpGpioSetFallingEdgeDetectEnable 
     (P_XLLP_GPIO_T pGPIO, XLLP_UINT32_T aGpioPinArray[])
	{
	XLLP_UINT32_T LockID;
	XLLP_UINT32_T aGpioPinMask;
	XLLP_UINT32_T aSizeArray;
	XLLP_UINT32_T aMask0, aMask1, aMask2, aMask3;
	XLLP_BOOL_T aSet0, aSet1, aSet2, aSet3;
	XLLP_UINT32_T i;

	//determine size of array
	aSizeArray = aGpioPinArray[0];
	aMask0=aMask1=aMask2=aMask3=0;
	aSet0=aSet1=aSet2=aSet3=XLLP_FALSE;
	
	for(i=1; i<=aSizeArray; i++)
	{
		aGpioPinMask = 0x1u << (aGpioPinArray[i] & 0x1F);
		if(aGpioPinArray[i] > 95)
		{
			aMask3 |= aGpioPinMask;
			aSet3=XLLP_TRUE;
		}
		else if(aGpioPinArray[i] > 63)
		{
			aMask2 |= aGpioPinMask;
			aSet2=XLLP_TRUE;
		}
		else if(aGpioPinArray[i] > 31)
		{
			aMask1 |= aGpioPinMask;
			aSet1=XLLP_TRUE;
		}
		else
		{
			aMask0 |= aGpioPinMask;
			aSet0=XLLP_TRUE;
		}
	}
	if(aSet3)
	{
		LockID = XllpLock(GFER3);
		pGPIO->GFER3=((pGPIO->GFER3|aMask3)&~XLLP_GPIO_PIN_RESERVED_BITS);
		XllpUnlock(LockID);
	}
	if(aSet2)
	{
		LockID = XllpLock(GFER2);
		pGPIO->GFER2=((pGPIO->GFER2)|aMask2);
		XllpUnlock(LockID);
	}
	if(aSet1)
	{
		LockID = XllpLock(GFER1);
		pGPIO->GFER1=((pGPIO->GFER1)|aMask1);
		XllpUnlock(LockID);
	}
	if(aSet0)
	{
		LockID = XllpLock(GFER0);
		pGPIO->GFER0=((pGPIO->GFER0)|aMask0);
		XllpUnlock(LockID);
	}
	}

/*
 * Get the edge-detect status of a Gpio pin.  
 */
XLLP_UINT32_T XllpGpioGetEdgeDetectStatus 
     (P_XLLP_GPIO_T pGPIO, XLLP_UINT32_T aGpioPin)
/**
 * Read edge-detect status (GEDR): 
 * return 1=edge occured, 0=no edge occur
 */
	{
	XLLP_UINT32_T aGpioPinMask;

	aGpioPinMask = 0x1 << (aGpioPin & 0x1F);

	if(aGpioPin > 95)
		return (pGPIO->GEDR3& aGpioPinMask); 
	else if(aGpioPin > 63) 
		return (pGPIO->GEDR2 & aGpioPinMask);
	else if(aGpioPin > 31) 
		return (pGPIO->GEDR1 & aGpioPinMask);
	else return (pGPIO->GEDR0 & aGpioPinMask);
	}

/*
 * aGpioPinArray[]=array of GPIO pins
 * aGpioPinArray[0] = size of array
 * clear edge-detect status bits specified bu aGpioPinArray[]
 */
void XllpGpioClearEdgeDetectStatus 
     (P_XLLP_GPIO_T pGPIO, XLLP_UINT32_T aGpioPinArray[])
	{
	XLLP_UINT32_T aGpioPinMask;
	XLLP_UINT32_T aSizeArray;
	XLLP_UINT32_T aMask0, aMask1, aMask2, aMask3;
	XLLP_BOOL_T aSet0, aSet1, aSet2, aSet3;
	XLLP_UINT32_T i;

	//determine size of array
	aSizeArray = aGpioPinArray[0];
	aMask0=aMask1=aMask2=aMask3=0;
	aSet0=aSet1=aSet2=aSet3=XLLP_FALSE;
	
	for(i=1; i<=aSizeArray; i++)
	{
		aGpioPinMask = 0x1u << (aGpioPinArray[i] & 0x1F);
		if(aGpioPinArray[i] > 95)
		{
			aMask3 |= aGpioPinMask;
			aSet3=XLLP_TRUE;
		}
		else if(aGpioPinArray[i] > 63)
		{
			aMask2 |= aGpioPinMask;
			aSet2=XLLP_TRUE;
		}
		else if(aGpioPinArray[i] > 31)
		{
			aMask1 |= aGpioPinMask;
			aSet1=XLLP_TRUE;
		}
		else
		{
			aMask0 |= aGpioPinMask;
			aSet0=XLLP_TRUE;
		}
	}
	if(aSet3)
		pGPIO->GEDR3= aMask3;
	if(aSet2)
		pGPIO->GEDR2= aMask2;
	if(aSet1)
		pGPIO->GEDR1= aMask1;
	if(aSet0)
		pGPIO->GEDR0= aMask0;
	}

/**
 * Alternative functions
 */

/**
 * Read alternate function value for Gpio pin specified by aGpioPin
 * aGpioPin=0 to 120
 */
XLLP_UINT32_T XllpGpioGetAlternateFn 
     (P_XLLP_GPIO_T pGPIO, XLLP_UINT32_T aGpioPin)
	{
	XLLP_UINT32_T aGpioPinAFMask;

	aGpioPinAFMask = 0x3u << ((aGpioPin & 0xF)*2);

	if (aGpioPin>111)
		return (pGPIO->GAFR3_U & aGpioPinAFMask);
	else if (aGpioPin>95)
		return (pGPIO->GAFR3_L & aGpioPinAFMask);
	else if (aGpioPin>79)
		return (pGPIO->GAFR2_U & aGpioPinAFMask);
	else if (aGpioPin>63)
		return (pGPIO->GAFR2_L & aGpioPinAFMask);
	else if (aGpioPin>47)
		return (pGPIO->GAFR1_U & aGpioPinAFMask);
	else if (aGpioPin>31)
		return (pGPIO->GAFR1_L & aGpioPinAFMask);
	else if (aGpioPin>15)
		return (pGPIO->GAFR0_U & aGpioPinAFMask);
	else return (pGPIO->GAFR0_L & aGpioPinAFMask);
	}
/*
 * aGpioPinArray[]=array of GPIO pins
 * aGpioPinArray[0] = size of array
 *
 * aAfValueArray[]=array of GPIO pins alternate function values
 * aAfValueArray[0] = size of array
 *
 * Set GPIO pins alternate function values
 *
 * IMPORTANT:THE ORDER OF aAfValueArray[] HAS TO MATCH THE ORDER OF aGpioPinArray[] 
 */
void XllpGpioSetAlternateFn
     (P_XLLP_GPIO_T pGPIO, XLLP_UINT32_T aGpioPinArray[], XLLP_UINT32_T aAfValueArray[])
	{
	XLLP_UINT32_T LockID;
	XLLP_UINT32_T aGpioPinAFMask;
	XLLP_UINT32_T aGpioPinAFValue;
	XLLP_UINT32_T aSizeArray;
	XLLP_UINT32_T aMask0_U, aMask0_L, aMask1_U, aMask1_L; 
	XLLP_UINT32_T aMask2_U, aMask2_L, aMask3_U, aMask3_L;
	XLLP_UINT32_T aAFnV0_U, aAFnV0_L, aAFnV1_U, aAFnV1_L; 
	XLLP_UINT32_T aAFnV2_U, aAFnV2_L, aAFnV3_U, aAFnV3_L;
	XLLP_BOOL_T aSet0_U, aSet0_L, aSet1_U, aSet1_L; 
	XLLP_BOOL_T aSet2_U, aSet2_L, aSet3_U, aSet3_L;
	XLLP_UINT32_T i;

	//determine size of array
	aSizeArray = aGpioPinArray[0];
	aMask0_U=aMask0_L=aMask1_U=aMask1_L=0;
	aMask2_U=aMask2_L=aMask3_U=aMask3_L=0;
	aAFnV0_U=aAFnV0_L=aAFnV1_U=aAFnV1_L=0;
	aAFnV2_U=aAFnV2_L=aAFnV3_U=aAFnV3_L=0;
	aSet0_U=aSet0_L=aSet1_U=aSet1_L=XLLP_FALSE;
	aSet2_U=aSet2_L=aSet3_U=aSet3_L=XLLP_FALSE;

	for(i=1; i<=aSizeArray; i++)
	{
		aGpioPinAFMask = 0x3u << ((aGpioPinArray[i] & 0xF)*2);
		aGpioPinAFValue = aAfValueArray[i] << ((aGpioPinArray[i] & 0xF)*2);
		if (aGpioPinArray[i]>111)
		{
			aAFnV3_U |= aGpioPinAFValue;
			aMask3_U |= aGpioPinAFMask;
			aSet3_U=XLLP_TRUE;
		}
		else if (aGpioPinArray[i]>95)
		{
			aAFnV3_L |= aGpioPinAFValue;
			aMask3_L |= aGpioPinAFMask;
			aSet3_L=XLLP_TRUE;
		}
		else if (aGpioPinArray[i]>79)
		{
			aAFnV2_U |= aGpioPinAFValue;
			aMask2_U |= aGpioPinAFMask;
			aSet2_U=XLLP_TRUE;
		}
		else if (aGpioPinArray[i]>63)
		{
			aAFnV2_L |= aGpioPinAFValue;
			aMask2_L |= aGpioPinAFMask;
			aSet2_L=XLLP_TRUE;
		}
		else if (aGpioPinArray[i]>47)
		{
			aAFnV1_U |= aGpioPinAFValue;
			aMask1_U |= aGpioPinAFMask;
			aSet1_U=XLLP_TRUE;
		}
		else if (aGpioPinArray[i]>31)
		{
			aAFnV1_L |= aGpioPinAFValue;
			aMask1_L |= aGpioPinAFMask;
			aSet1_L=XLLP_TRUE;
		}
		else if (aGpioPinArray[i]>15)
		{
			aAFnV0_U |= aGpioPinAFValue;
			aMask0_U |= aGpioPinAFMask;
			aSet0_U=XLLP_TRUE;
		}
		else 
		{
			aAFnV0_L |= aGpioPinAFValue;
			aMask0_L |= aGpioPinAFMask;
			aSet0_L=XLLP_TRUE;
		}
	}
	if(aSet3_U)
	{
		LockID = XllpLock(GAFR3_U);
		pGPIO->GAFR3_U=(((pGPIO->GAFR3_U&~aMask3_U)|aAFnV3_U)&~XLLP_GPIO_ALT_RESERVED_BITS);
		XllpUnlock(LockID);
	}
	if(aSet3_L)
	{
		LockID = XllpLock(GAFR3_L);
		pGPIO->GAFR3_L=((pGPIO->GAFR3_L&~aMask3_L)|aAFnV3_L);
		XllpUnlock(LockID);
	}
	if(aSet2_U)
	{
		LockID = XllpLock(GAFR2_U);
		pGPIO->GAFR2_U=((pGPIO->GAFR2_U&~aMask2_U)|aAFnV2_U);
		XllpUnlock(LockID);
	}
	if(aSet2_L)
	{
		LockID = XllpLock(GAFR2_L);
		pGPIO->GAFR2_L=((pGPIO->GAFR2_L&~aMask2_L)|aAFnV2_L);
		XllpUnlock(LockID);
	}
	if(aSet1_U)
	{
		LockID = XllpLock(GAFR1_U);
		pGPIO->GAFR1_U=((pGPIO->GAFR1_U&~aMask1_U)|aAFnV1_U);
		XllpUnlock(LockID);
	}
	if(aSet1_L)
	{
		LockID = XllpLock(GAFR1_L);
		pGPIO->GAFR1_L=((pGPIO->GAFR1_L&~aMask1_L)|aAFnV1_L);
		XllpUnlock(LockID);
	}
	if(aSet0_U)
	{
		LockID = XllpLock(GAFR0_U);
		pGPIO->GAFR0_U=((pGPIO->GAFR0_U&~aMask0_U)|aAFnV0_U);
		XllpUnlock(LockID);
	}
	if(aSet0_L)
	{
		LockID = XllpLock(GAFR0_L);
		pGPIO->GAFR0_L=((pGPIO->GAFR0_L&~aMask0_L)|aAFnV0_L);
		XllpUnlock(LockID);
	}
	}

/*
 * aGpioPinArray[]=array of GPIO pins
 * aGpioPinArray[0] = size of array
 *
 * Clear GPIO pin alternate function value
 */
void XllpGpioClearAlternateFn
     (P_XLLP_GPIO_T pGPIO, XLLP_UINT32_T aGpioPinArray[])
	{
	XLLP_UINT32_T LockID;
	XLLP_UINT32_T aGpioPinAFMask;
	XLLP_UINT32_T aSizeArray;
	XLLP_UINT32_T aMask0_U, aMask0_L, aMask1_U, aMask1_L; 
	XLLP_UINT32_T aMask2_U, aMask2_L, aMask3_U, aMask3_L;
	XLLP_BOOL_T aSet0_U, aSet0_L, aSet1_U, aSet1_L; 
	XLLP_BOOL_T aSet2_U, aSet2_L, aSet3_U, aSet3_L;
	XLLP_UINT32_T i;

	//determine size of array
	aSizeArray = aGpioPinArray[0];
	aMask0_U=aMask0_L=aMask1_U=aMask1_L=0;
	aMask2_U=aMask2_L=aMask3_U=aMask3_L=0;
	aSet0_U=aSet0_L=aSet1_U=aSet1_L=XLLP_FALSE;
	aSet2_U=aSet2_L=aSet3_U=aSet3_L=XLLP_FALSE;

	for(i=1; i<=aSizeArray; i++)
	{
		aGpioPinAFMask = 0x3u << ((aGpioPinArray[i] & 0xF)*2);
		if (aGpioPinArray[i]>111)
		{
			aMask3_U |= aGpioPinAFMask;
			aSet3_U=XLLP_TRUE;
		}
		else if (aGpioPinArray[i]>95)
		{
			aMask3_L |= aGpioPinAFMask;
			aSet3_L=XLLP_TRUE;
		}
		else if (aGpioPinArray[i]>79)
		{
			aMask2_U |= aGpioPinAFMask;
			aSet2_U=XLLP_TRUE;
		}
		else if (aGpioPinArray[i]>63)
		{
			aMask2_L |= aGpioPinAFMask;
			aSet2_L=XLLP_TRUE;
		}
		else if (aGpioPinArray[i]>47)
		{
			aMask1_U |= aGpioPinAFMask;
			aSet1_U=XLLP_TRUE;
		}
		else if (aGpioPinArray[i]>31)
		{
			aMask1_L |= aGpioPinAFMask;
			aSet1_L=XLLP_TRUE;
		}
		else if (aGpioPinArray[i]>15)
		{
			aMask0_U |= aGpioPinAFMask;
			aSet0_U=XLLP_TRUE;
		}
		else
		{
			aMask0_L |= aGpioPinAFMask;
			aSet0_L=XLLP_TRUE;
		}
	}
	if(aSet3_U)
	{
		LockID = XllpLock(GAFR3_U);
		pGPIO->GAFR3_U=((pGPIO->GAFR3_U&~aMask3_U)&~XLLP_GPIO_ALT_RESERVED_BITS);
		XllpUnlock(LockID);
	}
	if(aSet3_L)
	{
		LockID = XllpLock(GAFR3_L);
		pGPIO->GAFR3_L=(pGPIO->GAFR3_L&~aMask3_L);
		XllpUnlock(LockID);
	}
	if(aSet2_U)
	{
		LockID = XllpLock(GAFR2_U);
		pGPIO->GAFR2_U=(pGPIO->GAFR2_U&~aMask2_U);
		XllpUnlock(LockID);
	}
	if(aSet2_L)
	{
		LockID = XllpLock(GAFR2_L);
		pGPIO->GAFR2_L=(pGPIO->GAFR2_L&~aMask2_L);
		XllpUnlock(LockID);
	}
	if(aSet1_U)
	{
		LockID = XllpLock(GAFR1_U);
		pGPIO->GAFR1_U=(pGPIO->GAFR1_U&~aMask1_U);
		XllpUnlock(LockID);
	}
	if(aSet1_L)
	{
		LockID = XllpLock(GAFR1_L);
		pGPIO->GAFR1_L=(pGPIO->GAFR1_L&~aMask1_L);
		XllpUnlock(LockID);
	}
	if(aSet0_U)
	{
		LockID = XllpLock(GAFR0_U);
		pGPIO->GAFR0_U=(pGPIO->GAFR0_U&~aMask0_U);
		XllpUnlock(LockID);
	}
	if(aSet0_L)
	{
		LockID = XllpLock(GAFR0_L);
		pGPIO->GAFR0_L=(pGPIO->GAFR0_L&~aMask0_L);
		XllpUnlock(LockID);
	}
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -