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...