linux 驅動 camera 架構 V4L2

2021-10-06 01:32:50 字數 3317 閱讀 6135

<2012 11 14> v4l2應用程式框架

v4l2應用程式框架

// 用非阻塞模式開啟攝像頭裝置
int camerafd;

camerafd = open("/dev/video0", o_rdwr | o_nonblock, 0);

// 如果用阻塞模式開啟攝像頭裝置,上述**變為:

//camerafd = open("/dev/video0", o_rdwr, 0);

int ioctl (int __fd, unsigned long int __request, .../*args*/) ;
在進行v4l2開發中,常用的命令標誌符如下(some are optional):

在亞洲,一般使用pal(720x576)制式的攝像頭,而歐洲一般使用ntsc(720x480),使用vidioc_querystd來檢測:

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

switch (std)

struct v4l2_format fmt;
memset ( &fmt, 0, sizeof(fmt) );

fmt.type = v4l2_buf_type_video_capture;

fmt.fmt.pix.width = 720;

fmt.fmt.pix.height = 576;

fmt.fmt.pix.pixelformat = v4l2_pix_fmt_yuyv;

fmt.fmt.pix.field = v4l2_field_interlaced;

if (ioctl(fd, vidioc_s_fmt, &fmt) == -1) fmt;struct v4l2_pix_format

__u32                   width;         

//寬,必須是16的倍數

__u32 height;

// 高,必須是16的倍數

__u32 pixelformat;

//

enum

v4l2_field field;

__u32 bytesperline;

__u32 sizeimage;

enum

v4l2_colorspace colorspace;

__u32 priv;

2.3 分配記憶體

struct v4l2_requestbuffers  req;
if (ioctl(fd, vidioc_reqbufs, &req) == -1) videobuffer;

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

struct v4l2_buffer buf;

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

buffers[numbufs].length =buf.length;

//轉換成相對位址,核心空間buffer對映到使用者空間

buffers[numbufs].start = mmap(null, buf.length, prot_read |prot_write, map_shared, fd, buf.m.offset);

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

//放入快取佇列,這其實是核心空間中的v4l2驅動程式用乙個資料結構將.count個buffer管理成乙個fifo

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

)

作業系統一般把系統使用的記憶體劃分成使用者空間和核心空間,分別由應用程式管理和作業系統管理。應用程式可以直接訪問記憶體的位址,而核心空間存放的是供核心訪問的**和資料,使用者不能直接訪問。v4l2捕獲的資料,最初是存放在核心空間的,這意味著使用者不能直接訪問該段記憶體,必須通過某些手段來轉換位址。

read、write方式,在使用者空間和核心空間不斷拷貝資料,占用了大量使用者記憶體空間,效率不高。

記憶體對映方式:把裝置裡的記憶體對映到應用程式中的記憶體空間,直接處理裝置記憶體,這是一種有效的方式。上面的mmap函式就是使用這種方式。

使用者指標模式:記憶體片段由應用程式自己分配。這點需要在v4l2_requestbuffers裡將memory欄位設定成v4l2_memory_userptr。

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

buf.type=v4l2_buf_type_video_capture;

buf.memory=v4l2_memory_mmap;

buf.index=0;

//讀取快取

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

return -1

;

//重新放入快取佇列

if (ioctl(camerafd, vidioc_qbuf, &buf) == -1) {

return -1

;

close(camerafd)
如果使用mmap,最後還需要使用munmap方法。

分類:

linux ---********** infrastructure

好文要頂

關注我收藏該文

可可_西里

關注 - 9

粉絲 - 25

+加關注

1 0

posted @

2012-11-14 22:24

可可_西里  閱讀(

0) 

編輯 

收藏

camera驅動電源配置 camera驅動

在手機中,我們常將camera直接稱為sensor。一 sensor的種類 其實這個對於驅動來說基本略知就可以了,處於那種說出來要知道是在說sensor的專業名次這種程度就ok了!一般來說,sensor有兩大類,cmos和ccd。一般來說,ccd的功耗高,拍攝質量高,造價高,他更適合在數位相機或dv...

展訊camera驅動除錯

camera驅動目錄 vendor sprd modules libcamera sensor sensor drv classic galaxycore gc030a kernel drivers misc sprd camera sensor csi2 csi sprd r2p0 csi dri...

Wince5 0 Camera 驅動分析

wince5.0下camera驅動程式分析 2008 01 05 19 48 28 標籤 程式 驅動wince5.0 camera 推送到技術圈 原始出處 作者資訊和本宣告。否則將追究法律責任。1.camera採集動態影象以及顯示的總流程 dma從camera存放動態影象的暫存器將資料傳輸到memo...