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:
parent
9a31eef24c
commit
03e2e071fd
|
@ -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()
|
||||
|
|
|
@ -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 -
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue