1/*
2 * Copyright 2009, Johannes Wischert
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include "video.h"
8
9#include <arch/cpu.h>
10#include <boot/stage2.h>
11#include <boot/platform.h>
12#include <boot/menu.h>
13#include <boot/kernel_args.h>
14#include <boot/platform/generic/video.h>
15#include <util/list.h>
16#include <drivers/driver_settings.h>
17
18#include <stdio.h>
19#include <stdlib.h>
20#include <string.h>
21
22#include "arch_framebuffer.h"
23
24
25ArchFramebuffer *gFramebuffer = NULL;
26
27
28//	#pragma mark -
29
30
31bool
32video_mode_hook(Menu *menu, MenuItem *item)
33{
34	return true;
35}
36
37
38Menu *
39video_mode_menu()
40{
41	Menu *menu = new(nothrow) Menu(CHOICE_MENU, "Select Video Mode");
42	MenuItem *item;
43
44	menu->AddItem(item = new(nothrow) MenuItem("Default"));
45	item->SetMarked(true);
46	item->Select(true);
47	item->SetHelpText("The Default video mode is the one currently configured "
48		"in the system. If there is no mode configured yet, a viable mode will "
49		"be chosen automatically.");
50
51
52	menu->AddSeparatorItem();
53	menu->AddItem(item = new(nothrow) MenuItem("Return to main menu"));
54	item->SetType(MENU_ITEM_NO_CHOICE);
55
56	return menu;
57}
58
59
60//	#pragma mark -
61
62
63extern "C" void
64platform_set_palette(const uint8 *palette)
65{
66}
67
68
69extern "C" void
70platform_blit4(addr_t frameBuffer, const uint8 *data, uint16 width,
71	uint16 height, uint16 imageWidth, uint16 left, uint16 top)
72{
73}
74
75
76extern "C" void
77platform_switch_to_logo(void)
78{
79	// in debug mode, we'll never show the logo
80	if ((platform_boot_options() & BOOT_OPTION_DEBUG_OUTPUT) != 0)
81		return;
82
83	status_t err;
84
85	if (gFramebuffer != NULL) {
86		err = gFramebuffer->SetDefaultMode();
87		if (err < B_OK) {
88			ERROR("Framebuffer SetDefaultMode failed!\n");
89			return;
90		}
91
92		err = video_display_splash(gFramebuffer->Base());
93	}
94}
95
96
97extern "C" void
98platform_switch_to_text_mode(void)
99{
100}
101
102
103extern "C" status_t
104platform_init_video(void)
105{
106
107#warning TODO: Fix u-boot arm framebuffer location from fdt!
108#if defined(__arm__)
109	#if defined(BOARD_CPU_ARM920T)
110		extern ArchFramebuffer *arch_get_fb_arm_920(addr_t base);
111		gFramebuffer = arch_get_fb_arm_920(0x88000000);
112	#elif defined(BOARD_CPU_BCM2835) || defined(BOARD_CPU_BCM2836)
113		extern ArchFramebuffer *arch_get_fb_arm_bcm2835(addr_t base);
114		// BCM2835/BCM2836 gets their framebuffer base from a Mailbox
115		gFramebuffer = arch_get_fb_arm_bcm2835(0x0);
116	#elif defined(BOARD_CPU_OMAP3)
117		extern ArchFramebuffer *arch_get_fb_arm_omap3(addr_t base);
118		gFramebuffer = arch_get_fb_arm_omap3(FB_BASE);
119	#elif defined(BOARD_CPU_PXA270)
120		ArchFramebuffer *arch_get_fb_arm_pxa270(addr_t base);
121		gFramebuffer = arch_get_fb_arm_pxa270(0xA3000000);
122	#endif
123#endif
124
125	if (gFramebuffer == NULL) {
126		ERROR("No framebuffer device found!\n");
127		return B_ERROR;
128	}
129
130	status_t result = gFramebuffer->Probe();
131	if (result != B_OK)
132		return result;
133
134	gFramebuffer->Init();
135	if (result != B_OK)
136		return result;
137
138	return B_OK;
139}
140