嵌入式Linux Framebuffer怎么描点画线

技术嵌入式Linux Framebuffer怎么描点画线这篇文章主要讲解了“嵌入式Linux Framebuffer怎么描点画线”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学

本文主要讲解“如何在嵌入式Linux Framebuffer中绘制点和线”。本文的解释简单明了,易学易懂。接下来,请跟随边肖的思路学习《如何在嵌入式Linux Framebuffer中画点画线》!

Framebuffer,顾名思义,就是指帧,buffer就是缓冲区。帧缓冲区保存每个帧图像的每个像素的颜色值。

00-1010驱动程序设置液晶控制器。

根据液晶参数设置液晶控制器的时序和信号极性。

根据液晶显示器的分辨率,BPP分配帧缓冲器。

通过ioctl获取液晶分辨率、BPP等参数。

APP通过mmap映射Framebuffer,并将数据写入Framebuffer。嵌入式Linux  Framebuffer怎么描点画线

从上图中,我们可以看到帧缓冲器和液晶显示器的可显示区域是一一对应的。使用Framebuffer进行显示实际上是将每个像素的颜色数据写入Framebuffer。下图嵌入式Linux  Framebuffer怎么描点画线显示了液晶显示器像素的坐标和帧缓冲区中的位置之间的关系

给出任何屏幕坐标(x,y)和帧缓冲区的基址fb_base。此外,液晶显示器的分辨率是Xres x Yres,它代表单个像素颜色的二进制数字bpp。它的颜色数据在帧缓冲区中的地址是:

(x,y)像素起始地址=fb_base (y*Xres x)*bpp/8

LCD操作原理

嵌入式Linux  Framebuffer怎么描点画线

像素颜色表示

#包括ys/mman.h

#包括系统/类型. h

#包括ys/stat.h

# includeunistd.h

#includelinux/fb.h

# includefcntl.h

# includestdio.h

#includestring.h

#includesys/ioctl.h

#includemath.h

staticintfd _ fb

staticstructfb _ var _ screeninfovar;/*Currentvar*/

staticintscreen _ size/*一帧数据占用的字节数*/

staticunsignedchar * fb _ base/*帧缓冲区标头地址*/

staticunsignedintline _ width/*一行数据占用的字节数*/

staticunsignedintpixel _ width/*单个像素占用的字节数*/

/**********************************************************************

*功能名称:lcd_put_pixel

*功能描述:在液晶屏的指定位置输出指定的颜色(跟踪点)。

*输入参数:X坐标、Y坐标和颜色

*输出参数:无

*返回值:是

*修改日期、版本号、修改人修改的内容

* -

----------
 * 2020/05/12      V1.0   zh(angenao)       创建
 ***********************************************************************/ 
void lcd_put_pixel(int x, int y, unsigned int color){
unsigned char *pen_8 = fb_base+y*line_width+x*pixel_width;
unsigned short *pen_16;
unsigned int *pen_32;
unsigned int red, green, blue;
pen_16 = (unsigned short *)pen_8;
pen_32 = (unsigned int *)pen_8;
switch (var.bits_per_pixel){
case 8:{
*pen_8 = color;
break;
}
case 16:{
/* 565 */
red   = (color >> 16) & 0xff;
green = (color >> 8) & 0xff;
blue  = (color >> 0) & 0xff;
color = ((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3);
*pen_16 = color;
break;
}
case 32:{
*pen_32 = color;
break;
}
default:{
printf("can't surport %dbpp\n", var.bits_per_pixel);
break;
}
}
}
int main(int argc, char **argv){
int i;
fd_fb = open("/dev/fb0", O_RDWR);/** 打开fb设备*/
if (fd_fb < 0){
printf("can't open /dev/fb0\n");
return -1;
}
if (ioctl(fd_fb, FBIOGET_VSCREENINFO, &var)){/** 获取屏幕可变信息*/
printf("can't get var\n");
return -1;
}
printf("RES:%d x %d\n",var.xres,var.yres);
printf("one pixel bits:%d\n",var.bits_per_pixel);
line_width  = var.xres * var.bits_per_pixel / 8;// 一行数据 占据字节数
printf("line_width:%d byte\n",line_width);
pixel_width = var.bits_per_pixel / 8;///单个像素占用的字节数
printf("pixel_width:%d byte\n",pixel_width);
screen_size = var.xres * var.yres * var.bits_per_pixel / 8;//一帧画面占用的字节数
printf("screen_size:%d byte\n",screen_size);
fb_base = (unsigned char *)mmap(NULL , screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0);/** 映射framebuffer的首地址*/
if (fb_base == (unsigned char *)-1){
printf("can't mmap\n");
return -1;
}
memset(fb_base, 0x00, screen_size);/* 清屏: 全部设为黑色 */
/* 随便设置出100个为红点 */
const double T=2*3.14;//周期
const int A=100;//振幅
double x,sin_y,cos_y;
int start_x,start_y;//绘图的起始点像素坐标
start_x=0;
start_y = var.yres/2;

while(1){
for(i=0;i<var.xres;i++){
x= (i*2*T)/(var.xres);
sin_y = A*sin(x);
cos_y = A*cos(x);
int w=0;
for(w=0;w<5;w++){

lcd_put_pixel(start_x+i+w,start_y+sin_y, 0x00FF00);
lcd_put_pixel(start_x+i+w,start_y+cos_y, 0xFF0000);
}
usleep(1000);
}
memset(fb_base, 0x00, screen_size);/* 清屏: 全部设为黑色 */
}
munmap(fb_base , screen_size);/** 解除内存映射*/
close(fd_fb);
return 0;
}

上述代码示例效果(手机拍出来效果略微偏色) 嵌入式Linux Framebuffer怎么描点画线

感谢各位的阅读,以上就是“嵌入式Linux Framebuffer怎么描点画线”的内容了,经过本文的学习后,相信大家对嵌入式Linux Framebuffer怎么描点画线这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/113485.html

(0)

相关推荐

  • java的基础知识总结(java基础都涉及到哪些知识)

    技术Java中的基础知识点有哪些这篇文章主要讲解了“Java中的基础知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中的基础知识点有哪些”吧!"Hell

    攻略 2021年12月21日
  • Tomcat运行Java Web内存溢出的示例分析

    技术Tomcat运行Java Web内存溢出的示例分析这篇文章主要介绍Tomcat运行Java Web内存溢出的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!如果JVM里运行的程序, 它的

    攻略 2021年12月11日
  • Centos8 下部署 ASP.net Core 程序

    技术Centos8 下部署 ASP.net Core 程序 Centos8 下部署 ASP.net Core 程序1、安装需要的SDK包,如果程序包含3.1版本,需要安装3.1的SDK。
    sudo dn

    礼包 2021年12月1日
  • 怎样使用MyBatis轻松实现递归查询与存储过程调用

    技术怎样使用MyBatis轻松实现递归查询与存储过程调用怎样使用MyBatis轻松实现递归查询与存储过程调用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。递

    攻略 2021年11月10日
  • Java怎么实现教材管理系统

    技术Java怎么实现教材管理系统这篇文章给大家介绍Java怎么实现教材管理系统,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、项目简述功能包括: 管理员可以增删改查教材、教材商、入库教材、用户(用

    攻略 2021年11月24日
  • 大戴礼记,什么是辟谷

    技术大戴礼记,什么是辟谷说到辟谷大戴礼记,相信大家多数人都会认为,辟谷就是绝食,其实辟谷是一种养生方法,而绝食是属于一种心理障碍,或者是疾病引起的无法正常进食。“辟谷”源自道家养生中的“不食五谷”,是古人常用的一种养生方

    生活 2021年10月28日