From 3aeb586bae1909625ebdf0801de5906d06513605 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sun, 18 Dec 2022 10:46:22 +0800 Subject: [PATCH] Fixed the black rows yay! --- README.md | 24 ++++++++++++------------ render.zig | 7 ++++++- test/test_a64_de.c | 19 ++++++++++++------- test/test_a64_mipi_dsi.c | 1 + 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 9128a8a..6046ec9 100644 --- a/README.md +++ b/README.md @@ -4688,25 +4688,25 @@ This prevents `sinfo` from garbling the `printf` output... NuttShell (NSH) NuttX-11.0.0-RC2 ``` -FYI: `printf` Console Output Stream is locked and unlocked with a Mutex... +FYI: `printf` Console Output Stream is locked and unlocked with a Mutex. Let's log the locking and unlocking of the Mutex... -https://github.com/apache/nuttx/blob/master/libs/libc/stdio/lib_libfilelock.c#L39-L64 +[nuttx/libs/libc/stdio/lib_libfilelock.c](https://github.com/apache/nuttx/blob/master/libs/libc/stdio/lib_libfilelock.c#L39-L64) ```c void flockfile(FAR struct file_struct *stream) { - up_putc('{');//// + up_putc('{'); // Log the Mutex Locking nxrmutex_lock(&stream->fs_lock); } ... void funlockfile(FAR struct file_struct *stream) { - up_putc('}');//// + up_putc('}'); // Log the Mutex Unlocking nxrmutex_unlock(&stream->fs_lock); } ``` -Output log shows that `{` and `}` are nested... +Output log shows that `{` and `}` (Mutex Locking and Unlocking) are nested... ```text nx_start_application: Starting init thread @@ -4729,12 +4729,12 @@ Let's print the Thread ID and Mutex Count... void flockfile(FAR struct file_struct *stream) { nxrmutex_lock(&stream->fs_lock); - _info("%p, thread=%d, mutex.count=%d\n", stream, gettid(), stream->fs_lock.count); //// + _info("%p, thread=%d, mutex.count=%d\n", stream, gettid(), stream->fs_lock.count); // Log the Thread ID and Mutex Count } void funlockfile(FAR struct file_struct *stream) { - _info("%p, thread=%d, mutex.count=%d\n", stream, gettid(), stream->fs_lock.count); //// + _info("%p, thread=%d, mutex.count=%d\n", stream, gettid(), stream->fs_lock.count); // Log the Thread ID and Mutex Count nxrmutex_unlock(&stream->fs_lock); } ``` @@ -4750,22 +4750,22 @@ funlockfile: 0x40a5cc78, thread=2, mutex.count=3 funlockfile: 0x40a5cc78, thread=2, mutex.count=2 ``` -That's because [`nxrmutex_lock`](https://github.com/apache/nuttx/blob/master/include/nuttx/mutex.h#L335-L377) allows the Mutex to be locked multiple times within the same thread. +Why? That's because [`nxrmutex_lock`](https://github.com/apache/nuttx/blob/master/include/nuttx/mutex.h#L335-L377) allows the Mutex to be locked multiple times __within the same thread.__ FYI: Here's how we verify whether our code is called by multiple CPU Cores... ```c -#include "../arch/arm64/src/common/arm64_arch.h" //// -_info("up_cpu_index=%d\n", MPIDR_TO_CORE(GET_MPIDR())); //// +#include "../arch/arm64/src/common/arm64_arch.h" +_info("up_cpu_index=%d\n", MPIDR_TO_CORE(GET_MPIDR())); // Shows: `up_cpu_index=0` -_info("mpidr_el1=%p\n", read_sysreg(mpidr_el1)); //// +_info("mpidr_el1=%p\n", read_sysreg(mpidr_el1)); // Shows `mpidr_el1=0x80000000` ``` FYI: How `printf` works... -[`printf`](https://github.com/apache/nuttx/blob/master/libs/libc/stdio/lib_printf.c#L32-L51_ calls... +[`printf`](https://github.com/apache/nuttx/blob/master/libs/libc/stdio/lib_printf.c#L32-L51) calls... - [`vfprintf`](https://github.com/apache/nuttx/blob/master/libs/libc/stdio/lib_vfprintf.c#L34-L56), which calls... - [`libvsprintf`](https://github.com/apache/nuttx/blob/master/libs/libc/stdio/lib_libvsprintf.c#L1336-L1381), which calls... - [`vsprintf_internal`](https://github.com/apache/nuttx/blob/master/libs/libc/stdio/lib_libvsprintf.c#L171-L1332), which calls... diff --git a/render.zig b/render.zig index 14d7a93..2ac03c9 100644 --- a/render.zig +++ b/render.zig @@ -1152,6 +1152,7 @@ pub export fn hello_main( // _ = c.sleep(1); // Init Timing Controller TCON0 (in C) + // https://github.com/lupyuen2/wip-pinephone-nuttx/blob/tcon2/arch/arm64/src/a64/a64_tcon0.c#L180-L474 _ = a64_tcon0_init(); // Init PMIC (in Zig) @@ -1161,9 +1162,11 @@ pub export fn hello_main( // _ = c.sleep(1); // Enable MIPI DSI Block (in C) + // https://github.com/apache/nuttx/blob/master/arch/arm64/src/a64/a64_mipi_dsi.c#L526-L914 _ = a64_mipi_dsi_enable(); // Enable MIPI Display Physical Layer (in C) + // https://github.com/apache/nuttx/blob/master/arch/arm64/src/a64/a64_mipi_dphy.c#L86-L162 _ = a64_mipi_dphy_enable(); // Reset LCD Panel (in Zig) @@ -1180,13 +1183,15 @@ pub export fn hello_main( // TODO: Remove this: dsi.panel_init(); // Start MIPI DSI HSC and HSD (in C) + // https://github.com/apache/nuttx/blob/master/arch/arm64/src/a64/a64_mipi_dsi.c#L914-L993 _ = a64_mipi_dsi_start(); // Init Display Engine (in C) + // https://github.com/lupyuen2/wip-pinephone-nuttx/blob/tcon2/arch/arm64/src/a64/a64_de.c _ = a64_de_init(); // Wait 160 milliseconds - _ = c.usleep(160000); + _ = c.usleep(160_000); // Render Graphics with Display Engine (in C) // https://github.com/lupyuen/pinephone-nuttx/blob/main/test/test_a64_de.c diff --git a/test/test_a64_de.c b/test/test_a64_de.c index bcbb35c..e02c593 100644 --- a/test/test_a64_de.c +++ b/test/test_a64_de.c @@ -104,9 +104,6 @@ int render_graphics(void) DEBUGASSERT(overlayInfo[1].fblen == (overlayInfo[1].sarea.w) * overlayInfo[1].sarea.h * 4); DEBUGASSERT(overlayInfo[1].stride == overlayInfo[1].sarea.w * 4); - // Fill Framebuffer with Test Pattern - test_pattern(); - // Init the UI Blender for PinePhone's A64 Display Engine int ret = a64_de_blender_init(); DEBUGASSERT(ret == OK); @@ -120,6 +117,7 @@ int render_graphics(void) #endif // !__NuttX__ // Init the Base UI Channel + // https://github.com/lupyuen2/wip-pinephone-nuttx/blob/tcon2/arch/arm64/src/a64/a64_de.c ret = a64_de_ui_channel_init( 1, // UI Channel Number (1 for Base UI Channel) planeInfo.fbmem, // Start of frame buffer memory @@ -133,6 +131,7 @@ int render_graphics(void) DEBUGASSERT(ret == OK); // Init the 2 Overlay UI Channels + // https://github.com/lupyuen2/wip-pinephone-nuttx/blob/tcon2/arch/arm64/src/a64/a64_de.c int i; for (i = 0; i < sizeof(overlayInfo) / sizeof(overlayInfo[0]); i++) { @@ -151,13 +150,19 @@ int render_graphics(void) } // Set UI Blender Route, enable Blender Pipes and apply the settings + // https://github.com/lupyuen2/wip-pinephone-nuttx/blob/tcon2/arch/arm64/src/a64/a64_de.c ret = a64_de_enable(CHANNELS); DEBUGASSERT(ret == OK); + // Fill Framebuffer with Test Pattern. + // Must be called after Display Engine is Enabled, or black rows will appear. + test_pattern(); + return OK; } -// Fill the Framebuffers with a Test Pattern +// Fill the Framebuffers with a Test Pattern. +// Must be called after Display Engine is Enabled, or black rows will appear. static void test_pattern(void) { // Zero the Framebuffers @@ -188,7 +193,7 @@ static void test_pattern(void) fb0[i] = 0x80800000; } - // This is needed to reduce the missing lines, not sure why + // Needed to fix black rows, not sure why ARM64_DMB(); ARM64_DSB(); ARM64_ISB(); @@ -202,7 +207,7 @@ static void test_pattern(void) // Colours are in ARGB 8888 format fb1[i] = 0x80FFFFFF; - // This is needed to reduce the missing lines, not sure why + // Needed to fix black rows, not sure why ARM64_DMB(); ARM64_DSB(); ARM64_ISB(); @@ -234,7 +239,7 @@ static void test_pattern(void) fb2[p] = 0x00000000; // Transparent Black in ARGB 8888 Format } - // This is needed to reduce the missing lines, not sure why + // Needed to fix black rows, not sure why ARM64_DMB(); ARM64_DSB(); ARM64_ISB(); diff --git a/test/test_a64_mipi_dsi.c b/test/test_a64_mipi_dsi.c index 3562159..9d95e38 100644 --- a/test/test_a64_mipi_dsi.c +++ b/test/test_a64_mipi_dsi.c @@ -11,6 +11,7 @@ static int write_dcs(const uint8_t *buf, size_t len) assert(len > 0); // Do DCS Short Write or Long Write depending on command length + // https://github.com/apache/nuttx/blob/master/arch/arm64/src/a64/a64_mipi_dsi.c#L366-L526 switch (len) { // DCS Short Write (without parameter)