hrev44643 adds 4 changesets to branch 'master' old head: 8e813c26cde335c408493c86f544421eb355ffac new head: 8eeafbce5f491129c36c8d1cb42a207816b9f3af ---------------------------------------------------------------------------- d501b69: rPi: Set 1 cpu in the loader 7ccc9b4: arm loader: Style cleanup of loader arm arch code * These video sources would be good cannidates to be refactored as classes. (like the arm serial code) * No functional change. There are some order style issues in some of the code (the top externs), but I decided to not fix them as I can't build these atm to test. 58f219d: beagleboard: Fix build, missing header 8eeafbc: 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 [ Alexander von Gluck IV <kallisti5@xxxxxxxxxxx> ] ---------------------------------------------------------------------------- 11 files changed, 362 insertions(+), 354 deletions(-) src/system/boot/arch/arm/Jamfile | 7 +- src/system/boot/arch/arm/arch_framebuffer.h | 51 +++++ src/system/boot/arch/arm/arch_framebuffer_920.cpp | 93 ++++++++ ..._video_omap3.cpp => arch_framebuffer_omap3.cpp} | 176 +++++++++------- ...arch_video_pxa.cpp => arch_framebuffer_pxa.cpp} | 140 ++++++------ src/system/boot/arch/arm/arch_video.cpp | 68 ------ src/system/boot/arch/arm/arch_video.h | 17 -- src/system/boot/arch/arm/arch_video_920.cpp | 93 -------- src/system/boot/platform/raspberrypi_arm/cpu.cpp | 4 +- src/system/boot/platform/u-boot/video.cpp | 61 +++--- src/system/kernel/arch/arm/arch_uart_8250.cpp | 6 +- ############################################################################ Commit: d501b694bfec1de13313b3cac5eee25b4647f916 URL: http://cgit.haiku-os.org/haiku/commit/?id=d501b69 Author: Alexander von Gluck IV <kallisti5@xxxxxxxxxxx> Date: Fri Sep 14 20:38:10 2012 UTC rPi: Set 1 cpu in the loader ---------------------------------------------------------------------------- diff --git a/src/system/boot/platform/raspberrypi_arm/cpu.cpp b/src/system/boot/platform/raspberrypi_arm/cpu.cpp index bc2f15f..f8d27d9 100644 --- a/src/system/boot/platform/raspberrypi_arm/cpu.cpp +++ b/src/system/boot/platform/raspberrypi_arm/cpu.cpp @@ -35,6 +35,8 @@ spin(bigtime_t microseconds) extern "C" void cpu_init() { + gKernelArgs.num_cpus = 1; + // this will eventually be corrected later on + #warning IMPLEMENT cpu_init } - ############################################################################ Commit: 7ccc9b45e879ebc3ec9b711ff3c4e48d173828c8 URL: http://cgit.haiku-os.org/haiku/commit/?id=7ccc9b4 Author: Alexander von Gluck IV <kallisti5@xxxxxxxxxxx> Date: Sat Sep 15 14:23:26 2012 UTC arm loader: Style cleanup of loader arm arch code * These video sources would be good cannidates to be refactored as classes. (like the arm serial code) * No functional change. There are some order style issues in some of the code (the top externs), but I decided to not fix them as I can't build these atm to test. ---------------------------------------------------------------------------- diff --git a/src/system/boot/arch/arm/arch_video.cpp b/src/system/boot/arch/arm/arch_video.cpp index bc53b92..8da3ef5 100644 --- a/src/system/boot/arch/arm/arch_video.cpp +++ b/src/system/boot/arch/arm/arch_video.cpp @@ -20,8 +20,10 @@ #include <stdlib.h> #include <string.h> + //XXX -extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size, uint32 flags); +extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size, + uint32 flags); #define TRACE_VIDEO @@ -37,7 +39,6 @@ extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size, u #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 - @@ -64,5 +65,3 @@ arch_set_default_video_mode() #endif - - diff --git a/src/system/boot/arch/arm/arch_video_920.cpp b/src/system/boot/arch/arm/arch_video_920.cpp index 4be91e3..f345b71 100644 --- a/src/system/boot/arch/arm/arch_video_920.cpp +++ b/src/system/boot/arch/arm/arch_video_920.cpp @@ -20,8 +20,10 @@ #include <stdlib.h> #include <string.h> + //XXX -extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size, uint32 flags); +extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size, + uint32 flags); #define TRACE_VIDEO @@ -37,10 +39,12 @@ extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size, u #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 @@ -50,15 +54,18 @@ arch_probe_video_mode(void) gKernelArgs.frame_buffer.width = 1024; gKernelArgs.frame_buffer.height = 768; gKernelArgs.frame_buffer.bytes_per_row = gKernelArgs.frame_buffer.width * 2; - gKernelArgs.frame_buffer.physical_buffer.size = gKernelArgs.frame_buffer.width + gKernelArgs.frame_buffer.physical_buffer.size + = gKernelArgs.frame_buffer.width * 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); + 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; + gKernelArgs.frame_buffer.physical_buffer.start + = (addr_t)gFrameBufferBase; dprintf("video framebuffer: %p\n", gFrameBufferBase); } #else diff --git a/src/system/boot/arch/arm/arch_video_omap3.cpp b/src/system/boot/arch/arm/arch_video_omap3.cpp index fe7f45f..5d96aa2 100644 --- a/src/system/boot/arch/arm/arch_video_omap3.cpp +++ b/src/system/boot/arch/arm/arch_video_omap3.cpp @@ -20,8 +20,10 @@ #include <stdlib.h> #include <string.h> + //XXX -extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size, uint32 flags); +extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size, + uint32 flags); #define TRACE_VIDEO @@ -37,7 +39,6 @@ extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size, u #define dumpr(a) dprintf("LCC:%s:0x%lx\n", #a, read_io_32(a)) - #if BOARD_CPU_OMAP3 // #pragma mark - @@ -87,13 +88,15 @@ struct video_mode modes[] = { }; -static inline void setaddr(uint32 reg, unsigned int v) +static inline void +setaddr(uint32 reg, unsigned int v) { *((volatile uint32 *)(reg)) = v; } -static inline void modaddr(unsigned int reg, unsigned int m, unsigned int v) +static inline void +modaddr(unsigned int reg, unsigned int m, unsigned int v) { uint32 o; @@ -104,31 +107,35 @@ static inline void modaddr(unsigned int reg, unsigned int m, unsigned int v) } -static inline void setreg(uint32 base, unsigned int reg, unsigned int v) +static inline +void setreg(uint32 base, unsigned int reg, unsigned int v) { - *((volatile uint32 *)(base+reg)) = v; + *((volatile uint32 *)(base + reg)) = v; } -static inline uint32 readreg(uint32 base, unsigned int reg) +static inline +uint32 readreg(uint32 base, unsigned int reg) { - return *((volatile uint32 *)(base+reg)); + return *((volatile uint32 *)(base + reg)); } -static inline void modreg(uint32 base, unsigned int reg, unsigned int m, unsigned int v) +static inline void +modreg(uint32 base, unsigned int reg, unsigned int m, unsigned int v) { uint32 o; - o = *((volatile uint32 *)(base+reg)); + o = *((volatile uint32 *)(base + reg)); o &= ~m; o |= v; - *((volatile uint32 *)(base+reg)) = o; + *((volatile uint32 *)(base + reg)) = o; } // init beagle gpio for video -static void omap_beagle_init(void) +static void +omap_beagle_init(void) { // setup GPIO stuff, i can't find any references to these setreg(GPIO1_BASE, GPIO_OE, 0xfefffedf); @@ -137,7 +144,8 @@ static void omap_beagle_init(void) } -static void omap_clock_init(void) +static void +omap_clock_init(void) { // sets pixel clock to 72MHz @@ -159,15 +167,18 @@ static void omap_clock_init(void) } -static void omap_dss_init(void) +static void +omap_dss_init(void) { setreg(DSS_BASE, DSS_SYSCONFIG, DSS_AUTOIDLE); // Select DSS1 ALWON as clock source - setreg(DSS_BASE, DSS_CONTROL, DSS_VENC_OUT_SEL | DSS_DAC_POWERDN_BGZ | DSS_DAC_DEMEN | DSS_VENC_CLOCK_4X_ENABLE); + setreg(DSS_BASE, DSS_CONTROL, DSS_VENC_OUT_SEL | DSS_DAC_POWERDN_BGZ + | DSS_DAC_DEMEN | DSS_VENC_CLOCK_4X_ENABLE); } -static void omap_dispc_init(void) +static void +omap_dispc_init(void) { uint32 DISPC = DISPC_BASE; @@ -220,18 +231,18 @@ static void omap_set_lcd_mode(int w, int h) { dprintf("omap3: set_lcd_mode %d,%d\n", w, h); - for (i=0;i<sizeof(modes)/sizeof(modes[0]);i++) { - if (w <= modes[i].width - && h <= modes[i].height) + for (i = 0; i < sizeof(modes) / sizeof(modes[0]); i++) { + if (w <= modes[i].width + && h <= modes[i].height) goto found; } i -= 1; found: m = &modes[i]; - + dprintf("omap3: found mode[%s]\n", m->name); - setreg(DISPC, DISPC_SIZE_LCD, (m->width - 1) | ((m->height-1) << 16)); + setreg(DISPC, DISPC_SIZE_LCD, (m->width - 1) | ((m->height - 1) << 16)); setreg(DISPC, DISPC_TIMING_H, m->dispc_timing_h); setreg(DISPC, DISPC_TIMING_V, m->dispc_timing_v); @@ -240,18 +251,19 @@ found: // Tell hardware to update, and wait for it modreg(DISPC, DISPC_CONTROL, - DISPC_GOLCD, - DISPC_GOLCD); + DISPC_GOLCD, + DISPC_GOLCD); while ((readreg(DISPC, DISPC_CONTROL) & DISPC_GOLCD)) ; } -static void omap_attach_framebuffer(void *data, int width, int height, int depth) +static void +omap_attach_framebuffer(void *data, int width, int height, int depth) { 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); @@ -263,22 +275,20 @@ static void omap_attach_framebuffer(void *data, int width, int height, int depth setreg(DISPC, DISPC_GFX_ROW_INC, 1); setreg(DISPC, DISPC_GFX_PIXEL_INC, 1); setreg(DISPC, DISPC_GFX_WINDOW_SKIP, 0); - setreg(DISPC, DISPC_GFX_ATTRIBUTES, - DISPC_GFXFORMAT_RGB16 - | DISPC_GFXBURSTSIZE_16x32 - | DISPC_GFXENABLE); + setreg(DISPC, DISPC_GFX_ATTRIBUTES, DISPC_GFXFORMAT_RGB16 + | DISPC_GFXBURSTSIZE_16x32 | DISPC_GFXENABLE); // Tell hardware to update, and wait for it - modreg(DISPC, DISPC_CONTROL, - DISPC_GOLCD, - DISPC_GOLCD); - + modreg(DISPC, DISPC_CONTROL, DISPC_GOLCD, DISPC_GOLCD); + while ((readreg(DISPC, DISPC_CONTROL) & DISPC_GOLCD)) ; } -static void omap_init(void) { +static void +omap_init(void) +{ dprintf("omap3: video_init()\n"); setreg(DISPC_BASE, DISPC_IRQENABLE, 0x00000); @@ -298,15 +308,18 @@ arch_probe_video_mode(void) gKernelArgs.frame_buffer.width = 1024; gKernelArgs.frame_buffer.height = 768; gKernelArgs.frame_buffer.bytes_per_row = gKernelArgs.frame_buffer.width * 2; - gKernelArgs.frame_buffer.physical_buffer.size = gKernelArgs.frame_buffer.width + gKernelArgs.frame_buffer.physical_buffer.size + = gKernelArgs.frame_buffer.width * 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); + 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; + gKernelArgs.frame_buffer.physical_buffer.start + = (addr_t)gFrameBufferBase; dprintf("video framebuffer: %p\n", gFrameBufferBase); } #else @@ -347,5 +360,3 @@ arch_set_default_video_mode() #endif - - diff --git a/src/system/boot/arch/arm/arch_video_pxa.cpp b/src/system/boot/arch/arm/arch_video_pxa.cpp index 55bb4b2..41ff526 100644 --- a/src/system/boot/arch/arm/arch_video_pxa.cpp +++ b/src/system/boot/arch/arm/arch_video_pxa.cpp @@ -20,8 +20,10 @@ #include <stdlib.h> #include <string.h> + //XXX -extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size, uint32 flags); +extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size, + uint32 flags); #define TRACE_VIDEO @@ -37,8 +39,9 @@ extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size, u #define dumpr(a) dprintf("LCC:%s:0x%lx\n", #a, read_io_32(a)) - #if BOARD_CPU_PXA270 + + // #pragma mark - @@ -89,7 +92,8 @@ arch_probe_video_mode(void) gKernelArgs.frame_buffer.height = (read_io_32(LCCR2) & ((1 << 10) - 1)) + 1; gKernelArgs.frame_buffer.bytes_per_row = gKernelArgs.frame_buffer.width * sizeof(uint32); - gKernelArgs.frame_buffer.physical_buffer.size = gKernelArgs.frame_buffer.width + gKernelArgs.frame_buffer.physical_buffer.size + = gKernelArgs.frame_buffer.width * gKernelArgs.frame_buffer.height * gKernelArgs.frame_buffer.depth / 8; @@ -98,11 +102,11 @@ arch_probe_video_mode(void) gKernelArgs.frame_buffer.enabled = true; - return B_OK; } + status_t arch_set_video_mode(int width, int height, int depth) { @@ -110,7 +114,7 @@ arch_set_video_mode(int width, int height, int depth) status_t err; void *fb; uint32 fbSize = width * height * depth / 8; - //fb = malloc(800*600*4 + 16 - 1); + //fb = malloc(800 * 600 * 4 + 16 - 1); //fb = (void *)(((uint32)fb) & ~(0x0f)); //fb = scratch - 800; //fb = (void *)0xa0000000; @@ -123,18 +127,20 @@ arch_set_video_mode(int width, int height, int depth) #endif #if 0 if (!gFrameBufferBase) { - //XXX: realloc if larger !!! + // 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; + 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; + gKernelArgs.frame_buffer.physical_buffer.start + = (addr_t)gFrameBufferBase; // 0xa8000000; */ } #endif @@ -142,7 +148,6 @@ dprintf("error %08x\n", err); dprintf("fb @ %p\n", fb); - sVideoDMADesc.fdadr = ((uint32)&sVideoDMADesc & ~0x0f) | 0x01; sVideoDMADesc.fsadr = (uint32)(fb) & ~0x0f; sVideoDMADesc.fidr = 0; @@ -172,7 +177,8 @@ dprintf("error %08x\n", err); } write_io_32(LCCR1, (0 << 0) | (width - 1)); write_io_32(LCCR2, (0 << 0) | (height - 1)); - write_io_32(LCCR3, (pdfor << 30) | ((bpp >> 3) << 29) | ((bpp & 0x07) << 24)); + write_io_32(LCCR3, (pdfor << 30) | ((bpp >> 3) << 29) + | ((bpp & 0x07) << 24)); write_io_32(FDADR0, sVideoDMADesc.fdadr); write_io_32(LCCR0, read_io_32(LCCR0) | 0x01800001); // no ints +ENB write_io_32(FBR0, sVideoDMADesc.fdadr); @@ -183,13 +189,13 @@ dprintf("error %08x\n", err); dumpr(LCCR4); } else return EALREADY; // for now - + // clear the video memory memset((void *)fb, 0, fbSize); // XXX test pattern for (int i = 0; i < 128; i++) { - ((uint32 *)fb)[i+16] = 0x000000ff << ((i%4) * 8); + ((uint32 *)fb)[i + 16] = 0x000000ff << ((i%4) * 8); scratch[i] = 0x000000ff << ((i%4) * 8); } @@ -207,5 +213,3 @@ arch_set_default_video_mode() #endif - - ############################################################################ Commit: 58f219d49f15771c0df4c7d1f53790ca0689c603 URL: http://cgit.haiku-os.org/haiku/commit/?id=58f219d Author: Alexander von Gluck IV <kallisti5@xxxxxxxxxxx> Date: Sat Sep 15 17:50:08 2012 UTC beagleboard: Fix build, missing header ---------------------------------------------------------------------------- diff --git a/src/system/kernel/arch/arm/arch_uart_8250.cpp b/src/system/kernel/arch/arm/arch_uart_8250.cpp index 6e91e6f..a2efda5 100644 --- a/src/system/kernel/arch/arm/arch_uart_8250.cpp +++ b/src/system/kernel/arch/arm/arch_uart_8250.cpp @@ -6,10 +6,12 @@ * François Revol, revol@xxxxxxx */ -#include <debug.h> + +#include <arch/arm/reg.h> #include <arch/generic/debug_uart_8250.h> -#include <new> #include <board_config.h> +#include <debug.h> +#include <new> class ArchUART8250 : public DebugUART8250 { ############################################################################ Revision: hrev44643 Commit: 8eeafbce5f491129c36c8d1cb42a207816b9f3af URL: http://cgit.haiku-os.org/haiku/commit/?id=8eeafbc Author: Alexander von Gluck IV <kallisti5@xxxxxxxxxxx> Date: Sat Sep 15 18:21:45 2012 UTC 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 ---------------------------------------------------------------------------- diff --git a/src/system/boot/arch/arm/Jamfile b/src/system/boot/arch/arm/Jamfile index cd3dd05..7d3d143 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 0000000..6057d0f --- /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@xxxxxxxxxxx + */ +#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 */ 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 f345b71..ee2125d 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@xxxxxxxx + * Copyright 2009-2012 Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. + * + * Authors: + * François Revol, revol@xxxxxxx + * Alexander von Gluck IV, kallisti5@xxxxxxxxxxx */ -#include "arch_video.h" +#include "arch_framebuffer.h" #include <arch/cpu.h> #include <boot/stage2.h> @@ -12,89 +16,78 @@ #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> +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 - +status_t +ArchFBArm920::Init() +{ + gKernelArgs.frame_buffer.enabled = true; +#warning TODO: ARM920 init + return B_OK; +} -extern void *gFrameBufferBase; status_t -arch_probe_video_mode(void) +ArchFBArm920::Probe() { - gKernelArgs.frame_buffer.depth = 16; - gKernelArgs.frame_buffer.width = 1024; - gKernelArgs.frame_buffer.height = 768; - gKernelArgs.frame_buffer.bytes_per_row = gKernelArgs.frame_buffer.width * 2; - gKernelArgs.frame_buffer.physical_buffer.size - = gKernelArgs.frame_buffer.width - * gKernelArgs.frame_buffer.height - * gKernelArgs.frame_buffer.depth / 8; - #if 0 - if (!gFrameBufferBase) { + // 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; + 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; + gKernelArgs.frame_buffer.physical_buffer.start = fBase; #endif + gKernelArgs.frame_buffer.depth = 16; + gKernelArgs.frame_buffer.width = 1024; + gKernelArgs.frame_buffer.height = 768; + gKernelArgs.frame_buffer.bytes_per_row = gKernelArgs.frame_buffer.width * 2; + gKernelArgs.frame_buffer.physical_buffer.size + = gKernelArgs.frame_buffer.width + * gKernelArgs.frame_buffer.height + * gKernelArgs.frame_buffer.depth / 8; + 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 5d96aa2..1ebffef 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@xxxxxxxx + * Copyright 2009-2012 Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. + * + * Authors: + * François Revol, revol@xxxxxxx + * Alexander von Gluck IV, kallisti5@xxxxxxxxxxx */ -#include "arch_video.h" +#include "arch_framebuffer.h" +#include <arch/arm/omap3.h> #include <arch/cpu.h> #include <boot/stage2.h> #include <boot/platform.h> @@ -20,31 +25,35 @@ #include <stdlib.h> #include <string.h> +#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 -// #pragma mark - +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); +}; -#include "graphics/omap/omap3_regs.h" +ArchFBArmOmap3 *arch_get_fb_arm_omap3(addr_t base); + + +// #pragma mark - -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,23 +309,18 @@ omap_init(void) omap_clock_init(); omap_dss_init(); omap_dispc_init(); + + return B_OK; } status_t -arch_probe_video_mode(void) +ArchFBArmOmap3::Probe() { - gKernelArgs.frame_buffer.depth = 16; - gKernelArgs.frame_buffer.width = 1024; - gKernelArgs.frame_buffer.height = 768; - gKernelArgs.frame_buffer.bytes_per_row = gKernelArgs.frame_buffer.width * 2; - gKernelArgs.frame_buffer.physical_buffer.size - = gKernelArgs.frame_buffer.width - * gKernelArgs.frame_buffer.height - * gKernelArgs.frame_buffer.depth / 8; #if 0 - if (!gFrameBufferBase) { + // 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; @@ -323,40 +329,43 @@ arch_probe_video_mode(void) dprintf("video framebuffer: %p\n", gFrameBufferBase); } #else - gFrameBufferBase = (void *)0x88000000; - gKernelArgs.frame_buffer.physical_buffer.start = (addr_t)gFrameBufferBase; + gKernelArgs.frame_buffer.physical_buffer.start = fBase; #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; + gKernelArgs.frame_buffer.depth = 16; + gKernelArgs.frame_buffer.width = 1024; + gKernelArgs.frame_buffer.height = 768; + gKernelArgs.frame_buffer.bytes_per_row = gKernelArgs.frame_buffer.width * 2; + gKernelArgs.frame_buffer.physical_buffer.size + = gKernelArgs.frame_buffer.width + * gKernelArgs.frame_buffer.height + * gKernelArgs.frame_buffer.depth / 8; - omap_init(); + TRACE("video mode: %ux%ux%u\n", gKernelArgs.frame_buffer.width, + gKernelArgs.frame_buffer.height, gKernelArgs.frame_buffer.depth); 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 41ff526..196401d 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@xxxxxxxx + * Copyright 2009-2012 Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. + * + * Authors: + * François Revol, revol@xxxxxxx + * Alexander von Gluck IV, kallisti5@xxxxxxxxxxx */ -#include "arch_video.h" +#include "arch_framebuffer.h" #include <arch/cpu.h> #include <boot/stage2.h> @@ -26,35 +30,70 @@ 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); +}; -#define write_io_32(a, v) ((*(vuint32 *)a) = v) -#define read_io_32(a) (*(vuint32 *)a) +ArchFBArmPxa270 *arch_get_fb_arm_pxa270(addr_t base); -#define dumpr(a) dprintf("LCC:%s:0x%lx\n", #a, read_io_32(a)) +// #pragma mark - -#if BOARD_CPU_PXA270 +#define write_io_32(a, v) ((*(vuint32 *)a) = v) +#define read_io_32(a) (*(vuint32 *)a) -// #pragma mark - +#define dumpr(a) dprintf("LCC:%s:0x%lx\n", #a, read_io_32(a)) -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 8da3ef5..0000000 --- a/src/system/boot/arch/arm/arch_video.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2009, François Revol, revol@xxxxxxxx - * 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 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 5481380..0000000 --- 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 <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 */ diff --git a/src/system/boot/platform/u-boot/video.cpp b/src/system/boot/platform/u-boot/video.cpp index 4d775e4..d3767f9 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 <arch/cpu.h> #include <boot/stage2.h> @@ -23,15 +19,10 @@ #include <stdlib.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 - @@ -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; +}