整體驅動理解以下:api
1:如何在設備上建立一個攝像頭文件,具體api是什麼?架構
2:內核板級bsp作了什麼?是如何與V4L2框架鏈接起來的?框架
3:我到底如何給板級bsp什麼參數,才能讓攝像頭工做?ide
=============================================================函數
以前沒有作過相關的camear 驅動經驗,只是對V4L2 有所耳聞,可是知道一些基本的原生框架的API,因而我決定看看板級bsp作了什麼讓開發變得簡潔。看了幾天整理了如上內容決定依次解答。spa
1:對於原生V4L2 架構的API ,是 video_register_device(),該函數是會建立 /dev/videox 節點的,可是對於咱們這款單板bsp ,官方api是 v4l2_int_device_register() ,其內部調用了原生api。接口
2:經閱讀,發現mxc_v4l2_capture.c文件是作了一個camera的開天闢地的驅動。具體分析見 個人第三篇文章,這裏作出一個總結。ip
2-1:Camera驅動是作了驅動和設備信息的分離,該文件是driver框架的一部分,用於讀取設備信息如 ipu_id 和csi_id ,sensor的分辨率,引腳複用等等,用來填充一個cam_data結構體,開發
這個cam_data相當重要,在之後的任何與設備的操做中,均要讀取cam_data的信息。it
2-2 :camera驅動是分主從的,驅動主體做爲主,設備驅動做爲從,因而須要一個主從的匹配,匹配的過程是根據ipu_id 和csi_id 的。匹配成功會調用一個attach函數,這個attach會作一些默認操做和檢查。
2-3:任何對於 設備結點的 系統調用如 open Write ioctl 均會最終調用到 mxc_v4l_open ,mxc_v4l_close ,mxc_v4l_do_ioctl,等等。
3:
這塊是要進行區分,imx6q 支持並口輸入和mipi輸入,這兩個須要設備驅動提供的參數也不盡相同。
對於並口傳輸要作如下步驟
1: csi_id , ipu_id ,camera_width,camera_height ,數據線的複用使能,i2c控制接口使能。
2:在你的設備驅動里根據板機文件或者設備樹 解析這些部分,獲取到這些信息
對於mipi接口 :
1: csi_id , ipu_id ,camera_width,camera_height ,mclock
2 : 獲取這些信息填充一個sensor_data結構體,並使能時鐘。