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

📄 flcd.c

📁 FIC8120方案的 StartCell_Driver
💻 C
📖 第 1 页 / 共 5 页
字号:
*/

void SetFrameBase( unsigned char  *pFrameBuffer )
{
 
 *(unsigned int *)(LCD_IO_Base + 0x10) =  (unsigned int) pFrameBuffer;
} 

void Init_LCD( volatile unsigned int LCD_Base, volatile LCDMTYPE_T  *pLCDC, unsigned int lcd_type, unsigned char bpp)
{  
   *(volatile unsigned int *) (LCD_Base + 0x0 )= pLCDC[lcd_type].Timing0;
   *(volatile unsigned int *) (LCD_Base + 0x4 )= pLCDC[lcd_type].Timing1;
   *(volatile unsigned int *) (LCD_Base + 0x8 )= pLCDC[lcd_type].Timing2;
   
//   *(volatile unsigned int *) (LCD_Base + 0x10 )= 0x10000020;
//   *(volatile unsigned int *) (LCD_Base + 0x1c )= 0x00053a29; //YCbCR 
      
   
    *(volatile unsigned int *) (LCD_Base + 0x1c ) = 0x00013a21; // Turn on LCD
   SetBPP( bpp );
   Set_DivNo(6); 
        
   
   
}



void SetBPP( unsigned char bpp)
{

  *(unsigned int *)(LCD_IO_Base + 0x1c) &= 0xFFFFFFF1;
  switch( bpp)
    {
       case 1:
              *(unsigned int *)(LCD_IO_Base + 0x1c) &= 0xFFFFFFF1;
              *(unsigned int *)(LCD_IO_Base + 0x1c) |= 0x00000000;
              break;
       
       case 2:
              *(unsigned int *)(LCD_IO_Base + 0x1c) |= 0x00000002;
              break;
       case 4:
              *(unsigned int *)(LCD_IO_Base + 0x1c) |= 0x00000004;
              break;
       case 8:
              *(unsigned int *)(LCD_IO_Base + 0x1c) |= 0x00000006;
              break;
       case 16:
               *(unsigned int *)(LCD_IO_Base + 0x1c) |= 0x00000008;
              break;  
       case 24:
               *(unsigned int *)(LCD_IO_Base + 0x1c) |= 0x0000000a;
              break;
   }           
}              

void SetEndian( unsigned char endian )
{
   *(unsigned int *)(LCD_IO_Base + 0x1c) &= 0xFFFFF9FF;
   
   switch( endian )
   {
     case LBLP:
        break;
     case BBBP:
        *(unsigned int *)(LCD_IO_Base + 0x1c) |= 0x00000200;
        break;
     case LBBP:
        *(unsigned int *)(LCD_IO_Base + 0x1c) |= 0x00000400;
        break;
   }        
           
          
   
}

void SetYCbCr( int type )
{

   *(unsigned int *)(LCD_IO_Base + 0x1c) &= 0xfff9ffff;
   if( type == 422)
     {
       *(unsigned int *)(LCD_IO_Base + 0x1c)  |= 0x00040000;
     }          
   else 
     if( type == 420)
        *(unsigned int *)(LCD_IO_Base + 0x1c) |= 0x00060000;          
          
   
}



