From 03e2e071fd006ea8d8fe0ca0fd9e909aa42ce4ea Mon Sep 17 00:00:00 2001 From: "Ithamar R. Adema" Date: Sat, 3 Nov 2012 05:01:10 +0100 Subject: [PATCH] bring back framebuffer support in haiku_loader on ARM/u-boot * General fixes to get the refactored framebuffer code to work (across all 3 supported architectures) * PXA (verdex) specific fixes to framebuffer code. Now properly displays the (greyed) icons on the framebuffer! Signed-off-by: Ithamar R. Adema --- .../boot/arch/arm/arch_framebuffer_920.cpp | 11 ++++--- .../boot/arch/arm/arch_framebuffer_omap3.cpp | 11 +++++-- .../boot/arch/arm/arch_framebuffer_pxa.cpp | 31 ++++++++++--------- src/system/boot/platform/u-boot/video.cpp | 19 +++--------- 4 files changed, 37 insertions(+), 35 deletions(-) diff --git a/src/system/boot/arch/arm/arch_framebuffer_920.cpp b/src/system/boot/arch/arm/arch_framebuffer_920.cpp index ee2125d3a8..c9762e508d 100644 --- a/src/system/boot/arch/arm/arch_framebuffer_920.cpp +++ b/src/system/boot/arch/arm/arch_framebuffer_920.cpp @@ -21,16 +21,19 @@ class ArchFBArm920 : public ArchFramebuffer { public: - ArchFBArm920(addr_t base); - ~ArchFBArm920(); + ArchFBArm920(addr_t base) + : ArchFramebuffer(base) {} + ~ArchFBArm920() {} status_t Init(); status_t Probe(); status_t SetDefaultMode(); status_t SetVideoMode(int width, int height, int depth); }; -ArchFBArm920 *arch_get_fb_arm_920(addr_t base); - +extern "C" ArchFramebuffer *arch_get_fb_arm_920(addr_t base) +{ + return new ArchFBArm920(base); +} status_t ArchFBArm920::Init() diff --git a/src/system/boot/arch/arm/arch_framebuffer_omap3.cpp b/src/system/boot/arch/arm/arch_framebuffer_omap3.cpp index 03e38b26a8..976cace382 100644 --- a/src/system/boot/arch/arm/arch_framebuffer_omap3.cpp +++ b/src/system/boot/arch/arm/arch_framebuffer_omap3.cpp @@ -40,15 +40,20 @@ extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size, class ArchFBArmOmap3 : public ArchFramebuffer { public: - ArchFBArmOmap3(addr_t base); - ~ArchFBArmOmap3(); + ArchFBArmOmap3(addr_t base) + : ArchFramebuffer(base) {} + ~ArchFBArmOmap3() {} + status_t Init(); status_t Probe(); status_t SetDefaultMode(); status_t SetVideoMode(int width, int height, int depth); }; -ArchFBArmOmap3 *arch_get_fb_arm_omap3(addr_t base); +extern "C" ArchFramebuffer *arch_get_fb_arm_omap3(addr_t base) +{ + return new ArchFBArmOmap3(base); +} // #pragma mark - diff --git a/src/system/boot/arch/arm/arch_framebuffer_pxa.cpp b/src/system/boot/arch/arm/arch_framebuffer_pxa.cpp index 1bcc304d21..9c2048b80c 100644 --- a/src/system/boot/arch/arm/arch_framebuffer_pxa.cpp +++ b/src/system/boot/arch/arm/arch_framebuffer_pxa.cpp @@ -32,15 +32,19 @@ extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size, class ArchFBArmPxa270 : public ArchFramebuffer { public: - ArchFBArmPxa270(addr_t base); - ~ArchFBArmPxa270(); + ArchFBArmPxa270(addr_t base) + : ArchFramebuffer(base) {} + ~ArchFBArmPxa270() {} status_t Init(); status_t Probe(); status_t SetDefaultMode(); status_t SetVideoMode(int width, int height, int depth); }; -ArchFBArmPxa270 *arch_get_fb_arm_pxa270(addr_t base); +extern "C" ArchFramebuffer *arch_get_fb_arm_pxa270(addr_t base) +{ + return new ArchFBArmPxa270(base); +} // #pragma mark - @@ -97,8 +101,13 @@ dprintf("error %08x\n", err); struct pxa27x_lcd_dma_descriptor *dma; // check if LCD controller is enabled - if (!(read_io_32(LCCR0) | 0x00000001)) + if (!(read_io_32(LCCR0) & 0x00000001)) { + // not enabled, so return suggested mode + gKernelArgs.frame_buffer.depth = 32; + gKernelArgs.frame_buffer.width = 640; + gKernelArgs.frame_buffer.height = 480; return B_NO_INIT; + } pixelFormat = bppCode = read_io_32(LCCR3); bppCode = ((bppCode >> 26) & 0x08) | ((bppCode >> 24) & 0x07); @@ -126,7 +135,7 @@ dprintf("error %08x\n", err); return B_ERROR; } - gKernelArgs.frame_buffer.physical_buffer.start = (dma->fdadr & ~0x0f); + gKernelArgs.frame_buffer.physical_buffer.start = (dma->fsadr & ~0x0f); gKernelArgs.frame_buffer.width = (read_io_32(LCCR1) & ((1 << 10) - 1)) + 1; gKernelArgs.frame_buffer.height = (read_io_32(LCCR2) & ((1 << 10) - 1)) + 1; gKernelArgs.frame_buffer.bytes_per_row = gKernelArgs.frame_buffer.width @@ -150,12 +159,6 @@ ArchFBArmPxa270::SetVideoMode(int width, int height, int depth) void *fb; uint32 fbSize = width * height * depth / 8; - //fb = malloc(800 * 600 * 4 + 16 - 1); - //fb = (void *)(((uint32)fb) & ~(0x0f)); - //fb = scratch - 800; - //fb = (void *)0xa0000000; - -// fBase = scratch - 800; fb = (void*)fBase; @@ -168,8 +171,8 @@ ArchFBArmPxa270::SetVideoMode(int width, int height, int depth) // if not already enabled, set a default mode if (!(read_io_32(LCCR0) & 0x00000001)) { - int bpp = 0x09; // 24 bpp - int pdfor = 0x3; // Format 4: RGB888 (no alpha bit) + int bpp; + int pdfor; dprintf("Setting video mode\n"); switch (depth) { case 4: @@ -201,7 +204,7 @@ ArchFBArmPxa270::SetVideoMode(int width, int height, int depth) dumpr(LCCR3); dumpr(LCCR4); } else - return EALREADY; // for now + return B_OK; // assume we're already setup // clear the video memory memset((void *)fb, 0, fbSize); diff --git a/src/system/boot/platform/u-boot/video.cpp b/src/system/boot/platform/u-boot/video.cpp index d3767f9934..f7c4c72a19 100644 --- a/src/system/boot/platform/u-boot/video.cpp +++ b/src/system/boot/platform/u-boot/video.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -76,14 +77,10 @@ platform_blit4(addr_t frameBuffer, const uint8 *data, uint16 width, extern "C" void platform_switch_to_logo(void) { - CALLED(); // in debug mode, we'll never show the logo if ((platform_boot_options() & BOOT_OPTION_DEBUG_OUTPUT) != 0) return; - //XXX: not yet, DISABLED - return; - status_t err; if (gFramebuffer != NULL) { @@ -95,30 +92,28 @@ platform_switch_to_logo(void) err = video_display_splash(gFramebuffer->Base()); } - #warning U-Boot:TODO } extern "C" void platform_switch_to_text_mode(void) { - CALLED(); - #warning U-Boot:TODO } extern "C" status_t platform_init_video(void) { - CALLED(); - #ifdef __ARM__ #if defined(BOARD_CPU_ARM920T) + extern ArchFramebuffer *arch_get_fb_arm_920(addr_t base); gFramebuffer = arch_get_fb_arm_920(0x88000000); #elif defined(BOARD_CPU_OMAP3) + extern ArchFramebuffer *arch_get_fb_arm_omap3(addr_t base); gFramebuffer = arch_get_fb_arm_omap3(0x88000000); #elif defined(BOARD_CPU_PXA270) - gFramebuffer = arch_get_fb_arm_pxa270(0xA4000000); + ArchFramebuffer *arch_get_fb_arm_pxa270(addr_t base); + gFramebuffer = arch_get_fb_arm_pxa270(0xA3000000); #endif #endif @@ -127,9 +122,5 @@ platform_init_video(void) gFramebuffer->Init(); } - //XXX for testing - //platform_switch_to_logo(); - //return arch_probe_video_mode(); - return B_OK; }