Index: kernel/arch/arm32/src/mach/raspberrypi/raspberrypi.c
===================================================================
--- kernel/arch/arm32/src/mach/raspberrypi/raspberrypi.c	(revision 409a996001b1ed2b78fd6bb8ba81e24a4023ac32)
+++ kernel/arch/arm32/src/mach/raspberrypi/raspberrypi.c	(revision f22f679fa78e8a86ddf97362ae98660cdb16ee13)
@@ -173,4 +173,13 @@
 static void raspberrypi_output_init(void)
 {
+#ifdef CONFIG_FB
+	fb_properties_t prop;
+	if (bcm2835_fb_init(&prop)) {
+		outdev_t *fb_dev = fb_init(&prop);
+		if (fb_dev)
+			stdout_wire(fb_dev);
+	}
+#endif
+
 #ifdef CONFIG_PL011_UART
 	if (pl011_uart_init(&raspi.uart, BCM2835_UART_IRQ,
Index: kernel/genarch/include/genarch/drivers/bcm2835/mbox.h
===================================================================
--- kernel/genarch/include/genarch/drivers/bcm2835/mbox.h	(revision 409a996001b1ed2b78fd6bb8ba81e24a4023ac32)
+++ kernel/genarch/include/genarch/drivers/bcm2835/mbox.h	(revision f22f679fa78e8a86ddf97362ae98660cdb16ee13)
@@ -37,4 +37,5 @@
 #define _BCM2835_MBOX_H_
 
+#include <genarch/fb/fb.h>
 #include <arch/mm/page.h>
 #include <align.h>
@@ -79,5 +80,5 @@
 #define MBOX_MSG_VALUE(msg)	((msg) & ~0xf)
 
-#define KA2VC(addr)		(KA2PA(addr) + 0x40000000)
+#define KA2VCA(addr)		(KA2PA(addr) + 0x40000000)
 
 #define MBOX_ADDR_ALIGN		16
@@ -120,5 +121,19 @@
 } mbox_getmem_buf_t;
 
+typedef struct {
+	ioport32_t width;
+	ioport32_t height;
+	ioport32_t virt_width;
+	ioport32_t virt_height;
+	ioport32_t pitch;
+	ioport32_t bpp;
+	ioport32_t x_offset;
+	ioport32_t y_offset;
+	ioport32_t addr;
+	ioport32_t size;
+} bcm2835_fb_desc_t;
+
 bool bcm2835_prop_get_memory(uint32_t *base, uint32_t *size);
+bool bcm2835_fb_init(fb_properties_t *prop);
 
 #endif
Index: kernel/genarch/src/drivers/bcm2835/mbox.c
===================================================================
--- kernel/genarch/src/drivers/bcm2835/mbox.c	(revision 409a996001b1ed2b78fd6bb8ba81e24a4023ac32)
+++ kernel/genarch/src/drivers/bcm2835/mbox.c	(revision f22f679fa78e8a86ddf97362ae98660cdb16ee13)
@@ -34,4 +34,6 @@
  */
 
+#include <mm/km.h>
+#include <mm/slab.h>
 #include <typedefs.h>
 #include <genarch/drivers/bcm2835/mbox.h>
@@ -39,7 +41,4 @@
 static void mbox_write(bcm2835_mbox_t *mbox, uint8_t chan, uint32_t value)
 {
-	if (!mbox)
-		mbox = (bcm2835_mbox_t *)BCM2835_MBOX0_ADDR;
-
 	while (mbox->status & MBOX_STATUS_FULL) ;
 	mbox->write = MBOX_COMPOSE(chan, value);
@@ -49,7 +48,4 @@
 {
 	uint32_t msg;
-
-	if (!mbox)
-		mbox = (bcm2835_mbox_t *)BCM2835_MBOX0_ADDR;
 
 	do {
@@ -73,6 +69,8 @@
 	req->zero = 0;
 
-	mbox_write(NULL, MBOX_CHAN_PROP_A2V, KA2VC((uint32_t)req));
-	mbox_read(NULL, MBOX_CHAN_PROP_A2V);
+	mbox_write((bcm2835_mbox_t *)BCM2835_MBOX0_ADDR,
+		   MBOX_CHAN_PROP_A2V, KA2VCA((uint32_t)req));
+	mbox_read((bcm2835_mbox_t *)BCM2835_MBOX0_ADDR,
+		  MBOX_CHAN_PROP_A2V);
 
 	if (req->buf_hdr.code == MBOX_PROP_CODE_RESP_OK) {
@@ -87,4 +85,54 @@
 }
 
+bool bcm2835_fb_init(fb_properties_t *prop)
+{
+	bcm2835_mbox_t *fb_mbox;
+	bcm2835_fb_desc_t *fb_desc;
+	void *fb_desc_buf;
+	bool ret = false;
+
+	fb_desc_buf = malloc(sizeof(bcm2835_fb_desc_t) + MBOX_ADDR_ALIGN, 0);
+	if (!fb_desc_buf)
+		return false;
+
+	fb_mbox = (void *) km_map(BCM2835_MBOX0_ADDR, sizeof(bcm2835_mbox_t),
+				  PAGE_NOT_CACHEABLE);
+	fb_desc = (bcm2835_fb_desc_t *) ALIGN_UP((uintptr_t)fb_desc_buf,
+						 MBOX_ADDR_ALIGN);
+
+	fb_desc->width = 640;
+	fb_desc->height = 480;
+	fb_desc->virt_width = fb_desc->width;
+	fb_desc->virt_height = fb_desc->height;
+	fb_desc->pitch = 0;			/* Set by VC */
+	fb_desc->bpp = 16;
+	fb_desc->x_offset = 0;
+	fb_desc->y_offset = 0;
+	fb_desc->addr = 0;			/* Set by VC */
+	fb_desc->size = 0;			/* Set by VC */
+
+	mbox_write(fb_mbox, MBOX_CHAN_FB, KA2VCA(fb_desc));
+
+	if (mbox_read(fb_mbox, MBOX_CHAN_FB)) {
+		printf("BCM2835 framebuffer initialization failed\n");
+		goto out;
+	}
+
+	prop->addr = fb_desc->addr;
+	prop->offset = 0;
+	prop->x = fb_desc->width;
+	prop->y = fb_desc->height;
+	prop->scan = fb_desc->pitch;
+	prop->visual = VISUAL_RGB_5_6_5_LE;
+
+	printf("BCM2835 framebuffer at 0x%08x (%dx%d)\n", prop->addr,
+	       prop->x, prop->y);
+	ret = true;
+out:
+	km_unmap((uintptr_t)fb_mbox, sizeof(bcm2835_mbox_t));
+	free(fb_desc_buf);
+	return ret;
+}
+
 /**
  * @}
