/*! 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; }
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; }