From 8ab5b8953cd3dc3e12f16ffa68284be1fa79bc09 Mon Sep 17 00:00:00 2001 From: chinky Date: Mon, 6 Mar 2017 13:48:37 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9vga=5Fsetmode()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/fbtool.c | 247 ++++++++++++++++++++++++++------------------------- src/vga.c | 46 +++++++++- 2 files changed, 167 insertions(+), 126 deletions(-) diff --git a/src/fbtool.c b/src/fbtool.c index f857f30..a18a979 100644 --- a/src/fbtool.c +++ b/src/fbtool.c @@ -11,7 +11,8 @@ FBDEV currFbdev; //打开并且初始化该frame buffer -int fb_open(char * sFbdev) +int +fb_open(char* sFbdev) { memset(&currFbdev, 0, sizeof(FBDEV)); strcpy(currFbdev.dev, sFbdev); @@ -22,185 +23,185 @@ int fb_open(char * sFbdev) if (currFbdev.fb < 0) { printf("打开错误 %s.请检查内核配置\n", currFbdev.dev); return 0; - } + } - // 初始化fb_var - if(-1 == ioctl(currFbdev.fb,FBIOGET_VSCREENINFO,&(currFbdev.fb_var))) - { - printf("ioctl FBIOGET_VSCREENINFO\n"); - return 0; - } + // 初始化fb_var + if (-1 == ioctl(currFbdev.fb, FBIOGET_VSCREENINFO, &(currFbdev.fb_var))) { + printf("ioctl FBIOGET_VSCREENINFO\n"); + return 0; + } - // 初始化fb_fix - if(-1 == ioctl(currFbdev.fb,FBIOGET_FSCREENINFO,&(currFbdev.fb_fix))) - { - printf("ioctl FBIOGET_FSCREENINFO\n"); - return 0; - } + // 初始化fb_fix + if (-1 == ioctl(currFbdev.fb, FBIOGET_FSCREENINFO, &(currFbdev.fb_fix))) { + printf("ioctl FBIOGET_FSCREENINFO\n"); + return 0; + } - //将物理地址映射到虚拟地址 - currFbdev.fb_mem_offset = (unsigned long)currFbdev.fb_fix.smem_start & (~PAGE_MASK); + //将物理地址映射到虚拟地址 + currFbdev.fb_mem_offset = + (unsigned long)currFbdev.fb_fix.smem_start & (~PAGE_MASK); - currFbdev.fb_mem = (unsigned long int)mmap(NULL,currFbdev.fb_fix.smem_len + currFbdev.fb_mem_offset,PROT_READ|PROT_WRITE,MAP_SHARED,currFbdev.fb,0); - - if(-1L == (long)currFbdev.fb_mem){ - printf("mmap error with mem:%lu,mem_offset:%lu\n",currFbdev.fb_mem_offset,currFbdev.fb_mem); - return 0; - } - - return 1; + currFbdev.fb_mem = (unsigned long int)mmap( + NULL, currFbdev.fb_fix.smem_len + currFbdev.fb_mem_offset, + PROT_READ | PROT_WRITE, MAP_SHARED, currFbdev.fb, 0); + + if (-1L == (long)currFbdev.fb_mem) { + printf("mmap error with mem:%lu,mem_offset:%lu\n", currFbdev.fb_mem_offset, + currFbdev.fb_mem); + return 0; + } + + return 1; } //关闭frame buffer -int fb_close(PFBDEV pFbdev) +int +fb_close(PFBDEV pFbdev) { - int r = close(currFbdev.fb); - currFbdev.fb = -1; + int r = close(currFbdev.fb); + currFbdev.fb = -1; - return r; + return r; } //打印frame buffer 所占内存的开始地址  -void pmem_start(PFBDEV pFbdev) +void +pmem_start(PFBDEV pFbdev) { - printf("frame buffer所占内存的开始地址为:%lu\n",currFbdev.fb_fix.smem_start); + printf("frame buffer所占内存的开始地址为:%lu\n", currFbdev.fb_fix.smem_start); } //打印FB_TYPE -void p_type(PFBDEV pFbdev) +void +p_type(PFBDEV pFbdev) { - printf("frame buffer 的类型为:%d\n",currFbdev.fb_fix.type); + printf("frame buffer 的类型为:%d\n", currFbdev.fb_fix.type); } //打印可见清晰度 -void p_visible_res(PFBDEV pFbdev) +void +p_visible_res(PFBDEV pFbdev) { - printf("frame buffer的可见清晰度为:\n\tx = %d\n\ty = %d\n",currFbdev.fb_var.xres,currFbdev.fb_var.yres); + printf("frame buffer的可见清晰度为:\n\tx = %d\n\ty = %d\n", + currFbdev.fb_var.xres, currFbdev.fb_var.yres); } //打印虚拟分辨率 -void p_virt_res(PFBDEV pFbdev) +void +p_virt_res(PFBDEV pFbdev) { - printf("frame buffer的虚拟清晰度为:\n\tx = %d\n\ty = %d\n",currFbdev.fb_var.xres_virtual,currFbdev.fb_var.yres_virtual); + printf("frame buffer的虚拟清晰度为:\n\tx = %d\n\ty = %d\n", + currFbdev.fb_var.xres_virtual, currFbdev.fb_var.yres_virtual); } //打印虚拟到可见的偏移量 -void p_offset(PFBDEV pFbdev) +void +p_offset(PFBDEV pFbdev) { - printf("frame buffer的虚拟分辨率到可见分辨率的偏移量为:\n\tx = %d\n\ty = %d\n",currFbdev.fb_var.xoffset,currFbdev.fb_var.yoffset); + printf( + "frame buffer的虚拟分辨率到可见分辨率的偏移量为:\n\tx = %d\n\ty = %d\n", + currFbdev.fb_var.xoffset, currFbdev.fb_var.yoffset); } //打印每个像素的位数 -void p_bpp(PFBDEV pFbdev) +void +p_bpp(PFBDEV pFbdev) { - printf("frame buffer的BPP为:%d\n",currFbdev.fb_var.bits_per_pixel); + printf("frame buffer的BPP为:%d\n", currFbdev.fb_var.bits_per_pixel); } //打印R,G,B和透明度 -void p_rgbt(PFBDEV pFbdev) +void +p_rgbt(PFBDEV pFbdev) { - //R位域 - printf("R位域:\n"); - struct fb_bitfield bf = currFbdev.fb_var.red; - printf("\t开始:%d\n",bf.offset); - printf("\t长度:%d\n",bf.length); - printf("\tMSB:%d\n",bf.msb_right); - - //G位域 - printf("G位域:\n"); - bf = currFbdev.fb_var.green; - printf("\t开始:%d\n",bf.offset); - printf("\t长度:%d\n",bf.length); - printf("\tMSB:%d\n",bf.msb_right); + // R位域 + printf("R位域:\n"); + struct fb_bitfield bf = currFbdev.fb_var.red; + printf("\t开始:%d\n", bf.offset); + printf("\t长度:%d\n", bf.length); + printf("\tMSB:%d\n", bf.msb_right); - // B位域 - printf("B位域:\n"); - bf = currFbdev.fb_var.blue; - printf("\t开始:%d\n",bf.offset); - printf("\t长度:%d\n",bf.length); - printf("\tMSB:%d\n",bf.msb_right); + // G位域 + printf("G位域:\n"); + bf = currFbdev.fb_var.green; + printf("\t开始:%d\n", bf.offset); + printf("\t长度:%d\n", bf.length); + printf("\tMSB:%d\n", bf.msb_right); - // 透明度位域 - printf("透明度位域:\n"); - bf = currFbdev.fb_var.transp; - printf("\t开始:%d\n",bf.offset); - printf("\t长度:%d\n",bf.length); - printf("\tMSB:%d\n",bf.msb_right); + // B位域 + printf("B位域:\n"); + bf = currFbdev.fb_var.blue; + printf("\t开始:%d\n", bf.offset); + printf("\t长度:%d\n", bf.length); + printf("\tMSB:%d\n", bf.msb_right); + + // 透明度位域 + printf("透明度位域:\n"); + bf = currFbdev.fb_var.transp; + printf("\t开始:%d\n", bf.offset); + printf("\t长度:%d\n", bf.length); + printf("\tMSB:%d\n", bf.msb_right); } //打印在内存中的高度和宽度 -void p_hw(PFBDEV pFbdev) +void +p_hw(PFBDEV pFbdev) { - printf("frame buffer在内存中所占的高度和宽度分别是:\n\t宽度 = %d\n\t高度 = %d\n",currFbdev.fb_var.height,currFbdev.fb_var.width); + printf( + "frame buffer在内存中所占的高度和宽度分别是:\n\t宽度 = %d\n\t高度 = %d\n", + currFbdev.fb_var.height, currFbdev.fb_var.width); } //清空控制台  -void clear_con(void *addr,int n,size_t len) +void +clear_con(void* addr, int n, size_t len) { - memset(addr,n,len); + memset(addr, n, len); } //映射到内存 -void inline fb_memcpy(void *addr,void *color,size_t len) +void inline fb_memcpy(void* addr, void* color, size_t len) { - memcpy(addr,color,len); + memcpy(addr, color, len); } -RGBT getRGBT(const char *temp){ - RGBT rgbt; +RGBT +getRGBT(const char* temp) +{ + RGBT rgbt; - char *c_tmp; - c_tmp = (char *)malloc(4 * sizeof(int)); + char* c_tmp; + c_tmp = (char*)malloc(4 * sizeof(int)); - c_tmp[0] = '0'; - c_tmp[1] = 'x'; - int r,g,b,t; + c_tmp[0] = '0'; + c_tmp[1] = 'x'; + int r, g, b, t; - //RGBT值的计算 - c_tmp[2] = temp[0]; - c_tmp[3] = temp[1]; - - r = strtol(c_tmp,NULL,16); - - c_tmp[2] = temp[2]; - c_tmp[3] = temp[3]; - - g = strtol(c_tmp,NULL,16); + // RGBT值的计算 + c_tmp[2] = temp[0]; + c_tmp[3] = temp[1]; - c_tmp[2] = temp[4]; - c_tmp[3] = temp[5]; - - b = strtol(c_tmp,NULL,16); - - c_tmp[2] = temp[6]; - c_tmp[3] = temp[7]; - - t = strtol(c_tmp,NULL,16); + r = strtol(c_tmp, NULL, 16); - rgbt.r = r; - rgbt.g = g; - rgbt.b = b; - rgbt.t = t; + c_tmp[2] = temp[2]; + c_tmp[3] = temp[3]; - return rgbt; + g = strtol(c_tmp, NULL, 16); + + c_tmp[2] = temp[4]; + c_tmp[3] = temp[5]; + + b = strtol(c_tmp, NULL, 16); + + c_tmp[2] = temp[6]; + c_tmp[3] = temp[7]; + + t = strtol(c_tmp, NULL, 16); + + rgbt.r = r; + rgbt.g = g; + rgbt.b = b; + rgbt.t = t; + + return rgbt; } - - - - - - - - - - - - - - - - - - - - diff --git a/src/vga.c b/src/vga.c index 1706d9a..e076312 100644 --- a/src/vga.c +++ b/src/vga.c @@ -2,11 +2,51 @@ #include "fbtool.h" //初始化framebuffer -int vga_init(void) { - char *fbdev = "/dev/fb0"; +int +vga_init(void) +{ + char* fbdev = "/dev/fb0"; if (0 == fb_open(fbdev)) { printf("Open %s fail!!\n", fbdev); return -1; } } -int vga_setmode(int mode) {} +int +vga_setmode(int mode) +{ + struct fb_bitfield bf; + //每个像素的位数 + if (currFbdev.fb_var.bits_per_pixel != 16) { + printf("不支持的模式."); + return -1; + } + // R位域 + bf = currFbdev.fb_var.red; + if (bf.offset != 0 || bf.length != 5 || bf.msb_right) { + printf("不支持的模式.\n"); + return -1 + } + + // G位域 + bf = currFbdev.fb_var.green; + if (bf.offset != 0 || bf.length != 5 || bf.msb_right) { + printf("不支持的模式.\n"); + return -1 + } + + // B位域 + bf = currFbdev.fb_var.blue; + if (bf.offset != 0 || bf.length != 5 || bf.msb_right) { + printf("不支持的模式.\n"); + return -1 + } + + // 透明度位域 + bf = currFbdev.fb_var.transp; + if (bf.offset != 0 || bf.length != 5 || bf.msb_right) { + printf("不支持的模式.\n"); + return -1 + } + + return 0; +}