Linux之Framebuffer学习总结
来源:互联网 发布:淘宝双十二红包 编辑:程序博客网 时间:2024/05/22 05:10
Wikipedia中关于Framebuffer的页面:
http://en.wikipedia.org/wiki/Framebuffer
Framebuffer在Linux中的重要性不言而喻,以前都是看Kernel Code中的Framebuffer Device Driver,今天从Linux Application这边实践一把:
(1)ioctl操作
<span style="font-family:Verdana;font-size:14px;"><span style="font-family:Verdana;font-size:14px;"> struct fb_fix_screeninfo finfo; struct fb_var_screeninfo vinfo;</span></span>
<span style="font-family:Verdana;font-size:14px;"><span style="font-family:Verdana;font-size:14px;"> result = 0; memset(&finfo, 0, sizeof(struct fb_fix_screeninfo)); result = ioctl(fd, FBIOGET_FSCREENINFO, &finfo);</span></span>
<span style="font-family:Verdana;font-size:14px;"><span style="font-family:Verdana;font-size:14px;"> result = 0; memset(&vinfo, 0, sizeof(struct fb_var_screeninfo)); result = ioctl(fd, FBIOGET_VSCREENINFO, &vinfo);</span></span>
分别获取屏幕的Fix Screen Information和Var Screen Information信息:
parameters from struct fb_fix_screeninfo:
id is: radeondrmfb
smem_start is: 3490447360
smem_start is: 0xD00C0000
smem_len is: 4096000
smem_len is: 0x3E8000
type is: 0
type_aux is: 0
visual is: 2
xpanstep is: 1
ypanstep is: 1
ywrapstep is: 0
line_length is: 5120
parameters from struct fb_var_screeninfo:
xres is: 1280
yres is: 800
xres_virtual is: 1280
yres_virtual is: 800
xoffset is: 0
yoffset is: 0
bits_per_pixel is: 32
smem_start 是 "Start of frame buffer memory"
smem_len 是 "Length of frame buffer memory"
smem_len = xres_virtual * yres_virtual * (bits_per_pixel / 8)
此处则是:
1280 * 800 * 32 / 8 = 4096000 (bytes)
xres_virtual >= xres
yres_virtual >= yres
总是成立,这样可以支持双缓冲,通过在xoffset和yoffset中设置偏移量
(2)mmap映射操作
<span style="font-family:Verdana;font-size:14px;"> void* fb_addr = NULL; // fb_addr = mmap(NULL, finfo.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); fb_addr = mmap(NULL, finfo.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); perror(NULL); printf("fb_addr is: %p\n", fb_addr);</span>这行这步操作时,总是报错:
Permission denied
fb_addr is: 0xffffffffffffffff
把PROT_READ | PROT_WRITE 改为 PROT_READ,则能正确执行,怎么回事呢?
检查代码,发现问题原因是,在打开(open)文件时,权限设置错误:
fd = open(fb_path[index], O_RDWR);
这是正确的设置,开始时,设置成了O_RDONLY,没有设置O_WRONLY的权限。
(3)test操作,设置几个像素点,验证是否起作用
首先查看struct fb_var_screeninfo中的位域(bitfield):
red.offset is: 16
red.length is: 8
green.offset is: 8
green.length is: 8
blue.offset is: 0
blue.length is: 8
transp.offset is: 0
transp.length is: 0
for(vertical_index = 0; vertical_index < 100; vertical_index++)
{
for(index = 0; index < vinfo.xres; index++)
{
*(int*)(fb_addr + vertical_index * vinfo.xres + index * vinfo.bits_per_pixel / 8) =
(0x00 << 24) + (0xFF << 16) + (0xFF << 8) + (0x00 << 0);
}
}
尼玛,把数据写进去,一点反应都没有,没有任何改变,明天继续查~
- Linux之Framebuffer学习总结
- linux下FrameBuffer学习
- linux下FrameBuffer学习
- Linux设备驱动之Framebuffer
- Linux FrameBuffer分析之编写基于FrameBuffer接口的应用程序
- Linux 驱动学习-framebuffer-fb-LCD驱动
- 与afreez一起学习DirectFB之:一个linux下的framebuffer例子的学问
- Linux设备驱动之Framebuffer分析
- Linux驱动修炼之道-framebuffer
- Linux内核修炼之framebuffer分析
- 我对linux理解之framebuffer
- 我对linux理解之framebuffer
- Linux驱动修炼之道-framebuffer
- Linux设备驱动之Framebuffer分析
- Linux设备驱动之Framebuffer分析
- Linux内核修炼之framebuffer分析
- framebuffer驱动学习之代码分析
- Android surfaceflinger学习笔记之framebuffer管理
- 高校云平台从项目管理说起
- 安装nrpe报错Cannot find ssl libraries
- HTTP 协议详解
- Spring的quartz定时器同一时刻重复执行二次的问题解决
- java 位移,二进制、八进制、十进制、十六进制,超详解析!适合初学者!
- Linux之Framebuffer学习总结
- 关于quick cocos2d-x 2.2.5的安装、项目创建和下载链接
- 两个字符串中最大公共字符数(支持汉字)
- Block 内部使用self 如何防止内存循环引用
- sublime text3安装Package Control
- 二叉树建立
- 好习惯,让生活更美好!(已在App store上架)
- Linux常见错误解决
- hive语句优化-通过groupby实现distinct