[Feature]add MT2731_MP2_MR2_SVN388 baseline version

Change-Id: Ief04314834b31e27effab435d3ca8ba33b499059
diff --git a/src/bsp/lk/dev/fbcon/fbcon.c b/src/bsp/lk/dev/fbcon/fbcon.c
new file mode 100644
index 0000000..796fc6f
--- /dev/null
+++ b/src/bsp/lk/dev/fbcon/fbcon.c
@@ -0,0 +1,200 @@
+/*
+ * Copyright (c) 2008, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <debug.h>
+#include <err.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <dev/fbcon.h>
+
+#include "font5x12.h"
+
+struct pos {
+	int x;
+	int y;
+};
+
+static struct fbcon_config *config = NULL;
+
+#define RGB565_BLUE     0x001f
+#define RGB565_WHITE        0xffff
+
+#define FONT_WIDTH      5
+#define FONT_HEIGHT     12
+
+static uint16_t         BGCOLOR;
+static uint16_t         FGCOLOR;
+
+static struct pos       cur_pos;
+static struct pos       max_pos;
+
+static void fbcon_drawglyph(uint16_t *pixels, uint16_t paint, unsigned stride,
+                            unsigned *glyph)
+{
+	unsigned x, y, data;
+	stride -= FONT_WIDTH;
+
+	data = glyph[0];
+	for (y = 0; y < (FONT_HEIGHT / 2); ++y) {
+		for (x = 0; x < FONT_WIDTH; ++x) {
+			if (data & 1)
+				*pixels = paint;
+			data >>= 1;
+			pixels++;
+		}
+		pixels += stride;
+	}
+
+	data = glyph[1];
+	for (y = 0; y < (FONT_HEIGHT / 2); y++) {
+		for (x = 0; x < FONT_WIDTH; x++) {
+			if (data & 1)
+				*pixels = paint;
+			data >>= 1;
+			pixels++;
+		}
+		pixels += stride;
+	}
+}
+
+static void fbcon_flush(void)
+{
+	if (config->update_start)
+		config->update_start();
+	if (config->update_done)
+		while (!config->update_done());
+}
+
+/* TODO: Take stride into account */
+static void fbcon_scroll_up(void)
+{
+	unsigned short *dst = config->base;
+	unsigned short *src = dst + (config->width * FONT_HEIGHT);
+	unsigned count = config->width * (config->height - FONT_HEIGHT);
+
+	while (count--) {
+		*dst++ = *src++;
+	}
+
+	count = config->width * FONT_HEIGHT;
+	while (count--) {
+		*dst++ = BGCOLOR;
+	}
+
+	fbcon_flush();
+}
+
+/* TODO: take stride into account */
+static void fbcon_clear(void)
+{
+	uint16_t *dst = config->base;
+	unsigned count = config->width * config->height;
+
+	cur_pos.x = 0;
+	cur_pos.y = 0;
+
+	while (count--)
+		*dst++ = BGCOLOR;
+}
+
+
+static void fbcon_set_colors(unsigned bg, unsigned fg)
+{
+	BGCOLOR = bg;
+	FGCOLOR = fg;
+}
+
+void fbcon_putc(char c)
+{
+	uint16_t *pixels;
+
+	/* ignore anything that happens before fbcon is initialized */
+	if (!config)
+		return;
+
+	if ((unsigned char)c > 127)
+		return;
+	if ((unsigned char)c < 32) {
+		if (c == '\n')
+			goto newline;
+		else if (c == '\r')
+			cur_pos.x = 0;
+		return;
+	}
+
+	pixels = config->base;
+	pixels += cur_pos.y * FONT_HEIGHT * config->width;
+	pixels += cur_pos.x * (FONT_WIDTH + 1);
+	fbcon_drawglyph(pixels, FGCOLOR, config->stride,
+	                font5x12 + (c - 32) * 2);
+
+	cur_pos.x++;
+	if (cur_pos.x < max_pos.x)
+		return;
+
+newline:
+	cur_pos.y++;
+	cur_pos.x = 0;
+	if (cur_pos.y >= max_pos.y) {
+		cur_pos.y = max_pos.y - 1;
+		fbcon_scroll_up();
+	} else
+		fbcon_flush();
+}
+
+void fbcon_setup(struct fbcon_config *_config)
+{
+	uint32_t bg;
+	uint32_t fg;
+
+	ASSERT(_config);
+
+	config = _config;
+
+	switch (config->format) {
+		case FB_FORMAT_RGB565:
+			bg = RGB565_BLUE;
+			fg = RGB565_WHITE;
+			break;
+
+		default:
+			dprintf(CRITICAL, "unknown framebuffer pixel format\n");
+			ASSERT(0);
+			break;
+	}
+
+	fbcon_set_colors(bg, fg);
+
+	fbcon_clear();
+	fbcon_flush();
+
+	cur_pos.x = 0;
+	cur_pos.y = 0;
+	max_pos.x = config->width / (FONT_WIDTH+1);
+	max_pos.y = (config->height - 1) / FONT_HEIGHT;
+}