void ColorBar_YCbCr_420( unsigned char endian, unsigned char *pFrameBuffer, int width, int height, int int_test)
{

   unsigned char *CbPtr, *CrPtr, r, g, b;
   int  i,j;
   
   
   OSD_Off(LCD_IO_Base);
   SetYCbCr(420);
   Set_DivNo(6); 
//  SetBPP(8);
   r=0, g=0; b=255;
   rgb2ycbcr( &r, &g, &b ); 
  
   *(unsigned int *)(LCD_IO_Base + 0x10) |= 0x20;
  
       
   CbPtr = pFrameBuffer + 0x80000;
   CrPtr = pFrameBuffer + 0xa0000;
      
   SetEndian( endian );
  
  
   if(endian == BBBP)
   {
     for(i=0; i<height; i++)  //***********  draw pattern
      {
        r=255, g=0; b=0;
        rgb2ycbcr( &r, &g, &b );
        for(j=0; j<(width * 1/3 ); j++)
         {           
           *(unsigned char *) (pFrameBuffer + i * width + (j & 0xFFFFFFFC ) + 3-(j%4) ) = r;
                 
           if( ((i%2) == 0) && ((j%2) == 0) )  
               *(unsigned char *) (CbPtr + (width>>1) * (i>> 1) +  ((j>>1)  & 0xFFFFFFFC)  + (3 - ((j>>1) %4) ) ) = g;
           if( ((i%2) == 0) && ((j%2) == 0) )  
               *(unsigned char *) (CrPtr + (width>>1) * (i>> 1) +  ((j>>1)  & 0xFFFFFFFC) + (3 - ((j>>1) %4)) )= b;     
         }                
         
         
        r=0, g=255; b=0;
        rgb2ycbcr( &r, &g, &b );
        for( ; j<(width * 2/3 ); j++)
         {
           *(unsigned char *) (pFrameBuffer + i * width + (j & 0xFFFFFFFC ) + 3-(j%4) ) = r;
                 
           if( ((i%2) == 0) && ((j%2) == 0) )  
               *(unsigned char *) (CbPtr + (width>>1) * (i>> 1) +  ((j>>1)  & 0xFFFFFFFC)  + (3 - ((j>>1) %4) )) = g;
           if( ((i%2) == 0) && ((j%2) == 0) )  
               *(unsigned char *) (CrPtr + (width>>1) * (i>> 1) +  ((j>>1)  & 0xFFFFFFFC) + (3 - ((j>>1) %4))) = b; 
         }     
       
       r=0, g=0; b=255;
       rgb2ycbcr( &r, &g, &b );  
       for( ; j<width; j++)
         {
           *(unsigned char *) (pFrameBuffer + i * width + (j & 0xFFFFFFFC ) + 3-(j%4) ) = r;
                 
           if( ((i%2) == 0) && ((j%2) == 0) )  
               *(unsigned char *) (CbPtr + (width>>1) * (i>> 1) +  ((j>>1)  & 0xFFFFFFFC)  + (3 - ((j>>1) %4) ) )= g;
           if( ((i%2) == 0) && ((j%2) == 0) )  
               *(unsigned char *) (CrPtr + (width>>1) * (i>> 1) +  ((j>>1)  & 0xFFFFFFFC) + (3 - ((j>>1) %4)) )= b;                    
         }                                   
      } // end of i loop   
    }  //end of if(BBBP)   
    
      
  else
   {
    
     for(i=0; i<height; i++)  //***********  draw pattern
      {
        r=255, g=0; b=0;
        rgb2ycbcr( &r, &g, &b );
        for(j=0; j<(width * 1/3 ); j++)
         {           
           *(unsigned char *) (pFrameBuffer + i * width + j ) = r;
                 
           if( (i%2) == 0 )  *(unsigned char *) (CbPtr + (width>>1) * (i>> 1) +  (j>>1) ) = g;
           if( (i%2) == 0 )  *(unsigned char *) (CrPtr + (width>>1) * (i>> 1) + (j>>1) ) = b;     
         }                
         
         
        r=0, g=255; b=0;
        rgb2ycbcr( &r, &g, &b );
        for( ; j<(width * 2/3 ); j++)
         {
          *(unsigned char *) (pFrameBuffer + i * width + j) = r;
          if( (i%2) == 0 ) *(unsigned char *) (CbPtr + (width>>1) * (i>> 1) + (j>>1) ) = g;
          if( (i%2) == 0 ) *(unsigned char *) (CrPtr + (width>>1) * (i>> 1) + (j>>1) ) = b;
         }     
       
       r=0, g=0; b=255;
       rgb2ycbcr( &r, &g, &b );  
       for( ; j<width; j++)
         {
           *(unsigned char *) (pFrameBuffer + i * width + j) = r; 
           if( (i%2) == 0 ) *(unsigned char *) (CbPtr + (width>>1) * (i>> 1) + (j>>1) ) = g;
           if( (i%2) == 0 ) *(unsigned char *) (CrPtr + (width>>1) * (i>> 1) + (j>>1) ) = b;                     
         }                                   
      }     
      
   }   
   
   
 
  

/*      
  
  for(i=0; i<height; i++)  //***********  draw pattern
      {
        r=255, g=0; b=0;
        rgb2ycbcr( &r, &g, &b );
        for(j=0; j<(width * 1/3 ); j++)
         {           
           *(unsigned char *) (pFrameBuffer + i * width + (j>>2) + 3-(j%4) ) = r;
                 
           if( (i%2) == 0 )  *(unsigned char *) (CbPtr + (width>>1) * (i>> 1) +  (j>>1) ) = g;
           if( (i%2) == 0 )  *(unsigned char *) (CrPtr + (width>>1) * (i>> 1) + (j>>1) ) = b;     
         }                
         
         
        r=0, g=255; b=0;
        rgb2ycbcr( &r, &g, &b );
        for( ; j<(width * 2/3 ); j++)
         {
          *(unsigned char *) (pFrameBuffer + i * width + j) = r;
          if( (i%2) == 0 ) *(unsigned char *) (CbPtr + (width>>1) * (i>> 1) + (j>>1) ) = g;
          if( (i%2) == 0 ) *(unsigned char *) (CrPtr + (width>>1) * (i>> 1) + (j>>1) ) = b;
         }     
       
       r=0, g=0; b=255;
       rgb2ycbcr( &r, &g, &b );  
       for( ; j<width; j++)
         {
           *(unsigned char *) (pFrameBuffer + i * width + j) = r; 
           if( (i%2) == 0 ) *(unsigned char *) (CbPtr + (width>>1) * (i>> 1) + (j>>1) ) = g;
           if( (i%2) == 0 ) *(unsigned char *) (CrPtr + (width>>1) * (i>> 1) + (j>>1) ) = b;                     
         }                                   
      }     
  */


}



