V4L2 usb 攝像頭 測試

2021-07-04 23:27:15 字數 2144 閱讀 9467

1、常用的結構體在核心目錄include/linux/videodev2.h中定義

2、常用的ioctl介面命令也在include/linux/videodev2.h中定義

3、操作流程

v4l2提供了很多訪問介面,你可以根據具體需要選擇操作方法。需要注意的是,很少有驅動完全實現了所有的介面功能。所以在使用時需要參考驅動原始碼,或仔細閱讀驅動提供者的使用說明。

下面列舉出一種操作的流程,供參考。

(1)開啟裝置檔案

int fd = open(devicename,mode);

devicename:/dev/video0、/dev/video1 ……

mode:o_rdwr [| o_nonblock]

(2)取得裝置的capability

struct v4l2_capability capability;

int ret = ioctl(fd, vidioc_querycap, &capability);

struct v4l2_input input;

……初始化input

int ret = ioctl(fd, vidioc_querycap, &input);

v4l2_std_id std;

do while (ret == -1 && errno == eagain);

switch (std)

struct v4l2_format fmt;

fmt.type = v4l2_buf_type_video_output;

fmt.fmt.pix.pixelformat = v4l2_pix_fmt_uyvy;

fmt.fmt.pix.height = height;

fmt.fmt.pix.width = width;

fmt.fmt.pix.field = v4l2_field_interlaced;

ret = ioctl(fd, vidioc_s_fmt, &fmt);

if(ret)

(6)向驅動申請幀快取

struct v4l2_requestbuffers req;

if (ioctl(fd, vidioc_reqbufs, &req) == -1)

(7)獲取每個快取的資訊,並mmap到使用者空間

typedef struct videobuffer videobuffer;

videobuffer* buffers = calloc( req.count, sizeof(*buffers) );

struct v4l2_buffer buf;

for (numbufs = 0; numbufs < req.count; numbufs++)

buffers[numbufs].length = buf.length;

// 轉換成相對位址

buffers[numbufs].start = mmap(null, buf.length,

prot_read | prot_write,

map_shared,

fd, buf.m.offset);

if (buffers[numbufs].start == map_failed)

int buf_type= v4l2_buf_type_video_capture;

int ret = ioctl(fd, vidioc_streamon, &buf_type);

(9)取出fifo快取中已經取樣的幀快取

struct v4l2_buffer buf;

memset(&buf,0,sizeof(buf));

buf.type=v4l2_buf_type_video_capture;

buf.memory=v4l2_memory_mmap;

buf.index=0;//此值由下面的ioctl返回

if (ioctl(fd, vidioc_dqbuf, &buf) == -1)

(10)將剛剛處理完的緩衝重新入佇列尾,這樣可以迴圈採集

if (ioctl(fd, vidioc_qbuf, &buf) == -1)

int ret = ioctl(fd, vidioc_streamoff, &buf_type);

close(fd);

from: 

v4l2攝像頭驅動

環境 硬體 radxa rock開發板,藍色妖姬t998無驅攝像頭 系統 lubuntu 3月15號韌體,v4l2 其實我只是把草根老師的部落格 改了些引數 1.攝像頭的模式由o rdwr o nonblock改為o rdwr,若不改,會報dq buf的bug 3.n buffer中途會莫名其妙改變...

USB攝像頭驅動配置及V4L2程式設計

摘要 學位授予單位 燕山大學 學位級別 碩士 學位授予年份 2011 其實uboot啟動映像主要是在原來的zimage前加上乙個他要0x40的tag,告訴uboot一些關於核心啟動的資訊。在arch arm boot makefile 62行開始有命令和規則 quiet cmd uimage uim...

V4L2 獲取和配置攝像頭

一 v4l2 獲取和配置攝像頭程式示例 include include include include include include include includeint fd const char input dev dev video0 const char qctrl name null i...