/*!	Remaps the frame buffer if necessary; if we've already mapped the complete
	frame buffer, there is no need to map it again.
*/
static status_t
remap_frame_buffer(vesa_info& info, addr_t physicalBase, uint32 width,
	uint32 height, int8 depth, uint32 bytesPerRow, bool initializing)
{
	vesa_shared_info& sharedInfo = *info.shared_info;
	addr_t frameBuffer = info.frame_buffer;

	if (!info.complete_frame_buffer_mapped) {
		addr_t base = physicalBase;
		size_t size = bytesPerRow * height;
		bool remap = !initializing;

		if (info.physical_frame_buffer_size != 0) {
			// we can map the complete frame buffer
			base = info.physical_frame_buffer;
			size = info.physical_frame_buffer_size;
			remap = true;
		}

		if (remap) {
			area_id area = map_physical_memory("vesa frame buffer", base,
				size, B_ANY_KERNEL_ADDRESS, B_READ_AREA | B_WRITE_AREA,
				(void**)&frameBuffer);
			if (area < 0)
				return area;

			if (initializing) {
				// We need to manually update the kernel's frame buffer address,
				// since this frame buffer remapping has not been issued by the
				// app_server (which would otherwise take care of this)
				frame_buffer_update(frameBuffer, width, height, depth,
					bytesPerRow);
			}

			delete_area(info.shared_info->frame_buffer_area);

			info.frame_buffer = frameBuffer;
			sharedInfo.frame_buffer_area = area;

			// Turn on write combining for the area
			vm_set_area_memory_type(area, base, B_MTR_WC);

			if (info.physical_frame_buffer_size != 0)
				info.complete_frame_buffer_mapped = true;
		}
	}

	if (info.complete_frame_buffer_mapped)
		frameBuffer += physicalBase - info.physical_frame_buffer;

	// Update shared frame buffer information
	sharedInfo.frame_buffer = (uint8*)frameBuffer;
	sharedInfo.physical_frame_buffer = (uint8*)physicalBase;
	sharedInfo.bytes_per_row = bytesPerRow;

	return B_OK;
}
Exemple #2
0
extern "C" status_t
platform_init_video(void)
{
	extern ArchFramebuffer* arch_get_framebuffer_arm_bcm2708();
	gFramebuffer = arch_get_framebuffer_arm_bcm2708();

	if (gFramebuffer == NULL)
		return B_ERROR;

	status_t result = gFramebuffer->Probe();
	if (result != B_OK)
		return result;

	result = gFramebuffer->Init();
	if (result != B_OK)
		return result;

	result = gFramebuffer->SetDefaultMode();
	if (result != B_OK)
		return result;

	result = frame_buffer_update(gFramebuffer->Base(), gFramebuffer->Width(),
		gFramebuffer->Height(), gFramebuffer->Depth(),
		gFramebuffer->BytesPerRow());
	if (result != B_OK)
		return result;

	result = blue_screen_init();
	if (result != B_OK)
		return result;

	result = blue_screen_enter(false);
	if (result != B_OK)
		return result;

	blue_screen_clear_screen();
	blue_screen_puts("Welcome to very early on-screen debug output on rPi!\n");
	sOnScreenDebugOutputAvailable = true;

	gKernelArgs.frame_buffer.physical_buffer.start
		= gFramebuffer->PhysicalBase();
	gKernelArgs.frame_buffer.physical_buffer.size = gFramebuffer->Size();
	gKernelArgs.frame_buffer.bytes_per_row = gFramebuffer->BytesPerRow();
	gKernelArgs.frame_buffer.width = gFramebuffer->Width();
	gKernelArgs.frame_buffer.height = gFramebuffer->Height();
	gKernelArgs.frame_buffer.depth = gFramebuffer->Depth();
	gKernelArgs.frame_buffer.enabled = true;
	return B_OK;
}