免费注册 查看新帖 |

Chinaunix

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

[驱动] UT6410和TVP5150视频采集 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-08 17:16 |只看该作者 |倒序浏览
我写的代码感觉没有错,但是为什么会在ioctl(vfd,VIDIOC_S_CROP,&crop)和ioctl(vfd,VIDIOC_S_FMT,&fmt)时候出现s3c-fimc: invalid target size有谁出现过类似的问题么?怎么解决的?
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <sys/ioctl.h>
  6. #include <sys/mman.h>
  7. #include <unistd.h>
  8. #include <fcntl.h>
  9. #include <linux/videodev2.h>
  10. #include <linux/fb.h>

  11. #define WIDTH 640
  12. #define HEIGHT 480
  13. #define BUFFER_NUM 3

  14. typedef struct _FRAME_BUF{
  15.         unsigned char *start;
  16.         size_t offset;
  17.         unsigned int length;
  18. }FRAME_BUF;


  19. int main(int argc,char* argv[])
  20. {
  21.        

  22.         int vfd = open("/dev/video0",O_RDWR|O_NONBLOCK);
  23. //        int vfd = open("/dev/video1",O_RDWR);
  24.        
  25.         if(vfd < 0){
  26.                 printf("failed in open\n");
  27.                  return -1;
  28.         }


  29.         struct v4l2_crop crop;
  30.         memset(&crop,0,sizeof(crop));
  31.         crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  32.         crop.c.left = 0;
  33.         crop.c.top = 0;
  34.         crop.c.width = 320;
  35.         crop.c.height = 240;
  36.         if(ioctl(vfd,VIDIOC_S_CROP,&crop)<0){
  37.                 printf("VIDIOC_S_CROP failed\n");
  38.         }

  39.        
  40.         struct v4l2_format fmt;
  41.         fmt.type = V4L2_BUF_TYPE_SLICED_VBI_CAPTURE;
  42. /*

  43.         if(ioctl(vfd,VIDIOC_G_FMT,&fmt) < 0){
  44.                 printf("failed G_fmt1 \n");
  45.                 return -1;
  46.         }
  47.         printf("fmt.fmt.pix.priv %d\n",fmt.fmt.pix.priv);
  48.        
  49. */
  50.         memset(&fmt,0,sizeof(fmt));
  51.         fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  52.         fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420;
  53.         fmt.fmt.pix.width =WIDTH;
  54.         fmt.fmt.pix.height =HEIGHT;
  55.         fmt.fmt.pix.bytesperline = WIDTH;
  56.         fmt.fmt.pix.sizeimage = WIDTH*HEIGHT*3/2;
  57.         fmt.fmt.pix.priv = 0;
  58.         fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
  59.        
  60.         if(ioctl(vfd,VIDIOC_S_FMT,&fmt) < 0) {
  61.                 printf("failed in S_fmt \n");
  62.                 return -1;
  63.         }
  64.         memset(&fmt,0,sizeof(fmt));
  65.         fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

  66.         if(ioctl(vfd,VIDIOC_G_FMT,&fmt) < 0) {
  67.                 printf("failed in g_fmt\n");
  68.                 return -1;
  69.         }       

  70.         printf("width %d, height %d ,sizeimage %d",
  71.                         fmt.fmt.pix.width, fmt.fmt.pix.height,
  72.                                 fmt.fmt.pix.sizeimage);

  73.         char k = getchar();
  74.         printf("d");       
  75.                
  76.         struct v4l2_streamparm parm;
  77.         struct v4l2_control ctrl;
  78.        
  79.        
  80.         parm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  81.         parm.parm.capture.timeperframe.numerator = 1;
  82.         parm.parm.capture.timeperframe.denominator = 3;
  83.         parm.parm.capture.capturemode = 0;


  84.         if(ioctl(vfd,VIDIOC_S_PARM,&parm)<0){
  85.                 printf("failed S_PARM\n");
  86.                 return -1;
  87.         }

  88.         getchar();
  89.         printf("s");
  90.        
  91.         ctrl.id = V4L2_CID_PRIVATE_BASE + 0;
  92.         ctrl.value = 0;
  93.         if(ioctl(vfd,VIDIOC_S_CTRL,&ctrl) < 0){
  94.                 printf("set ctrl failed\n");
  95.                 return -1;
  96.         }
  97.         getchar();

  98.         struct v4l2_requestbuffers req;
  99.         memset(&req,0,sizeof(req));
  100.         req.count = BUFFER_NUM;
  101.         req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  102.         req.memory = V4L2_MEMORY_MMAP;

  103.         if(ioctl(vfd,VIDIOC_REQBUFS,&req) <0){
  104.                 printf("VIDIOC_REQBUFS failed\n");
  105.                 return -1;
  106.         }
  107.         getchar();

  108.         int i;
  109.         struct v4l2_buffer buf;
  110.         enum v4l2_buf_type type;
  111.         FRAME_BUF bufs[BUFFER_NUM];
  112.        
  113.         for(i=0; i< BUFFER_NUM; i++)
  114.         {
  115.                 memset(&buf,0,sizeof(buf));
  116.                 buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  117.                 buf.index = i;
  118.                 if(ioctl(vfd,VIDIOC_QUERYBUF,&buf)<0){
  119.                         printf("VIDIOC_QUERYBUF failed\n");
  120.                         return -1;
  121.                 }

  122.                 bufs[i].length = buf.length;
  123.                 bufs[i].offset = (size_t) buf.m.offset;
  124.                 bufs[i].start = mmap(NULL,bufs[i].length,
  125.                         PROT_READ|PROT_WRITE,MAP_SHARED,
  126.                         vfd,bufs[i].offset);
  127.                 memset(bufs[i].start,0,bufs[i].length);
  128.                 printf("buf%d length:%d offset:%d start %d\n",i,bufs[i].length,
  129.                                 bufs[i].offset,bufs[i].start);
  130.                 getchar();
  131.         }

  132.         for(i=0; i< BUFFER_NUM; i++)
  133.         {
  134.                 memset(&buf,0,sizeof(buf));
  135.                 buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  136.                 buf.memory = V4L2_MEMORY_MMAP;
  137.                 buf.index = i;
  138.                 buf.m.offset = bufs[i].offset;
  139.                
  140.                 if(ioctl(vfd,VIDIOC_QBUF,&buf) < 0){
  141.                         printf("VIDIOC_QBUF failed\n");
  142.                         return -1;
  143.                 }
  144.         }

  145.         type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  146.         if(ioctl(vfd,VIDIOC_STREAMON,&type)<0){
  147.                 printf("VIDIOC_STREAMON failed\n");
  148.                 return -1;
  149.         }

  150.         fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  151.         if(ioctl(vfd,VIDIOC_G_FMT,&fmt) < 0){
  152.                 printf("G_FMT failed\n");
  153.                 return -1;
  154.         }else{
  155.                 printf("wdith %d\n",fmt.fmt.pix.width);
  156.                 printf("height %d\n",fmt.fmt.pix.height);
  157.                 printf("Image size = %d\n",fmt.fmt.pix.sizeimage);
  158.                 printf("pixelformate = %x\n",fmt.fmt.pix.pixelformat);
  159.         }

  160.         getchar();
  161.        
  162.         unsigned char  count = 1;
  163.         memset(&buf,0,sizeof(buf));
  164.         buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  165.         buf.memory = V4L2_MEMORY_MMAP;

  166.         FILE * fyuv =  fopen("./yuvfile","wb");
  167.         if(fyuv < 0){
  168.                 printf("failed in create yuv file\n");
  169.                 return -1;
  170.         }

  171.         while(count++ > 0) {
  172.                 if(ioctl(vfd,  VIDIOC_DQBUF,&buf)<0){
  173.                         printf("VIDIOC_DQBUF failed\n");
  174.                         continue;
  175.                 }
  176.                 fwrite(bufs[buf.index].start,fmt.fmt.pix.sizeimage,1,fyuv);
  177.         }

  178.         type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  179.         ioctl(vfd,VIDIOC_STREAMOFF,&type);
  180.        
  181.         for(i=0; i< BUFFER_NUM; i++){
  182.                 munmap(bufs[i].start,bufs[i].length);
  183.         }       
  184.         fclose(fyuv);
  185.         close(vfd);       
  186.         return 0;

  187. }
复制代码

论坛徽章:
2
水瓶座
日期:2013-09-04 15:09:57白羊座
日期:2014-04-17 16:48:13
2 [报告]
发表于 2011-08-08 17:44 |只看该作者
官版内核好像没有6410的摄像头接口文件的?

可以到你用的内核下面grep下“s3c-fimc: invalid target size”,看看是不是驱动里面对这些参数有什么限制。

论坛徽章:
0
3 [报告]
发表于 2011-08-08 21:38 |只看该作者
没弄过,不知道。
不过,找到了这个patch源码,估计是你正在用的:http://svn.openmoko.org/develope ... amif-original.patch

static int s3c_camif_setup_scaler(camif_cfg_t *cfg)
{
        int tx = cfg->target_x, ty=cfg->target_y;
        int sx, sy;

        if (tx <= 0 || ty <= 0) {
                printk(KERN_ERR "Invalid target size\n");
                return -1;
        }
。。。
}

所以,剩下的,只能靠你自己,一点点通过printk打印,去找具体哪里调用时候参数出错了。

论坛徽章:
0
4 [报告]
发表于 2011-08-09 11:42 |只看该作者
还在继续调,然后我发现tvp5150的驱动代码中有这段
  1. static struct s3c_fimc_camera tvp5150_data = {
  2.         .id                 = CONFIG_VIDEO_FIMC_CAM_CH,
  3.         .type                = CAM_TYPE_ITU,
  4.         .mode                = ITU_656_YCBCR422_8BIT,
  5.         .order422        = CAM_ORDER422_8BIT_CBYCRY,//YCRYCB,
  6.         .clockrate        = 27000000,
  7.         .width                = 720,//640,//800,
  8.         .height                = 240,//480,//600,
  9.         .offset                = {
  10.                 .h1 = 0,
  11.                 .h2 = 0,
  12.                 .v1 = 0,
  13.                 .v2 = 0,
  14.         },

  15.         .polarity        = {
  16.                 .pclk        = 1,
  17.                 .vsync        = 0,
  18.                 .href        = 0,
  19.                 .hsync        = 0,
  20.         },

  21.         .initialized        = 0,
  22. };
复制代码
可是我将代码中的width和height改为以上数值后,问题还在!如果驱动没错是s3c_fimc的话,那么有出现invalid size的问题一般是类似的if (tx <= 0 || ty <= 0)的条件,可是明明我已经赋值,不可能不符合以上条件呀!= =郁闷,继续调,请有做过的朋友指导下!不可能只有我一个人玩这个吧!

论坛徽章:
0
5 [报告]
发表于 2011-08-09 11:47 |只看该作者
附上tvp5150的代码~

tvp5150.rar

2.37 KB, 下载次数: 196

论坛徽章:
0
6
发表于 2011-09-07 21:57
回复 1# linlinver


    你好,我最近一也在调tvp5150,我用的是mini2440的板子,我现在已经把i2c调通了,但是不知道怎么配置mini2440的camera interface和tvp5150的寄存器,希望能跟你一起调好来。请您联系我,qq:48921093.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP