---恢復內容開始---
1 先從應用程序入手看看應用流程對驅動做了哪些事情

這個首先對傳入的 參數做了處理,用來重寫驅動默認給的參數

這里先打開/dev/video3 ,這個設備節點是由驅動創建的。

該函數是一個設置參數的過程,內核接收一些結構體改變自己默認參數

首先進行一個查詢能力的函數,傳入struct v4l2_capability 這個結構體里面,驅動會設置這個結構體。

如驅動代碼所示,這個設備有多個能力,首先是個視頻輸入設備,還可以進行視頻疊加,支持系統IOCTL控制,支持系統調用IO讀寫。


接着使用VIDIOC_S_INPUT傳入了一個參數到驅動,應用程序給的1,那么看驅動做了什么處理。

這個是一個選擇數據流向內存的一個路由,驅動框架定義了兩個流向,一個是
“CSI IC MEM” 一個是 “CSI MEM”,第一個需要經過IC的處理到內存,另外一個不需要
如驅動代碼所示,我們傳入的參數為1,於是選擇了第一個流向,其中最重要的是.name 用來進行strcmp匹配。


接着

設置這個結構體為視頻捕獲設備類型,否則驅動會返回錯誤,

驅動將cam_data的crop_bounds和crop_defrect值傳給應用層傳來的結構體,驅動的crop_current是根據具體設備來的是設備相關驅動做的,然后傳給框架驅動的。
然后根據設備驅動傳來的defrect值傳給crop.c 接着調用VIDIOC_CROPCAP命令字根據
具體設備的v4l2_crop值進行判斷,校驗合適后寫入寄存器。

這里的紅色框是寫入真實寄存器的,用來設置csi的窗口大小和位置
接着



驅動同樣以一個struct v4l2_format *sf接受,調用mxc_v4l2_s_fmt函數
在應用傳給驅動的結構體struct v4l2_format fmt ,width是0,height是0,pixformat
是UYVY格式,但是在接下來的過程中,還是會被設備驅動定的cam_data值覆蓋。

接着

這個是很重要的一步,為攝像頭發來的數據分配內存,


分配內存最核心的API是 dma_alloc_coherent
函數,分配好之后,將內存地址賦值給
cam->frame[i].vaddress這個虛擬地址
至此設置部分完畢。
接着

這里又打開了另外一個設備結點/dev/mxc_ipu,這個是與底層數據傳輸相關的節點

又打開了一個framebuffer設備,用於顯示,可以是HDMI也可以是LCD屏,然后對此設備進行顯示設置。

這個是正式開啟Camera進行數據傳輸的函數
最終會調用

最終驅動會調用mxc_streamon

=================================================================================
我發現找不到可以上傳示例代碼的地方,想找Camera應用編程的實例代碼還是私信我吧!
---恢復內容結束---
