攝像頭驅動框架

對應應用程序(xawtv),攝像頭的操作過程:
①open打開攝像頭設備(v4l2_open)
②獲取或者設置攝像頭的屬性參數(v4l2_read_attr/v4l2_write_attr)
③準備緩衝區,啓動流傳輸(v4l2_star_streaming)
④重複等待數據,處理數據,準備新緩衝區(v4l2_nextframe,v4l2_waiton)

一個攝像頭(video_device)的ioctl(①~⑤是設置屬性參數,後面的是緩衝區處理):
①攝像頭標籤,指明這是個攝像頭設備(vidio_querycap)<必須的>
②視頻輸入源,對於一個設備可以有多個輸入源camera1、camera2等等(vidioc_enum_input, vidioc_s_input,vidio_g_input)<不是必須的>
③攝像頭的TV制式,只針對模擬攝像頭(vidioc_s_std)<不是必須的>
④攝像頭數據的格式(vidioc_enum_fmt_cap,vidioc_try_fmt_cap,vidioc_s_fmt_cap,vidioc_g_fmt_cap)<枚舉操作不是必須,其餘必須>
⑤攝像頭的白平衡、色彩等參數(vidioc_query_ctrl,vidioc_s_ctrl,vidioc_g_ctrl)<不是必須的>,沒有這些函數,色彩調節只能通過軟件完成
⑥緩衝區的申請、查詢、入列、出列(vidioc_querybuf,vidioc_reqbuf,vidioc_qbuf,vidioc_dqbuf)<必須的>
⑦流停止與啓動(vidioc_streamon,vidioc_streamoff)

流數據的處理
video_device.open函數創建了兩個隊列,底層硬件操作佔用一個,另外一個讓上層app使用
通過ioctl緩衝區操作申請創建數據緩衝區,每個緩衝區需要至少能夠存放一幀圖像(對於底層usb驅動還需要通過分包完成一幀圖像的傳輸)
video.mmap將應用程序的虛擬內存地址跟驅動層中創建的緩衝區地址相關聯
for循環
{
應用程序將空閒緩衝區同時放入之前創建的兩個緩衝區隊列中
上層應用調用video_device.select,進入阻塞,等待數據喚醒
驅動中的硬件完成一幀圖像數據捕獲後,觸發中斷,從底層專用的隊列中取出空緩衝區,並且填充數據後,並且喚醒用戶休眠進程
應用程序從自己專用的隊列中取出第一個緩衝區,進行數據處理
}

這裏寫圖片描述

對於v4l2_fops直接調用video_fops,所以驅動程序中三個主要的ops,:
①video_fops
②由於fops->ioctl = video_ioctl2,所以需要提供ioctl_ops
③由於ioctl_ops中的緩衝區操作函數調用了內核提供的操作函數,所以在open緩衝區隊列初始化時除了提供自旋鎖,還需要有videobuf_ops,如果驅動程

序自行實現ioctl_ops中的緩衝區操作,則videobuf_ops可以省略

發佈了57 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章