diff --git a/src/system/boot/arch/arm/Jamfile b/src/system/boot/arch/arm/Jamfile index cd3dd05748..7d3d143044 100644 --- a/src/system/boot/arch/arm/Jamfile +++ b/src/system/boot/arch/arm/Jamfile @@ -27,10 +27,9 @@ KernelMergeObject boot_arch_$(TARGET_ARCH).o : arch_uart_8250.cpp arch_uart_pl011.cpp arch_elf.cpp - arch_video.cpp - arch_video_920.cpp - arch_video_pxa.cpp - arch_video_omap3.cpp + arch_framebuffer_920.cpp + arch_framebuffer_pxa.cpp + arch_framebuffer_omap3.cpp $(librootArchObjects) : -fno-pic : diff --git a/src/system/boot/arch/arm/arch_framebuffer.h b/src/system/boot/arch/arm/arch_framebuffer.h new file mode 100644 index 0000000000..6057d0f7ac --- /dev/null +++ b/src/system/boot/arch/arm/arch_framebuffer.h @@ -0,0 +1,51 @@ +/* + * Copyright 2011-2012 Haiku, Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Alexander von Gluck IV, kallisti5@unixzen.com + */ +#ifndef _ARCH_FRAMEBUFFER_H +#define _ARCH_FRAMEBUFFER_H + + +#include +#include + + +#define TRACE_VIDEO +#ifdef TRACE_VIDEO +# define TRACE(x...) dprintf(x) +# define CALLED() dprintf("%s()\n", __func__); +#else +# define TRACE(x...) ; +# define CALLED() ; +#endif +#define ERROR(x...) dprintf(x) + + +class ArchFramebuffer { +public: + ArchFramebuffer(addr_t base) + : + fBase(base) {}; + ~ArchFramebuffer() {}; + + virtual status_t Init() { return B_OK; }; + virtual status_t Probe() { return B_OK; }; + virtual status_t SetDefaultMode() { return B_OK; }; + virtual status_t SetVideoMode(int width, int height, int depth) + { return B_OK; }; + + virtual addr_t Base() { return fBase; }; + +protected: + addr_t fBase; +private: + int fCurrentWidth; + int fCurrentHeight; + int fCurrentDepth; +}; + + +#endif /* _ARCH_FRAMEBUFFER_H */ diff --git a/src/system/boot/arch/arm/arch_video_920.cpp b/src/system/boot/arch/arm/arch_framebuffer_920.cpp similarity index 53% rename from src/system/boot/arch/arm/arch_video_920.cpp rename to src/system/boot/arch/arm/arch_framebuffer_920.cpp index f345b71771..ee2125d3a8 100644 --- a/src/system/boot/arch/arm/arch_video_920.cpp +++ b/src/system/boot/arch/arm/arch_framebuffer_920.cpp @@ -1,10 +1,14 @@ /* - * Copyright 2009, François Revol, revol@free.fr. + * Copyright 2009-2012 Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. + * + * Authors: + * François Revol, revol@free.fr + * Alexander von Gluck IV, kallisti5@unixzen.com */ -#include "arch_video.h" +#include "arch_framebuffer.h" #include #include @@ -12,44 +16,50 @@ #include #include #include -#include -#include #include -#include -#include -#include +class ArchFBArm920 : public ArchFramebuffer { +public: + ArchFBArm920(addr_t base); + ~ArchFBArm920(); + status_t Init(); + status_t Probe(); + status_t SetDefaultMode(); + status_t SetVideoMode(int width, int height, int depth); +}; -//XXX -extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size, - uint32 flags); +ArchFBArm920 *arch_get_fb_arm_920(addr_t base); -#define TRACE_VIDEO -#ifdef TRACE_VIDEO -# define TRACE(x) dprintf x -#else -# define TRACE(x) ; -#endif - -#define write_io_32(a, v) ((*(vuint32 *)a) = v) -#define read_io_32(a) (*(vuint32 *)a) - -#define dumpr(a) dprintf("LCC:%s:0x%lx\n", #a, read_io_32(a)) - - -#if BOARD_CPU_ARM920T - - -// #pragma mark - - - -extern void *gFrameBufferBase; - status_t -arch_probe_video_mode(void) +ArchFBArm920::Init() { + gKernelArgs.frame_buffer.enabled = true; + +#warning TODO: ARM920 init + return B_OK; +} + + +status_t +ArchFBArm920::Probe() +{ +#if 0 + // TODO: More dynamic framebuffer base? + if (!fBase) { + int err = platform_allocate_region(&gFrameBufferBase, + gKernelArgs.frame_buffer.physical_buffer.size, 0, false); + if (err < B_OK) + return err; + gKernelArgs.frame_buffer.physical_buffer.start + = (addr_t)gFrameBufferBase; + dprintf("video framebuffer: %p\n", gFrameBufferBase); + } +#else + gKernelArgs.frame_buffer.physical_buffer.start = fBase; +#endif + gKernelArgs.frame_buffer.depth = 16; gKernelArgs.frame_buffer.width = 1024; gKernelArgs.frame_buffer.height = 768; @@ -59,42 +69,25 @@ arch_probe_video_mode(void) * gKernelArgs.frame_buffer.height * gKernelArgs.frame_buffer.depth / 8; -#if 0 - if (!gFrameBufferBase) { - int err = platform_allocate_region(&gFrameBufferBase, - gKernelArgs.frame_buffer.physical_buffer.size, 0, false); - if (err < B_OK) return err; - gKernelArgs.frame_buffer.physical_buffer.start - = (addr_t)gFrameBufferBase; - dprintf("video framebuffer: %p\n", gFrameBufferBase); - } -#else - gFrameBufferBase = (void *)0x88000000; - gKernelArgs.frame_buffer.physical_buffer.start = (addr_t)gFrameBufferBase; -#endif - dprintf("video mode: %ux%ux%u\n", gKernelArgs.frame_buffer.width, gKernelArgs.frame_buffer.height, gKernelArgs.frame_buffer.depth); - gKernelArgs.frame_buffer.enabled = true; return B_OK; } status_t -arch_set_video_mode(int width, int height, int depth) +ArchFBArm920::SetDefaultMode() { - return B_OK; + return SetVideoMode(gKernelArgs.frame_buffer.width, + gKernelArgs.frame_buffer.height, + gKernelArgs.frame_buffer.depth); } status_t -arch_set_default_video_mode() +ArchFBArm920::SetVideoMode(int width, int height, int depth) { - return arch_set_video_mode(800, 600, 32); + #warning TODO: ArchFBArm920 SetVideoMode + return B_OK; } - - -#endif - - diff --git a/src/system/boot/arch/arm/arch_video_omap3.cpp b/src/system/boot/arch/arm/arch_framebuffer_omap3.cpp similarity index 84% rename from src/system/boot/arch/arm/arch_video_omap3.cpp rename to src/system/boot/arch/arm/arch_framebuffer_omap3.cpp index 5d96aa2dcd..1ebffef832 100644 --- a/src/system/boot/arch/arm/arch_video_omap3.cpp +++ b/src/system/boot/arch/arm/arch_framebuffer_omap3.cpp @@ -1,11 +1,16 @@ /* - * Copyright 2009, François Revol, revol@free.fr. + * Copyright 2009-2012 Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. + * + * Authors: + * François Revol, revol@free.fr + * Alexander von Gluck IV, kallisti5@unixzen.com */ -#include "arch_video.h" +#include "arch_framebuffer.h" +#include #include #include #include @@ -20,31 +25,35 @@ #include #include +#include "graphics/omap/omap3_regs.h" + //XXX extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size, uint32 flags); -#define TRACE_VIDEO -#ifdef TRACE_VIDEO -# define TRACE(x) dprintf x -#else -# define TRACE(x) ; -#endif - #define write_io_32(a, v) ((*(vuint32 *)a) = v) #define read_io_32(a) (*(vuint32 *)a) #define dumpr(a) dprintf("LCC:%s:0x%lx\n", #a, read_io_32(a)) -#if BOARD_CPU_OMAP3 +class ArchFBArmOmap3 : public ArchFramebuffer { +public: + ArchFBArmOmap3(addr_t 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); + + // #pragma mark - -#include "graphics/omap/omap3_regs.h" - -extern void *gFrameBufferBase; struct video_mode { short width, height; @@ -224,7 +233,9 @@ omap_dispc_init(void) } -static void omap_set_lcd_mode(int w, int h) { +static void +omap_set_lcd_mode(int w, int h) +{ uint32 DISPC = DISPC_BASE; unsigned int i; struct video_mode *m; @@ -260,12 +271,12 @@ found: static void -omap_attach_framebuffer(void *data, int width, int height, int depth) +omap_attach_framebuffer(addr_t data, int width, int height, int depth) { uint32 DISPC = DISPC_BASE; uint32 gsize = ((height - 1) << 16) | (width - 1); - dprintf("omap3: attach bitmap (%d,%d) %p to screen\n", width, height, data); + dprintf("omap3: attach bitmap (%d,%d) to screen\n", width, height); setreg(DISPC, DISPC_GFX_BA0, (uint32)data); setreg(DISPC, DISPC_GFX_BA1, (uint32)data); @@ -286,10 +297,10 @@ omap_attach_framebuffer(void *data, int width, int height, int depth) } -static void -omap_init(void) +status_t +ArchFBArmOmap3::Init() { - dprintf("omap3: video_init()\n"); + gKernelArgs.frame_buffer.enabled = true; setreg(DISPC_BASE, DISPC_IRQENABLE, 0x00000); setreg(DISPC_BASE, DISPC_IRQSTATUS, 0x1ffff); @@ -298,12 +309,29 @@ omap_init(void) omap_clock_init(); omap_dss_init(); omap_dispc_init(); + + return B_OK; } status_t -arch_probe_video_mode(void) +ArchFBArmOmap3::Probe() { + +#if 0 + // TODO: More dynamic framebuffer base? + if (!fBase) { + int err = platform_allocate_region(&gFrameBufferBase, + gKernelArgs.frame_buffer.physical_buffer.size, 0, false); + if (err < B_OK) return err; + gKernelArgs.frame_buffer.physical_buffer.start + = (addr_t)gFrameBufferBase; + dprintf("video framebuffer: %p\n", gFrameBufferBase); + } +#else + gKernelArgs.frame_buffer.physical_buffer.start = fBase; +#endif + gKernelArgs.frame_buffer.depth = 16; gKernelArgs.frame_buffer.width = 1024; gKernelArgs.frame_buffer.height = 768; @@ -313,50 +341,31 @@ arch_probe_video_mode(void) * gKernelArgs.frame_buffer.height * gKernelArgs.frame_buffer.depth / 8; -#if 0 - if (!gFrameBufferBase) { - int err = platform_allocate_region(&gFrameBufferBase, - gKernelArgs.frame_buffer.physical_buffer.size, 0, false); - if (err < B_OK) return err; - gKernelArgs.frame_buffer.physical_buffer.start - = (addr_t)gFrameBufferBase; - dprintf("video framebuffer: %p\n", gFrameBufferBase); - } -#else - gFrameBufferBase = (void *)0x88000000; - gKernelArgs.frame_buffer.physical_buffer.start = (addr_t)gFrameBufferBase; -#endif - - dprintf("video mode: %ux%ux%u\n", gKernelArgs.frame_buffer.width, + TRACE("video mode: %ux%ux%u\n", gKernelArgs.frame_buffer.width, gKernelArgs.frame_buffer.height, gKernelArgs.frame_buffer.depth); - gKernelArgs.frame_buffer.enabled = true; - - omap_init(); - return B_OK; } status_t -arch_set_video_mode(int width, int height, int depth) +ArchFBArmOmap3::SetVideoMode(int width, int height, int depth) { - dprintf("arch_set_video_mode %d,%d @ %d\n", width, height, depth); + TRACE("%s: %dx%d@%d\n", __func__, width, height, depth); omap_set_lcd_mode(width, height); - omap_attach_framebuffer(gFrameBufferBase, width, height, depth); + omap_attach_framebuffer(fBase, width, height, depth); return B_OK; } status_t -arch_set_default_video_mode() +ArchFBArmOmap3::SetDefaultMode() { - dprintf("arch_set_default_video_mode()\n"); + CALLED(); - return arch_set_video_mode(1024, 768, 16); + return SetVideoMode(gKernelArgs.frame_buffer.width, + gKernelArgs.frame_buffer.height, + gKernelArgs.frame_buffer.depth); } - - -#endif diff --git a/src/system/boot/arch/arm/arch_video_pxa.cpp b/src/system/boot/arch/arm/arch_framebuffer_pxa.cpp similarity index 79% rename from src/system/boot/arch/arm/arch_video_pxa.cpp rename to src/system/boot/arch/arm/arch_framebuffer_pxa.cpp index 41ff5267c5..196401de2b 100644 --- a/src/system/boot/arch/arm/arch_video_pxa.cpp +++ b/src/system/boot/arch/arm/arch_framebuffer_pxa.cpp @@ -1,10 +1,14 @@ /* - * Copyright 2009, François Revol, revol@free.fr. + * Copyright 2009-2012 Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. + * + * Authors: + * François Revol, revol@free.fr + * Alexander von Gluck IV, kallisti5@unixzen.com */ -#include "arch_video.h" +#include "arch_framebuffer.h" #include #include @@ -26,12 +30,21 @@ extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size, uint32 flags); -#define TRACE_VIDEO -#ifdef TRACE_VIDEO -# define TRACE(x) dprintf x -#else -# define TRACE(x) ; -#endif +class ArchFBArmPxa270 : public ArchFramebuffer { +public: + ArchFBArmPxa270(addr_t 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); + + +// #pragma mark - + #define write_io_32(a, v) ((*(vuint32 *)a) = v) #define read_io_32(a) (*(vuint32 *)a) @@ -39,22 +52,48 @@ extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size, #define dumpr(a) dprintf("LCC:%s:0x%lx\n", #a, read_io_32(a)) -#if BOARD_CPU_PXA270 - - -// #pragma mark - - - -extern void *gFrameBufferBase; static struct pxa27x_lcd_dma_descriptor sVideoDMADesc; static uint32 scratch[128] __attribute__((aligned(16))); status_t -arch_probe_video_mode(void) +ArchFBArmPxa270::Init() { - dprintf("%s()\n", __FUNCTION__); - uint32 bppCode, pixelFormat; + gKernelArgs.frame_buffer.enabled = true; + return B_OK; +} + + +status_t +ArchFBArmPxa270::Probe() +{ + CALLED(); + +#if 0 + // TODO: More dynamic framebuffer base? + if (!fBase) { + // XXX: realloc if larger !!! + err = platform_allocate_region(&gFrameBufferBase, fbSize, 0, false); +dprintf("error %08x\n", err); + if (err < B_OK) + return err; + gKernelArgs.frame_buffer.physical_buffer.start + = (addr_t)gFrameBufferBase; +/* + gFrameBufferBase = (void *)mmu_map_physical_memory( + 0xa8000000, fbSize, 0); + if (gFrameBufferBase == NULL) + return B_NO_MEMORY; + gKernelArgs.frame_buffer.physical_buffer.start + = (addr_t)gFrameBufferBase; // 0xa8000000; +*/ + } +#else + gKernelArgs.frame_buffer.physical_buffer.start = fBase; +#endif + + uint32 bppCode; + uint32 pixelFormat; struct pxa27x_lcd_dma_descriptor *dma; // check if LCD controller is enabled @@ -83,7 +122,7 @@ arch_probe_video_mode(void) case 10: gKernelArgs.frame_buffer.depth = 32; // RGB888 break; - defaut: + default: return B_ERROR; } @@ -100,15 +139,12 @@ arch_probe_video_mode(void) dprintf("video mode: %ux%ux%u\n", gKernelArgs.frame_buffer.width, gKernelArgs.frame_buffer.height, gKernelArgs.frame_buffer.depth); - gKernelArgs.frame_buffer.enabled = true; - - return B_OK; } status_t -arch_set_video_mode(int width, int height, int depth) +ArchFBArmPxa270::SetVideoMode(int width, int height, int depth) { dprintf("%s(%d, %d, %d)\n", __FUNCTION__, width, height, depth); status_t err; @@ -119,32 +155,9 @@ arch_set_video_mode(int width, int height, int depth) //fb = scratch - 800; //fb = (void *)0xa0000000; -// gFrameBufferBase = scratch - 800; +// fBase = scratch - 800; -#if 1 - gFrameBufferBase = (void *)0xa4000000; - gKernelArgs.frame_buffer.physical_buffer.start = (addr_t)gFrameBufferBase; -#endif -#if 0 - if (!gFrameBufferBase) { - // XXX: realloc if larger !!! - err = platform_allocate_region(&gFrameBufferBase, fbSize, 0, false); -dprintf("error %08x\n", err); - if (err < B_OK) - return err; - gKernelArgs.frame_buffer.physical_buffer.start - = (addr_t)gFrameBufferBase; -/* - gFrameBufferBase = (void *)mmu_map_physical_memory( - 0xa8000000, fbSize, 0); - if (gFrameBufferBase == NULL) - return B_NO_MEMORY; - gKernelArgs.frame_buffer.physical_buffer.start - = (addr_t)gFrameBufferBase; // 0xa8000000; -*/ - } -#endif - fb = gFrameBufferBase; + fb = (void*)fBase; dprintf("fb @ %p\n", fb); @@ -200,16 +213,15 @@ dprintf("error %08x\n", err); } // update framebuffer descriptor - return arch_probe_video_mode(); + return Probe(); } status_t -arch_set_default_video_mode() +ArchFBArmPxa270::SetDefaultMode() { - dprintf("%s()\n", __FUNCTION__); - return arch_set_video_mode(800, 600, 32); + CALLED(); + return SetVideoMode(gKernelArgs.frame_buffer.width, + gKernelArgs.frame_buffer.height, + gKernelArgs.frame_buffer.depth); } - - -#endif diff --git a/src/system/boot/arch/arm/arch_video.cpp b/src/system/boot/arch/arm/arch_video.cpp deleted file mode 100644 index 8da3ef56f6..0000000000 --- a/src/system/boot/arch/arm/arch_video.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2009, François Revol, revol@free.fr. - * Distributed under the terms of the MIT License. - */ - - -#include "arch_video.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - - -//XXX -extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size, - uint32 flags); - - -#define TRACE_VIDEO -#ifdef TRACE_VIDEO -# define TRACE(x) dprintf x -#else -# define TRACE(x) ; -#endif - -#define write_io_32(a, v) ((*(vuint32 *)a) = v) -#define read_io_32(a) (*(vuint32 *)a) - -#define dumpr(a) dprintf("LCC:%s:0x%lx\n", #a, read_io_32(a)) - - -#if !BOARD_CPU_PXA270 && !BOARD_CPU_OMAP3 && !BOARD_CPU_ARM920T -// #pragma mark - - - -status_t -arch_probe_video_mode(void) -{ - return B_ERROR; -} - - -status_t -arch_set_video_mode(int width, int height, int depth) -{ - return B_ERROR; -} - - -status_t -arch_set_default_video_mode() -{ - return arch_set_video_mode(800, 600, 32); -} - - -#endif diff --git a/src/system/boot/arch/arm/arch_video.h b/src/system/boot/arch/arm/arch_video.h deleted file mode 100644 index 54813807de..0000000000 --- a/src/system/boot/arch/arm/arch_video.h +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2009, Haiku Inc. - * All rights reserved. Distributed under the terms of the MIT License. - */ -#ifndef _ARCH_VIDEO_H -#define _ARCH_VIDEO_H - -#include - -/* try to detect current video mode and set gFrameBuffer accordingly */ -extern status_t arch_probe_video_mode(); -/* try to set a video mode */ -extern status_t arch_set_video_mode(int width, int height, int depth); -extern status_t arch_set_default_video_mode(); - - -#endif /* _ARCH_VIDEO_H */ diff --git a/src/system/boot/platform/u-boot/video.cpp b/src/system/boot/platform/u-boot/video.cpp index 4d775e490e..d3767f9934 100644 --- a/src/system/boot/platform/u-boot/video.cpp +++ b/src/system/boot/platform/u-boot/video.cpp @@ -5,10 +5,6 @@ #include "video.h" -//XXX -#ifdef __ARM__ -#include "arch_video.h" -#endif #include #include @@ -23,15 +19,10 @@ #include #include +#include "arch_framebuffer.h" -#define TRACE_VIDEO -#ifdef TRACE_VIDEO -# define TRACE(x) dprintf x -#else -# define TRACE(x) ; -#endif -void *gFrameBufferBase = NULL; +ArchFramebuffer *gFramebuffer = NULL; // #pragma mark - @@ -66,7 +57,6 @@ video_mode_menu() } - // #pragma mark - @@ -77,15 +67,16 @@ platform_set_palette(const uint8 *palette) extern "C" void -platform_blit4(addr_t frameBuffer, const uint8 *data, uint16 width, uint16 height, - uint16 imageWidth, uint16 left, uint16 top) +platform_blit4(addr_t frameBuffer, const uint8 *data, uint16 width, + uint16 height, uint16 imageWidth, uint16 left, uint16 top) { } + extern "C" void platform_switch_to_logo(void) { - TRACE(("%s()\n", __FUNCTION__)); + CALLED(); // in debug mode, we'll never show the logo if ((platform_boot_options() & BOOT_OPTION_DEBUG_OUTPUT) != 0) return; @@ -95,15 +86,15 @@ platform_switch_to_logo(void) status_t err; -#ifdef __ARM__ - err = arch_set_default_video_mode(); - dprintf("set video mode: 0x%08x\n", err); - if (err < B_OK) - return; -#endif + if (gFramebuffer != NULL) { + err = gFramebuffer->SetDefaultMode(); + if (err < B_OK) { + ERROR("Framebuffer SetDefaultMode failed!\n"); + return; + } - err = video_display_splash((addr_t)gFrameBufferBase); - dprintf("video_display_splash: 0x%08x\n", err); + err = video_display_splash(gFramebuffer->Base()); + } #warning U-Boot:TODO } @@ -111,7 +102,7 @@ platform_switch_to_logo(void) extern "C" void platform_switch_to_text_mode(void) { - TRACE(("%s()\n", __FUNCTION__)); + CALLED(); #warning U-Boot:TODO } @@ -119,14 +110,26 @@ platform_switch_to_text_mode(void) extern "C" status_t platform_init_video(void) { - TRACE(("%s()\n", __FUNCTION__)); - #warning U-Boot:TODO + CALLED(); + #ifdef __ARM__ - arch_probe_video_mode(); + #if defined(BOARD_CPU_ARM920T) + gFramebuffer = arch_get_fb_arm_920(0x88000000); + #elif defined(BOARD_CPU_OMAP3) + gFramebuffer = arch_get_fb_arm_omap3(0x88000000); + #elif defined(BOARD_CPU_PXA270) + gFramebuffer = arch_get_fb_arm_pxa270(0xA4000000); + #endif #endif + + if (gFramebuffer != NULL) { + gFramebuffer->Probe(); + gFramebuffer->Init(); + } + //XXX for testing //platform_switch_to_logo(); //return arch_probe_video_mode(); - //return B_OK; -} + return B_OK; +}