From e4aafca7c305d0dac4f734a7d0c956ddee238c9f Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Thu, 4 Feb 2021 20:44:27 -0800 Subject: [PATCH] [fb] Use system_map_mmio to map framebuffer Update fb driver to use new j6_init_desc_framebuffer format with physical address, and system_map_mmio to map the framebuffer into its memory. --- src/drivers/fb/main.cpp | 26 ++++++++++++++++++++++++-- src/drivers/fb/screen.cpp | 11 +++++++---- src/drivers/fb/screen.h | 6 ++++-- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/drivers/fb/main.cpp b/src/drivers/fb/main.cpp index 1ca3509..b37943f 100644 --- a/src/drivers/fb/main.cpp +++ b/src/drivers/fb/main.cpp @@ -4,6 +4,7 @@ #include "j6/init.h" #include "j6/errors.h" +#include "j6/flags.h" #include "j6/signals.h" #include "j6/syscalls.h" #include "j6/types.h" @@ -18,6 +19,7 @@ extern "C" { } extern j6_handle_t __handle_sys; +extern j6_handle_t __handle_self; struct entry { @@ -45,15 +47,35 @@ main(int argc, const char **argv) } } - if (!fb || fb->addr == nullptr) { + if (!fb || fb->addr == 0) { j6_system_log("fb driver didn't find a framebuffer, exiting"); return 1; } + j6_handle_t fb_handle = j6_handle_invalid; + uint32_t flags = + j6_vm_flag_write | + j6_vm_flag_write_combine; + j6_status_t s = j6_system_map_mmio(__handle_sys, &fb_handle, fb->addr, fb->size, flags); + if (s != j6_status_ok) { + return s; + } + + s = j6_vma_map(fb_handle, __handle_self, fb->addr); + if (s != j6_status_ok) { + return s; + } + const screen::pixel_order order = (fb->flags & 1) ? screen::pixel_order::bgr8 : screen::pixel_order::rgb8; - screen scr(fb->addr, fb->horizontal, fb->vertical, order); + screen scr( + reinterpret_cast(fb->addr), + fb->horizontal, + fb->vertical, + fb->scanline, + order); + font fnt; screen::pixel_t fg = scr.color(0xb0, 0xb0, 0xb0); diff --git a/src/drivers/fb/screen.cpp b/src/drivers/fb/screen.cpp index d7862f9..3a95d7d 100644 --- a/src/drivers/fb/screen.cpp +++ b/src/drivers/fb/screen.cpp @@ -2,13 +2,14 @@ #include #include "screen.h" -screen::screen(void *addr, unsigned hres, unsigned vres, pixel_order order) : - m_fb(static_cast(addr)), +screen::screen(volatile void *addr, unsigned hres, unsigned vres, unsigned scanline, pixel_order order) : + m_fb(static_cast(addr)), m_order(order), + m_scanline(scanline), m_resx(hres), m_resy(vres) { - m_back = reinterpret_cast(malloc(hres*vres*sizeof(pixel_t))); + m_back = reinterpret_cast(malloc(scanline*vres*sizeof(pixel_t))); } screen::pixel_t @@ -46,5 +47,7 @@ screen::draw_pixel(unsigned x, unsigned y, pixel_t color) void screen::update() { - memcpy(m_fb, m_back, m_resx*m_resy*sizeof(pixel_t)); + const size_t len = m_scanline * m_resy * sizeof(pixel_t); + asm volatile ( "rep movsb" : : + "c"(len), "S"(m_back), "D"(m_fb) ); } diff --git a/src/drivers/fb/screen.h b/src/drivers/fb/screen.h index 8d338ce..fbc9d82 100644 --- a/src/drivers/fb/screen.h +++ b/src/drivers/fb/screen.h @@ -9,7 +9,7 @@ public: enum class pixel_order : uint8_t { bgr8, rgb8, }; - screen(void *addr, unsigned hres, unsigned vres, pixel_order order); + screen(volatile void *addr, unsigned hres, unsigned vres, unsigned scanline, pixel_order order); unsigned width() const { return m_resx; } unsigned height() const { return m_resy; } @@ -22,8 +22,10 @@ public: void update(); private: - pixel_t *m_fb, *m_back; + volatile pixel_t *m_fb; + pixel_t *m_back; pixel_order m_order; + unsigned m_scanline; unsigned m_resx, m_resy; screen() = delete;