注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
liufan的个人空间 https://home.eeworld.com.cn/space-uid-53362.html [收藏] [复制] [分享] [RSS]
日志

裸机S3C6410显示控制器(2)-RGB模式下初始化显示控制器 【转载】

已有 1093 次阅读2014-7-2 09:50 |个人分类:ARM| 6410, LCD, 控制器, 寄存器, 接口

LCD在工作之前必须作一些初始化。下面讲的是在使用RGB模式时的主要初始化工作。

(1)LCD各引脚的GPIO设置

RGB接口的信号如图:


(2)设置LCD的大小、工作模式、时序等。

LCD的时序图:


查看LCD的手册,找出相应的VSPW,VBPD,VFPD,HSPW,HBPD,HFPD等值,将这些值设置到VIDTCON0, VIDTCON1, VIDTCON2及部分VIDCON0寄存器中。

示例代码:

  1. oLcdc.m_uLcdHSz = 320;  
  2. oLcdc.m_uLcdVSz = 240;  
  3. oLcdc.m_uVidOutFormat = VIDOUT_RGBIF;  
  4. oLcdc.m_uDitherMode = RDITHPOS_8BIT|GDITHPOS_8BIT|BDITHPOS_8BIT;  
  5. oLcdc.m_uDitherMode &= ~DITHERING_ENABLE;  
  6.   
  7. LcdcOutp32(rVIDCON1, IHSYNC_INVERT | IVSYNC_INVERT |IVDEN_INVERT);  //Check   
  8.   
  9. LcdcOutp32(rVIDTCON0, VBPDE(VBPD_LTV350QV) | VBPD(VBPD_LTV350QV) | VFPD(VFPD_LTV350QV) | VSPW(VSPW_LTV350QV));  
  10. LcdcOutp32(rVIDTCON1, VFPDE(VFPD_LTV350QV) | HBPD(HBPD_LTV350QV) | HFPD(HFPD_LTV350QV) | HSPW(HSPW_LTV350QV));  
  11. LcdcOutp32(rVIDTCON2, LINEVAL(oLcdc.m_uLcdVSz-1) | HOZVAL(oLcdc.m_uLcdHSz-1));  
  12. LcdcOutp32(rDITHMODE, oLcdc.m_uDitherMode); // Fixed Dithering Matrix  

(3)设置LCD的时钟源、时钟分频

VSYNC是帧频率,HSYNC是行频率,VCLK是显示控制器行扫描时使用的频率,我们要设置的就是这个频率,通过设置寄存器VIDCON0的CLKVAL字段来设置VCLK的频率。

CLKVAL字段就是LCD时钟源的分频,它们的关系如下图所示:


要计算CLKVAL的值,先假设LCD的输出频率为60Hz,能过下面的公式可以得出CLKVAL:


示例代码:

  1. //------------------------------------------------------------  
  2. // Function Name : LCD_GetClkValAndClkDir  
  3. //  
  4. // Function Desctiption :  
  5. //  This function calculates clkval and determines clock source  
  6. //  
  7. // Input :  uLcdHSz, lcd horizontal size  
  8. //          uLcdVSz, lcd vertical size  
  9. //  
  10. // Output : uClkVal, clock value for wanted vclk  
  11. //          uClkDir, clock source  
  12. //  
  13. // Version :   
  14. //------------------------------------------------------------  
  15. void LCD_GetClkValAndClkDir(u32 uLcdHSz, u32 uLcdVSz, u32* uClkVal, u32* uClkDir, CLK_SRC eClkSrc)  
  16. {  
  17.     double dTmpVal, dVclkSrc;  
  18.     u32 uTotalTime;  
  19.       
  20.     if(eClkSrc == SRC_HCLK)  
  21.     {  
  22.           
  23.         LCD_SetClkSrc(SRC_HCLK);  
  24.         dVclkSrc = g_HCLK;      //should be changed in your system clock condition  
  25.     }  
  26.     else if(eClkSrc == SRC_MOUT_EPLL)  
  27.     {  
  28.         LCD_SetClkSrc(SRC_MOUT_EPLL);  
  29.         dVclkSrc = 97700000;    //should be changed in your system clock condition    
  30.     }  
  31.     else if(eClkSrc == SRC_DOUT_MPLL)  
  32.     {  
  33.         LCD_SetClkSrc(SRC_DOUT_MPLL);  
  34.         dVclkSrc = 100000000;   //should be changed in your system clock condition  
  35.     }  
  36.     else if(eClkSrc == SRC_FIN_EPLL)  
  37.     {  
  38.         LCD_SetClkSrc(SRC_FIN_EPLL);  
  39.         dVclkSrc = 12000000;    //should be changed in your system clock condition  
  40.     }  
  41.     else if(eClkSrc == SRC_27M)  
  42.         dVclkSrc = 27000000;          
  43.           
  44.     #if (LCD_MODULE_TYPE == LTP700WV_RGB ||LCD_MODULE_TYPE ==LTE480WV_RGB)  
  45.         uLcdHSz+= HBPD_LTP700WV + HFPD_LTP700WV + HSPW_LTP700WV +3;  
  46.         uLcdVSz+= VBPD_LTP700WV + VFPD_LTP700WV + VSPW_LTP700WV +3;  
  47.   
  48.     #elif (LCD_MODULE_TYPE == LTS222QV_SRGB)  
  49.         uLcdHSz = uLcdHSz*3 + HBPD_LTS222QV + HFPD_LTS222QV + HSPW_LTS222QV +3;  
  50.         uLcdVSz+= VBPD_LTS222QV + VFPD_LTS222QV + VSPW_LTS222QV +3;  
  51.   
  52.     #elif (LCD_MODULE_TYPE == LTV300GV_RGB)  
  53.         uLcdHSz += HBPD_LTV300GV + HFPD_LTV300GV + HSPW_LTV300GV +3;  
  54.         uLcdVSz+= VBPD_LTV300GV + VFPD_LTV300GV + VSPW_LTV300GV +3;  
  55.   
  56.     #elif (LCD_MODULE_TYPE == LTV350QV_RGB)  
  57.         uLcdHSz += HBPD_LTV350QV + HFPD_LTV350QV + HSPW_LTV350QV +3;  
  58.         uLcdVSz+= VBPD_LTV350QV + VFPD_LTV350QV + VSPW_LTV350QV +3;   
  59.       
  60.     #endif  
  61.           
  62.     uTotalTime =  
  63.     #if (LCD_MODULE_TYPE == LTS222QV_CPU)  
  64.                 CS_SETUP_TIME + WR_SETUP_TIME + WR_ACT_TIME + WR_HOLD_TIME + 4;  
  65.     #else  
  66.                 1;  
  67.     #endif  
  68.       
  69.     dTmpVal = dVclkSrc/(double)(uTotalTime*uLcdHSz*uLcdVSz*LCD_FRM_RATE) - 1;  
  70.   
  71.     dTmpVal = (dTmpVal+0.5)*10;  
  72.     *uClkVal = (int)(dTmpVal/10.0);  
  73.   
  74.     *uClkDir = (*uClkVal<1) ? 0 : 1;  
  75.   
  76.  }  
评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章