void ColorBar_YCbCr_422( unsigned char endian, unsigned char *pFrameBuffer, int width, int height, int int_test)
{

  int i,j;
  unsigned char r,g,b, result;
  
  
  
  OSD_Off(LCD_IO_Base);
  (volatile) FIFO_Under_Run=0;
         
  fLib_ConnectInt(34,  UnderRun_Handler );	//it only can be
       
  UnmaskFIQ(2);
  SetFIQmode(2,LEVEL); 
  
  
  SetBPP(16);
  SetEndian(endian);
  SetYCbCr(422);
  Set_DivNo(6); 
  
  
  switch(endian)
  {
    case BBBP:  printf("YCbCr BBBP Testing\n");
                break;
    case LBLP:  printf("YCbCr LBLP Testing\n");
                break;
    case LBBP:   printf("YCbCr LBBP Testing\n");
                break;                                  
  
  }
  
  
  for(i=0; i<height; i++)                           //***********  draw pattern
      {
        r=255, g=0; b=0;                         // Draw red Bar
        rgb2ycbcr( &r, &g, &b );
        for(j=0; j< ( width * 1/3) *2 ; j=j+4)
         {          
            if( endian == BBBP)
             {
              *(unsigned char *) (pFrameBuffer + i * width*2 + j+3 ) = r;  
              *(unsigned char *) (pFrameBuffer + i * width*2 + j+2 ) = g;                    
           
              *(unsigned char *) (pFrameBuffer + i * width*2 + j+1 ) = r;  
              *(unsigned char *) (pFrameBuffer + i * width*2 + j ) = b;  
             
             } 
            else
             {
              *(unsigned char *) (pFrameBuffer + i * width*2 + j+3 ) = r;  
              *(unsigned char *) (pFrameBuffer + i * width*2 + j+2 ) = b;                    
          
              *(unsigned char *) (pFrameBuffer + i * width*2 + j+1 ) = r;  
              *(unsigned char *) (pFrameBuffer + i * width*2 + j ) = g;               
             }            
                     
         }      
        r=0, g=255; b=0;                          // Draw green bar
        rgb2ycbcr( &r, &g, &b );              
        for( ; j< (width * 2/3 )*2 ; j=j+4)
         {          
            if( endian == BBBP)
             {
              *(unsigned char *) (pFrameBuffer + i * width*2 + j+3 ) = r;  
              *(unsigned char *) (pFrameBuffer + i * width*2 + j+2 ) = g;                    
           
              *(unsigned char *) (pFrameBuffer + i * width*2 + j+1 ) = r;  
              *(unsigned char *) (pFrameBuffer + i * width*2 + j ) = b;  
             
             } 
            else
             {
              *(unsigned char *) (pFrameBuffer + i * width*2 + j+3 ) = r;  
              *(unsigned char *) (pFrameBuffer + i * width*2 + j+2 ) = b;                    
          
              *(unsigned char *) (pFrameBuffer + i * width*2 + j+1 ) = r;  
              *(unsigned char *) (pFrameBuffer + i * width*2 + j ) = g;          
             }             
                     
         }   
        r=0, g=0; b=255;
        rgb2ycbcr( &r, &g, &b );
        for(  ; j<(width * 3/3) *2 ; j=j+4)            //Draw blue bar
         {          
            if( endian == BBBP)
             {
              *(unsigned char *) (pFrameBuffer + i * width*2 + j+3 ) = r;  
              *(unsigned char *) (pFrameBuffer + i * width*2 + j+2 ) = g;                    
           
              *(unsigned char *) (pFrameBuffer + i * width*2 + j+1 ) = r;  
              *(unsigned char *) (pFrameBuffer + i * width*2 + j ) = b;  
             
             } 
            else
             {
              *(unsigned char *) (pFrameBuffer + i * width*2 + j+3 ) = r;  
              *(unsigned char *) (pFrameBuffer + i * width*2 + j+2 ) = b;                    
          
              *(unsigned char *) (pFrameBuffer + i * width*2 + j+1 ) = r;  
              *(unsigned char *) (pFrameBuffer + i * width*2 + j ) = g;                     
             }                 
         }  
  

     }

 //************* Check Buffer Under Run ***************************************
 
 if( int_test)
 { 
  *(volatile unsigned int *) ( LCD_IO_Base + 0x20 )= 0x00000002;
  *(volatile unsigned int *) ( LCD_IO_Base + 0x18 )= 0x00000002;
    
  
  EnableFIQ();	

  
  
 
 
  *(volatile unsigned int *) ( LCD_IO_Base + 0x08 ) &= 0xffff7fff;  //Adpative off
  printf("If the color bar is ok, press y to pass\n");
  do{
     result = getchar();
    }while( (result != 'y') );  
    
    
     printf("Change divisor, press 'y' or 'Y'");
  do{
      result = getchar();
    }while( (result != 'y') );  
    
  Set_DivNo(2); 
  
  
  
  
  printf("Check if your screen flash, press 'y' or 'Y'\n");
  do{
     result = getchar();
    }while( (result != 'y') );

  if( FIFO_Under_Run ) printf("Generate FIFO Under Run Interrupt Successfully\n");
  else  printf("FIFO Under Run Interrupt Fail\n");    
  
   
  if(FIFO_Under_Run) printf("FIFO under run generate interrupt\n");
  else  printf("FIFO under run interrupt fail\n");
  
  
  
  printf("Use adaptive, press 'y' or 'Y'");
  do{
      result = getchar();
    }while( (result != 'y') ); 
  *(volatile unsigned int *) ( LCD_IO_Base + 0x08 ) |= 0x00008000;  
  
  printf("If screen is ok, press 'y' or 'Y'");
  do{
      result = getchar();
    }while( (result != 'y') ); 
    
 }   
   
}


void OSD_On( unsigned int  base )  //OSD Enable/disable
{
    *(unsigned int *) (base + 0x34) &= 0xfffffffe;
    *(unsigned int *) (base + 0x34) |= 1;
}

void OSD_Off( unsigned int  LCD_IO_Base )  //OSD Enable/disable
{
    *(unsigned int *) (LCD_IO_Base + 0x34) &= 0xfffffffe;
}

void OSD_Pos( unsigned int  LCD_IO_Base, int  HPos, int VPos)
{

⌨️ 快捷键说明

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