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

📄 gpio.c

📁 OMAP1030 处理器的ARM 侧硬件测试代码 OMAP1030 是TI的双核处理器
💻 C
📖 第 1 页 / 共 2 页
字号:
 ****************************************************************/

void GPIO_SetDataOut_High(Gpio_Num_t gpio_num)
{
	switch(gpio_num/32)
	{
	case 0: /* GPIO group 1 */
			GPIO_SetOutPin(GPIO_MODULE1, gpio_num%32);
			break;
			
		case 1: /* GPIO group 2 */
			GPIO_SetOutPin(GPIO_MODULE2, gpio_num%32);
			break;
		
		default:
			;
	}
	return;
}

/**************************************************************** 
  Function Name:Get_GPIODataIn     
  Description:	Get gpio's input data 	    
  Usage:        gpio_num: 		0 to 63
  				Return value:	Gpio input pin's data
 ****************************************************************/ 
signed char GPIO_GetDataIn(Gpio_Num_t gpio_num)
{
	switch(gpio_num/32)
	{
		case 0: /* GPIO group 1 */
			return GPIO_GetInputPin(GPIO_MODULE1, gpio_num%32);
			
		case 1: /* GPIO group 2 */
			return GPIO_GetInputPin(GPIO_MODULE1, gpio_num%32);
					
		default:
			return -1;
	}
}




/**************************************************************** 
  Function Name:Set_GPIOEdgeCtrl     
  Description:	Set GPIO Edge Control	 	    
  Usage:        gpio_num: 		0 to 63
  				edge_control:	Select edge detection type
  								0 - low level detection
  								1 - high level detection
  								2 - Rising edge detection
  								3 - Falling edge detection
  				Return value:	void
 ****************************************************************/

void GPIO_SetEdgeCtrl(Gpio_Num_t gpio_num, GPIO_Edge_Level_Ctrl_t edge_level_ctrl)
{
	switch(gpio_num/32)
	{
		case 0: /* GPIO group 1 */
		{
			switch(edge_level_ctrl)
			{
				case LOW_LEVEL_DETECT:
				{
					GPIO_SetLevelDetect0Bit(GPIO_MODULE1, gpio_num%32);
					break;
				}
				case HIGH_LEVEL_DETECT:
				{
					GPIO_SetLevelDetect1Bit(GPIO_MODULE1, gpio_num%32);
					break;
				}
				case RISING_EDGE_DETECT:
				{
					GPIO_SetRisingDetectBit(GPIO_MODULE1, gpio_num%32);
					break;
				}
				case FALLING_EDGE_DETECT:
				{
					GPIO_SetFallingDetectBit(GPIO_MODULE1, gpio_num%32);
					break;
				}
				default:
					;
			}	
		}
			
		case 1: /* GPIO group 2 */
			switch(edge_level_ctrl)
			{
				case LOW_LEVEL_DETECT:
				{
					GPIO_SetLevelDetect0Bit(GPIO_MODULE2, gpio_num%32);
					break;
				}
				case HIGH_LEVEL_DETECT:
				{
					GPIO_SetLevelDetect1Bit(GPIO_MODULE2, gpio_num%32);
					break;
				}
				case RISING_EDGE_DETECT:
				{
					GPIO_SetRisingDetectBit(GPIO_MODULE2, gpio_num%32);
					break;
				}
				case FALLING_EDGE_DETECT:
				{
					GPIO_SetFallingDetectBit(GPIO_MODULE2, gpio_num%32);
					break;
				}
				default:
					;
			}
					
		default:
			;
	}		
}



/**************************************************************** 
  Function Name:GPIO_ClearEdgeCtrl     
  Description:	Clear GPIO Edge Control	 	    
  Usage:        gpio_num: 		0 to 63
  				edge_control:	Select edge detection type
  								0 - low level detection
  								1 - high level detection
  								2 - Rising edge detection
  								3 - Falling edge detection
  				Return value:	void
 ****************************************************************/

