基于国嵌的H264的那个v4l项目,本人想改为V4L2,但是在板子上显示: 
USB_video is OK 
VIDIOC_S_FMT is OK 
VIDIOC_REQBUFS is OK 
buffers is OK 
VIDIOC_QUERYBUF is OK 
the buf length is 32768 
the buf offset is 0 
mmap is failed 
VIDIOC_QBUF is OK 
zc3xx: probe 2wr ov vga 0x0000 
VIDIOC_STREAMON is OK 
VIDIOC_DQBUF is OK 
Segmentation fault 
 
发现原来是mmap没有成功,原代码部分如下: 
void init_video() /* bpp == bytes per pixel*/  
{  
   int ret;  
/*设备的打开*/  
   cam_fd = open( USB_VIDEO, O_NONBLOCK);  
  if( cam_fd<0 )  
  printf("Can't open video device\n");  
else  
 printf("USB_video is OK\n");  
 
  CLEAR (fmt);  
  fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;  
  fmt.fmt.pix.width = 100;//帧宽  
 
  fmt.fmt.pix.height = 100;//帧高  
 
  fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;//像素格式  
 
  fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;//隔行扫描  
  //设置当前驱动的视频捕获格式  
  if (-1 == ioctl (cam_fd, VIDIOC_S_FMT, &fmt))  
  errno_exit ("VIDIOC_S_FMT");  
else  
  printf("VIDIOC_S_FMT is OK\n");  
struct v4l2_requestbuffers req;  
  CLEAR (req);  
req.count = 1;//在缓存队列里保存多少张照片  
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;  
req.memory = V4L2_MEMORY_MMAP;//内存映射  
/*向驱动申请帧缓冲,一般不超过5个。*/  
if (-1 == ioctl (cam_fd, VIDIOC_REQBUFS, &req))  
{  
errno_exit ("VIDIOC_REQBUFS");  
}  
else  
printf("VIDIOC_REQBUFS is OK\n");  
buffers = calloc (req.count, sizeof (*buffers));//分配连续的内存给刚才申请的缓冲区,并且初始化为0,返回值是首地址(物理地址)  
if (!buffers) {  
fprintf (stderr, "Out of memory\n");  
exit (EXIT_FAILURE);  
}  
else  
printf("buffers is OK\n");  
 
for (n_buffers = 0; n_buffers < req.count; ++n_buffers) {  
struct v4l2_buffer buf;  
CLEAR (buf);  
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;  
buf.memory = V4L2_MEMORY_MMAP;  
buf.index = n_buffers;//缓冲区序号  
if (-1 == ioctl (cam_fd, VIDIOC_QUERYBUF, &buf))//把数据缓存转换成物理地址  
errno_exit ("VIDIOC_QUERYBUF");  
else  
printf("VIDIOC_QUERYBUF is OK\n"); 
printf("the buf length is %d\n",buf.length);  
printf("the buf offset is %d\n",buf.m.offset);  
buffers[n_buffers].length = buf.length;  
buffers[n_buffers].offset = (size_t) buf.m.offset; 
//buffers[n_buffers].start= (char*)mmap (NULL, buf.length,PROT_READ | PROT_WRITE, MAP_SHARED, cam_fd, buf.m.offset);//确定被映射的内存地址  
buffers[n_buffers].start = mmap(NULL, buf.length, PROT_READ | PROT_WRITE, 
                        MAP_SHARED, cam_fd, buf.m.offset); 
if (MAP_FAILED == buffers[n_buffers].start)  
printf("mmap is failed\n");  
else  
printf("mmap is OK\n");  
InitLookupTable(); 
}  
}  
 
求高人指教,究竟哪个地方错了!!!! |