v4l2攝像頭框架--基於s5pv210和 s5p6818(一)

接觸v4l2框架已經很久了,因爲工作中從沒有用到過這個框架,因此也就沒有花時間去研究學習,最主要的是當時看到這個框架太複雜,沒有心情去弄明白。最近雖然也沒有實際工作和該框架相關,但還是花了一部分精力去學習了以下該框架,通過這段時間大量閱讀源碼和論文,也算是對該框架有了一個初步的認識,現總結以下,以便以後自己翻閱方便,其次有不對的地方也希望大家給予指正。廢話就這些了,下面先給大家看一個框圖

這是從https://blog.csdn.net/lizuobin2/article/details/53000720地址摘錄過來的,該博主對v4l2的講解也挺好,就是感覺代碼太多,看起來有點顧此失彼,但是想深入學習v4l2架構,我建議大家可以好好閱讀該博主的博文,當然了也可以給我留言,我儘量把自己知道的都告訴給大家。

首先我們應該明白再大的框架其基本思想都不會離開字符設備、塊設備和網絡設備這些基本的設備驅動思想,v4l2是基於字符設備的一個框架,學過驅動的都應該知道應用層的系統調用最終調用到驅動得file_operations結構體中對應的函數,v4l2這個大架構也不例外,應用程序最終通過file_operations和驅動層通信,只是file_operations不用我們驅動實現,而是核心層實現了一個統一的file_operations結構體,即上圖中的v4l2_fops,應用層的所有接口最終都會調用到v4l2_fops結構體中的成員,然後再由v4l2_fops調用我們驅動層實現的接口,分層之後的訪問流程大致就是上面所述的那樣。雖然整個架構很簡單,但是估計每個人剛接觸到v4l2的時候都會感覺很頭大,很迷惘,雖然我們都能理解這個架構,但心裏卻很虛,感覺對該驅動很不理解。

其實造成v4l2比較難以理解的根本原因是這個架構包含的模塊太多了,以至於我們大家都會迷失在其浩瀚的代碼世界中,我個人認爲學習該架構不光有很強的閱讀代碼的功底,還需要有一些攝像頭及攝像頭應用程序開發的知識,只有這樣才能真正的弄明白該架構(當然,這裏只是簡單的指視頻採集部分)。

這裏我分開去講解v4l2的一些結構體和關係。雖然在v4l2中有很多的結構體,在此我不會把所有結構體都講解到,我只把最主要的跟架構緊密相關的部分給大家說明,這裏我根據應用層的調用順序解釋一下數據結構。

應用層系統調用和video_device.cdev通信,故首先進入我們視野的就是struct video_device結構體,該結構體定義如下:

struct video_device{
        ......
	const struct v4l2_file_operations *fops;
	struct cdev *cdev;		/* character device */
	int minor;
	const struct v4l2_ioctl_ops *ioctl_ops;
};

這裏我們只列出了和架構緊密相關的成員,其它成員沒有列出,如有疑問,可在博文下留言。應用層的系統調用會調用到video_device.cdev的file_operations成員,file_operations中的成員函數最終會調用到video_device結構的v4l2_file_operations  fops成員,v4l2_file_operations  fops的unlocked_ioctl函數會調用到v4l2_ioctl_ops  ioctl_ops成員,最終調用到了子設備對應的ioctl等成員。

以上部分就是對開頭那張圖的一個說明,接下來我會根據兩個實際例子向大家講解v4l2。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章