Add toolchain and mbtk source
Change-Id: Ie12546301367ea59240bf23d5e184ad7e36e40b3
diff --git a/mbtk/test/framebuffer_demo.c b/mbtk/test/framebuffer_demo.c
new file mode 100755
index 0000000..281e9ab
--- /dev/null
+++ b/mbtk/test/framebuffer_demo.c
@@ -0,0 +1,283 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <linux/fb.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <math.h>
+
+/**< \brief 根据实际情况修改,此处为unsigned short是565的屏,根据程序打印出的
+ bits_per_pixel的值可以判断出输出格式是565还是888 */
+// typedef unsigned int color_t;
+typedef unsigned short color_t;
+/**< \brief 定义每个像素点对应的位数,如果是565的屏则为16,如果是888的屏则为32 */
+// #define BITS_PER_PIXEL 32
+#define BITS_PER_PIXEL 16
+
+static struct fb_var_screeninfo __g_vinfo; /* 显示信息 */
+color_t *__gp_frame; /* 虚拟屏幕首地址 */
+
+#pragma pack(2)
+typedef unsigned short WORD;
+typedef unsigned char BYTE;
+typedef unsigned int DWORD;
+typedef int LONG;
+
+typedef struct tagBITMAPFILEHEADER
+{
+ WORD bfType; // 位图文件的类型,必须为BM
+ DWORD bfSize; // 位图文件的大小,以字节为单位
+ WORD bfReserved1; // 位图文件保留字,必须为0
+ WORD bfReserved2; // 位图文件保留字,必须为0
+ DWORD bfOffBits; // 位图数据的起始位置,以相对于位图
+ // 文件头的偏移量表示,以字节为单位
+} BITMAPFILEHEADER;
+
+typedef struct tagBITMAPINFOHEADER
+{
+ DWORD biSize; // 本结构所占用字节数
+ LONG biWidth; // 位图的宽度,以像素为单位
+ LONG biHeight; // 位图的高度,以像素为单位
+ WORD biPlanes; // 目标设备的级别,必须为1
+ WORD biBitCount;// 每个像素所需的位数,必须是1(双色),
+ // 4(16色),8(256色)或24(真彩色)之一
+ DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),
+ // 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
+ DWORD biSizeImage; // 位图的大小,以字节为单位
+ LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数
+ LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数
+ DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数
+ DWORD biClrImportant;// 位图显示过程中重要的颜色数
+} BITMAPINFOHEADER;
+#pragma pack(0)
+
+typedef WORD (*bmp_xx_to_16)(char *);
+
+//画点
+void draw_point(int x, int y, color_t color)
+{
+ color_t *p = __gp_frame;
+
+ p += __g_vinfo.xres * y + x;
+ *p = color;
+}
+
+WORD bmp_24_to_16(char *input)
+{
+ /* 如果使用的bmp图片的颜色深度是24位,适用于888的屏,但如果一定要在565的屏
+ 上显示,则取红色的高5位,绿色的高6位和蓝色的高5位,拼成16位的数据
+ 进行显示。这样做并不是最好的办法,更好的方法是将需要丢失的部分数
+ 据进行进位或舍去。
+ */
+ WORD c;
+ char b, g, r;
+ r = *input >> 3;
+ input++;
+ g = *input >> 2;
+ input++;
+ b = *input >> 3;
+
+ c = (b << 11) | (g << 5) | r;
+
+ return c;
+}
+
+WORD bmp_16_to_16(char *input)
+{
+ WORD c;
+
+ c = *input;
+ input++;
+ c = (c << 8) | *input;
+ c = ((c >> 8) & 0x00ff) | ((c & 0x00ff) << 8);
+
+ return c;
+}
+
+//功能:在指定坐标显示指定BPM24位图
+//参数:(x , y)坐标
+// pic:24位BMP图像
+void Show_BMP(int x , int y , const char *pic)
+{
+ int fd = 0;
+ color_t c;
+ BITMAPFILEHEADER filehead;
+ BITMAPINFOHEADER infohead;
+ int i,j;
+ unsigned char pixel_byte;
+ unsigned char *p = NULL , *p_data = NULL;
+ int width_error = 0;
+ short* t_data = NULL;
+ bmp_xx_to_16 transform_func = NULL;
+ int index = 0;
+
+ printf("%s: %s\n", __FUNCTION__, pic);
+ fd = open(pic , O_RDONLY);
+ if(fd == -1) {
+ printf("fail to open\n");
+ return;
+ }
+
+ read(fd , &filehead , sizeof(filehead));
+ read(fd , &infohead , sizeof(infohead));
+ printf("bfType: 0x%x, bfSize: %d, bfOffBits: 0x%x\n", filehead.bfType, filehead.bfSize, filehead.bfOffBits);
+
+ printf("biSize: %d, biWidth: %d, biHeight: %d\n", infohead.biSize, infohead.biWidth, infohead.biHeight);
+ printf("biPlanes: %d, biBitCount: %d, biCompression: %d\n", infohead.biPlanes, infohead.biBitCount, infohead.biCompression);
+ printf("biSizeImage: %d, biXPelsPerMeter: %d, biYPelsPerMeter: %d\n", infohead.biSizeImage, infohead.biXPelsPerMeter, infohead.biYPelsPerMeter);
+
+ width_error = (4 - infohead.biWidth * 3 % 4) % 4;
+ pixel_byte = infohead.biBitCount / 8;
+
+ if (16 == infohead.biBitCount) {
+ transform_func = bmp_16_to_16;
+ } else if (24 == infohead.biBitCount) {
+ transform_func = bmp_24_to_16;
+ } else {
+ printf("Not Suppurt %d bmp\n", infohead.biBitCount);
+ close(fd);
+ return;
+ }
+
+ t_data = malloc(__g_vinfo.xres_virtual * __g_vinfo.yres_virtual * __g_vinfo.bits_per_pixel / 8);
+
+ if(t_data == NULL) {
+ perror("fail to malloc");
+ }
+
+ p_data = malloc(infohead.biSizeImage);
+ if(p_data == NULL) {
+ perror("fail to malloc");
+ }
+
+ printf("biSizeImage:%d, width_error: %d\n", infohead.biSizeImage, width_error);
+ read(fd , p_data , infohead.biSizeImage);
+ p = p_data;
+
+ int ret;
+ char data[24] = {0};
+ int debug_fd = open("/data/debug_fb", O_RDWR|O_CREAT|O_TRUNC, 0644);
+ if (debug_fd < 0) {
+ printf("debug_fb open error\n");
+ return;
+ }
+ printf("height:%d, width:%d\n", infohead.biHeight, infohead.biWidth);
+ for(j = infohead.biHeight - 1; j >= 0; j--) {
+ for(i = 0; i < infohead.biWidth; i++) {
+ c = transform_func(p);
+ // c = *p;
+ p += pixel_byte;
+ // c = ((c >> 8) & 0x00ff) | ((c & 0x00ff) << 8);
+ t_data[__g_vinfo.xres * (y + j) + (x + i)] = c;
+ // draw_point(x + i, y + j, c);
+ index++;
+
+ sprintf(data, "index:%d, i:%d, j:%d\n", index, i, j);
+ ret = write(debug_fd, data, strlen(data));
+ if (ret < 0) {
+ printf("%s write error\n", __FUNCTION__);
+ }
+ }
+ p += width_error;
+ }
+ close(debug_fd);
+ printf("%s: %d\n", __FUNCTION__, infohead.biHeight * infohead.biWidth * __g_vinfo.bits_per_pixel / 8);
+ memcpy(__gp_frame, t_data,
+ infohead.biHeight * infohead.biWidth * __g_vinfo.bits_per_pixel / 8);
+ printf("%s: %d\n", __FUNCTION__, index);
+ free(p_data);
+ free(t_data);
+ close(fd);
+}
+
+/**
+ * \brief 填充整屏
+ */
+void full_screen (color_t color)
+{
+ int i;
+ color_t *p = __gp_frame;
+
+ for (i = 0; i < __g_vinfo.xres_virtual * __g_vinfo.yres_virtual; i++) {
+ *p++ = color;
+ }
+}
+
+/**
+ * \brief 清屏
+ */
+void clear()
+{
+ full_screen(0);
+}
+
+/* framebuffer初始化 */
+int framebuffer_init (void)
+{
+ int fd = 0;
+
+ fd = open("/dev/fb0", O_RDWR);
+ if (fd == -1) {
+ perror("fail to open /dev/fb0\n");
+ return -1;
+ }
+
+ /* 获取显示信息 */
+ ioctl(fd, FBIOGET_VSCREENINFO, &__g_vinfo); /* 获取显示信息 */
+ printf("bits_per_pixel = %d\n", __g_vinfo.bits_per_pixel); /* 得到一个像素点对应的位数 */
+ printf("xres_virtual = %d\n", __g_vinfo.xres_virtual); /* 打印虚拟屏幕列数 */
+ printf("yres_virtual = %d\n", __g_vinfo.yres_virtual); /* 打印虚拟屏幕行数 */
+ printf("xres = %d\n", __g_vinfo.xres); /* 打印屏幕列数 */
+ printf("yres = %d\n", __g_vinfo.yres); /* 打印屏幕行数 */
+
+ int len = __g_vinfo.xres_virtual * __g_vinfo.yres_virtual * __g_vinfo.bits_per_pixel / 8; /* 映射区大小 */
+
+ printf("fb size = %d\n", len);
+ __gp_frame = mmap(NULL, /* 映射区的开始地址,为NULL表示由系统决定映射区的起始地址 */
+ len,
+ PROT_WRITE | PROT_READ, /* 内存保护标志(可读可写) */
+ MAP_SHARED, /* 映射对象类型(与其他进程共享) */
+ fd, /* 有效的文件描述符 */
+ 0); /* 被映射内容的偏移量 */
+ if (__gp_frame == NULL) {
+ perror("fail to mmap\n");
+ return -1;
+ }
+
+ return fd;
+}
+
+
+int main(int argc, const char *argv[])
+{
+ int fd;
+
+ if (argc < 2) {
+ printf("%s \" img \"", argv[0]);
+ exit(1);
+ }
+
+ fd = framebuffer_init();
+ if (fd < 0) {
+ printf("framebuffer_init error\n");
+ return 0;
+ }
+
+ printf("framebuffer_init Success.\n");
+ /* 清屏 */
+ clear();
+
+ printf("clear Success.\n");
+
+ // full_screen(0xF800); // 显示红色
+
+ Show_BMP(0 , 0 , argv[1]);
+
+ close(fd);
+
+ return 0;
+}