IMX6Q camera 驅動總結( 1 )

---恢復內容開始---編程

1 先從應用程序入手看看應用流程對驅動作了哪些事情框架

 

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

 

這裏先打開/dev/video3 ,這個設備節點是由驅動建立的。函數

 

 

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

 

 

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

 

 

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

 

 

 

 

 

 

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

 

 

這個是一個選擇數據流向內存的一個路由,驅動框架定義了兩個流向,一個是ip

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

 

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

相關文章
相關標籤/搜索