void GPIO_ClearEdgeCtrl(Gpio_Num_t gpio_num, GPIO_Edge_Level_Ctrl_t edge_level_ctrl)
{
	switch(gpio_num/32)
	{
		case 0: /* GPIO group 1 */
		{
			switch(edge_level_ctrl)
			{
				case LOW_LEVEL_DETECT:
				{
					GPIO_ClearLevelDetect0Bit(GPIO_MODULE1, gpio_num%32);
					break;
				}
				case HIGH_LEVEL_DETECT:
				{
					GPIO_ClearLevelDetect1Bit(GPIO_MODULE1, gpio_num%32);
					break;
				}
				case RISING_EDGE_DETECT:
				{
					GPIO_ClearRisingDetectBit(GPIO_MODULE1, gpio_num%32);
					break;
				}
				case FALLING_EDGE_DETECT:
				{
					GPIO_ClearFallingDetectBit(GPIO_MODULE1, gpio_num%32);
					break;
				}
				default:
					;
			}	
		}
			
		case 1: /* GPIO group 2 */
			switch(edge_level_ctrl)
			{
				case LOW_LEVEL_DETECT:
				{
					GPIO_ClearLevelDetect0Bit(GPIO_MODULE2, gpio_num%32);
					break;
				}
				case HIGH_LEVEL_DETECT:
				{
					GPIO_ClearLevelDetect1Bit(GPIO_MODULE2, gpio_num%32);
					break;
				}
				case RISING_EDGE_DETECT:
				{
					GPIO_ClearRisingDetectBit(GPIO_MODULE2, gpio_num%32);
					break;
				}
				case FALLING_EDGE_DETECT:
				{
					GPIO_ClearFallingDetectBit(GPIO_MODULE2, gpio_num%32);
					break;
				}
				default:
					;
			}
					
		default:
			;
	}		
}


//-------------------------------------------------------------------------
// NAME        : GPIO_SetOnePinInterruptMask
// DESCRIPTION : Mask or unmask the interrupt generation of one pin
// PARAMETERS  : gpio_num is the specific pin and mask is either it_enable or it_disable
// RETURN VALUE: None
// LIMITATIONS : None
//-------------------------------------------------------------------------
void GPIO_SetOnePinInterruptMask(Gpio_Num_t gpio_num, GPIO_IT_Mask_t mask)
{
    switch (gpio_num/32) 
    {
    	case 0:
		{
    		switch(mask)
			{
				case IT_ENABLE:
				{
					GPIO_SetIrqEnable1Bit(GPIO_MODULE1, gpio_num%32);
					break;
				}
				case IT_DISABLE:
				{
					GPIO_ClearIrqEnable1Bit(GPIO_MODULE1, gpio_num%32);
					break;
				}
				default:
					;
			}    		
	        break;
		}
    	case 1:
		{
        	switch(mask)
			{
				case IT_ENABLE:
				{
					GPIO_SetIrqEnable1Bit(GPIO_MODULE2, gpio_num%32);
					break;
				}
				case IT_DISABLE:
				{
					GPIO_ClearIrqEnable1Bit(GPIO_MODULE2, gpio_num%32);
					break;
				}
				default:
					;
			}    		
	        break;
		}
		default:
			;
    }    
}


//-------------------------------------------------------------------------
// NAME        : GPIOGetInterruptStatus
// DESCRIPTION : Read the interrupt status register
// PARAMETERS  : None
// RETURN VALUE: Interrupt status register value
// LIMITATIONS : None
//-------------------------------------------------------------------------
UWORD16 GPIO_GetInterruptStatus(Gpio_Num_t gpio_num)
{
    switch (gpio_num/32) 
    {
    	case 0:
        	return GPIO_GetIrqStatusPin(GPIO_MODULE1, gpio_num%32);                               
    	case 1:
        	return GPIO_GetIrqStatusPin(GPIO_MODULE2, gpio_num%32);        	    	
    default:
        return 0;
    }
}

/*************************************************************************************
******* func           :  read the gpio interrupt line number
******* return value   :  0~63 gpio number
******* return value   :  =65 indicate no gpio irq 
**************************************************************************************/
UWORD16 GPIO_ReadIRQNum(int module_num)
  {
   	unsigned int temp;
   	unsigned int num;
   	unsigned int gpio_irq_num;
   	int shift_num;
   	int shift_data=0x1;
	switch(module_num)
	{
		case 1:
			temp = GPIO_GetIrqStatus1(GPIO_MODULE1);
			break;
		case 2:
			temp = GPIO_GetIrqStatus1(GPIO_MODULE2);
			break;
		default:
			return 0;
	}
 //   temp=gpio_irqstatus1_reg(module_num);
     	
    for(shift_num=0;shift_num<31;shift_num++)
     	 {
     	    num= (shift_data&temp);
     	    shift_data = (shift_data<<1);
     	    if(num>0) 
     	      {
     	       	gpio_irq_num=shift_num;
     	       	if(module_num==1) return(gpio_irq_num);
     	       	else return(gpio_irq_num+32);
     	      }
     	    //else return 65 ;  
     	    
     	      	
     	  }
    if(num==0)return 65;

   
   }

//-------------------------------------------------------------------------
// NAME        : GPIO_AcknoledgeInterrupt
// DESCRIPTION : Acknoledge one interrupt, query mode
// PARAMETERS  : pin_index is the specific pin
// RETURN VALUE: None
// LIMITATIONS : None
//-------------------------------------------------------------------------
void GPIO_AcknoledgeInterrupt(Gpio_Num_t gpio_num)
{
    switch (gpio_num/32) 
    {
    case 0:
        GPIO_SetIrqStatus1Bit(GPIO_MODULE1, gpio_num%32);
        break;
    case 1:
        GPIO_SetIrqStatus1Bit(GPIO_MODULE2, gpio_num%32);
        break;   
    }
}



//-------------------------------------------------------------------------
// NAME        : GPIO_ConfigureInterruptEnable
// DESCRIPTION : Acknoledge one interrupt, query mode
// PARAMETERS  : pin_index is the specific pin
// RETURN VALUE: None
// LIMITATIONS : None
//-------------------------------------------------------------------------
void GPIO_ConfigureInterruptEnable(Gpio_Num_t gpio_num, GPIO_Edge_Level_Ctrl_t edge_level_ctrl, isrpointer isrHandlerName)
{


	int temp;
	int int_dex;
	if(gpio_num <32)
	{
		int_dex = IRQ1_GPIO1_INT;
		IsrRegister(int_dex, GPIO1_IRQ);
	}
	else if(gpio_num >=32)
	{
		int_dex = IRQ1_GPIO2_INT;
		IsrRegister(int_dex, GPIO2_IRQ);
	}

	GPIOIsrRegister(gpio_num, isrHandlerName);
    GPIO_SetDirection(gpio_num, GPIO_INPUT);
    GPIO_SetEdgeCtrl(gpio_num, edge_level_ctrl);
    GPIO_SetOnePinInterruptMask(gpio_num, IT_ENABLE);
 	GPIO_AcknoledgeInterrupt(gpio_num); 
  //clear interrupt status register.
	EnableNewInterrupt(INTH_IRQ_MODE);
	ConfInterrupt(int_dex, 0,    //0:IRQ, 1:FIQ.
                     1,    ////  0:fall edge, 1:low level.
                     0);

}


unsigned int GPIOIsrRegister( unsigned int inthIndex , isrpointer isrHandlerName )
{
  
 
   if ( (inthIndex < 0) ||( inthIndex > 64) ){
     return INTH_REQ_FAILED ;                                     // errocde is the parameter is error.
	 }

  else{
  
  gpioirq[inthIndex] =  isrHandlerName;                            // fill the arry with the handler function 
                                                                 // function's pointer.
     }
  return INTH_REQ_OK;


}

void GPIO1_IRQ (void)
{

int inthIndex;
 isrpointer isrProcess;
 inthIndex = GPIO_ReadIRQNum(GPIO_MODULE_1);
// inthIndex = gpio_readirq(GPIO_MODULE_1);
 if( (inthIndex >= 32 )||(inthIndex<0) ){
       while( 1 );
    }
  else {
   isrProcess = gpioirq[inthIndex];
   (*isrProcess)();
   }
 GPIO_AcknoledgeInterrupt(inthIndex); 


//*(unsigned int *)0xfffecb18 = 0x00000001;
}
void GPIO2_IRQ (void)
{

int inthIndex;
 isrpointer isrProcess;
 inthIndex = GPIO_ReadIRQNum(GPIO_MODULE_2);
 if( (inthIndex > 64 )||(inthIndex<32) ){
       while( 1 );
    }
  else {
   isrProcess = gpioirq[inthIndex];
   (*isrProcess)();
   }
 GPIO_AcknoledgeInterrupt(inthIndex); 


//*(unsigned int *)0xfffecb18 = 0x00000001;
}

⌨️ 快捷键说明

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