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 <ithamar@upgrade-android.com>
This commit is contained in:
Ithamar R. Adema 2012-11-03 05:01:10 +01:00
parent 9a31eef24c
commit 03e2e071fd
4 changed files with 37 additions and 35 deletions

View File

@ -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()

View File

@ -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 -

View File

@ -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);

View File

@ -14,6 +14,7 @@
#include <boot/platform/generic/video.h>
#include <util/list.h>
#include <drivers/driver_settings.h>
#include <board_config.h>
#include <stdio.h>
#include <stdlib.h>
@ -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;
}