免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4243 | 回复: 1
打印 上一主题 下一主题

framebuffer测试程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-13 16:08 |只看该作者 |倒序浏览

               
               
                /*mebuffer简单测试程序*/
#include stdio.h>
#include stdlib.h>
#include string.h>
#include stdint.h>
#include unistd.h>
#include fcntl.h>
#include sys/ioctl.h>
#include sys/mman.h>
#include asm/page.h>
#include linux/fb.h>
#define TRUE    1
#define FALSE   2
//a framebuffer device structure;
typedef struct fbdev{
    int fb;
    unsigned long fb_mem_offset;
    unsigned long fb_mem;
    struct fb_fix_screeninfo fb_fix;
    struct fb_var_screeninfo fb_var;
    char dev[20];
} FBDEV, *PFBDEV;
int fb_open(PFBDEV pFbdev)
{
    pFbdev->fb = open(pFbdev->dev, O_RDWR);
    if(pFbdev->fb  0)
    {
        printf("Error opening %s: %m. Check kernel config\n", pFbdev->dev);
        return FALSE;
    }
    if (-1 == ioctl(pFbdev->fb,FBIOGET_VSCREENINFO,&(pFbdev->fb_var)))
    {
        printf("ioctl FBIOGET_VSCREENINFO\n");
        return FALSE;
    }
    if (-1 == ioctl(pFbdev->fb,FBIOGET_FSCREENINFO,&(pFbdev->fb_fix)))
    {
        printf("ioctl FBIOGET_FSCREENINFO\n");
        return FALSE;
    }
    //map physics address to virtual address
    pFbdev->fb_mem_offset = (unsigned long)(pFbdev->fb_fix.smem_start) & (~PAGE_MASK);
    pFbdev->fb_mem = (unsigned long int)mmap(NULL, pFbdev->fb_fix.smem_len +
            pFbdev->fb_mem_offset,
            PROT_READ | PROT_WRITE, MAP_SHARED, pFbdev->fb, 0);
    if (-1L == (long) pFbdev->fb_mem)
    {
        printf("mmap error! mem:%ld offset:%ld\n", pFbdev->fb_mem,
                pFbdev->fb_mem_offset);
        return FALSE;
    }
    return TRUE;
}
void fb_close(PFBDEV pFbdev)
{
    close(pFbdev->fb);
    pFbdev->fb=-1;
}
void fb_memset (void *addr, int c, size_t len)
{
    memset(addr, c, len);
}
void draw_dot (PFBDEV pFbdev, uint32_t x, uint32_t y, uint8_t r, uint8_t g, uint8_t b)
{
    unsigned int offset;
    if (-1L == (long) pFbdev->fb_mem)
    {
        printf("mmap error! mem:%ld offset:%ld\n", pFbdev->fb_mem,
                pFbdev->fb_mem_offset);
        return;
    }
//    offset = y*pFbdev->fb_fix.line_length+4*x;
    offset = y*pFbdev->fb_fix.line_length+2*x;
    fb_memset((void*)(pFbdev->fb_mem + pFbdev->fb_mem_offset + offset), b, 1);
    fb_memset((void*)(pFbdev->fb_mem + pFbdev->fb_mem_offset + offset + 1), g, 1);
//    fb_memset((void*)(pFbdev->fb_mem + pFbdev->fb_mem_offset + offset + 2), r, 1);
//    fb_memset((void*)(pFbdev->fb_mem + pFbdev->fb_mem_offset + offset + 3), 0x00, 1);
}
int main(void)
{
    FBDEV fb;
    memset(&fb, 0, sizeof(FBDEV));
    strcpy(fb.dev, "/dev/fb0");
    if(fb_open(&fb)==FALSE)
    {
        printf("open frame buffer error\n");
        return 0;
    }
    printf("depth(bits per pixel) =  %d\n",fb.fb_var.bits_per_pixel);
    printf("smemlen = %d\n",fb.fb_fix.smem_len);
    printf("fix_line(in byte) = %d\n",fb.fb_fix.line_length);
    int i,j;
    for(i=100; i300; ++i)
        for(j = 80;j100;++j)
        {
            draw_dot(&fb,i,j,0xff,0xff,0xff);
        }
    fb_close(&fb);
    return 0;
}


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/43090/showart_2069493.html

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
2 [报告]
发表于 2011-06-06 08:26 |只看该作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP