📄 lcd.c
字号:
//===============================================================================
// TEXAS INSTRUMENTS INCORPORATED PROPRIETARY INFORMATION
//
// Property of Texas Instruments
// For Unrestricted Internal Use Only
// Unauthorized reproduction and/or distribution is strictly prohibited.
// This product is protected under copyright law and trade secret law
// as an unpublished work.
// Created 1999, (C) Copyright 1999 Texas Instruments. All rights reserved.
//
// Filename : lcd.c
//
// Description : Body file for OMAP LCD Controller
//
// Project : OMAP
//
// Author : Vincent Bour v-bour@ti.com
//===============================================================================
#include "lcd.h"
#include "mem.h"
#include "global_types.h"
//---------------------------------------------------------------------------
// LCD_TestRegisterValueAtReset
//---------------------------------------------------------------------------
BOOL LCD_TestRegisterValueAtReset(void)
{
BOOL ok =True;
ok &=((REG32(LCD_CONTROL_REG_SUPERVISOR_ADDR) & LCD_CONTROL_REG_MSK) == LCD_CONTROL_REG_VALUE_AT_RESET);
ok &=((REG32(LCD_TIMING0_REG_SUPERVISOR_ADDR) & LCD_TIMING0_REG_MSK) == LCD_TIMING0_REG_VALUE_AT_RESET);
ok &=((REG32(LCD_TIMING1_REG_SUPERVISOR_ADDR) & LCD_TIMING1_REG_MSK) == LCD_TIMING1_REG_VALUE_AT_RESET);
ok &=((REG32(LCD_TIMING2_REG_SUPERVISOR_ADDR) & LCD_TIMING2_REG_MSK) == LCD_TIMING2_REG_VALUE_AT_RESET);
ok &=((REG32(LCD_STATUS_REG_SUPERVISOR_ADDR) & LCD_STATUS_REG_MSK) == LCD_STATUS_REG_VALUE_AT_RESET);
ok &=((REG32(LCD_SUBPANEL_REG_SUPERVISOR_ADDR) & LCD_SUBPANEL_REG_MSK) == LCD_SUBPANEL_REG_VALUE_AT_RESET);
return(ok);
}
//---------------------------------------------------------------------------
// LCD_ReadControlRegister
//---------------------------------------------------------------------------
UWORD32 LCD_ReadControlRegister(void)
{
return(REG32(LCD_CONTROL_REG_SUPERVISOR_ADDR) & LCD_CONTROL_REG_MSK);
}
//---------------------------------------------------------------------------
// LCD_ControllerEnable
//---------------------------------------------------------------------------
void LCD_ControllerEnable(void)
{
// Read control register
UWORD32 value = REG32(LCD_CONTROL_REG_SUPERVISOR_ADDR);
value |= LCD_Enable;
REG32(LCD_CONTROL_REG_SUPERVISOR_ADDR) = value;
}
//---------------------------------------------------------------------------
// LCD_ControllerDisable
//---------------------------------------------------------------------------
void LCD_ControllerDisable(void)
{
// Read control register
UWORD32 value = REG32(LCD_CONTROL_REG_SUPERVISOR_ADDR);
value &= ~LCD_Enable;
REG32(LCD_CONTROL_REG_SUPERVISOR_ADDR) = value;
}
//---------------------------------------------------------------------------
// LCD_SetControllerRegister
//---------------------------------------------------------------------------
void LCD_SetControlRegister(LCD_ENABLE_T EnableLcd,
LCD_BW_T bw,
LCD_INT_DONEMASK_T FrameInterruptMask,
LCD_INT_LOADMASK_T LoadInterruptMask,
LCD_TFT_T ActiveMode,
LCD_BE_T EndianMode,
LCD_M8B_T Mono8BitMode,
UWORD8 FifoDmaRequestDelay,
LOADING_MODE_T LoadingMode,
LCD_WCE_T WinCEMode)
{
// Read control register
UWORD32 value = REG32(LCD_CONTROL_REG_SUPERVISOR_ADDR);
// clear all used bits
value = 0;
value &= ~LCD_CONTROL_REG_MSK;
value |= EnableLcd;
value |= (bw << LCD_BW_BIT_POSITION);
value |= (FrameInterruptMask << LCD_DoneMask_BIT_POSITION);
value |= (LoadInterruptMask << LCD_LoadMask_BIT_POSITION);
value |= (ActiveMode << LCD_LcdTFT_BIT_POSITION);
value |= (EndianMode << LCD_LcdBE_BIT_POSITION);
value |= (Mono8BitMode << LCD_M8B_BIT_POSITION);
value |= (FifoDmaRequestDelay << LCD_FDD_BIT_POSITION);
value |= (LoadingMode << LCD_PLM_BIT_POSITION);
value |= (WinCEMode << LCD_WCE_BIT_POSITION);
// write control register
REG32(LCD_CONTROL_REG_SUPERVISOR_ADDR) = value;
}
//---------------------------------------------------------------------------
// LCD_ReadStatusRegister
//---------------------------------------------------------------------------
void LCD_ReadStatusRegister(BOOL * const FrameDone,
BOOL * const SynchroLost,
BOOL * const ACBiasCount,
BOOL * const FifoUnderFlow,
BOOL * const PaletteLoaded)
{
// Read status register
UWORD32 value = REG32(LCD_STATUS_REG_SUPERVISOR_ADDR);
*FrameDone = (BOOL)(value & 1);
*SynchroLost = (BOOL)((value >> LCD_Sync_BIT_POSITION ) & 1);
*ACBiasCount = (BOOL)((value >> LCD_ABC_BIT_POSITION ) & 1);
*FifoUnderFlow = (BOOL)((value >> LCD_FUF_BIT_POSITION ) & 1);
*PaletteLoaded = (BOOL)((value >> LCD_PL_BIT_POSITION ) & 1);
}
//---------------------------------------------------------------------------
// LCD_SetSubPanelRegister
//---------------------------------------------------------------------------
void LCD_SetSubPanelRegister(UWORD16 DefaultPixelData,
UWORD16 LinePerPanelThreshold,
SUBPANEL_HOLS_T SubPanelHols,
SUBPANEL_ENABLE_T SubPanelEnable)
{
// Read sub Panel register
UWORD32 value = REG32(LCD_SUBPANEL_REG_SUPERVISOR_ADDR);
// clear all used bits
value &= ~LCD_SUBPANEL_REG_MSK;
// set corresponding parts of register
// DefaultPixelData coded on 12 bits
value |= (DefaultPixelData & 0xFFF);
// 10 bits are used
value |= ((LinePerPanelThreshold & 0x3ff) << LCD_LPPT_BIT_POSITION);
value |= (SubPanelHols << LCD_HOLS_BIT_POSITION);
value |= (SubPanelEnable << LCD_SPEN_BIT_POSITION);
// write sub Panel register
REG32(LCD_SUBPANEL_REG_SUPERVISOR_ADDR) = value;
}
//---------------------------------------------------------------------------
// LCD_SetLcdTiming0Register
//---------------------------------------------------------------------------
void LCD_SetLcdTiming0Register(UWORD16 PixelPerLine,
UWORD8 HorizontalSynchroPulseWidth,
UWORD8 HorizontalFrontPorsh,
UWORD8 HorizontalBackPorsh)
{
// Read register
UWORD32 value = REG32(LCD_TIMING0_REG_SUPERVISOR_ADDR);
// clear all used bits
value &= LCD_TIMING0_REG_MSK;
// set corresponding parts of register
// 4 lsb bits are used
value |= (PixelPerLine & 0x3F0);
// 6 bits are used
value |= ((HorizontalSynchroPulseWidth & 0x3F) << LCD_HSW_BIT_POSITION);
value |= (HorizontalFrontPorsh << LCD_HFP_BIT_POSITION);
value |= (HorizontalBackPorsh << LCD_HBP_BIT_POSITION);
// write register
REG32(LCD_TIMING0_REG_SUPERVISOR_ADDR) = value;
}
//---------------------------------------------------------------------------
// LCD_SetLcdTiming1Register
//---------------------------------------------------------------------------
void LCD_SetLcdTiming1Register(UWORD16 LinePerPanel,
UWORD8 VerticalSynchroPulseWidth,
UWORD8 VerticalFrontPorsh,
UWORD8 VerticalBackPorsh)
{
// Read register
UWORD32 value = REG32(LCD_TIMING1_REG_SUPERVISOR_ADDR);
// clear all used bits
value &= ~LCD_TIMING1_REG_MSK;
// set corresponding parts of register
// 10 bits are used
value |= (LinePerPanel & 0x3FF);
// 6 bits are used
value |= ((VerticalSynchroPulseWidth & 0x3F) << LCD_VSW_BIT_POSITION);
value |= (VerticalFrontPorsh << LCD_VFP_BIT_POSITION);
value |= (VerticalBackPorsh << LCD_VBP_BIT_POSITION);
// write register
REG32(LCD_TIMING1_REG_SUPERVISOR_ADDR) = value;
}
//---------------------------------------------------------------------------
// LCD_SetLcdTiming2Register
//---------------------------------------------------------------------------
void LCD_SetLcdTiming2Register(UWORD8 PixelClockDivisor,
UWORD8 AcPinFrequency,
UWORD8 AcBiasPinTransitionPerInterrupt,
BOOL InvertVsync ,
BOOL InvertHsync ,
BOOL InvertPixelClock,
BOOL InvertOutputEnable)
{
// Read register
UWORD32 value = REG32(LCD_TIMING2_REG_SUPERVISOR_ADDR);
// clear all used bits
value &= ~LCD_TIMING2_REG_MSK;
// set corresponding parts of register
value |= PixelClockDivisor;
value |= (AcPinFrequency << LCD_ACB_Pin_BIT_POSITION);
value |= (AcBiasPinTransitionPerInterrupt << LCD_ACBI_BIT_POSITION);
value |= (InvertVsync << LCD_IVS_BIT_POSITION);
value |= (InvertHsync << LCD_IHS_BIT_POSITION);
value |= (InvertPixelClock << LCD_IPC_BIT_POSITION);
value |= (InvertOutputEnable << LCD_IEO_BIT_POSITION);
// write register
REG32(LCD_TIMING2_REG_SUPERVISOR_ADDR) = value;
}
//---------------------------------------------------------------------------
// LCD_SetLcdTiming2Register
//---------------------------------------------------------------------------
void LCD_SetHvSyncPolarity(BOOL Rising_nFalling_Edge)
{
// Read register
UWORD32 value;
value = REG32(LCD_TIMING2_REG_SUPERVISOR_ADDR);
// clear bit
value &= ~(1<<(LCD_HVSYNC_EDGE_POLARITY_BIT_POSITION));
// set bit to
value |= Rising_nFalling_Edge << LCD_HVSYNC_EDGE_POLARITY_BIT_POSITION;
// turn on functionnality
value |= 1 << LCD_HVSYNC_PROG_BIT_POSITION;
// write register
REG32(LCD_TIMING2_REG_SUPERVISOR_ADDR) = value;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -