---恢復內容開始---編程
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應用編程的實例代碼仍是私信我吧!
---恢復內容結束---