📄 ddi_display_controller_hx8347a_20070920.c
字号:
{
// For 16-bit, data is ok as 16 bits
#ifdef DEBUG
ret1 =
#endif
ddi_lcdif_WriteDirect(eCommMode, (void *)&u32Command, sizeof(DDI_DISPLAY_WORD_TYPE));
}
}
#ifdef DEBUG
assert(!ret1);
assert(!ret2);
#endif
}
////////////////////////////////////////////////////////////////////////////////
//! \fn RtStatus_t ddi_display_controller_GetLcdifInitStruct(hw_lcdif_Init_t *pInit, gfx_BitmapTypeEnum_t eBitmapType)
//!
//! \brief Copies the LCDIF init struct that corresponds to the given color format
//!
//! \fntype Function
//!
//! \param[in,out] pInit - Pointer to init struct to copy to
//! \param[in] eBitmapType - Graphics color format specifier
//!
//! \retval SUCCESS No error
//!
//! \retval ERROR_DDI_DISPLAY_CONTROLLER_BITMAP_TYPE_UNSUPPORTED - This
//! controller does not support the given bitmap color type
//!
//! This function is implemented per controller or display. The appropriate
//! LCDIF init parameters are copied to the given init struct pointer according
//! to the type of color format is specified. Not all controllers/displays are
//! capable of all color formats, so this function may return an error
//! indicating that the given color format is not supported.
//!
////////////////////////////////////////////////////////////////////////////////
RtStatus_t ddi_display_controller_GetLcdifInitStruct(hw_lcdif_Init_t *pInit, gfx_BitmapTypeEnum_t eBitmapType)
{
//! Init structure for LCDIF, may be loaded from a resource
hw_lcdif_Init_t LcdifInit =
{
//! No busy line, no byte-swapping, bring LCD module out of reset
false, //! m_bBusyEnable
DDI_DISPLAY_DATA_SWIZZLE, //! m_eDataSwizzle
LCDRESET_HIGH, //! m_eReset
BUSMODE_8080, //! m_eBusMode
DDI_DISPLAY_WORDLENGTH, //! m_eWordLength
//! Bus timing info
//! 1XCLK ~= 168ns
{
DDI_DISPLAY_DATA_SETUP_XCLKS, //! m_u8DataSetup
DDI_DISPLAY_DATA_HOLD_XCLKS, //! m_u8DataHold
DDI_DISPLAY_CMD_SETUP_XCLKS, //! m_u8CmdSetup
DDI_DISPLAY_CMD_HOLD_XCLKS, //! m_u8CmdHold
}
};
if( BITMAP_TYPE_16BPP_565 != eBitmapType )
return ERROR_DDI_DISPLAY_CONTROLLER_BITMAP_TYPE_UNSUPPORTED;
memcpy(pInit, &LcdifInit, sizeof(hw_lcdif_Init_t));
return SUCCESS;
}
////////////////////////////////////////////////////////////////////////////////
//! \fn static void InitPwmBacklight(void)
//!
//! \brief Sets up the PWM backlight control signal
//!
//! \fntype Function
//!
//! Inits the PWM hardware block and sets up the GPIOs for PWM mode.
//! The initial backlight frequency is set, but the duty cycle is set to zero
//!
////////////////////////////////////////////////////////////////////////////////
static void InitPwmBacklight(void)
{
// Do a raw init of the PWM GPIO
if( !ddi_etm_IsPresent() ) {
HW_PINCTRL_MUXSEL6_CLR(0x00300000 << (2*DDI_DISPLAY_BACKLIGHT_PWM_CHANNEL));
}
// Set up the backlight
BF_CLR(PWM_CTRL, SFTRST);
BF_CLR(PWM_CTRL, CLKGATE);
// Initialize to 0% duty cycle
if(g_bInitializeLCDController)//LCD_SPlash_
{
HW_PWMn_ACTIVE_WR(DDI_DISPLAY_BACKLIGHT_PWM_CHANNEL, 0);
}
else
{
// Initialize to 1/2 duty cycle
BF_CS2n(PWMn_ACTIVE, DDI_DISPLAY_BACKLIGHT_PWM_CHANNEL,
ACTIVE, 0,
INACTIVE, ((BACKLIGHT_PWM_PERIOD*(MIN_BRIGHTNESS_PERCENTAGE+MAX_BRIGHTNESS_PERCENTAGE)/2)/100) );
}
BF_CS5n(PWMn_PERIOD, DDI_DISPLAY_BACKLIGHT_PWM_CHANNEL,
MATT, 0,
CDIV, BACKLIGHT_PWM_CDIV,
INACTIVE_STATE, BV_PWMn_PERIOD_INACTIVE_STATE__0,
ACTIVE_STATE, BV_PWMn_PERIOD_ACTIVE_STATE__1,
PERIOD, BACKLIGHT_PWM_PERIOD);
if(g_bInitializeLCDController)//LCD_SPLASH_BUG FIXED
{
HW_PWM_CTRL_CLR(1 << DDI_DISPLAY_BACKLIGHT_PWM_CHANNEL);
}
else
{
HW_PWM_CTRL_SET(1 << DDI_DISPLAY_BACKLIGHT_PWM_CHANNEL);
}
}
////////////////////////////////////////////////////////////////////////////////
//! \fn static void SendControllerInitSeq(gfx_BitmapTypeEnum_t eBitmapType, uint32_t u32Width, uint32_t u32Height)
//!
//! \brief Sends commands to initialize the controller from reset
//!
//! \fntype Function
//!
//! \param[in] eBitmapType - Graphics color format specifier
//! \param[in] u32Width - Desired screen width setting
//! \param[in] u32Height - Desired screen height setting
//!
//! This function sends commands to initialize the controller after it has
//! been taken out of reset.
//!
//! \retval SUCCESS No error
//!
//! \retval ERROR_DDI_DISPLAY_CONTROLLER_BITMAP_TYPE_UNSUPPORTED - This
//! controller does not support the given bitmap color type
//!
//! \retval ERROR_DDI_DISPLAY_CONTROLLER_SCREEN_SIZE - This
//! controller does not support the given screen dimensions
//!
////////////////////////////////////////////////////////////////////////////////
static void SendControllerInitSeq(gfx_BitmapTypeEnum_t eBitmapType, uint32_t u32Width, uint32_t u32Height)
{
if(g_bInitializeLCDController)
{
//WriteDirect(CMD_MODE,0x22);
//Gamma Setting
HW_PWM_CTRL_CLR(1 << DDI_DISPLAY_BACKLIGHT_PWM_CHANNEL);
WriteDirect(CMD_MODE,0x46);
WriteDirect(DATA_MODE,0x00D2);
WriteDirect(CMD_MODE,0x47);
WriteDirect(DATA_MODE,0x0050);
WriteDirect(CMD_MODE,0x48);
WriteDirect(DATA_MODE,0x0007);
WriteDirect(CMD_MODE,0x49);
WriteDirect(DATA_MODE,0x0043);
WriteDirect(CMD_MODE,0x4A);
WriteDirect(DATA_MODE,0x0044);
WriteDirect(CMD_MODE,0x4B);
WriteDirect(DATA_MODE,0x0077);
WriteDirect(CMD_MODE,0x4C);
WriteDirect(DATA_MODE,0x0066);
WriteDirect(CMD_MODE,0x4D);
WriteDirect(DATA_MODE,0x0016);
WriteDirect(CMD_MODE,0x4E);
WriteDirect(DATA_MODE,0x0012);
WriteDirect(CMD_MODE,0x4F);
WriteDirect(DATA_MODE,0x004C);
WriteDirect(CMD_MODE,0x50);
WriteDirect(DATA_MODE,0x0046);
WriteDirect(CMD_MODE,0x51);
WriteDirect(DATA_MODE,0x0044);
//Gamma end
//240*320window setting
WriteDirect(CMD_MODE,0x02);
WriteDirect(DATA_MODE,0x0000);
WriteDirect(CMD_MODE,0x03);
WriteDirect(DATA_MODE,0x0000);
WriteDirect(CMD_MODE,0x04);
WriteDirect(DATA_MODE,0x0000);
WriteDirect(CMD_MODE,0x05);
WriteDirect(DATA_MODE,0x00EF);
WriteDirect(CMD_MODE,0x06);
WriteDirect(DATA_MODE,0x0000);
WriteDirect(CMD_MODE,0x07);
WriteDirect(DATA_MODE,0x0000);
WriteDirect(CMD_MODE,0x08);
WriteDirect(DATA_MODE,0x0001);
WriteDirect(CMD_MODE,0x09);
WriteDirect(DATA_MODE,0x003F);
//WriteDirect(CMD_MODE,0x22);
//Display setting
WriteDirect(CMD_MODE,0x01);
WriteDirect(DATA_MODE,0x0006); //0x0006
WriteDirect(CMD_MODE,0x16);
WriteDirect(DATA_MODE,0x00A8);//0X48//0x00C8//0x0068//0x0008//0x00A8
WriteDirect(CMD_MODE,0x23);
WriteDirect(DATA_MODE,0x0095);
WriteDirect(CMD_MODE,0x24);
WriteDirect(DATA_MODE,0x0095);
WriteDirect(CMD_MODE,0x25);
WriteDirect(DATA_MODE,0x00FF);
WriteDirect(CMD_MODE,0x27);
WriteDirect(DATA_MODE,0x0002);
WriteDirect(CMD_MODE,0x28);
WriteDirect(DATA_MODE,0x0002);
WriteDirect(CMD_MODE,0x29);
WriteDirect(DATA_MODE,0x0002);
WriteDirect(CMD_MODE,0x2A);
WriteDirect(DATA_MODE,0x0002);
WriteDirect(CMD_MODE,0x2C);
WriteDirect(DATA_MODE,0x0002);
WriteDirect(CMD_MODE,0x2D);
WriteDirect(DATA_MODE,0x0002);
WriteDirect(CMD_MODE,0x3A);
WriteDirect(DATA_MODE,0x0001);
WriteDirect(CMD_MODE,0x3B);
WriteDirect(DATA_MODE,0x0001);
WriteDirect(CMD_MODE,0x3C);
WriteDirect(DATA_MODE,0x00F0);
WriteDirect(CMD_MODE,0x3D);
WriteDirect(DATA_MODE,0x0000);
delay(20);
WriteDirect(CMD_MODE,0x35);
WriteDirect(DATA_MODE,0x0038);
WriteDirect(CMD_MODE,0x36);
WriteDirect(DATA_MODE,0x0078);
WriteDirect(CMD_MODE,0x3E);
WriteDirect(DATA_MODE,0x0038);
WriteDirect(CMD_MODE,0x40);
WriteDirect(DATA_MODE,0x000F);
WriteDirect(CMD_MODE,0x41);
WriteDirect(DATA_MODE,0x00F0);
WriteDirect(CMD_MODE,0x19);
WriteDirect(DATA_MODE,0x0049);
WriteDirect(CMD_MODE,0x93);
WriteDirect(DATA_MODE,0x0003);
delay(10);
WriteDirect(CMD_MODE,0x20);
WriteDirect(DATA_MODE,0x0020);
WriteDirect(CMD_MODE,0x1D);
WriteDirect(DATA_MODE,0x0005);
delay(10);
WriteDirect(CMD_MODE,0x1E);
WriteDirect(DATA_MODE,0x0006);
WriteDirect(CMD_MODE,0x1F);
WriteDirect(DATA_MODE,0x0008);
//VCOM setting
WriteDirect(CMD_MODE,0x44);
WriteDirect(DATA_MODE,0x0040);
WriteDirect(CMD_MODE,0x45);
WriteDirect(DATA_MODE,0x0012);
delay(10);
WriteDirect(CMD_MODE,0x1C);
WriteDirect(DATA_MODE,0x0004);
delay(20);
WriteDirect(CMD_MODE,0x43);
WriteDirect(DATA_MODE,0x0080);
delay(5);
WriteDirect(CMD_MODE,0x1B);
WriteDirect(DATA_MODE,0x0008);//0X00,0X08
delay(40);
WriteDirect(CMD_MODE,0x1B);
WriteDirect(DATA_MODE,0x0010);//0X00,0X10
delay(40);
WriteDirect(CMD_MODE,0x43);
WriteDirect(DATA_MODE,0x0080);
delay(10);
//Display ON setting
WriteDirect(CMD_MODE,0x90);
WriteDirect(DATA_MODE,0x007F);
WriteDirect(CMD_MODE,0x26);
WriteDirect(DATA_MODE,0x0004);
delay(40);
WriteDirect(CMD_MODE,0x26);
WriteDirect(DATA_MODE,0x0024);
delay(40);
WriteDirect(CMD_MODE,0x26);
WriteDirect(DATA_MODE,0x002C);
delay(40);
WriteDirect(CMD_MODE,0x26);
WriteDirect(DATA_MODE,0x003C);
//Set internal VDDD voltage
WriteDirect(CMD_MODE,0x57);
WriteDirect(DATA_MODE,0x0002);
WriteDirect(CMD_MODE,0x55);
WriteDirect(DATA_MODE,0x0000);
WriteDirect(CMD_MODE,0x57);
WriteDirect(DATA_MODE,0x0000);
HW_PWM_CTRL_SET(1 << DDI_DISPLAY_BACKLIGHT_PWM_CHANNEL);
}
g_bInitializeLCDController = TRUE;
}
/*
#ifdef RTOS_THREADX // VSYNC only supported in threadx builds
////////////////////////////////////////////////////////////////////////////////
//! \fn static void ddi_display_controllerVsyncIsr(void *)
//!
//! \brief Services the VSYNC interrupt
//!
//! \fntype Deferred service routine
//!
//! This function signals the occurrence of the VSYNC signal. The VSYNC event
//! is signalled via semaphore.
//!
////////////////////////////////////////////////////////////////////////////////
static void ddi_display_controller_VsyncIsr(void *vUnused)
{
// Check to see if this is our interrupt
if( CHECK_VSYNC_IRQ_STATUS() )
{
// Put the VSYNC semaphore as a binary semaphore
// There only ever needs to be at most one instance
tx_semaphore_put(pVideoSemaphore);
// Disable and clear the interrupt
DISABLE_VSYNC_IRQ();
CLEAR_VSYNC_IRQ_STATUS();
}
// If it's not our interrupt, ignore this
}
*/
////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -