i.mx53平台上ov5640拍照获取全像素图片

yihuage72 2013-01-31 04:44:01
ov5640最大支持2592*1944,15fps的图像获取,在i.mx53平台上利用v4l2驱动进行数据获取,Qt来显示图像。目的是想获取2592*1944像素大小的图片。


应用程序参数设置,流程大致为:
ioctl(fd_v4l, VIDIOC_S_PARM, &parm) // 配置寄存器为2592*1944,15fps
ioctl(fd_v4l, VIDIOC_S_CROP, &crop) // 设置截取大小,参数通过-iw、-ih来配置
ioctl(fd_v4l, VIDIOC_S_FMT, &fmt) // 设置输出样式,参数通过-ow、-oh来配置


输出结果:
./capture -iw 2592 -ih 1944 -ow 640 -oh 480 -qws // 输出图像正常

./capture -iw 2592 -ih 1944 -ow 1280 -oh 960 -qws // 输出图像分为5*5块,如正常图像为"F",显示为横竖各5个“F的一部分,内容相似”,图像总大小正常

./capture -iw 2592 -ih 1944 -ow 2560 -oh 1920 -qws // 输出图像分成了很多很多块


无论输出结果以哪种方式YUYV、RGB565、RGB24效果都是这样。

通过mmap来获取数据,设置的输出(fmt)都有效,输出图像数据在960*720一下都是正常的,以上就出现错误了,1280*960时能够清楚的看出图像分为5*5块了


被这个问题困扰了半个多月了,希望各位给点意见和建议。
...全文
929 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
yihuage72 2013-10-29
  • 打赏
  • 举报
回复
freescale文件系统中自带了一些实例,有参考意义,在 /unit_tests,目录下。 ov5640 的驱动文件,IMX53自带有,可用 调试中:全像素时,g_input 需为1,且只支持YUV格式,640*480时设为0,支持格式很多 if (ioctl(fd_v4l, VIDIOC_S_INPUT, &g_input) < 0) { printf("VIDIOC_S_INPUT failed\n"); return -1; }
mxl_mxl 2013-10-23
  • 打赏
  • 举报
回复
你好,我也在 imx53 平台调试 ov5640 ,能否将 2592x1944 分辨率的寄存器配置发我一份,谢谢! 邮箱:164068589@qq.com
wb49163 2013-07-01
  • 打赏
  • 举报
回复
问题我们这边已经完美解决(OV3640/OV5640)! 捉虫记: 对于OV3640: 我这边实在搞不定这个问题了,提请老大派另外一个工程师支援。 由于30W可以预览,300W可以拍照。硬件已经基本证明完全无问题。 拿30OW在设置之后必须拖才正常,于是将mxc_v4l2_capture.c中预留的print全部打开:将pr_debug、pr_err全部修改成printk, 下面罗列其中比较重要的打印log: (mxc_v4l_do_ioctl函数) case VIDIOC_S_INPUT case VIDIOC_S_PARM case VIDIOC_S_FMT case VIDIOC_G_FMT case VIDIOC_S_CTRL case VIDIOC_REQBUFS case VIDIOC_QUERYBUF case VIDIOC_STREAMOFF case VIDIOC_QUERYCAP case VIDIOC_QUERYCAP 验证方向: 1、我的验证方向:拖动解锁, case VIDIOC_QUERYBUF if (buf->memory & V4L2_MEMORY_USERPTR) if (buf->memory & V4L2_MEMORY_MMAP) 由于拖动解锁(V4L2_MEMORY_USERPTR)和V4L2(V4L2_MEMORY_MMAP)分别进了不通的地方,既然V4L2_MEMORY_MMAP出错,我主要查找V4L2_MEMORY_USERPTR方式拿图片,网上找到的例程不好使。 2、我同事验证方向: case VIDIOC_S_INPUT case VIDIOC_S_PARM 他估计是两个宏定义开关可能出问题了: case VIDIOC_S_INPUT: { …… if (strcmp(mxc_capture_inputs[*index].name, "CSI MEM") == 0) { #if defined(CONFIG_MXC_IPU_CSI_ENC) || defined(CONFIG_MXC_IPU_CSI_ENC_MODULE) retval = csi_enc_select(cam); printk("**** wyb file: %s \t line = %d\t function: %s retval=%d\n", __FILE__, __LINE__, __func__, retval); if (retval) { break; } #endif } else if (strcmp(mxc_capture_inputs[*index].name, "CSI IC MEM") == 0) { #if defined(CONFIG_MXC_IPU_PRP_ENC) || defined(CONFIG_MXC_IPU_PRP_ENC_MODULE) retval = prp_enc_select(cam); printk("**** wyb file: %s \t line = %d\t function: %s retval=%d\n", __FILE__, __LINE__, __func__, retval); if (retval) { break; } #endif } …… } 想办法打开, 就是在V4L2中加入设置: int g_input=1; if (ioctl(fd, VIDIOC_S_INPUT, &g_input) < 0) { printf("VIDIOC_S_INPUT failed\n"); return ; } struct v4l2_streamparm parm; parm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; parm.parm.capture.timeperframe.numerator = 1; //printf("frame rate: %d\n", sVideoFmt.xFramerate / Q16_SHIFT); parm.parm.capture.timeperframe.denominator = 15; //sVideoFmt.xFramerate / Q16_SHIFT; parm.parm.capture.capturemode = 7; if (ioctl(fd, VIDIOC_S_PARM, &parm) < 0) { printf("ioctl VIDIOC_S_PARM err!\n"); return ; } 拿出来300W的图片,问题解决!请问这两个宏定义起啥作用????可以直接去掉吗? 对于OV5640: static void init_camera_struct(cam_data *cam, struct platform_device *pdev) { …… cam->dummy_frame.vaddress = dma_alloc_coherent(0, SZ_8M, &cam->dummy_frame.paddress, GFP_DMA | GFP_KERNEL); if (cam->dummy_frame.vaddress == 0) pr_err("ERROR: v4l2 capture: Allocate dummy frame " "failed.\n"); cam->dummy_frame.buffer.length = SZ_8M; …… } 还需要将SZ_8M修改为:SZ_8M+SZ_4M。OV5640设置为YUYV模式,单张图片10MB,这里必须设置为10MB以上(这里设置为12MB)。
andy1658 2013-07-01
  • 打赏
  • 举报
回复
引用 11 楼 wb49163 的回复:
问题我们这边已经完美解决(OV3640/OV5640)! 捉虫记: 对于OV3640: 我这边实在搞不定这个问题了,提请老大派另外一个工程师支援。 由于30W可以预览,300W可以拍照。硬件已经基本证明完全无问题。 拿30OW在设置之后必须拖才正常,于是将mxc_v4l2_capture.c中预留的print全部打开:将pr_debug、pr_err全部修改成printk, 下面罗列其中比较重要的打印log: (mxc_v4l_do_ioctl函数) case VIDIOC_S_INPUT case VIDIOC_S_PARM case VIDIOC_S_FMT case VIDIOC_G_FMT case VIDIOC_S_CTRL case VIDIOC_REQBUFS case VIDIOC_QUERYBUF case VIDIOC_STREAMOFF case VIDIOC_QUERYCAP case VIDIOC_QUERYCAP 验证方向: 1、我的验证方向:拖动解锁, case VIDIOC_QUERYBUF if (buf->memory & V4L2_MEMORY_USERPTR) if (buf->memory & V4L2_MEMORY_MMAP) 由于拖动解锁(V4L2_MEMORY_USERPTR)和V4L2(V4L2_MEMORY_MMAP)分别进了不通的地方,既然V4L2_MEMORY_MMAP出错,我主要查找V4L2_MEMORY_USERPTR方式拿图片,网上找到的例程不好使。 2、我同事验证方向: case VIDIOC_S_INPUT case VIDIOC_S_PARM 他估计是两个宏定义开关可能出问题了: case VIDIOC_S_INPUT: { …… if (strcmp(mxc_capture_inputs[*index].name, "CSI MEM") == 0) { #if defined(CONFIG_MXC_IPU_CSI_ENC) || defined(CONFIG_MXC_IPU_CSI_ENC_MODULE) retval = csi_enc_select(cam); printk("**** wyb file: %s \t line = %d\t function: %s retval=%d\n", __FILE__, __LINE__, __func__, retval); if (retval) { break; } #endif } else if (strcmp(mxc_capture_inputs[*index].name, "CSI IC MEM") == 0) { #if defined(CONFIG_MXC_IPU_PRP_ENC) || defined(CONFIG_MXC_IPU_PRP_ENC_MODULE) retval = prp_enc_select(cam); printk("**** wyb file: %s \t line = %d\t function: %s retval=%d\n", __FILE__, __LINE__, __func__, retval); if (retval) { break; } #endif } …… } 想办法打开, 就是在V4L2中加入设置: int g_input=1; if (ioctl(fd, VIDIOC_S_INPUT, &g_input) < 0) { printf("VIDIOC_S_INPUT failed\n"); return ; } struct v4l2_streamparm parm; parm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; parm.parm.capture.timeperframe.numerator = 1; //printf("frame rate: %d\n", sVideoFmt.xFramerate / Q16_SHIFT); parm.parm.capture.timeperframe.denominator = 15; //sVideoFmt.xFramerate / Q16_SHIFT; parm.parm.capture.capturemode = 7; if (ioctl(fd, VIDIOC_S_PARM, &parm) < 0) { printf("ioctl VIDIOC_S_PARM err!\n"); return ; } 拿出来300W的图片,问题解决!请问这两个宏定义起啥作用????可以直接去掉吗? 对于OV5640: static void init_camera_struct(cam_data *cam, struct platform_device *pdev) { …… cam->dummy_frame.vaddress = dma_alloc_coherent(0, SZ_8M, &cam->dummy_frame.paddress, GFP_DMA | GFP_KERNEL); if (cam->dummy_frame.vaddress == 0) pr_err("ERROR: v4l2 capture: Allocate dummy frame " "failed.\n"); cam->dummy_frame.buffer.length = SZ_8M; …… } 还需要将SZ_8M修改为:SZ_8M+SZ_4M。OV5640设置为YUYV模式,单张图片10MB,这里必须设置为10MB以上(这里设置为12MB)。
楼主能给个测试的例子么,我最近也在调试摄像头,但是出来的数据有点问题,没太搞懂,希望楼主指点一下,谢谢
andy1658 2013-06-28
  • 打赏
  • 举报
回复
我也遇到同样的问题,楼主能帮忙分析一下么,我是已经设置了input了,我sersor输出的数据格式是UYVY的格式,mx53这端LCD显示是RGB24,我现在是能显示大概轮廓,但是颜色什么的都有点问题,楼主能帮忙分析一下么
wb49163 2013-06-27
  • 打赏
  • 举报
回复
估计是freescale驱动的bug,经过艰难的奋斗,终于找到这里:设置VIDIOC_S_INPUT之后问题解决! // 2012-8-8 04:29下午 V4L2初始化摄像头 // 注释资料来源: // http://wenku.baidu.com/view/2f92ce8c680203d8ce2f247f.html // 基于Linux视频驱动接口V4L2视频采集编程 // 用非阻塞模式打开摄像头设备 if((fd=open(dev_name,O_RDWR | O_NONBLOCK,0))<0) { printf("Error: open %s\n",dev_name); return; } else { printf("**** wyb01 Open camera success!!!! fd=%d\n", fd); } // 2013-6-27 15:04 必须设置这里,否则拿出来的图片为网格状! int g_input=1; if (ioctl(fd, VIDIOC_S_INPUT, &g_input) < 0) { printf("VIDIOC_S_INPUT failed\n"); return ; } struct v4l2_streamparm parm; parm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; parm.parm.capture.timeperframe.numerator = 1; //printf("frame rate: %d\n", sVideoFmt.xFramerate / Q16_SHIFT); parm.parm.capture.timeperframe.denominator = 15; //sVideoFmt.xFramerate / Q16_SHIFT; parm.parm.capture.capturemode = 7; if (ioctl(fd, VIDIOC_S_PARM, &parm) < 0) { printf("ioctl VIDIOC_S_PARM err!\n"); return ; } // 获取当前视频设备支持的视频格式 struct v4l2_fmtdesc fmtd; int ret = 0; memset(&fmtd, 0, sizeof(fmtd)); fmtd.index = 0; fmtd.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; while ((ret = ioctl(fd, VIDIOC_ENUM_FMT, &fmtd)) == 0) { fmtd.index++; printf(" pixelformat = ''%c%c%c%c'', description = ''%s'' \n", fmtd.pixelformat & 0xFF, (fmtd.pixelformat >> 8) & 0xFF, (fmtd.pixelformat >> 16) & 0xFF, (fmtd.pixelformat >> 24) & 0xFF, fmtd.description); }
南棱笑笑生 2013-06-26
  • 打赏
  • 举报
回复
我是在Android平台下: PART3: buffers = calloc (req.count, sizeof (*buffers));//内存中建立对应空间 printf(" sizeof (*buffers) =%08x\n", sizeof (*buffers)); for(i=0;i<req.count;i++) { buf[i].type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf[i].memory = V4L2_MEMORY_MMAP; buf[i].index = i; // 查询已经分配的 V4L2的视频缓冲区的相关信息,包括视频缓冲区的使用状态、在内核空间的 // 偏移地址、缓冲区长度等。在应用程序设计中通过调VIDIOC_QUERYBUF 来获取内核空间的 // 视频缓冲区信息,然后调用函数mmap把内核空间地址映射到用户空间,这样应用程序才能够 // 访问位于内核空间的视频缓冲区。通过调用 VIDIOC_QUERYBUF 取得内核空间的缓冲区信息后, // 接着调用 mmap函数把内核空间缓冲区映射到用户空间。 if(ioctl(fd, VIDIOC_QUERYBUF, buf+i)<0) { printf("Error:VIDIOC_QUERYBUF\n"); return; } buffers[i].length = buf[i].length; buffers[i].start = mmap (NULL /* start anywhere */, //通过mmap建立映射关系 buf[i].length, PROT_READ | PROT_WRITE /* required */, MAP_SHARED /* recommended */, fd, buf[i].m.offset); // printf("**** i=%d buf.length=%d, buffers[i].start=%08x buf.m.offset=%08x\n", i, buf[i].length, *( (unsigned int *) (buffers[i].start) ), buf.m.offset); printf("**** i=%d buf.length=%d, buffers[i].start=%08x buf.m.offset=%08x\n", i, buf[i].length, *( (unsigned int *) (buffers[i].start) ), buf[i].m.offset); buf[i].type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf[i].memory = V4L2_MEMORY_MMAP; buf[i].index = i; // 投放一个空的视频缓冲区到视频缓冲区输入队列中。函数执行成功后,指令的视频缓冲区 // 进入视频输入队列,在启动视频设备拍摄图像时,相应的视频数据被保存到视频输入队列 // 相应的视频缓冲区中。 if(ioctl(fd, VIDIOC_QBUF, buf+i)<0) { printf("Error: VIDIOC_QBUF\n"); } } // 启动视频采集命令,应用程序调用 VIDIOC_STREAMON 启动视频采集命令后, // 视频设备驱动程序开始采集视频数据,并把采集到的视频数据保存到 // 视频驱动的视频缓冲区中。 type=V4L2_BUF_TYPE_VIDEO_CAPTURE; if(ioctl(fd, VIDIOC_STREAMON, &type)<0) { printf("Error: VIDIOC_STREAMON\n"); return; } gettimeofday(&tv, NULL); int iSecond = tv.tv_sec; int iuSecond = tv.tv_usec; int iCostTime = 0; int iSecond3 = tv.tv_sec; int iuSecond3 = tv.tv_usec; int iCostTime3 = 0; int iSecond4 = tv.tv_sec; int iuSecond4 = tv.tv_usec; int iCostTime4 = 0; int iCameraCounter = 0; int iFrameCounter = 0; int iFrameCounter3 = 0; int iFrameCounter4 = 0; while(1) { // 2013/5/14 17:59:02 按q退出 if(iFlagCamera>1000) { break; } // 2013-5-14 19:13 测帧率 iFrameCounter++; if(iFrameCounter%100==0) { gettimeofday(&tp1, NULL); iCostTime = (tp1.tv_sec - iSecond)*1000000 + tp1.tv_usec - iuSecond; // printf("@@@@ 100 frame=%u us, fps=%f\n",iCostTime, 1000000*100.0/iCostTime) ; iSecond = tp1.tv_sec; iuSecond = tp1.tv_usec; } FD_ZERO (&fds); FD_SET (fd, &fds); tv.tv_sec = 2; tv.tv_usec = 0; // VIDIOC_STREAMON函数执行成功后,视频设备驱动程序开始采集视频数据,此时应用程序 // 一般通过调用 select 函数来判断一帧视频数据是否采集完成,当视频设备驱动完成 // 一帧视频数据采集并保存到视频缓冲区中时,select 函数返回,应用程序接着可以 // 读取视频数据;否则 select 函数阻塞直到视频数据采集完成。 r = select (fd + 1, &fds, NULL, NULL, &tv); // printf("------------r=%d\n",r); if(r<0) { printf("!!!!select error!!!!------------r=%d\n",r); continue; // return; } tmp_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; tmp_buf.memory = V4L2_MEMORY_MMAP; tmp_buf.index = 0; // 从视频缓冲区的输出队列中取得一个已经保存有一帧视频数据的视频缓冲区。 // 函数VIDIOC_DQBUF执行成功后,相应的内核视频缓冲区中保存有当前拍摄到的 // 视频数据,应用程序可以通过访问用户空间来读取该视频数据。 if(ioctl(fd, VIDIOC_DQBUF, &tmp_buf)<0) { // printf("**** Error:VIDIOC_DQBUF\n"); continue; } iFrameCounter3++; if(iFrameCounter3%100==0) { gettimeofday(&tp3, NULL); iCostTime3 = (tp3.tv_sec - iSecond3)*1000000 + tp3.tv_usec - iuSecond3; // printf("####100 frame=%u us, fps=%f\n", iCostTime3, 1000000*100.0/iCostTime3) ; iSecond3 = tp3.tv_sec; iuSecond3 = tp3.tv_usec; } // 2013/2/20 19:54:10 存储灰度图 if(iFlagCamera) { iCameraCounter++; iFlagCamera--; // 写灰度图 char GRAYname[100]; sprintf(GRAYname, "/sdcard/gray_2048x1536_%04d.bmp", iCameraCounter); file_fd = fopen(GRAYname, "w"); if(file_fd) { fwrite(gray_2048x1536_head, sizeof (unsigned char), 1078, file_fd ); fwrite(buffers[tmp_buf.index].start, g_nWidth*g_nHeight, 1, file_fd); } fclose (file_fd); printf ("**** wyb3 write BMP success j=%d!!!!\n", iCameraCounter); } tmp_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; tmp_buf.memory = V4L2_MEMORY_MMAP; // 投放一个空的视频缓冲区到视频缓冲区输入队列中。函数执行成功后,指令的视频缓冲区 // 进入视频输入队列,在启动视频设备拍摄图像时,相应的视频数据被保存到视频输入队列 // 相应的视频缓冲区中。 if(ioctl(fd, VIDIOC_QBUF, &tmp_buf)<0) { // printf("#### Error:VIDIOC_QBUF\n"); continue; } iFrameCounter4++; if(iFrameCounter4%100==0) { gettimeofday(&tp4, NULL); iCostTime4 = (tp4.tv_sec - iSecond4)*1000000 + tp4.tv_usec - iuSecond4; printf("@@@@ 100 frame=%u us, fps=%f\n",iCostTime, 1000000*100.0/iCostTime); printf("####100 frame=%u us, fps=%f\n", iCostTime3, 1000000*100.0/iCostTime3); printf("^^^^ 100 frame=%u us, fps=%f\n", iCostTime4, 1000000*100.0/iCostTime4); printf("\n\n\n"); iSecond4 = tp4.tv_sec; iuSecond4 = tp4.tv_usec; } } // 停止视频采集命令,应用程序调用 VIDIOC_ STREAMOFF停集命令后, // 视频设备驱动程序不再采集视频数据。 if(ioctl(fd, VIDIOC_STREAMOFF, &type)<0) { printf("Error:VIDIOC_STREAMOFF\n"); return; } printf("================streamoff\n"); printf("\n capabilities= 0x%08x, iCapCapabilities=0x%08x \n",cap.capabilities, iCapCapabilities); getCameraCapabilities(iCapCapabilities); // 解除内存映射 for(i=0;i<req.count;i++) { munmap(buffers[i].start, buf[i].length); } close(fd); return; } // 函数名称:main // 函数功能:主函数 // 参数列表: // 返回值 : int main(int argc, char **argv) { pthread_t id1; pthread_t id2; int ret2; ret2=pthread_create(&id1,NULL,(void *) thread1,NULL); if(ret2!=0) { printf ("Create pthread1 error!\n"); return 0; } ret2=pthread_create(&id2,NULL,(void *) thread2,NULL); if(ret2!=0) { printf ("Create pthread2 error!\n"); return 0; } pthread_join(id1,NULL); pthread_join(id2,NULL); return 0; }
wb49163 2013-06-26
  • 打赏
  • 举报
回复
#include <sys/time.h> // int main () void thread2(void) { int iCounterCamera = 0; // 2012-11-8 05:27下午 RGB24 640*480分辨率的BMP图像头文件 // unsigned char head[54] = {0x42,0x4d,0x36,0x10,0x0e,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x80,0x02,0x00,0x00,0xe0,0x01,0x00,0x00,0x01,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; // 抓取Y分量所取得的灰度图 unsigned char gray_2048x1536_head[1078] = {0x42, 0x4D, 0x36, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x04, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x02, 0x02, 0x02, 0x00, 0x03, 0x03, 0x03, 0x00, 0x04, 0x04, 0x04, 0x00, 0x05, 0x05, 0x05, 0x00, 0x06, 0x06, 0x06, 0x00, 0x07, 0x07, 0x07, 0x00, 0x08, 0x08, 0x08, 0x00, 0x09, 0x09, 0x09, 0x00, 0x0A, 0x0A, 0x0A, 0x00, 0x0B, 0x0B, 0x0B, 0x00, 0x0C, 0x0C, 0x0C, 0x00, 0x0D, 0x0D, 0x0D, 0x00, 0x0E, 0x0E, 0x0E, 0x00, 0x0F, 0x0F, 0x0F, 0x00, 0x10, 0x10, 0x10, 0x00, 0x11, 0x11, 0x11, 0x00, 0x12, 0x12, 0x12, 0x00, 0x13, 0x13, 0x13, 0x00, 0x14, 0x14, 0x14, 0x00, 0x15, 0x15, 0x15, 0x00, 0x16, 0x16, 0x16, 0x00, 0x17, 0x17, 0x17, 0x00, 0x18, 0x18, 0x18, 0x00, 0x19, 0x19, 0x19, 0x00, 0x1A, 0x1A, 0x1A, 0x00, 0x1B, 0x1B, 0x1B, 0x00, 0x1C, 0x1C, 0x1C, 0x00, 0x1D, 0x1D, 0x1D, 0x00, 0x1E, 0x1E, 0x1E, 0x00, 0x1F, 0x1F, 0x1F, 0x00, 0x20, 0x20, 0x20, 0x00, 0x21, 0x21, 0x21, 0x00, 0x22, 0x22, 0x22, 0x00, 0x23, 0x23, 0x23, 0x00, 0x24, 0x24, 0x24, 0x00, 0x25, 0x25, 0x25, 0x00, 0x26, 0x26, 0x26, 0x00, 0x27, 0x27, 0x27, 0x00, 0x28, 0x28, 0x28, 0x00, 0x29, 0x29, 0x29, 0x00, 0x2A, 0x2A, 0x2A, 0x00, 0x2B, 0x2B, 0x2B, 0x00, 0x2C, 0x2C, 0x2C, 0x00, 0x2D, 0x2D, 0x2D, 0x00, 0x2E, 0x2E, 0x2E, 0x00, 0x2F, 0x2F, 0x2F, 0x00, 0x30, 0x30, 0x30, 0x00, 0x31, 0x31, 0x31, 0x00, 0x32, 0x32, 0x32, 0x00, 0x33, 0x33, 0x33, 0x00, 0x34, 0x34, 0x34, 0x00, 0x35, 0x35, 0x35, 0x00, 0x36, 0x36, 0x36, 0x00, 0x37, 0x37, 0x37, 0x00, 0x38, 0x38, 0x38, 0x00, 0x39, 0x39, 0x39, 0x00, 0x3A, 0x3A, 0x3A, 0x00, 0x3B, 0x3B, 0x3B, 0x00, 0x3C, 0x3C, 0x3C, 0x00, 0x3D, 0x3D, 0x3D, 0x00, 0x3E, 0x3E, 0x3E, 0x00, 0x3F, 0x3F, 0x3F, 0x00, 0x40, 0x40, 0x40, 0x00, 0x41, 0x41, 0x41, 0x00, 0x42, 0x42, 0x42, 0x00, 0x43, 0x43, 0x43, 0x00, 0x44, 0x44, 0x44, 0x00, 0x45, 0x45, 0x45, 0x00, 0x46, 0x46, 0x46, 0x00, 0x47, 0x47, 0x47, 0x00, 0x48, 0x48, 0x48, 0x00, 0x49, 0x49, 0x49, 0x00, 0x4A, 0x4A, 0x4A, 0x00, 0x4B, 0x4B, 0x4B, 0x00, 0x4C, 0x4C, 0x4C, 0x00, 0x4D, 0x4D, 0x4D, 0x00, 0x4E, 0x4E, 0x4E, 0x00, 0x4F, 0x4F, 0x4F, 0x00, 0x50, 0x50, 0x50, 0x00, 0x51, 0x51, 0x51, 0x00, 0x52, 0x52, 0x52, 0x00, 0x53, 0x53, 0x53, 0x00, 0x54, 0x54, 0x54, 0x00, 0x55, 0x55, 0x55, 0x00, 0x56, 0x56, 0x56, 0x00, 0x57, 0x57, 0x57, 0x00, 0x58, 0x58, 0x58, 0x00, 0x59, 0x59, 0x59, 0x00, 0x5A, 0x5A, 0x5A, 0x00, 0x5B, 0x5B, 0x5B, 0x00, 0x5C, 0x5C, 0x5C, 0x00, 0x5D, 0x5D, 0x5D, 0x00, 0x5E, 0x5E, 0x5E, 0x00, 0x5F, 0x5F, 0x5F, 0x00, 0x60, 0x60, 0x60, 0x00, 0x61, 0x61, 0x61, 0x00, 0x62, 0x62, 0x62, 0x00, 0x63, 0x63, 0x63, 0x00, 0x64, 0x64, 0x64, 0x00, 0x65, 0x65, 0x65, 0x00, 0x66, 0x66, 0x66, 0x00, 0x67, 0x67, 0x67, 0x00, 0x68, 0x68, 0x68, 0x00, 0x69, 0x69, 0x69, 0x00, 0x6A, 0x6A, 0x6A, 0x00, 0x6B, 0x6B, 0x6B, 0x00, 0x6C, 0x6C, 0x6C, 0x00, 0x6D, 0x6D, 0x6D, 0x00, 0x6E, 0x6E, 0x6E, 0x00, 0x6F, 0x6F, 0x6F, 0x00, 0x70, 0x70, 0x70, 0x00, 0x71, 0x71, 0x71, 0x00, 0x72, 0x72, 0x72, 0x00, 0x73, 0x73, 0x73, 0x00, 0x74, 0x74, 0x74, 0x00, 0x75, 0x75, 0x75, 0x00, 0x76, 0x76, 0x76, 0x00, 0x77, 0x77, 0x77, 0x00, 0x78, 0x78, 0x78, 0x00, 0x79, 0x79, 0x79, 0x00, 0x7A, 0x7A, 0x7A, 0x00, 0x7B, 0x7B, 0x7B, 0x00, 0x7C, 0x7C, 0x7C, 0x00, 0x7D, 0x7D, 0x7D, 0x00, 0x7E, 0x7E, 0x7E, 0x00, 0x7F, 0x7F, 0x7F, 0x00, 0x80, 0x80, 0x80, 0x00, 0x81, 0x81, 0x81, 0x00, 0x82, 0x82, 0x82, 0x00, 0x83, 0x83, 0x83, 0x00, 0x84, 0x84, 0x84, 0x00, 0x85, 0x85, 0x85, 0x00, 0x86, 0x86, 0x86, 0x00, 0x87, 0x87, 0x87, 0x00, 0x88, 0x88, 0x88, 0x00, 0x89, 0x89, 0x89, 0x00, 0x8A, 0x8A, 0x8A, 0x00, 0x8B, 0x8B, 0x8B, 0x00, 0x8C, 0x8C, 0x8C, 0x00, 0x8D, 0x8D, 0x8D, 0x00, 0x8E, 0x8E, 0x8E, 0x00, 0x8F, 0x8F, 0x8F, 0x00, 0x90, 0x90, 0x90, 0x00, 0x91, 0x91, 0x91, 0x00, 0x92, 0x92, 0x92, 0x00, 0x93, 0x93, 0x93, 0x00, 0x94, 0x94, 0x94, 0x00, 0x95, 0x95, 0x95, 0x00, 0x96, 0x96, 0x96, 0x00, 0x97, 0x97, 0x97, 0x00, 0x98, 0x98, 0x98, 0x00, 0x99, 0x99, 0x99, 0x00, 0x9A, 0x9A, 0x9A, 0x00, 0x9B, 0x9B, 0x9B, 0x00, 0x9C, 0x9C, 0x9C, 0x00, 0x9D, 0x9D, 0x9D, 0x00, 0x9E, 0x9E, 0x9E, 0x00, 0x9F, 0x9F, 0x9F, 0x00, 0xA0, 0xA0, 0xA0, 0x00, 0xA1, 0xA1, 0xA1, 0x00, 0xA2, 0xA2, 0xA2, 0x00, 0xA3, 0xA3, 0xA3, 0x00, 0xA4, 0xA4, 0xA4, 0x00, 0xA5, 0xA5, 0xA5, 0x00, 0xA6, 0xA6, 0xA6, 0x00, 0xA7, 0xA7, 0xA7, 0x00, 0xA8, 0xA8, 0xA8, 0x00, 0xA9, 0xA9, 0xA9, 0x00, 0xAA, 0xAA, 0xAA, 0x00, 0xAB, 0xAB, 0xAB, 0x00, 0xAC, 0xAC, 0xAC, 0x00, 0xAD, 0xAD, 0xAD, 0x00, 0xAE, 0xAE, 0xAE, 0x00, 0xAF, 0xAF, 0xAF, 0x00, 0xB0, 0xB0, 0xB0, 0x00, 0xB1, 0xB1, 0xB1, 0x00, 0xB2, 0xB2, 0xB2, 0x00, 0xB3, 0xB3, 0xB3, 0x00, 0xB4, 0xB4, 0xB4, 0x00, 0xB5, 0xB5, 0xB5, 0x00, 0xB6, 0xB6, 0xB6, 0x00, 0xB7, 0xB7, 0xB7, 0x00, 0xB8, 0xB8, 0xB8, 0x00, 0xB9, 0xB9, 0xB9, 0x00, 0xBA, 0xBA, 0xBA, 0x00, 0xBB, 0xBB, 0xBB, 0x00, 0xBC, 0xBC, 0xBC, 0x00, 0xBD, 0xBD, 0xBD, 0x00, 0xBE, 0xBE, 0xBE, 0x00, 0xBF, 0xBF, 0xBF, 0x00, 0xC0, 0xC0, 0xC0, 0x00, 0xC1, 0xC1, 0xC1, 0x00, 0xC2, 0xC2, 0xC2, 0x00, 0xC3, 0xC3, 0xC3, 0x00, 0xC4, 0xC4, 0xC4, 0x00, 0xC5, 0xC5, 0xC5, 0x00, 0xC6, 0xC6, 0xC6, 0x00, 0xC7, 0xC7, 0xC7, 0x00, 0xC8, 0xC8, 0xC8, 0x00, 0xC9, 0xC9, 0xC9, 0x00, 0xCA, 0xCA, 0xCA, 0x00, 0xCB, 0xCB, 0xCB, 0x00, 0xCC, 0xCC, 0xCC, 0x00, 0xCD, 0xCD, 0xCD, 0x00, 0xCE, 0xCE, 0xCE, 0x00, 0xCF, 0xCF, 0xCF, 0x00, 0xD0, 0xD0, 0xD0, 0x00, 0xD1, 0xD1, 0xD1, 0x00, 0xD2, 0xD2, 0xD2, 0x00, 0xD3, 0xD3, 0xD3, 0x00, 0xD4, 0xD4, 0xD4, 0x00, 0xD5, 0xD5, 0xD5, 0x00, 0xD6, 0xD6, 0xD6, 0x00, 0xD7, 0xD7, 0xD7, 0x00, 0xD8, 0xD8, 0xD8, 0x00, 0xD9, 0xD9, 0xD9, 0x00, 0xDA, 0xDA, 0xDA, 0x00, 0xDB, 0xDB, 0xDB, 0x00, 0xDC, 0xDC, 0xDC, 0x00, 0xDD, 0xDD, 0xDD, 0x00, 0xDE, 0xDE, 0xDE, 0x00, 0xDF, 0xDF, 0xDF, 0x00, 0xE0, 0xE0, 0xE0, 0x00, 0xE1, 0xE1, 0xE1, 0x00, 0xE2, 0xE2, 0xE2, 0x00, 0xE3, 0xE3, 0xE3, 0x00, 0xE4, 0xE4, 0xE4, 0x00, 0xE5, 0xE5, 0xE5, 0x00, 0xE6, 0xE6, 0xE6, 0x00, 0xE7, 0xE7, 0xE7, 0x00, 0xE8, 0xE8, 0xE8, 0x00, 0xE9, 0xE9, 0xE9, 0x00, 0xEA, 0xEA, 0xEA, 0x00, 0xEB, 0xEB, 0xEB, 0x00, 0xEC, 0xEC, 0xEC, 0x00, 0xED, 0xED, 0xED, 0x00, 0xEE, 0xEE, 0xEE, 0x00, 0xEF, 0xEF, 0xEF, 0x00, 0xF0, 0xF0, 0xF0, 0x00, 0xF1, 0xF1, 0xF1, 0x00, 0xF2, 0xF2, 0xF2, 0x00, 0xF3, 0xF3, 0xF3, 0x00, 0xF4, 0xF4, 0xF4, 0x00, 0xF5, 0xF5, 0xF5, 0x00, 0xF6, 0xF6, 0xF6, 0x00, 0xF7, 0xF7, 0xF7, 0x00, 0xF8, 0xF8, 0xF8, 0x00, 0xF9, 0xF9, 0xF9, 0x00, 0xFA, 0xFA, 0xFA, 0x00, 0xFB, 0xFB, 0xFB, 0x00, 0xFC, 0xFC, 0xFC, 0x00, 0xFD, 0xFD, 0xFD, 0x00, 0xFE, 0xFE, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0x00}; int g_nWidth = 2048; int g_nHeight = 1536; // 2012-8-8 04:29下午 V4L2初始化摄像头 // 注释资料来源: // http://wenku.baidu.com/view/2f92ce8c680203d8ce2f247f.html // 基于Linux视频驱动接口V4L2视频采集编程 // 用非阻塞模式打开摄像头设备 if((fd=open(dev_name,O_RDWR | O_NONBLOCK,0))<0) { printf("Error: open %s\n",dev_name); return; } else { printf("**** wyb01 Open camera success!!!! fd=%d\n", fd); } // 获取当前视频设备支持的视频格式 struct v4l2_fmtdesc fmtd; int ret = 0; memset(&fmtd, 0, sizeof(fmtd)); fmtd.index = 0; fmtd.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; while ((ret = ioctl(fd, VIDIOC_ENUM_FMT, &fmtd)) == 0) { fmtd.index++; printf(" pixelformat = ''%c%c%c%c'', description = ''%s'' \n", fmtd.pixelformat & 0xFF, (fmtd.pixelformat >> 8) & 0xFF, (fmtd.pixelformat >> 16) & 0xFF, (fmtd.pixelformat >> 24) & 0xFF, fmtd.description); } // 查询视频设备的功能;执行完 VIDIOC_QUERYCAP 命令后,cap变量中包含了该视频设备的能力信息, // 程序中通过检查cap中的设备能力信息来判断设备是否支持某项功能。 if(ioctl(fd, VIDIOC_QUERYCAP, &cap)<0) { printf("Error: query cap\n"); return; } printf("\n capabilities= 0x%08x\n",cap.capabilities); int iCapCapabilities=cap.capabilities; fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; fmt.fmt.pix.width = g_nWidth; fmt.fmt.pix.height = g_nHeight; // fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV422P; fmt.fmt.pix.field = V4L2_FIELD_BOTTOM; printf("**** fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV422P; ****\n"); // 设置视频设备的视频数据格式,例如设置视频图像数据的长、宽,图像格式(JPEG、YUYV 格式); // 注意:如果该视频设备驱动不支持你所设定的图像格式, // 视频驱动会重新修改struct v4l2_format 结构体变量的值为该视频设备所支持的图像格式, // 所以在程序设计中,设定完所有的视频格式后,要获取实际的视频格式, // 要重新读取struct v4l2_format 结构体变量。 if(ioctl(fd,VIDIOC_S_FMT, &fmt)<0) { printf("Error:VIDIOC_S_FMT \n"); return; } // 读取当前驱动的频捕获格式 // 2012-8-8 03:07下午 确认所设置的制式是否是我们所需要的制式 struct v4l2_format fmt2; fmt2.type=V4L2_BUF_TYPE_VIDEO_CAPTURE; ret = ioctl(fd,VIDIOC_G_FMT, &fmt2); printf("VIDIOC_G_FMT ret=%d \n", ret); printf("pixelformat = ''%c%c%c%c''\n", fmt2.fmt.pix.pixelformat & 0xFF, (fmt2.fmt.pix.pixelformat >> 8) & 0xFF, (fmt2.fmt.pix.pixelformat >> 16) & 0xFF, (fmt2.fmt.pix.pixelformat >> 24) & 0xFF); req.count = REQ_COUNT ; req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; req.memory = V4L2_MEMORY_MMAP; // 请求V4L2驱动分配视频缓冲区 (申请 V4L2视频驱动分配内存),V4L2是视频设备的驱动层, // 位于内核空间,所以通过 VIDIOC_REQBUFS 控制命令字申请的内存位于内核空间, // 应用程序不能直接访问,需要通过调用 mmap内存映射函数把内核空间内存映射到用户空间后, // 应用程序通过访问用户空间地址来访问内核空间。 // 注意: VIDIOC_REQBUFS会修改tV4L2_reqbuf的count值, // tV4L2_reqbuf的count值返回实际申请成功的视频缓冲区数目。 if(ioctl(fd, VIDIOC_REQBUFS, &req)<0) { printf("Error:VIDIOC_REQBUFS\n"); // return 0; return; } printf("req.count=%d\n",req.count);
wb49163 2013-06-26
  • 打赏
  • 举报
回复
PART1: // http://www.linuxidc.com/Linux/2011-03/33020.htm // V4L2摄像头获取单幅图片测试程序(MMAP模式) // [日期:2011-03-06] 来源:Linux社区 作者:aokikyon [字体:大 中 小] // // #加了点注释 // // #Rockie Cheng // printf #include <stdio.h> #include <stdlib.h> // memset #include <string.h> #include <assert.h> #include <getopt.h> #include <fcntl.h> // close write usleep read #include <unistd.h> #include <errno.h> #include <malloc.h> #include <sys/stat.h> #include <sys/types.h> #include <sys/time.h> // mmap #include <sys/mman.h> #include <sys/ioctl.h> #include <asm/types.h> #include <linux/videodev2.h> // pthread_create pthread_join #include <pthread.h> #define CLEAR(x) memset (&(x), 0, sizeof (x)) // #define REQ_COUNT 6 #define REQ_COUNT 3 #define uchar unsigned char struct buffer { void * start; size_t length; }; static char * dev_name = "/dev/video0";//摄像头设备名 static int fd = -1; struct buffer * buffers = NULL; // static unsigned int n_buffers = 0; // 2012-7-13 11:33 camera flag // static int iFlagCamera = 0; volatile int iFlagCamera = 0; // 函数名称:thread1 // 函数功能:用于接受键盘的输入,之后通知thread2抓图 // 参数列表: // 返回值 : void thread1(void) { char ch; printf("\n !!!!Warning!!!!\n Max 1000 color bmp\n Input the char: \n"); printf("\n !!!!press o an capture 1 frame picture! \n"); printf("\n !!!!press t an capture 10 frame picture! \n"); printf("\n !!!!press h an capture 100 frame picture! \n"); while(1) { while((ch=getchar()) != '\n') { printf("%c\n", ch); if('o'==ch) { iFlagCamera = 1; printf("thread1=%d\n", iFlagCamera); } else if('t'==ch) { iFlagCamera = 10; printf("thread1=%d\n", iFlagCamera); } else if('h'==ch) { iFlagCamera = 101; printf("thread1=%d\n", iFlagCamera); } else if('q'==ch) { iFlagCamera = 10001; printf("thread1=%d\n", iFlagCamera); } } if(iFlagCamera>1000) { break; } } printf("\n exit\n"); } FILE *file_fd; int i; int r; struct v4l2_capability cap; struct v4l2_format fmt; struct v4l2_buffer buf[REQ_COUNT]; struct v4l2_requestbuffers req; struct v4l2_buffer tmp_buf; enum v4l2_buf_type type; struct timeval tv; struct timeval tp1; struct timeval tp3; struct timeval tp4; // void * mem[REQ_COUNT]; fd_set fds; // // http://blog.sina.com.cn/s/blog_602f87700100znq7.html // // 嵌入式Linux下Camera编程--V4L2 // // Z:\kernel_imx\include\linux\videodev2.h // /* Values for 'capabilities' field */ #define V4L2_CAP_VIDEO_CAPTURE 0x00000001 /* Is a video capture device */ #define V4L2_CAP_VIDEO_OUTPUT 0x00000002 /* Is a video output device */ #define V4L2_CAP_VIDEO_OVERLAY 0x00000004 /* Can do video overlay */ #define V4L2_CAP_VBI_CAPTURE 0x00000010 /* Is a raw VBI capture device */ #define V4L2_CAP_VBI_OUTPUT 0x00000020 /* Is a raw VBI output device */ #define V4L2_CAP_SLICED_VBI_CAPTURE 0x00000040 /* Is a sliced VBI capture device */ #define V4L2_CAP_SLICED_VBI_OUTPUT 0x00000080 /* Is a sliced VBI output device */ #define V4L2_CAP_RDS_CAPTURE 0x00000100 /* RDS data capture */ #define V4L2_CAP_VIDEO_OUTPUT_OVERLAY 0x00000200 /* Can do video output overlay */ #define V4L2_CAP_HW_FREQ_SEEK 0x00000400 /* Can do hardware frequency seek */ #define V4L2_CAP_RDS_OUTPUT 0x00000800 /* Is an RDS encoder */ /* Is a video capture device that supports multiplanar formats */ #define V4L2_CAP_VIDEO_CAPTURE_MPLANE 0x00001000 /* Is a video output device that supports multiplanar formats */ #define V4L2_CAP_VIDEO_OUTPUT_MPLANE 0x00002000 #define V4L2_CAP_TUNER 0x00010000 /* has a tuner */ #define V4L2_CAP_AUDIO 0x00020000 /* has audio support */ #define V4L2_CAP_RADIO 0x00040000 /* is a radio device */ #define V4L2_CAP_MODULATOR 0x00080000 /* has a modulator */ #define V4L2_CAP_READWRITE 0x01000000 /* read/write systemcalls */ #define V4L2_CAP_ASYNCIO 0x02000000 /* async I/O */ #define V4L2_CAP_STREAMING 0x04000000 /* streaming I/O ioctls */ void getCameraCapabilities(int iCameraCapabilities) { if(iCameraCapabilities&V4L2_CAP_VIDEO_CAPTURE) { printf("!!!!**** camera ****!!!! Is a video capture device\n"); } if(iCameraCapabilities&V4L2_CAP_VIDEO_OUTPUT) { printf("**** camera **** Is a video output device\n"); } if(iCameraCapabilities&V4L2_CAP_VIDEO_OVERLAY) { printf("**** camera **** Can do video overlay\n"); } if(iCameraCapabilities&V4L2_CAP_VBI_CAPTURE) { printf("**** camera **** Is a raw VBI capture device\n"); } if(iCameraCapabilities&V4L2_CAP_VBI_OUTPUT) { printf("**** camera **** Is a raw VBI output device\n"); } if(iCameraCapabilities&V4L2_CAP_SLICED_VBI_CAPTURE) { printf("**** camera **** Is a sliced VBI capture device\n"); } if(iCameraCapabilities&V4L2_CAP_SLICED_VBI_OUTPUT) { printf("**** camera **** Is a sliced VBI output device\n"); } if(iCameraCapabilities&V4L2_CAP_RDS_CAPTURE) { printf("**** camera **** RDS data capture\n"); } if(iCameraCapabilities&V4L2_CAP_VIDEO_OUTPUT_OVERLAY) { printf("**** camera **** Can do video output overlay\n"); } if(iCameraCapabilities&V4L2_CAP_HW_FREQ_SEEK) { printf("**** camera **** Can do hardware frequency seek\n"); } if(iCameraCapabilities&V4L2_CAP_RDS_OUTPUT) { printf("**** camera **** Is an RDS encoder\n"); } if(iCameraCapabilities&V4L2_CAP_VIDEO_CAPTURE_MPLANE) { printf("**** camera **** Is a video capture device that supports multiplanar formats\n"); } if(iCameraCapabilities&V4L2_CAP_VIDEO_OUTPUT_MPLANE) { printf("**** camera **** Is a video output device that supports multiplanar formats\n"); } if(iCameraCapabilities&V4L2_CAP_TUNER) { printf("**** camera **** has a tuner\n"); } if(iCameraCapabilities&V4L2_CAP_AUDIO) { printf("**** camera **** has audio support\n"); } if(iCameraCapabilities&V4L2_CAP_RADIO) { printf("**** camera **** is a radio device\n"); } if(iCameraCapabilities&V4L2_CAP_MODULATOR) { printf("**** camera **** has a modulator\n"); } if(iCameraCapabilities&V4L2_CAP_READWRITE) { printf("**** camera **** read/write systemcalls\n"); } if(iCameraCapabilities&V4L2_CAP_ASYNCIO) { printf("**** camera **** async I/O\n"); } if(iCameraCapabilities&V4L2_CAP_STREAMING) { printf("!!!!**** camera ****!!!! streaming I/O ioctls\n"); } }
wb49163 2013-06-26
  • 打赏
  • 举报
回复
我使用i.MX6Q+OV3640,想获取300W的灰度图(fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV422P;只取Y分量),得到4x6的网格图。

e

我通过技术处理,可以让它生成完整的图片。但是头不满意:


附上抓图的程序:
太大,只给链接了!
// http://www.linuxidc.com/Linux/2011-03/33020.htm
// V4L2摄像头获取单幅图片测试程序(MMAP模式)
// [日期:2011-03-06] 来源:Linux社区 作者:aokikyon [字体:大 中 小]
落叶行健 2013-03-25
  • 打赏
  • 举报
回复
没试过!!观望
曹大夯 2013-02-02
  • 打赏
  • 举报
回复
是不是OV的数据接口带宽不够大?
用心飞翔 2013-02-01
  • 打赏
  • 举报
回复
同问,顶起!

21,600

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