免费注册 查看新帖 |

Chinaunix

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

[驱动] linux framebuffer 出错?求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-08 23:02 |只看该作者 |倒序浏览
本帖最后由 yyplc 于 2012-05-10 17:49 编辑

今天写一个应用程序测试linux 视频子系统frame buffer设备,发现ioctl竟然出错,均返回-1,不知到为什么?
更奇怪的是,在内核端fb_ioctl加入printk调式,竟然也没有输出,说明用户程序ioctl的时候,根本不会执行fbioctl!!!
求助高手,指点一下菜鸟!
static const struct file_operations fb_fops = {
        .owner =        THIS_MODULE,
        .read =                fb_read,
        .write =        fb_write,
        .unlocked_ioctl = fb_ioctl,
#ifdef CONFIG_COMPAT
        .compat_ioctl = fb_compat_ioctl,
#endif
        .mmap =                fb_mmap,
        .open =                fb_open,
        .release =        fb_release,
#ifdef HAVE_ARCH_FB_UNMAPPED_AREA
        .get_unmapped_area = get_fb_unmapped_area,
#endif
#ifdef CONFIG_FB_DEFERRED_IO
        .fsync =        fb_deferred_io_fsync,
#endif
};
用户程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
//#include <sys/types.h>
#include <fcntl.h>     
#include <linux/fb.h>
#include <sys/mman.h>



struct fb_var_screeninfo vinfo;
struct fb_fix_screeninfo finfo;



int main(void)
{
        int fd;
        int fbsize;
        unsigned char *fbbuf;
           char buf[10];
        int i,res,adc_data;

        if ((fd = open("/dev/fb0",O_RDWR)) < 0) {
            printf("open adc_dev failed\n";
             return 1;
        }

          if((res = ioctl(fd,FBIOGET_FSCREENINFO,&finfo)) == -1)
            {
                printf("ERROR reading fixed information.error = %d\n",res);

        }

        if ((res = ioctl(fd, FBIOGET_VSCREENINFO, &vinfo)) ==-1) {
                printf("bad vscreeninfo ioctl.error = %d\n",res);
        }

        fbsize = vinfo.xres * vinfo.yres * (vinfo.bits_per_pixel/;
        printf("fbisze: %d",fbsize);

        if ((fbbuf = mmap(0, fbsize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == (void*) -1)
        {
                printf("map video error.\n";
        }
       
        for (i = 0; i< fbsize; i++) {
                *(fbbuf+i) = 0x0;
        }
        munmap(fbbuf, fbsize);
        close(fd);

        return 0;
}

论坛徽章:
0
2 [报告]
发表于 2012-05-09 09:35 |只看该作者
你先确定你open的设备节点是对的吗? 你ioctl下的cmd和内核是对应的吗?

论坛徽章:
0
3 [报告]
发表于 2012-05-09 11:26 |只看该作者
stefan_weids 发表于 2012-05-09 09:35
你先确定你open的设备节点是对的吗? 你ioctl下的cmd和内核是对应的吗?


open节点没错,能返回。
ioctl的cmd是没错的。可以查看源码


现在,无论是在PC或者S3C2440上测试,设备都能正确打开,但ioctl都返回错误值!!

论坛徽章:
0
4 [报告]
发表于 2012-05-10 17:50 |只看该作者
stefan_weids 发表于 2012-05-09 09:35
你先确定你open的设备节点是对的吗? 你ioctl下的cmd和内核是对应的吗?


谢谢,你说的是对的

粗心造成...

论坛徽章:
0
5 [报告]
发表于 2012-05-10 18:04 |只看该作者

解决了
犯了一个及其低级的错误!
楼主位的程序改正了

论坛徽章:
0
6 [报告]
发表于 2012-05-10 18:06 |只看该作者
我刚刚说把你的程序改正了
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/ioctl.h>
  5. //#include <sys/types.h>
  6. #include <fcntl.h>     
  7. #include <linux/fb.h>
  8. #include <sys/mman.h>



  9. struct fb_var_screeninfo vinfo;
  10. struct fb_fix_screeninfo finfo;



  11. int main(void)
  12. {
  13.         int fd;
  14.         int fbsize;
  15.         unsigned char *fbbuf;
  16.            char buf[10];
  17.         int i,res,adc_data;

  18.         if ((fd = open("/dev/fb0",O_RDWR)) < 0) {
  19.             printf("open adc_dev failed\n");
  20.              return 1;
  21.         }

  22.           if((res = ioctl(fd,FBIOGET_FSCREENINFO,&finfo)) == -1)
  23.             {
  24.                 printf("ERROR reading fixed information.error = %d\n",res);

  25.         }

  26.         if ((res = ioctl(fd, FBIOGET_VSCREENINFO, &vinfo)) ==-1) {
  27.                 printf("bad vscreeninfo ioctl.error = %d\n",res);
  28.         }

  29.         fbsize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel;
  30.         printf("fbisze: %d",fbsize);
  31.                 fbbuf = mmap(0, finfo.smem_len , PROT_READ | PROT_WRITE , MAP_SHARED, fd, 0);
  32.                 if( fbbuf == MAP_FAILED)
  33.         {
  34.                 printf("map video error.\n");
  35.         }
  36.       
  37.         for (i = 0; i< finfo.smem_len; i++) {
  38.                 *(fbbuf+i) = 0x0;
  39.         }
  40.         munmap(fbbuf, finfo.smem_len);
  41.         close(fd);

  42.         return 0;
  43. }
复制代码
你现在可以试试。

论坛徽章:
0
7 [报告]
发表于 2012-05-10 18:08 |只看该作者
主要是的代码问题,与设备节点和ioctl下的cmd无关。

论坛徽章:
0
8 [报告]
发表于 2012-05-11 18:54 |只看该作者
是,粗心导致,也被fb_open了
因为觉得fb_open都能打开了,那么说明file_operations已经挂接成功
事实上file_operations没有关联node....
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP