arm framebuffer: Convert arm arch_video code into classes

* Proper framebuffer code is chosen based on hardware
* This change could extend into other arch code as well
* François gave permission to update his copyrights
* Minimal functional change
This commit is contained in:
Alexander von Gluck IV
2012-09-15 13:23:34 -05:00
parent 58f219d49f
commit 8eeafbce5f
8 changed files with 259 additions and 276 deletions
+3 -4
View File
@@ -27,10 +27,9 @@ KernelMergeObject boot_arch_$(TARGET_ARCH).o :
arch_uart_8250.cpp arch_uart_8250.cpp
arch_uart_pl011.cpp arch_uart_pl011.cpp
arch_elf.cpp arch_elf.cpp
arch_video.cpp arch_framebuffer_920.cpp
arch_video_920.cpp arch_framebuffer_pxa.cpp
arch_video_pxa.cpp arch_framebuffer_omap3.cpp
arch_video_omap3.cpp
$(librootArchObjects) $(librootArchObjects)
: -fno-pic : -fno-pic
: :
@@ -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, [email protected]
*/
#ifndef _ARCH_FRAMEBUFFER_H
#define _ARCH_FRAMEBUFFER_H
#include <boot/platform.h>
#include <SupportDefs.h>
#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 */
@@ -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. * 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 <arch/cpu.h> #include <arch/cpu.h>
#include <boot/stage2.h> #include <boot/stage2.h>
@@ -12,44 +16,50 @@
#include <boot/menu.h> #include <boot/menu.h>
#include <boot/kernel_args.h> #include <boot/kernel_args.h>
#include <boot/platform/generic/video.h> #include <boot/platform/generic/video.h>
#include <board_config.h>
#include <util/list.h>
#include <drivers/driver_settings.h> #include <drivers/driver_settings.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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 ArchFBArm920 *arch_get_fb_arm_920(addr_t base);
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_ARM920T
// #pragma mark -
extern void *gFrameBufferBase;
status_t 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.depth = 16;
gKernelArgs.frame_buffer.width = 1024; gKernelArgs.frame_buffer.width = 1024;
gKernelArgs.frame_buffer.height = 768; gKernelArgs.frame_buffer.height = 768;
@@ -59,42 +69,25 @@ arch_probe_video_mode(void)
* gKernelArgs.frame_buffer.height * gKernelArgs.frame_buffer.height
* gKernelArgs.frame_buffer.depth / 8; * 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, dprintf("video mode: %ux%ux%u\n", gKernelArgs.frame_buffer.width,
gKernelArgs.frame_buffer.height, gKernelArgs.frame_buffer.depth); gKernelArgs.frame_buffer.height, gKernelArgs.frame_buffer.depth);
gKernelArgs.frame_buffer.enabled = true;
return B_OK; return B_OK;
} }
status_t 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 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
@@ -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. * 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 <arch/arm/omap3.h>
#include <arch/cpu.h> #include <arch/cpu.h>
#include <boot/stage2.h> #include <boot/stage2.h>
#include <boot/platform.h> #include <boot/platform.h>
@@ -20,31 +25,35 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "graphics/omap/omap3_regs.h"
//XXX //XXX
extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size, extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size,
uint32 flags); 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 write_io_32(a, v) ((*(vuint32 *)a) = v)
#define read_io_32(a) (*(vuint32 *)a) #define read_io_32(a) (*(vuint32 *)a)
#define dumpr(a) dprintf("LCC:%s:0x%lx\n", #a, read_io_32(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 - // #pragma mark -
#include "graphics/omap/omap3_regs.h"
extern void *gFrameBufferBase;
struct video_mode { struct video_mode {
short width, height; 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; uint32 DISPC = DISPC_BASE;
unsigned int i; unsigned int i;
struct video_mode *m; struct video_mode *m;
@@ -260,12 +271,12 @@ found:
static void 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 DISPC = DISPC_BASE;
uint32 gsize = ((height - 1) << 16) | (width - 1); 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_BA0, (uint32)data);
setreg(DISPC, DISPC_GFX_BA1, (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 status_t
omap_init(void) ArchFBArmOmap3::Init()
{ {
dprintf("omap3: video_init()\n"); gKernelArgs.frame_buffer.enabled = true;
setreg(DISPC_BASE, DISPC_IRQENABLE, 0x00000); setreg(DISPC_BASE, DISPC_IRQENABLE, 0x00000);
setreg(DISPC_BASE, DISPC_IRQSTATUS, 0x1ffff); setreg(DISPC_BASE, DISPC_IRQSTATUS, 0x1ffff);
@@ -298,12 +309,29 @@ omap_init(void)
omap_clock_init(); omap_clock_init();
omap_dss_init(); omap_dss_init();
omap_dispc_init(); omap_dispc_init();
return B_OK;
} }
status_t 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.depth = 16;
gKernelArgs.frame_buffer.width = 1024; gKernelArgs.frame_buffer.width = 1024;
gKernelArgs.frame_buffer.height = 768; gKernelArgs.frame_buffer.height = 768;
@@ -313,50 +341,31 @@ arch_probe_video_mode(void)
* gKernelArgs.frame_buffer.height * gKernelArgs.frame_buffer.height
* gKernelArgs.frame_buffer.depth / 8; * gKernelArgs.frame_buffer.depth / 8;
#if 0 TRACE("video mode: %ux%ux%u\n", gKernelArgs.frame_buffer.width,
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.height, gKernelArgs.frame_buffer.depth);
gKernelArgs.frame_buffer.enabled = true;
omap_init();
return B_OK; return B_OK;
} }
status_t 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_set_lcd_mode(width, height);
omap_attach_framebuffer(gFrameBufferBase, width, height, depth); omap_attach_framebuffer(fBase, width, height, depth);
return B_OK; return B_OK;
} }
status_t 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
@@ -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. * 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 <arch/cpu.h> #include <arch/cpu.h>
#include <boot/stage2.h> #include <boot/stage2.h>
@@ -26,12 +30,21 @@ extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size,
uint32 flags); uint32 flags);
#define TRACE_VIDEO class ArchFBArmPxa270 : public ArchFramebuffer {
#ifdef TRACE_VIDEO public:
# define TRACE(x) dprintf x ArchFBArmPxa270(addr_t base);
#else ~ArchFBArmPxa270();
# define TRACE(x) ; status_t Init();
#endif 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 write_io_32(a, v) ((*(vuint32 *)a) = v)
#define read_io_32(a) (*(vuint32 *)a) #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)) #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 struct pxa27x_lcd_dma_descriptor sVideoDMADesc;
static uint32 scratch[128] __attribute__((aligned(16))); static uint32 scratch[128] __attribute__((aligned(16)));
status_t status_t
arch_probe_video_mode(void) ArchFBArmPxa270::Init()
{ {
dprintf("%s()\n", __FUNCTION__); gKernelArgs.frame_buffer.enabled = true;
uint32 bppCode, pixelFormat; 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; struct pxa27x_lcd_dma_descriptor *dma;
// check if LCD controller is enabled // check if LCD controller is enabled
@@ -83,7 +122,7 @@ arch_probe_video_mode(void)
case 10: case 10:
gKernelArgs.frame_buffer.depth = 32; // RGB888 gKernelArgs.frame_buffer.depth = 32; // RGB888
break; break;
defaut: default:
return B_ERROR; return B_ERROR;
} }
@@ -100,15 +139,12 @@ arch_probe_video_mode(void)
dprintf("video mode: %ux%ux%u\n", gKernelArgs.frame_buffer.width, dprintf("video mode: %ux%ux%u\n", gKernelArgs.frame_buffer.width,
gKernelArgs.frame_buffer.height, gKernelArgs.frame_buffer.depth); gKernelArgs.frame_buffer.height, gKernelArgs.frame_buffer.depth);
gKernelArgs.frame_buffer.enabled = true;
return B_OK; return B_OK;
} }
status_t 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); dprintf("%s(%d, %d, %d)\n", __FUNCTION__, width, height, depth);
status_t err; status_t err;
@@ -119,32 +155,9 @@ arch_set_video_mode(int width, int height, int depth)
//fb = scratch - 800; //fb = scratch - 800;
//fb = (void *)0xa0000000; //fb = (void *)0xa0000000;
// gFrameBufferBase = scratch - 800; // fBase = scratch - 800;
#if 1 fb = (void*)fBase;
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;
dprintf("fb @ %p\n", fb); dprintf("fb @ %p\n", fb);
@@ -200,16 +213,15 @@ dprintf("error %08x\n", err);
} }
// update framebuffer descriptor // update framebuffer descriptor
return arch_probe_video_mode(); return Probe();
} }
status_t status_t
arch_set_default_video_mode() ArchFBArmPxa270::SetDefaultMode()
{ {
dprintf("%s()\n", __FUNCTION__); CALLED();
return arch_set_video_mode(800, 600, 32); return SetVideoMode(gKernelArgs.frame_buffer.width,
gKernelArgs.frame_buffer.height,
gKernelArgs.frame_buffer.depth);
} }
#endif
-67
View File
@@ -1,67 +0,0 @@
/*
* Copyright 2009, François Revol, [email protected].
* Distributed under the terms of the MIT License.
*/
#include "arch_video.h"
#include <arch/cpu.h>
#include <boot/stage2.h>
#include <boot/platform.h>
#include <boot/menu.h>
#include <boot/kernel_args.h>
#include <boot/platform/generic/video.h>
#include <board_config.h>
#include <util/list.h>
#include <drivers/driver_settings.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.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_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
-17
View File
@@ -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 <SupportDefs.h>
/* 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 */
+32 -29
View File
@@ -5,10 +5,6 @@
#include "video.h" #include "video.h"
//XXX
#ifdef __ARM__
#include "arch_video.h"
#endif
#include <arch/cpu.h> #include <arch/cpu.h>
#include <boot/stage2.h> #include <boot/stage2.h>
@@ -23,15 +19,10 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#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 - // #pragma mark -
@@ -66,7 +57,6 @@ video_mode_menu()
} }
// #pragma mark - // #pragma mark -
@@ -77,15 +67,16 @@ platform_set_palette(const uint8 *palette)
extern "C" void extern "C" void
platform_blit4(addr_t frameBuffer, const uint8 *data, uint16 width, uint16 height, platform_blit4(addr_t frameBuffer, const uint8 *data, uint16 width,
uint16 imageWidth, uint16 left, uint16 top) uint16 height, uint16 imageWidth, uint16 left, uint16 top)
{ {
} }
extern "C" void extern "C" void
platform_switch_to_logo(void) platform_switch_to_logo(void)
{ {
TRACE(("%s()\n", __FUNCTION__)); CALLED();
// in debug mode, we'll never show the logo // in debug mode, we'll never show the logo
if ((platform_boot_options() & BOOT_OPTION_DEBUG_OUTPUT) != 0) if ((platform_boot_options() & BOOT_OPTION_DEBUG_OUTPUT) != 0)
return; return;
@@ -95,15 +86,15 @@ platform_switch_to_logo(void)
status_t err; status_t err;
#ifdef __ARM__ if (gFramebuffer != NULL) {
err = arch_set_default_video_mode(); err = gFramebuffer->SetDefaultMode();
dprintf("set video mode: 0x%08x\n", err); if (err < B_OK) {
if (err < B_OK) ERROR("Framebuffer SetDefaultMode failed!\n");
return; return;
#endif }
err = video_display_splash((addr_t)gFrameBufferBase); err = video_display_splash(gFramebuffer->Base());
dprintf("video_display_splash: 0x%08x\n", err); }
#warning U-Boot:TODO #warning U-Boot:TODO
} }
@@ -111,7 +102,7 @@ platform_switch_to_logo(void)
extern "C" void extern "C" void
platform_switch_to_text_mode(void) platform_switch_to_text_mode(void)
{ {
TRACE(("%s()\n", __FUNCTION__)); CALLED();
#warning U-Boot:TODO #warning U-Boot:TODO
} }
@@ -119,14 +110,26 @@ platform_switch_to_text_mode(void)
extern "C" status_t extern "C" status_t
platform_init_video(void) platform_init_video(void)
{ {
TRACE(("%s()\n", __FUNCTION__)); CALLED();
#warning U-Boot:TODO
#ifdef __ARM__ #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 #endif
if (gFramebuffer != NULL) {
gFramebuffer->Probe();
gFramebuffer->Init();
}
//XXX for testing //XXX for testing
//platform_switch_to_logo(); //platform_switch_to_logo();
//return arch_probe_video_mode(); //return arch_probe_video_mode();
//return B_OK;
}
return B_OK;
}