IMX6Q camera 驅動總結( 1 )


---恢復內容開始---

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應用編程的實例代碼還是私信我吧!

 

---恢復內容結束---


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM