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

📄 uart_vfifo.c

📁 uart全功能实现.实现如下函数: U_Open, U_Close, U_GetBytes, U_PutBytes, U_GetBytesAvail, U_GetTxRoomL
💻 C
📖 第 1 页 / 共 3 页
字号:
	         DRVPDN_Disable(DRVPDN_CON1,DRVPDN_CON1_UART3,PDN_UART3);
	         #endif
	         break;
	#endif   /*__UART3_SUPPORT__*/
	      default:
	         ASSERT(0);
	         break;
	   }
   }
   real_count = DMA_GetVFIFO_Roomleft(ch);
#ifdef VFIFO_DBG
{
	kal_char s[50];
	sprintf(s,"uart_putbytes,len %d,left %d",Length,real_count);
	kal_print(s);
}
#endif

   if (real_count >= Length)
   {
      real_count = Length;
   }
   else
   {
      send_Txilm[port] = KAL_TRUE;
      DMA_EnableINT(ch);
   }
   if(ownerid==MOD_TST_READER)
   {
      for (index = 0; index < real_count; index++)
      {
      	savedMask = SaveAndSetIRQMask();   
      	if(!IS_VFIFO_FULL(ch))
      	{
      		DMA_PUSH(ch,*(Buffaddr+index));
      	}	
      	else
      	{
      	   real_count=index;
      	   send_Txilm[port] = KAL_TRUE;
      	   DMA_EnableINT(ch);      	   
      	   RestoreIRQMask(savedMask);	
      	   break;
      	 }   
          RestoreIRQMask(savedMask);	
      }
   }   
   else/*not TST */
   {
      for (index = 0; index < real_count; index++)
      {
      	DMA_PUSH(ch,*(Buffaddr+index));
      }      
   }      
   /*invoke THRE interrupt*/
   //EnableTxIntr(UART_BaseAddr[port]);
   return real_count;
#else /*DRV_DEBUG*/
   return Length;
