JZ2440攝像頭驅動1 V4L2框架分析學習筆記

2021-09-11 05:36:10 字數 3596 閱讀 3110

1、對於複雜的字元裝置驅動程式(以lcd為例)

引入分層的概念

(1)上層fbmem.c(對於lcd驅動程式來說,核心已經幫我們做好了,這個fbmem.c是核心提供的)

(2)我們要做的是硬體相關這一層

分配、設定、註冊fb_info結構體,這裡的註冊是把這個結構體告訴fbmem.c,當應用程式呼叫讀寫等函式操作lcd的時候,首先會呼叫fbmem.c的file_operation結構體的讀寫函式,在這些讀寫函式裡面就會呼叫之前的fb_info結構體裡面的函式或屬性來操作硬體。

(3)總結:如何寫對於分層的裝置驅動程式

2、v4l2框架和驅動

(1)框架

註冊file_operation結構體就是把這個結構體變成結構體cdev的ops成員。

應用程式呼叫讀寫函式,會呼叫v4l2_fops結構體(也就是file_operation結構體)裡面的讀寫函式。v4l2_fops結構體肯定會呼叫到video_device結構體提供的各種函式或屬性(如裡面的file_operation結構體)。

不知道**是哪乙個:

開啟虛擬機器,並位於前面,接上usb攝像頭到電腦上去,然後看核心的輸出資訊(用dmesg命令檢視)

r表示遞迴,n表示顯示行號

根據搜尋結果反推攝像頭驅動框架,uvc是usb video class,是usb類的驅動程式,是硬體相關的驅動程式。

uvc_driver.c會向核心層註冊乙個結構體usb_driver,這個結構體裡面會有乙個probe函式,當發現支援的裝置(通過id_table比較)就會呼叫probe函式。

在這個probe函式裡面分配、設定、註冊

(2)驅動編寫

分配、設定、註冊v4l2_device結構體

分配、設定、註冊video_device(vfd)結構體,這個結構體的v4l2_device成員指向

上面的v4l2_device結構體

1.分配video_device

2.設定

3.註冊:video_register_device

入口函式分析

vivi_init

vivi_create_instance

v4l2_device_register   // 不是主要, 只是用於初始化一些東西,比如自旋鎖、引用計數

//註冊   (根據vfl_type_grabber這個型別自動建立裝置節點)根據型別得到不同的名字、次裝置號等

vdev->cdev = cdev_alloc(); //分配cdev結構體

vdev->cdev->ops = &v4l2_fops;//cdev結構體的ops成員等於v4l2_fops(file_operation結構體)

cdev_add //註冊cdev結構體

video_device[vdev->minor] = vdev;   //video_device陣列以次裝置號為下標把video_device結構體放進去

if (vdev->ctrl_handler == null)  //包含v4l2_ctrl結構體的ctrl_handler跟video_device關聯

vdev->ctrl_handler = vdev->v4l2_dev->ctrl_handler;

(2)分析vivi.c的open,read,write,ioctl過程

這些屬性由誰提供

v4l2_ctrl_handler的使用過程:

__video_do_ioctl

struct video_device *vfd = video_devdata(file);//獲得video_device

case vidioc_queryctrl:

{struct v4l2_queryctrl *p = arg;

if (vfh && vfh->ctrl_handler) 

ret = v4l2_queryctrl(vfh->ctrl_handler, p);

else if (vfd->ctrl_handler)  // 在哪設定?在video_register_device,video_device裡面設定了ctrl_handler

ret = v4l2_queryctrl(vfd->ctrl_handler, p);

// 根據id在ctrl_handler裡找到v4l2_ctrl,返回它的值

4、v4l2_ctrl結構體 (每個結構體對應一項(音量、亮度))

(1)作用

(2)這些結構體的管理通過v4l2_ctrl_handler(類似鍊錶)

5、總結

(1)video_device結構體的v4l2_dev等於我們建立的v4l2_device結構體

(2)vdev->ctrl_handler = vdev->v4l2_dev->ctrl_handler;

(3)v4l2_ctrl_handler(類似鍊錶)包含v4l2_ctrl結構體 (代表各種屬性)

v4l2攝像頭驅動

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

V4L2 usb 攝像頭 測試

1 常用的結構體在核心目錄include linux videodev2.h中定義 2 常用的ioctl介面命令也在include linux videodev2.h中定義 3 操作流程 v4l2提供了很多訪問介面,你可以根據具體需要選擇操作方法。需要注意的是,很少有驅動完全實現了所有的介面功能。所...

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

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