From ee137696de37f553b1b7b40cdc114e791ad48f18 Mon Sep 17 00:00:00 2001 From: Sylvain Lefebvre Date: Thu, 18 Jan 2024 22:14:33 +0100 Subject: [PATCH] ili9341 transpose --- frameworks/verilator/ParallelScreen.cpp | 45 ++++++++++++++++++++----- frameworks/verilator/ParallelScreen.h | 3 ++ 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/frameworks/verilator/ParallelScreen.cpp b/frameworks/verilator/ParallelScreen.cpp index 1e47e588..20951780 100644 --- a/frameworks/verilator/ParallelScreen.cpp +++ b/frameworks/verilator/ParallelScreen.cpp @@ -104,6 +104,9 @@ void ParallelScreen::cmd_idle_ILI9341() case 0x3A: m_command = std::bind( &ParallelScreen::cmd_mode_ILI9341, this ); break; + case 0x36: + m_command = std::bind( &ParallelScreen::cmd_madctl_ILI9341, this ); + break; default: break; } @@ -123,6 +126,19 @@ void ParallelScreen::cmd_mode_ILI9341() // ---------------------------------------------------------------------------- +void ParallelScreen::cmd_madctl_ILI9341() +{ + if ((m_byte & 0x20) != 0) { + fprintf(stdout,"screen in row major mode\n"); + m_row_major = true; + } else { + m_row_major = false; + } + set_idle(); +} + +// ---------------------------------------------------------------------------- + void ParallelScreen::cmd_start_end(int *p_start,int *p_end,int nbytes) { fprintf(stdout,"cmd_start_end, byte: %x (step:%d)\n",m_byte,m_step); @@ -151,8 +167,9 @@ void ParallelScreen::cmd_start_end(int *p_start,int *p_end,int nbytes) void ParallelScreen::cmd_write_ram() { if (!m_dc) { - // exit - set_idle(); + // command + cmd_idle_ILI9341(); + return; } if (m_step == 0) { // first time @@ -178,13 +195,25 @@ void ParallelScreen::cmd_write_ram() if (m_step > 2) { // move to next pixel m_step = 1; - ++ m_y_cur; - if (m_y_cur > m_y_end) { - m_y_cur = m_y_start; + if (!m_row_major) { + ++ m_y_cur; + if (m_y_cur > m_y_end) { + m_y_cur = m_y_start; + ++ m_x_cur; + if (m_x_cur > m_x_end) { + m_x_cur = m_x_start; + m_framebuffer_changed = true; + } + } + } else { ++ m_x_cur; - if (m_x_cur > m_x_end) { - m_x_cur = m_x_start; - m_framebuffer_changed = true; + if (m_x_cur > m_y_end) { + m_x_cur = m_y_start; + ++ m_y_cur; + if (m_y_cur > m_x_end) { + m_y_cur = m_x_start; + m_framebuffer_changed = true; + } } } } diff --git a/frameworks/verilator/ParallelScreen.h b/frameworks/verilator/ParallelScreen.h index d2663767..806a3e55 100644 --- a/frameworks/verilator/ParallelScreen.h +++ b/frameworks/verilator/ParallelScreen.h @@ -68,6 +68,8 @@ class ParallelScreen : public DisplayChip int m_x_cur = 0; int m_y_cur = 0; + + bool m_row_major = false; LibSL::Math::v4b m_rgb; @@ -77,6 +79,7 @@ class ParallelScreen : public DisplayChip void cmd_idle_ILI9341(); void cmd_mode_ILI9341(); + void cmd_madctl_ILI9341(); void cmd_start_end(int *p_start,int *p_end,int nbytes); void cmd_write_ram();