#endif /*DRV_DEBUG*/
}
kal_uint16 U_PutISRBytes_VFIFO(UART_PORT port, kal_uint8 *Buffaddr, kal_uint16 Length, module_type ownerid)
{
	kal_uint8 ch = UARTPort[port].Tx_DMA_Ch;
#ifndef DRV_DEBUG
   kal_uint16  real_count,index;
    
	EXT_ASSERT( (UARTPort[port].ownerid == ownerid), (kal_uint32) ownerid, (kal_uint32)port, (kal_uint32)UARTPort[port].ownerid);
   if(UARTPort[port].EnableTX == KAL_FALSE)
   {
   	return Length;
   }
   if (UARTPort[port].sleep_on_tx == uart_sleep_on_tx_forbid)
   {
	   switch(port)
	   {
	      case uart_port1:
	         DRVPDN_Disable(DRVPDN_CON1,DRVPDN_CON1_UART1,PDN_UART1);
	         break;
	      case uart_port2:
	         DRVPDN_Disable(DRVPDN_CON1,DRVPDN_CON1_UART2,PDN_UART2);
	         break;
	#ifdef __UART3_SUPPORT__
	      case uart_port3:
	         #if ( (defined(MT6219))||defined(MT6226M)||(defined(MT6228))|| defined(MT6229)|| (defined(MT6226))|| (defined(MT6227)) )
	         DRVPDN_Disable(DRVPDN_CON1,DRVPDN_CON1_UART3,PDN_UART3);
	         #endif
	         break;
	#endif   /*__UART3_SUPPORT__*/
	      default:
	         ASSERT(0);
	         break;
	   }
   }
   real_count = DMA_GetVFIFO_Roomleft(ch);
#ifdef VFIFO_DBG
{
	kal_char s[50];
	sprintf(s,"uart_putbytes,len %d,left %d",Length,real_count);
	kal_print(s);
}
#endif

   if (real_count >= Length)
   {
      real_count = Length;
   }
   else
   {
      send_Txilm[port] = KAL_TRUE;
      DMA_EnableINT(ch);
   }
   
   for (index = 0; index < real_count; index++)
   {   	
   	DMA_PUSH(ch,*(Buffaddr+index));   		
   }
   /*invoke THRE interrupt*/
   //EnableTxIntr(UART_BaseAddr[port]);
   return real_count;
#else /*DRV_DEBUG*/
   return Length;
#endif /*DRV_DEBUG*/
}
kal_uint16 U_SendData_VFIFO(UART_PORT port, kal_uint8 *Buffaddr, kal_uint16 Length,kal_uint8 mode,kal_uint8 escape_char, module_type ownerid)
{
#ifndef DRV_DEBUG
    kal_int16   real_count,index;
    kal_uint8   data;
    kal_uint8 ch = UARTPort[port].Tx_DMA_Ch;
    kal_uint32  savedMask;

   EXT_ASSERT( (UARTPort[port].ownerid == ownerid), (kal_uint32) ownerid,  (kal_uint32)port, (kal_uint32)UARTPort[port].ownerid);
   
   if(UARTPort[port].EnableTX == KAL_FALSE)
   {
   	return Length;
   }      
   
   if( (stack_query_boot_mode()== FACTORY_BOOT && UARTPort[port].DCB.flowControl==fc_sw)||
    (uart_support_autoescape()==KAL_FALSE) )
   {
      if(mode == 0)
          real_count = UART_PutBytes(port, Buffaddr, Length, ownerid);
      else
      {
        if (UARTPort[port].sleep_on_tx == uart_sleep_on_tx_forbid)
        {
           switch(port)
           {
              case uart_port1:
                 DRVPDN_Disable(DRVPDN_CON1,DRVPDN_CON1_UART1,PDN_UART1);
                 break;
              case uart_port2:
                 DRVPDN_Disable(DRVPDN_CON1,DRVPDN_CON1_UART2,PDN_UART2);
                 break;
        #ifdef __UART3_SUPPORT__
              case uart_port3:
                 #if ( (defined(MT6219))||defined(MT6226M)||(defined(MT6228))|| defined(MT6229)|| (defined(MT6226))|| (defined(MT6227)) )
                 DRVPDN_Disable(DRVPDN_CON1,DRVPDN_CON1_UART3,PDN_UART3);
                 #endif
                 break;
        #endif   /*__UART3_SUPPORT__*/
              default:
                 ASSERT(0);
                 break;
           }
        }
        
	   real_count = DMA_GetVFIFO_Roomleft(ch);
      #ifdef VFIFO_DBG
      {
      	char s[50];
      	sprintf(s,"uart_SendData,len %d,left %d",Length,real_count);
      	kal_print(s);
      }
      #endif
      
	   if (real_count > Length)
	   {
	      real_count = Length;
	   }
	   else
	   {
	      send_Txilm[port] = KAL_TRUE;
	      DMA_EnableINT(ch);
	   }
      
         for (index = 0; index < real_count; index++)
         {
	   	   data = *(Buffaddr+index);
	   	
	   	if (data == UARTPort[port].DCB.xonChar)
	   	{   
	   	   savedMask = SaveAndSetIRQMask(); 		     					
      		if(!IS_VFIFO_FULL(ch))
	   		{
	   		     DMA_PUSH(ch,escape_char);
	   		     DMA_PUSH(ch,0x01);
	   		}    
      		else
      		{
      			RestoreIRQMask(savedMask);	
      	   	break;
      		}   
         	RestoreIRQMask(savedMask);				
	   		 
	   	}
 	   	else if (data == UARTPort[port].DCB.xoffChar)
	   	{
	   	    savedMask = SaveAndSetIRQMask(); 	
      		if(!IS_VFIFO_FULL(ch))
	   		{
	   		     DMA_PUSH(ch,escape_char);
	   		     DMA_PUSH(ch,0x02);
	   		}     
	   		else
      		{
      			RestoreIRQMask(savedMask);	
      	   	break;
      		}  
         	RestoreIRQMask(savedMask);				
      					
	   	}
        		else if (data == escape_char)
	   	{
	   	   savedMask = SaveAndSetIRQMask(); 		     					
	   		if(!IS_VFIFO_FULL(ch))
	   		{
	   		     DMA_PUSH(ch,escape_char);
	   		     DMA_PUSH(ch,0x03);
	   		}     
	   		else
      		{
      			RestoreIRQMask(savedMask);				
      	   	break;
      		}  			     
	   		      	RestoreIRQMask(savedMask);				
      
	   	}
	   	 else
	   	 {
	   	   savedMask = SaveAndSetIRQMask(); 		     							 	
	   	   if(!IS_VFIFO_FULL(ch))
	   		{
	   	   	DMA_PUSH(ch,data);
	   	   }	
	   		else
      		{
      			RestoreIRQMask(savedMask);	
      	   	break;
      		} 	
      		RestoreIRQMask(savedMask);				
      
	   	 }
	   	
         }
         real_count = index;
      
	   }   
	}
	else
	{
     real_count = UART_PutBytes(port, Buffaddr, Length, ownerid);
   }   
   /*invoke THRE interrupt*/
   //EnableTxIntr(UART_BaseAddr[port]);
   return real_count;
#else
    return Length;
#endif
}
kal_uint16 U_SendISRData_VFIFO(UART_PORT port, kal_uint8 *Buffaddr, kal_uint16 Length,kal_uint8 mode,kal_uint8 escape_char, module_type ownerid)
{
#ifndef DRV_DEBUG
    kal_int16   real_count,index;
    kal_uint8   data;
    kal_uint8 ch = UARTPort[port].Tx_DMA_Ch;

   EXT_ASSERT( (UARTPort[port].ownerid == ownerid), (kal_uint32) ownerid, (kal_uint32)port, (kal_uint32)UARTPort[port].ownerid);
   
   if(UARTPort[port].EnableTX == KAL_FALSE)
   {
   	return Length;
   }
            
       if( (stack_query_boot_mode()== FACTORY_BOOT && UARTPort[port].DCB.flowControl==fc_sw)||
       (uart_support_autoescape()==KAL_FALSE) )  
       {
          if(mode == 0)
              real_count = UART_PutISRBytes(port, Buffaddr, Length, ownerid);
          else
          {
            if (UARTPort[port].sleep_on_tx == uart_sleep_on_tx_forbid)
            {
               switch(port)
               {
                  case uart_port1:
                     DRVPDN_Disable(DRVPDN_CON1,DRVPDN_CON1_UART1,PDN_UART1);
                     break;
                  case uart_port2:
                     DRVPDN_Disable(DRVPDN_CON1,DRVPDN_CON1_UART2,PDN_UART2);
                     break;
            #ifdef __UART3_SUPPORT__
                  case uart_port3:
                     #if ( (defined(MT6219))||defined(MT6226M)||(defined(MT6228))|| defined(MT6229)|| (defined(MT6226))|| (defined(MT6227)) )
                     DRVPDN_Disable(DRVPDN_CON1,DRVPDN_CON1_UART3,PDN_UART3);
                     #endif            
                     break;
            #endif   /*__UART3_SUPPORT__*/
                  default:
                     ASSERT(0);
                     break;
               }
            }
            
   	      real_count = DMA_GetVFIFO_Roomleft(ch);
            #ifdef VFIFO_DBG
            {
            	char s[50];
            	sprintf(s,"uart_SendData,len %d,left %d",Length,real_count);
            	kal_print(s);
            }
            #endif
   
   	   if (real_count > Length)
   	   {
   	      real_count = Length;
   	   }
   	   else
   	   {
   	      send_Txilm[port] = KAL_TRUE;
   	      DMA_EnableINT(ch);
   	   }
         
         for (index = 0; index < real_count; index++)
         {
   	   	data = *(Buffaddr+index);
   	   	if (data == UARTPort[port].DCB.xonChar)
   	   	{   
   	   		DMA_PUSH(ch,escape_char);
   	   		DMA_PUSH(ch,0x01); 
   	   	}
    	   	else if (data == UARTPort[port].DCB.xoffChar)
   	   	{
   	   	   DMA_PUSH(ch,escape_char);
   	   		DMA_PUSH(ch,0x02);
         
   	   	}
            else if (data == escape_char)
   	   	{
   	   		DMA_PUSH(ch,escape_char);
   	   		DMA_PUSH(ch,0x03);

⌨️ 快捷键说明

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