說明:
理解攝像頭驅動需要四個前提:
1)攝像頭基本的工作原理和S5PC100集成的Camera控制器的工作原理
2)platform_device和platform_driver工作原理
3)Linux內核V4L2驅動架構
4)Linux內核I2C驅動架構
1. 攝像頭工作原理
OV9650/9655是CMOS接口的圖像傳感器芯片,可以感知外部的視覺信號並將其轉換為數字信號並輸出。通過下面的框圖可以清晰的看到它的工作原理:
我們需要通過XVCLK1給攝像頭提供時鐘,RESET是復位線,PWDN在攝像頭工作時應該始終為低。HREF是行參考信號,PCLK是像素時鐘,VSYNC是場同步信號。一旦給攝像頭提供了時鐘,並且復位攝像頭,攝像頭就開始工作了,通過HREF,PCLK和VSYNC同步傳輸數字圖像信號。數據是通過D0~D7這八根數據線並行送出的。
OV9650向外傳輸的圖像格式是YUV的格式,YUV是一種壓縮後的圖像數據格式,它裡面還包含很多具體的格式類型,我們的攝像頭對應的是YCbCr(8 bits, 4:2:2, Interpolated color).一定要搞清楚格式,後面的驅動裡面設置的格式一定要和這個格式一致。
OV9650裡面有很多寄存器需要配置,配置這些寄存器就需要通過芯片裡面的SCCB總線去配置。SCCB其實是一種弱化的I2C總線。我們可以直接把攝像頭接在S5PC100的I2C控制器上,利用I2C總線去讀寫寄存器,當然直接使用GPIO模擬I2C也可以實現讀寫。我們的驅動代碼裡兩種操作模式都實現了。
從OV9650采集過來的數據沒法直接交給CPU處理。S5PC100芯片裡面集成了Camera控制器,叫FIMC(Fully Interactive Mobile Camera)。攝像頭需要先把圖像數據傳給控制器,經過控制器處理(裁剪拉升後直接預覽或者編碼)之後交給CPU處理。
實際上攝像頭工作需要的時鐘也是FIMC給它提供的。
2. 驅動開發思路
因為驅動程序是承接硬件和軟件的橋梁,因此開發攝像頭驅動我們要搞清楚兩方面的內容:第一是攝像頭的硬件接口,也就是它是怎麼和芯片連接的,如何控制它,如何給攝像頭復位以及傳送數據的格式等等;第二是攝像頭的軟件接口,Linux內核裡面攝像頭屬於標准的V4L2設備,但是這個攝像頭只是一個傳感器,具體的操作都需要通過FIMC來控制,這看起來關系比較復雜。
相比較而言,硬件接口容易搞懂,通過讀芯片手冊和原理圖基本上就沒有問題了,軟件接口比較復雜,主要中間有一個Camera控制器。下面主要集中分析軟件接口。