mirror of
https://github.com/CTCaer/hekate
synced 2024-12-22 19:31:12 +00:00
display: Make dsi write buffer bigger
This commit is contained in:
parent
60b629e57f
commit
d0d943c9c3
1 changed files with 11 additions and 7 deletions
|
@ -20,6 +20,7 @@
|
||||||
#include "di.h"
|
#include "di.h"
|
||||||
#include <power/max77620.h>
|
#include <power/max77620.h>
|
||||||
#include <power/max7762x.h>
|
#include <power/max7762x.h>
|
||||||
|
#include <mem/heap.h>
|
||||||
#include <soc/clock.h>
|
#include <soc/clock.h>
|
||||||
#include <soc/gpio.h>
|
#include <soc/gpio.h>
|
||||||
#include <soc/hw_init.h>
|
#include <soc/hw_init.h>
|
||||||
|
@ -170,9 +171,9 @@ int display_dsi_read(u8 cmd, u32 len, void *data, bool video_enabled)
|
||||||
|
|
||||||
void display_dsi_write(u8 cmd, u32 len, void *data, bool video_enabled)
|
void display_dsi_write(u8 cmd, u32 len, void *data, bool video_enabled)
|
||||||
{
|
{
|
||||||
|
u8 *fifo8;
|
||||||
|
u32 *fifo32;
|
||||||
u32 host_control;
|
u32 host_control;
|
||||||
u32 fifo32[DSI_STATUS_RX_FIFO_SIZE] = {0};
|
|
||||||
u8 *fifo8 = (u8 *)fifo32;
|
|
||||||
|
|
||||||
// Enable host cmd packets during video and save host control.
|
// Enable host cmd packets during video and save host control.
|
||||||
if (video_enabled)
|
if (video_enabled)
|
||||||
|
@ -193,6 +194,8 @@ void display_dsi_write(u8 cmd, u32 len, void *data, bool video_enabled)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
fifo32 = calloc(DSI_STATUS_RX_FIFO_SIZE * 8, 4);
|
||||||
|
fifo8 = (u8 *)fifo32;
|
||||||
fifo32[0] = (len << 8) | MIPI_DSI_DCS_LONG_WRITE;
|
fifo32[0] = (len << 8) | MIPI_DSI_DCS_LONG_WRITE;
|
||||||
fifo8[4] = cmd;
|
fifo8[4] = cmd;
|
||||||
memcpy(&fifo8[5], data, len);
|
memcpy(&fifo8[5], data, len);
|
||||||
|
@ -200,6 +203,7 @@ void display_dsi_write(u8 cmd, u32 len, void *data, bool video_enabled)
|
||||||
for (u32 i = 0; i < (ALIGN(len, 4) / 4); i++)
|
for (u32 i = 0; i < (ALIGN(len, 4) / 4); i++)
|
||||||
DSI(_DSIREG(DSI_WR_DATA)) = fifo32[i];
|
DSI(_DSIREG(DSI_WR_DATA)) = fifo32[i];
|
||||||
DSI(_DSIREG(DSI_TRIGGER)) = DSI_TRIGGER_HOST;
|
DSI(_DSIREG(DSI_TRIGGER)) = DSI_TRIGGER_HOST;
|
||||||
|
free(fifo32);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -215,7 +219,7 @@ void display_dsi_write(u8 cmd, u32 len, void *data, bool video_enabled)
|
||||||
void display_init()
|
void display_init()
|
||||||
{
|
{
|
||||||
// Check if display is already initialized.
|
// Check if display is already initialized.
|
||||||
if (CLOCK(CLK_RST_CONTROLLER_CLK_ENB_L_SET) & BIT(CLK_L_DISP1))
|
if (CLOCK(CLK_RST_CONTROLLER_CLK_OUT_ENB_L) & BIT(CLK_L_DISP1))
|
||||||
_display_panel_and_hw_end(true);
|
_display_panel_and_hw_end(true);
|
||||||
|
|
||||||
// Get Chip ID.
|
// Get Chip ID.
|
||||||
|
@ -293,7 +297,7 @@ void display_init()
|
||||||
|
|
||||||
// Set DISP1 clock source and parent clock.
|
// Set DISP1 clock source and parent clock.
|
||||||
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_DISP1) = 0x40000000; // PLLD_OUT.
|
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_DISP1) = 0x40000000; // PLLD_OUT.
|
||||||
u32 plld_div = (3 << 20) | (20 << 11) | 1; // DIVM: 1, DIVN: 20, DIVP: 3. PLLD_OUT: 768 MHz, PLLD_OUT0 (DSI): 96 MHz.
|
u32 plld_div = (3 << 20) | (20 << 11) | 1; // DIVM: 1, DIVN: 20, DIVP: 3. PLLD_OUT: 768 MHz, PLLD_OUT0 (DSI): 97.5 MHz (offset).
|
||||||
CLOCK(CLK_RST_CONTROLLER_PLLD_BASE) = PLLCX_BASE_ENABLE | PLLCX_BASE_LOCK | plld_div;
|
CLOCK(CLK_RST_CONTROLLER_PLLD_BASE) = PLLCX_BASE_ENABLE | PLLCX_BASE_LOCK | plld_div;
|
||||||
|
|
||||||
if (tegra_t210)
|
if (tegra_t210)
|
||||||
|
@ -407,11 +411,11 @@ void display_init()
|
||||||
_display_dsi_send_cmd(MIPI_DSI_DCS_SHORT_WRITE, MIPI_DCS_SET_DISPLAY_ON, 20000);
|
_display_dsi_send_cmd(MIPI_DSI_DCS_SHORT_WRITE, MIPI_DCS_SET_DISPLAY_ON, 20000);
|
||||||
|
|
||||||
// Configure PLLD for DISP1.
|
// Configure PLLD for DISP1.
|
||||||
plld_div = (1 << 20) | (24 << 11) | 1; // DIVM: 1, DIVN: 24, DIVP: 1. PLLD_OUT: 768 MHz, PLLD_OUT0 (DSI): 230.4 MHz.
|
plld_div = (1 << 20) | (24 << 11) | 1; // DIVM: 1, DIVN: 24, DIVP: 1. PLLD_OUT: 768 MHz, PLLD_OUT0 (DSI): 234 MHz (offset).
|
||||||
CLOCK(CLK_RST_CONTROLLER_PLLD_BASE) = PLLCX_BASE_ENABLE | PLLCX_BASE_LOCK | plld_div;
|
CLOCK(CLK_RST_CONTROLLER_PLLD_BASE) = PLLCX_BASE_ENABLE | PLLCX_BASE_LOCK | plld_div;
|
||||||
|
|
||||||
if (tegra_t210)
|
if (tegra_t210)
|
||||||
CLOCK(CLK_RST_CONTROLLER_PLLD_MISC1) = 0x20; // PLLD_SETUP
|
CLOCK(CLK_RST_CONTROLLER_PLLD_MISC1) = 0x20; // PLLD_SETUP.
|
||||||
else
|
else
|
||||||
CLOCK(CLK_RST_CONTROLLER_PLLD_MISC1) = 0;
|
CLOCK(CLK_RST_CONTROLLER_PLLD_MISC1) = 0;
|
||||||
CLOCK(CLK_RST_CONTROLLER_PLLD_MISC) = 0x2DFC00; // Use new PLLD_SDM_DIN.
|
CLOCK(CLK_RST_CONTROLLER_PLLD_MISC) = 0x2DFC00; // Use new PLLD_SDM_DIN.
|
||||||
|
@ -420,7 +424,7 @@ void display_init()
|
||||||
DSI(_DSIREG(DSI_PAD_CONTROL_1)) = 0;
|
DSI(_DSIREG(DSI_PAD_CONTROL_1)) = 0;
|
||||||
DSI(_DSIREG(DSI_PHY_TIMING_0)) = tegra_t210 ? 0x6070601 : 0x6070603;
|
DSI(_DSIREG(DSI_PHY_TIMING_0)) = tegra_t210 ? 0x6070601 : 0x6070603;
|
||||||
exec_cfg((u32 *)DSI_BASE, _display_dsi_packet_config, 19);
|
exec_cfg((u32 *)DSI_BASE, _display_dsi_packet_config, 19);
|
||||||
// Set pixel clock dividers: 230.4 / 3 / 1 = 76.8 MHz. 60 Hz.
|
// Set pixel clock dividers: 234 / 3 / 1 = 78 MHz (offset) for 60 Hz.
|
||||||
DISPLAY_A(_DIREG(DC_DISP_DISP_CLOCK_CONTROL)) = PIXEL_CLK_DIVIDER_PCD1 | SHIFT_CLK_DIVIDER(4); // 4: div3.
|
DISPLAY_A(_DIREG(DC_DISP_DISP_CLOCK_CONTROL)) = PIXEL_CLK_DIVIDER_PCD1 | SHIFT_CLK_DIVIDER(4); // 4: div3.
|
||||||
exec_cfg((u32 *)DSI_BASE, _display_dsi_mode_config, 10);
|
exec_cfg((u32 *)DSI_BASE, _display_dsi_mode_config, 10);
|
||||||
usleep(10000);
|
usleep(10000);
|
||||||
|
|
Loading…
Reference in a new issue