rt-thread/bsp/imxrt/imxrt1170-nxp-evk/m7/video/display/rm68200/fsl_rm68200.c

410 lines
8.6 KiB
C

/*
* Copyright 2019-2021 NXP
* All rights reserved.
*
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "fsl_display.h"
#include "fsl_rm68200.h"
/*******************************************************************************
* Definitions
******************************************************************************/
#define RM68200_DelayMs VIDEO_DelayMs
/*******************************************************************************
* Variables
******************************************************************************/
uint8_t RM68200_DDB_START[5] = {0x00, 0x00, 0x00, 0x00, 0xff};
static const uint8_t lcmInitPage0Setting[][2] = {
{0xFE, 0x01}, {0x24, 0xC0}, {0x25, 0x53}, {0x26, 0x00}, {0x2B, 0xE5}, {0x27, 0x0A},
{0x29, 0x0A}, {0x16, 0x52}, {0x2F, 0x53}, {0x34, 0x5A}, {0x1B, 0x00}, {0x12, 0x0A},
{0x1A, 0x06}, {0x46, 0x56}, {0x52, 0xA0}, {0x53, 0x00}, {0x54, 0xA0}, {0x55, 0x00},
};
static const uint8_t lcmInitSetting[][2] = {
{0xFE, 0x03},
{0x00, 0x05},
{0x02, 0x0B},
{0x03, 0x0F},
{0x04, 0x7D},
{0x05, 0x00},
{0x06, 0x50},
{0x07, 0x05},
{0x08, 0x16},
{0x09, 0x0D},
{0x0A, 0x11},
{0x0B, 0x7D},
{0x0C, 0x00},
{0x0D, 0x50},
{0x0E, 0x07},
{0x0F, 0x08},
{0x10, 0x01},
{0x11, 0x02},
{0x12, 0x00},
{0x13, 0x7D},
{0x14, 0x00},
{0x15, 0x85},
{0x16, 0x08},
{0x17, 0x03},
{0x18, 0x04},
{0x19, 0x05},
{0x1A, 0x06},
{0x1B, 0x00},
{0x1C, 0x7D},
{0x1D, 0x00},
{0x1E, 0x85},
{0x1F, 0x08},
{0x20, 0x00},
{0x21, 0x00},
{0x22, 0x00},
{0x23, 0x00},
{0x24, 0x00},
{0x25, 0x00},
{0x26, 0x00},
{0x27, 0x00},
{0x28, 0x00},
{0x29, 0x00},
{0x2A, 0x07},
{0x2B, 0x08},
{0x2D, 0x01},
{0x2F, 0x02},
{0x30, 0x00},
{0x31, 0x40},
{0x32, 0x05},
{0x33, 0x08},
{0x34, 0x54},
{0x35, 0x7D},
{0x36, 0x00},
{0x37, 0x03},
{0x38, 0x04},
{0x39, 0x05},
{0x3A, 0x06},
{0x3B, 0x00},
{0x3D, 0x40},
{0x3F, 0x05},
{0x40, 0x08},
{0x41, 0x54},
{0x42, 0x7D},
{0x43, 0x00},
{0x44, 0x00},
{0x45, 0x00},
{0x46, 0x00},
{0x47, 0x00},
{0x48, 0x00},
{0x49, 0x00},
{0x4A, 0x00},
{0x4B, 0x00},
{0x4C, 0x00},
{0x4D, 0x00},
{0x4E, 0x00},
{0x4F, 0x00},
{0x50, 0x00},
{0x51, 0x00},
{0x52, 0x00},
{0x53, 0x00},
{0x54, 0x00},
{0x55, 0x00},
{0x56, 0x00},
{0x58, 0x00},
{0x59, 0x00},
{0x5A, 0x00},
{0x5B, 0x00},
{0x5C, 0x00},
{0x5D, 0x00},
{0x5E, 0x00},
{0x5F, 0x00},
{0x60, 0x00},
{0x61, 0x00},
{0x62, 0x00},
{0x63, 0x00},
{0x64, 0x00},
{0x65, 0x00},
{0x66, 0x00},
{0x67, 0x00},
{0x68, 0x00},
{0x69, 0x00},
{0x6A, 0x00},
{0x6B, 0x00},
{0x6C, 0x00},
{0x6D, 0x00},
{0x6E, 0x00},
{0x6F, 0x00},
{0x70, 0x00},
{0x71, 0x00},
{0x72, 0x20},
{0x73, 0x00},
{0x74, 0x08},
{0x75, 0x08},
{0x76, 0x08},
{0x77, 0x08},
{0x78, 0x08},
{0x79, 0x08},
{0x7A, 0x00},
{0x7B, 0x00},
{0x7C, 0x00},
{0x7D, 0x00},
{0x7E, 0xBF},
{0x7F, 0x02},
{0x80, 0x06},
{0x81, 0x14},
{0x82, 0x10},
{0x83, 0x16},
{0x84, 0x12},
{0x85, 0x08},
{0x86, 0x3F},
{0x87, 0x3F},
{0x88, 0x3F},
{0x89, 0x3F},
{0x8A, 0x3F},
{0x8B, 0x0C},
{0x8C, 0x0A},
{0x8D, 0x0E},
{0x8E, 0x3F},
{0x8F, 0x3F},
{0x90, 0x00},
{0x91, 0x04},
{0x92, 0x3F},
{0x93, 0x3F},
{0x94, 0x3F},
{0x95, 0x3F},
{0x96, 0x05},
{0x97, 0x01},
{0x98, 0x3F},
{0x99, 0x3F},
{0x9A, 0x0F},
{0x9B, 0x0B},
{0x9C, 0x0D},
{0x9D, 0x3F},
{0x9E, 0x3F},
{0x9F, 0x3F},
{0xA0, 0x3F},
{0xA2, 0x3F},
{0xA3, 0x09},
{0xA4, 0x13},
{0xA5, 0x17},
{0xA6, 0x11},
{0xA7, 0x15},
{0xA9, 0x07},
{0xAA, 0x03},
{0xAB, 0x3F},
{0xAC, 0x3F},
{0xAD, 0x05},
{0xAE, 0x01},
{0xAF, 0x17},
{0xB0, 0x13},
{0xB1, 0x15},
{0xB2, 0x11},
{0xB3, 0x0F},
{0xB4, 0x3F},
{0xB5, 0x3F},
{0xB6, 0x3F},
{0xB7, 0x3F},
{0xB8, 0x3F},
{0xB9, 0x0B},
{0xBA, 0x0D},
{0xBB, 0x09},
{0xBC, 0x3F},
{0xBD, 0x3F},
{0xBE, 0x07},
{0xBF, 0x03},
{0xC0, 0x3F},
{0xC1, 0x3F},
{0xC2, 0x3F},
{0xC3, 0x3F},
{0xC4, 0x02},
{0xC5, 0x06},
{0xC6, 0x3F},
{0xC7, 0x3F},
{0xC8, 0x08},
{0xC9, 0x0C},
{0xCA, 0x0A},
{0xCB, 0x3F},
{0xCC, 0x3F},
{0xCD, 0x3F},
{0xCE, 0x3F},
{0xCF, 0x3F},
{0xD0, 0x0E},
{0xD1, 0x10},
{0xD2, 0x14},
{0xD3, 0x12},
{0xD4, 0x16},
{0xD5, 0x00},
{0xD6, 0x04},
{0xD7, 0x3F},
{0xDC, 0x02},
{0xDE, 0x12},
{0xFE, 0x0E},
{0x01, 0x75},
/* Gamma Settings */
{0xFE, 0x04},
{0x60, 0x00},
{0x61, 0x0C},
{0x62, 0x12},
{0x63, 0x0E},
{0x64, 0x06},
{0x65, 0x12},
{0x66, 0x0E},
{0x67, 0x0B},
{0x68, 0x15},
{0x69, 0x0B},
{0x6A, 0x10},
{0x6B, 0x07},
{0x6C, 0x0F},
{0x6D, 0x12},
{0x6E, 0x0C},
{0x6F, 0x00},
{0x70, 0x00},
{0x71, 0x0C},
{0x72, 0x12},
{0x73, 0x0E},
{0x74, 0x06},
{0x75, 0x12},
{0x76, 0x0E},
{0x77, 0x0B},
{0x78, 0x15},
{0x79, 0x0B},
{0x7A, 0x10},
{0x7B, 0x07},
{0x7C, 0x0F},
{0x7D, 0x12},
{0x7E, 0x0C},
{0x7F, 0x00},
/* Page 0. */
{0xFE, 0x00},
{0x11, 0x00},
};
const display_operations_t rm68200_ops = {
.init = RM68200_Init,
.deinit = RM68200_Deinit,
.start = RM68200_Start,
.stop = RM68200_Stop,
};
/*******************************************************************************
* Code
******************************************************************************/
status_t RM68200_Init(display_handle_t *handle, const display_config_t *config)
{
uint32_t i;
uint8_t param[2];
status_t status = kStatus_Success;
const rm68200_resource_t *resource = (const rm68200_resource_t *)(handle->resource);
mipi_dsi_device_t *dsiDevice = resource->dsiDevice;
/* Only support 720 * 1280 */
if (config->resolution != FSL_VIDEO_RESOLUTION(720, 1280))
{
return kStatus_InvalidArgument;
}
/* Power on. */
resource->pullPowerPin(true);
RM68200_DelayMs(1);
/* Perform reset. */
resource->pullResetPin(false);
RM68200_DelayMs(1);
resource->pullResetPin(true);
RM68200_DelayMs(5);
/* Set the LCM page0 init settings. */
for (i = 0; i < ARRAY_SIZE(lcmInitPage0Setting); i++)
{
status = MIPI_DSI_GenericWrite(dsiDevice, lcmInitPage0Setting[i], 2);
if (kStatus_Success != status)
{
return status;
}
}
/* Data lane number selection. */
param[0] = 0x5FU;
param[1] = 0x10U | (config->dsiLanes - 1U);
status = MIPI_DSI_GenericWrite(dsiDevice, param, 2);
if (kStatus_Success != status)
{
return status;
}
/* Set the LCM init settings. */
for (i = 0; i < ARRAY_SIZE(lcmInitSetting); i++)
{
status = MIPI_DSI_GenericWrite(dsiDevice, lcmInitSetting[i], 2);
if (kStatus_Success != status)
{
return status;
}
}
RM68200_DelayMs(200);
param[0] = 0x29;
param[1] = 0x00;
status = MIPI_DSI_GenericWrite(dsiDevice, param, 2);
if (kStatus_Success != status)
{
return status;
}
RM68200_DelayMs(100);
param[0] = 0x2c;
status = MIPI_DSI_GenericWrite(dsiDevice, param, 1);
if (kStatus_Success != status)
{
return status;
}
param[0] = 0x35;
param[1] = 0x00;
status = MIPI_DSI_GenericWrite(dsiDevice, param, 2);
if (kStatus_Success != status)
{
return status;
}
RM68200_DelayMs(200);
return kStatus_Success;
}
status_t RM68200_Deinit(display_handle_t *handle)
{
const rm68200_resource_t *resource = (const rm68200_resource_t *)(handle->resource);
mipi_dsi_device_t *dsiDevice = resource->dsiDevice;
(void)MIPI_DSI_DCS_EnterSleepMode(dsiDevice, true);
resource->pullResetPin(false);
resource->pullPowerPin(false);
return kStatus_Success;
}
status_t RM68200_Start(display_handle_t *handle)
{
const rm68200_resource_t *resource = (const rm68200_resource_t *)(handle->resource);
mipi_dsi_device_t *dsiDevice = resource->dsiDevice;
return MIPI_DSI_DCS_SetDisplayOn(dsiDevice, true);
}
status_t RM68200_Stop(display_handle_t *handle)
{
const rm68200_resource_t *resource = (const rm68200_resource_t *)(handle->resource);
mipi_dsi_device_t *dsiDevice = resource->dsiDevice;
return MIPI_DSI_DCS_SetDisplayOn(dsiDevice, false);
}