hi3536 uvc驱动配置
海思hi3536 usb摄像头驱动配置
Linux系统自带了usb摄像头驱动,在Linux系统中简称uvc驱动,有些系统中默认可能没有配置该驱动,或者需要进行裁剪,这个时候需要自己手动进行配置。配置过程如下:
- 在Device Drivers选项下选择Multimedia support
- 进入Multimedia support选项,选择Cameras/video grabbers support
- 进入Media USB Adapters选项,选中USB Video Class (UVC),可以根据实际需要将该模块编译进内核或者编程成ko文件。
上述步骤完成后可以编译出以下模块,然后用insmod命令加载模块:
insmod videodev.ko
insmod videobuf2-memops.ko
insmod videobuf2-vmalloc.ko
insmod videobuf2-core.ko
insmod uvcvideo.ko
加载成功后,会在板子上/dev目录下生成videoxx节点。然后就可以用Linux下v4l2那套接口采集视频。
下面附一段v4l2采集的demon程序。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <getopt.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <malloc.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/mman.h>
#include <sys/ioctl.h>#include <asm/types.h>
#include <linux/videodev2.h>#define CAMERA_DEVICE "/dev/video0"
#define CAPTURE_FILE "frame.jpg"#define VIDEO_WIDTH 640
#define VIDEO_HEIGHT 480
#define VIDEO_FORMAT V4L2_PIX_FMT_YUYV
#define BUFFER_COUNT 4typedef struct VideoBuffer {void *start;size_t length;
} VideoBuffer;VideoBuffer framebuf[10];int main()
{int i, ret;// 打开设备int fd;fd = open(CAMERA_DEVICE, O_RDWR, 0);if (fd < 0) {printf("Open %s failed\n", CAMERA_DEVICE);return -1;}// 获取驱动信息struct v4l2_capability cap;ret = ioctl(fd, VIDIOC_QUERYCAP, &cap);if (ret < 0) {printf("VIDIOC_QUERYCAP failed (%d)\n", ret);return ret;}// Print capability infomationsprintf("Capability Informations:\n");printf(" driver: %s\n", cap.driver);printf(" card: %s\n", cap.card);printf(" bus_info: %s\n", cap.bus_info);printf(" version: %08X\n", cap.version);printf(" capabilities: %08X\n", cap.capabilities);// 设置视频格式struct v4l2_format fmt;memset(&fmt, 0, sizeof(fmt));fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;fmt.fmt.pix.width = VIDEO_WIDTH;fmt.fmt.pix.height = VIDEO_HEIGHT;fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;ret = ioctl(fd, VIDIOC_S_FMT, &fmt);if (ret < 0) {printf("VIDIOC_S_FMT failed (%d)\n", ret);return ret;}// 获取视频格式ret = ioctl(fd, VIDIOC_G_FMT, &fmt);if (ret < 0) {printf("VIDIOC_G_FMT failed (%d)\n", ret);return ret;}// Print Stream Formatprintf("Stream Format Informations:\n");printf(" type: %d\n", fmt.type);printf(" width: %d\n", fmt.fmt.pix.width);printf(" height: %d\n", fmt.fmt.pix.height);char fmtstr[8];memset(fmtstr, 0, 8);memcpy(fmtstr, &fmt.fmt.pix.pixelformat, 4);printf(" pixelformat: %s\n", fmtstr);printf(" field: %d\n", fmt.fmt.pix.field);printf(" bytesperline: %d\n", fmt.fmt.pix.bytesperline);printf(" sizeimage: %d\n", fmt.fmt.pix.sizeimage);printf(" colorspace: %d\n", fmt.fmt.pix.colorspace);printf(" priv: %d\n", fmt.fmt.pix.priv);printf(" raw_date: %s\n", fmt.fmt.raw_data);// 请求分配内存struct v4l2_requestbuffers reqbuf;reqbuf.count = BUFFER_COUNT;reqbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;reqbuf.memory = V4L2_MEMORY_MMAP;ret = ioctl(fd , VIDIOC_REQBUFS, &reqbuf);if(ret < 0) {printf("VIDIOC_REQBUFS failed (%d)\n", ret);return ret;}// 获取空间VideoBuffer* buffers = calloc( reqbuf.count, sizeof(*buffers) );struct v4l2_buffer buf;for (i = 0; i < reqbuf.count; i++) {buf.index = i;buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;buf.memory = V4L2_MEMORY_MMAP;ret = ioctl(fd , VIDIOC_QUERYBUF, &buf);if(ret < 0) {printf("VIDIOC_QUERYBUF (%d) failed (%d)\n", i, ret);return ret;}// mmap bufferframebuf[i].length = buf.length;framebuf[i].start = (char *) mmap(0, buf.length, PROT_READ|PROT_WRITE, MAP_SHARED, fd, buf.m.offset);if (framebuf[i].start == MAP_FAILED) {printf("mmap (%d) failed: %s\n", i, strerror(errno));return -1;}// Queen bufferret = ioctl(fd , VIDIOC_QBUF, &buf);if (ret < 0) {printf("VIDIOC_QBUF (%d) failed (%d)\n", i, ret);return -1;}printf("Frame buffer %d: address=0x%x, length=%d\n", i, (unsigned int)framebuf[i].start, framebuf[i].length);}// 开始录制enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;ret = ioctl(fd, VIDIOC_STREAMON, &type);if (ret < 0) {printf("VIDIOC_STREAMON failed (%d)\n", ret);return ret;}// Process the frameFILE *fp = fopen(CAPTURE_FILE, "wb");if (fp < 0) {printf("open frame data file failed\n");return -1;}int cnt = 100;while(cnt--){// Get frameret = ioctl(fd, VIDIOC_DQBUF, &buf);if (ret < 0) {printf("VIDIOC_DQBUF failed (%d)\n", ret);return ret;}fwrite(framebuf[buf.index].start, 1, buf.length, fp);printf("Capture one frame saved in %s\n", CAPTURE_FILE);// Re-queen bufferret = ioctl(fd, VIDIOC_QBUF, &buf);if (ret < 0) {printf("VIDIOC_QBUF failed (%d)\n", ret);return ret;}}fclose(fp);// Release the resourcefor (i=0; i< 4; i++) {munmap(framebuf[i].start, framebuf[i].length);}close(fd);printf("Camera test Done.\n");return 0;
}
hi3536 uvc驱动配置相关推荐
- 罗技摄像头C270与嵌入式LINUX(linux UVC驱动分析)
转载地址(原文地址):http://www.eefocus.com/marianna/blog/13-06/294567_a5fc8.html 现在,假如你的手上有一只摄像头,它是罗技高清网络摄像头w ...
- USB Camera摄像头 UVC 驱动
UVC 驱动的代码在linux-3.7.2\drivers\media\usb\uvc 中 我的摄像头终于出现图像了! 李迟按:本文章不是教程,不是心得总结,而是记录我在做毕业设计过程中遇到的一些问题 ...
- hi3536 pcie驱动学习笔记
Hi3536 PCIE学习笔记2(linux3.10.y) 一.PCI总线简单介绍 1.PCI总线配置 两类配置请求:Type00h配置请求,Type 01配置请求.Type 00h配置请求:访问与H ...
- eclipse新建项目有红叉_selenum+java+eclipse环境搭建和浏览器驱动配置
一.环境搭建 准备:安装JDK.安装eclipse.下载selenium包(下面以selenium3.1为例) 1.高级--环境变量 1)创建一个变量名为:JAVA_HOME,变量值为:jdk的安装目 ...
- cyclone iv 器件手册_GaN器件的直接驱动配置
受益于集成器件保护,直接驱动GaN器件可实现更高的开关电源效率和更佳的系统级可靠性. 高电压(600V)氮化镓(GaN)高电子迁移率晶体管(HEMT)的开关特性可实现提高开关模式电源效率和密度的新型拓 ...
- Linux摄像头UVC驱动第五篇--启动传输之设置摄像头参数
本章主要实现 myuvc_vidioc_streamon()即启动传输 中的摄像头参数设置 向USB摄像头设置参数: 比如使用哪个format, 使用这个format下的哪个frame(分辨率),参考 ...
- 自己写的uvc驱动支持IP2977/ip2970
/* 作者: 453411484@qq.com * 此驱动程序是基于linux2.6.31.14内核 * 上一篇自己写的uvc驱动程序是针对环宇飞扬6190来写的,有一些缺点,这些缺点在本次的驱动 * ...
- LittleVGL踩坑指南03:Arduino下显示和触摸驱动配置(TFT_eSPI)
文章版本7.10,LVGL更新极快,不同版本配置方法可能存在差异 前言 触摸搞了好几天,坑太多了,好在总算飞过来了.顺便把显示驱动也写了:提前说一下,我的硬件是2.4寸ILI9341驱动屏幕+XP ...
- [学习开发板]iTOP-4412开发板AVIN驱动配置
平台:iTOP-4412开发板[学习开发板] 本文学习开发板AVIN模块的驱动配置 在内核目录下执行命令"make menuconfig" ,如下图: 将会打开内核的配置界面,如下 ...
最新文章
- 教育学专硕考试科目计算机,2017考研:哪些专业的考试科目相同?
- 【转】HTTP Header 详解
- VTK:小部件之BoxWidget
- 【Linux】一步一步学Linux——pmap命令(145)
- SpringAop对struts2的Action设置切面织入时报错java.lang.NoSuchMethodException
- C++笔记121023
- iPhone 12系列又有新变化:免费的有线耳机可能不再有
- 可以分屏的软件_Screen分屏软件下载|Screen+专业分屏 免费版v1.4.25 下载
- 线程同步--关键代码段(一)
- 用html代码实现做题记分,html解析cricinfo记分卡
- 文华wh6如何修改服务器,文华财经 软件特色功能介绍修改
- html文件变成桌面背景,将HTML文档设置为Windows桌面背景
- 我在印尼工作的日子-基本环境
- 电脑打开html不显示图片,网页不显示图片,教您网页不显示图片怎么解决
- python 计算箱线图、中位数、上下四分位数等
- 去中心化存储项目终极指南 | Filecoin, Storj 和 PPIO 项目技术对比(上)
- Python学习初阶:Python基本介绍及常用数据类型
- VMware系统启动假死,一直处于“繁忙”状态
- AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE(阅读笔记)
- PCA(Principal Component Analysis)数学分析
热门文章
- Android OTA 相关工具(四) 查看 payload 文件信息
- java流浪动物救助系统(毕业设计)
- 向军html视频教程
- acm-(模拟、暴力枚举)Codeforces Round #664 (Div. 1) A. Boboniu Chats with Du
- 【C++】经典项目控制台贪吃蛇小游戏详细教程
- 23考研截至目前,计算机/软件等专业调剂信息集合!
- 常见浏览器Agent代理信息
- 学校计算机有麦克风吗,电脑使用麦克风需要声卡吗?为什么有人说需要,有人说不需要呢?...
- **磁卡只读RFID智能卡管理读写器Z100-RF卡片初始化**
- php mmseg,coreseek+sphinx+mmseg中文分词安装