Framebuuffer的应用编程

Framebuuffer是LCD的一种驱动程序。LCD是一块屏幕,上面有很多像素,我们要怎样去操作LCD呢?我们需要一个驱动程序。在嵌入式linux里面经常是使用Framebuffer来驱动LCD。从名字上来看,frame是一帧,buffer是缓存,framebuffer是用来保存一帧数据的缓存。

在驱动程序里面会在内存里面分配一个framebuffer,在framebuffer里面会保存有每一个像素的颜色值。假设LCD上一个像素的颜色值是32位,在framebuffer中,第零个32位数据,就是LCD上第零个像素的颜色值,framebuffer上的数据和LCD上像素一一对应。对于应用程序来说,只要把数据扔进framebuffer里面就可以了。那么谁把framebuffer中的数据在屏幕上一一显示出来呢?由LCD控制器来做。设置好LCD控制器后,它就会周而复始地从framebuffer从头到尾取出数据在LCD上显示出来。从头取到尾,再从头取到尾。应用程序将数据放到framebuffer里面,LCD控制器马上就会将数据搬到LCD上,一小段时间就能在LCD上显示出来,这一小段时间人眼根本看不出来,就好像应用程序马上就可以修改屏幕上的像素一样。

我们要去修改LCD上的某个像素的颜色值时,我们必须知道LCD屏幕的分辨率,还要知道一个像素颜色值的表示方式,也就是每个颜色用多少位来表示,也就是bbp.


在想要修改(x,y)点出的像素,我们要找出在framebuffer里面储存(x,y)的信息的地址。
(x,y)在framebuffer里面的偏移地址:(y*xres+x)*bpp/8
framebuffer的首地址加上上面计算的偏移地址就是LCD上(x,y)在framebuffer里面的地址

像素颜色的表示方法:


涉及的API函数
open函数,ioctl函数(通过这个来获取LCD的参数) mmap函数(去映射framebuffer)framebuffer是驱动程序分配的,应用程序去使用它,必须映射到用户空间。
然后学习韦东山的例程
在main函数里面首先打开设备结点,打开驱动程序
fd_fb = open("/dev/fb0", O_RD_WR) ;
利用ioctl函数获得LCD屏幕函数,




接下来映射framebuffer

fb_base = (unsigned char *)mmap(NULL , screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0);
 

  • NULL:这个参数指定了映射区域的起始地址。传递NULL意味着让系统自动选择地址。

  • PROT_READ | PROT_WRITE:这些标志指定了对映射内存的访问权限。PROT_READ允许读取,PROT_WRITE允许写入。这里同时设置了这两个标志,意味着进程可以读写映射的内存区域。

  • MAP_SHARED:这个标志指定了映射类型。MAP_SHARED意味着对映射内存的修改会反映到底层的文件或设备中,也会被其他映射这个文件或设备的进程看到。

  • 0:这是偏移量,指定了映射开始的偏移位置。在这里传递0意味着从文件的开头开始映射

screen_size是屏幕大小,也就是屏幕像素在framebuffer里面总共有多少字节


画点函数

字符的编码方式:
要显示一个字符,要知道字符的编码值,要显示成什么样子还得找到它的字体文件
显示ASCII码编码的字符A,通过编码值,在点阵文件找到对应的点阵数组,下面的图左右两边行和行一一对应

c*16是字符c在点阵数组中的起始地址,把这个地址保存在dots中

同一个字符在不同的编码格式下,会有不同的编码值

对于同一个源码程序,由于编码格式不同,导致执行的结果不同,可以用指定编码格式来解决
指定源文件或可执行程序里那些字符的编码方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值