修改vga_setmode()

This commit is contained in:
chinky 2017-03-06 13:48:37 +08:00
parent 845828ba6a
commit 8ab5b8953c
2 changed files with 167 additions and 126 deletions

View File

@ -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);
@ -25,26 +26,28 @@ int fb_open(char * sFbdev)
}
// 初始化fb_var
if(-1 == ioctl(currFbdev.fb,FBIOGET_VSCREENINFO,&(currFbdev.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)))
{
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);
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);
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;
}
@ -52,7 +55,8 @@ int fb_open(char * sFbdev)
}
//关闭frame buffer
int fb_close(PFBDEV pFbdev)
int
fb_close(PFBDEV pFbdev)
{
int r = close(currFbdev.fb);
currFbdev.fb = -1;
@ -61,121 +65,138 @@ int fb_close(PFBDEV pFbdev)
}
//打印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位域
// 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);
printf("\t开始:%d\n", bf.offset);
printf("\t长度:%d\n", bf.length);
printf("\tMSB:%d\n", bf.msb_right);
//G位域
// 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("\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("\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);
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
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;
int r, g, b, t;
//RGBT值的计算
// RGBT值的计算
c_tmp[2] = temp[0];
c_tmp[3] = temp[1];
r = strtol(c_tmp,NULL,16);
r = strtol(c_tmp, NULL, 16);
c_tmp[2] = temp[2];
c_tmp[3] = temp[3];
g = strtol(c_tmp,NULL,16);
g = strtol(c_tmp, NULL, 16);
c_tmp[2] = temp[4];
c_tmp[3] = temp[5];
b = strtol(c_tmp,NULL,16);
b = strtol(c_tmp, NULL, 16);
c_tmp[2] = temp[6];
c_tmp[3] = temp[7];
t = strtol(c_tmp,NULL,16);
t = strtol(c_tmp, NULL, 16);
rgbt.r = r;
rgbt.g = g;
@ -184,23 +205,3 @@ RGBT getRGBT(const char *temp){
return rgbt;
}

View File

@ -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;
}