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 <[email protected]>
This commit is contained in:
@@ -21,16 +21,19 @@
|
|||||||
|
|
||||||
class ArchFBArm920 : public ArchFramebuffer {
|
class ArchFBArm920 : public ArchFramebuffer {
|
||||||
public:
|
public:
|
||||||
ArchFBArm920(addr_t base);
|
ArchFBArm920(addr_t base)
|
||||||
~ArchFBArm920();
|
: ArchFramebuffer(base) {}
|
||||||
|
~ArchFBArm920() {}
|
||||||
status_t Init();
|
status_t Init();
|
||||||
status_t Probe();
|
status_t Probe();
|
||||||
status_t SetDefaultMode();
|
status_t SetDefaultMode();
|
||||||
status_t SetVideoMode(int width, int height, int depth);
|
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
|
status_t
|
||||||
ArchFBArm920::Init()
|
ArchFBArm920::Init()
|
||||||
|
|||||||
@@ -40,15 +40,20 @@ extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size,
|
|||||||
|
|
||||||
class ArchFBArmOmap3 : public ArchFramebuffer {
|
class ArchFBArmOmap3 : public ArchFramebuffer {
|
||||||
public:
|
public:
|
||||||
ArchFBArmOmap3(addr_t base);
|
ArchFBArmOmap3(addr_t base)
|
||||||
~ArchFBArmOmap3();
|
: ArchFramebuffer(base) {}
|
||||||
|
~ArchFBArmOmap3() {}
|
||||||
|
|
||||||
status_t Init();
|
status_t Init();
|
||||||
status_t Probe();
|
status_t Probe();
|
||||||
status_t SetDefaultMode();
|
status_t SetDefaultMode();
|
||||||
status_t SetVideoMode(int width, int height, int depth);
|
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 -
|
// #pragma mark -
|
||||||
|
|||||||
@@ -32,15 +32,19 @@ extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size,
|
|||||||
|
|
||||||
class ArchFBArmPxa270 : public ArchFramebuffer {
|
class ArchFBArmPxa270 : public ArchFramebuffer {
|
||||||
public:
|
public:
|
||||||
ArchFBArmPxa270(addr_t base);
|
ArchFBArmPxa270(addr_t base)
|
||||||
~ArchFBArmPxa270();
|
: ArchFramebuffer(base) {}
|
||||||
|
~ArchFBArmPxa270() {}
|
||||||
status_t Init();
|
status_t Init();
|
||||||
status_t Probe();
|
status_t Probe();
|
||||||
status_t SetDefaultMode();
|
status_t SetDefaultMode();
|
||||||
status_t SetVideoMode(int width, int height, int depth);
|
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 -
|
// #pragma mark -
|
||||||
@@ -97,8 +101,13 @@ dprintf("error %08x\n", err);
|
|||||||
struct pxa27x_lcd_dma_descriptor *dma;
|
struct pxa27x_lcd_dma_descriptor *dma;
|
||||||
|
|
||||||
// check if LCD controller is enabled
|
// 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;
|
return B_NO_INIT;
|
||||||
|
}
|
||||||
|
|
||||||
pixelFormat = bppCode = read_io_32(LCCR3);
|
pixelFormat = bppCode = read_io_32(LCCR3);
|
||||||
bppCode = ((bppCode >> 26) & 0x08) | ((bppCode >> 24) & 0x07);
|
bppCode = ((bppCode >> 26) & 0x08) | ((bppCode >> 24) & 0x07);
|
||||||
@@ -126,7 +135,7 @@ dprintf("error %08x\n", err);
|
|||||||
return B_ERROR;
|
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.width = (read_io_32(LCCR1) & ((1 << 10) - 1)) + 1;
|
||||||
gKernelArgs.frame_buffer.height = (read_io_32(LCCR2) & ((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
|
gKernelArgs.frame_buffer.bytes_per_row = gKernelArgs.frame_buffer.width
|
||||||
@@ -150,12 +159,6 @@ ArchFBArmPxa270::SetVideoMode(int width, int height, int depth)
|
|||||||
|
|
||||||
void *fb;
|
void *fb;
|
||||||
uint32 fbSize = width * height * depth / 8;
|
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;
|
fb = (void*)fBase;
|
||||||
|
|
||||||
@@ -168,8 +171,8 @@ ArchFBArmPxa270::SetVideoMode(int width, int height, int depth)
|
|||||||
|
|
||||||
// if not already enabled, set a default mode
|
// if not already enabled, set a default mode
|
||||||
if (!(read_io_32(LCCR0) & 0x00000001)) {
|
if (!(read_io_32(LCCR0) & 0x00000001)) {
|
||||||
int bpp = 0x09; // 24 bpp
|
int bpp;
|
||||||
int pdfor = 0x3; // Format 4: RGB888 (no alpha bit)
|
int pdfor;
|
||||||
dprintf("Setting video mode\n");
|
dprintf("Setting video mode\n");
|
||||||
switch (depth) {
|
switch (depth) {
|
||||||
case 4:
|
case 4:
|
||||||
@@ -201,7 +204,7 @@ ArchFBArmPxa270::SetVideoMode(int width, int height, int depth)
|
|||||||
dumpr(LCCR3);
|
dumpr(LCCR3);
|
||||||
dumpr(LCCR4);
|
dumpr(LCCR4);
|
||||||
} else
|
} else
|
||||||
return EALREADY; // for now
|
return B_OK; // assume we're already setup
|
||||||
|
|
||||||
// clear the video memory
|
// clear the video memory
|
||||||
memset((void *)fb, 0, fbSize);
|
memset((void *)fb, 0, fbSize);
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
#include <boot/platform/generic/video.h>
|
#include <boot/platform/generic/video.h>
|
||||||
#include <util/list.h>
|
#include <util/list.h>
|
||||||
#include <drivers/driver_settings.h>
|
#include <drivers/driver_settings.h>
|
||||||
|
#include <board_config.h>
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -76,14 +77,10 @@ platform_blit4(addr_t frameBuffer, const uint8 *data, uint16 width,
|
|||||||
extern "C" void
|
extern "C" void
|
||||||
platform_switch_to_logo(void)
|
platform_switch_to_logo(void)
|
||||||
{
|
{
|
||||||
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;
|
||||||
|
|
||||||
//XXX: not yet, DISABLED
|
|
||||||
return;
|
|
||||||
|
|
||||||
status_t err;
|
status_t err;
|
||||||
|
|
||||||
if (gFramebuffer != NULL) {
|
if (gFramebuffer != NULL) {
|
||||||
@@ -95,30 +92,28 @@ platform_switch_to_logo(void)
|
|||||||
|
|
||||||
err = video_display_splash(gFramebuffer->Base());
|
err = video_display_splash(gFramebuffer->Base());
|
||||||
}
|
}
|
||||||
#warning U-Boot:TODO
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
extern "C" void
|
extern "C" void
|
||||||
platform_switch_to_text_mode(void)
|
platform_switch_to_text_mode(void)
|
||||||
{
|
{
|
||||||
CALLED();
|
|
||||||
#warning U-Boot:TODO
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
extern "C" status_t
|
extern "C" status_t
|
||||||
platform_init_video(void)
|
platform_init_video(void)
|
||||||
{
|
{
|
||||||
CALLED();
|
|
||||||
|
|
||||||
#ifdef __ARM__
|
#ifdef __ARM__
|
||||||
#if defined(BOARD_CPU_ARM920T)
|
#if defined(BOARD_CPU_ARM920T)
|
||||||
|
extern ArchFramebuffer *arch_get_fb_arm_920(addr_t base);
|
||||||
gFramebuffer = arch_get_fb_arm_920(0x88000000);
|
gFramebuffer = arch_get_fb_arm_920(0x88000000);
|
||||||
#elif defined(BOARD_CPU_OMAP3)
|
#elif defined(BOARD_CPU_OMAP3)
|
||||||
|
extern ArchFramebuffer *arch_get_fb_arm_omap3(addr_t base);
|
||||||
gFramebuffer = arch_get_fb_arm_omap3(0x88000000);
|
gFramebuffer = arch_get_fb_arm_omap3(0x88000000);
|
||||||
#elif defined(BOARD_CPU_PXA270)
|
#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
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -127,9 +122,5 @@ platform_init_video(void)
|
|||||||
gFramebuffer->Init();
|
gFramebuffer->Init();
|
||||||
}
|
}
|
||||||
|
|
||||||
//XXX for testing
|
|
||||||
//platform_switch_to_logo();
|
|
||||||
//return arch_probe_video_mode();
|
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user