一、硬件原理
1. OV2640
1.1 基本功能
OV2640 是一款低功耗、高性能的圖像傳感器,支持以下功能:
-
最高分辨率:200 萬像素(1600x1200)。
-
輸出格式:JPEG、YUV、RGB。
-
內置圖像處理功能:自動曝光、自動白平衡、自動增益控制等。
1.2 硬件接口
2. CSI
2.1 基本功能
CSI 是一種高速串行接口,專為攝像頭模塊設計,具有以下特點:
-
支持高帶寬數據傳輸(適合高分辨率和高幀率視頻)。
-
低引腳數,減少硬件復雜度。
-
支持多種數據格式(如 RAW、YUV、RGB)。
2.2 硬件原理
CSI 接口通常包括以下信號:
-
數據通道(Data Lanes):
-
差分信號對(如 CSI_D0+/CSI_D0-)。
-
支持 1-4 對數據通道,帶寬隨通道數增加。
-
-
時鐘通道(Clock Lane):
-
差分信號對(如 CSI_CLK+/CSI_CLK-)。
-
用于同步數據傳輸。
-
-
控制信號:
-
I2C 或 SPI 接口,用于配置攝像頭模塊。
-
2.3 工作流程
-
初始化:通過 I2C 或 SPI 配置攝像頭模塊。
-
數據傳輸:
-
攝像頭模塊通過 CSI 數據通道發送圖像數據。
-
主控設備通過 CSI 時鐘通道同步接收數據。
-
-
數據處理:主控設備對接收到的圖像數據進行處理或存儲。
二、設備樹
根節點
&csi {status = "okay";port {csi1_ep: endpoint {remote-endpoint = <&ov2640_ep>;};};
};&i2c1 {ov2640: ov2640@30 {compatible = "ovti,ov2640";reg = <0x30>;pinctrl-names = "default";pinctrl-0 = <&pinctrl_csi1>;clocks = <&clks IMX6UL_CLK_CSI>;clock-names = "csi_mclk";/*pwn-gpios = <&gpio1 4 1>;*/rst-gpios = <&gpio1 2 0>;/*csi_id = <0>;mclk = <24000000>;mclk_source = <0>;*/status = "okay";port {ov2640_ep: endpoint {remote-endpoint = <&csi1_ep>;};};};
};
三、驅動簡單分析
四、Qt 編寫測試文件
1. 簡介
Qt 里有一個 QCamera 類,但是不支持4.1.15 內核版本上使用 OV5640、OV2640。
因為 OV5640、OV2640 的驅動默認是讀取 YUYV 格式數據,而 QCamera 里讀取的數據是 RGB 格式數據。當然也能通過修改驅動來支持。不過有 V4l2 框架,就沒必要這么做了。V4l2 的數據直接可以顯示在 fb0,且處理效率比 Qt 來的流程。
直接使用 V4l2 的方案留在后面的視頻監控項目上。本次使用的是 Qt+OpenCV 調用攝像頭。
OpenCV 的環境搭建:ARM Linux 移植 tslib、Qt和OpenCV-CSDN博客
2. 主要功能
-
攝像頭管理
selectCameraDevice(int index)
:選擇并打開指定索引的攝像頭cameraProcess(bool bl)
:控制攝像頭的啟動和停止timerTimeOut()
:定時采集攝像頭圖像并發送信號
-
圖像處理
matToQImage(const cv::Mat &img)
:將 OpenCVcv::Mat
格式轉換為 QtQImage
格式
-
定時器機制
- 使用
QTimer
控制圖像采集頻率(33ms,約等于 30fps)
- 使用
3. 程序編寫
3.1 .pro 文件
添加 opencv 庫
INCLUDEPATH += /home/prover/linux/opencv-3.4.1/install/include
LIBS += /home/prover/linux/opencv-3.4.1/install/lib/libopencv_core.so \/home/prover/linux/opencv-3.4.1/install/lib/libopencv_highgui.so \/home/prover/linux/opencv-3.4.1/install/lib/libopencv_imgproc.so \/home/prover/linux/opencv-3.4.1/install/lib/libopencv_videoio.so \/home/prover/linux/opencv-3.4.1/install/lib/libopencv_imgcodecs.so
3.2 簡單分析
3.3 編譯
source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
/home/prover/linux/qt-5.12.9/arm-qt/bin/qmake
make -j 8
五、測試
1. 手動加載
將內核源碼的drivers/media/paltform/mxc/subdev 中的mx6s_capture.c 單獨拿出來編譯 .ko文件
然后將 ov2640_driver.ko 和?mx6s_capture.ko 文件進行加載即可。
一般加載后,設備為 /dev/video1。然后運行第四節的 Qt 程序即可。
2. 內核修改
配置 4.1.15 內核
?
按1進入
按Y選中,并進入紅框
紅框默認是 M 的,改成 Y,并選擇 VF SDC。?
還有這個也要選中:
如果不出意外的話,就會出意外了:
?修改內核源碼中的 drivers/media/platform/mxc/capture/ 下的?ipu_prp_vf_sdc.c和ipu_prp_vf_sdc_bg.c
重新編譯下內核。
發現取消綁定了。
然后加載自己寫的驅動,當然也可以編入到內核的 drivers/media/paltform/mxc/capture:
運行測試前,可以添加格式:drivers\media\platform\mxc\subdev\mx6s_capture.c
static struct mx6s_fmt formats[] = {{.name = "UYVY-16",.fourcc = V4L2_PIX_FMT_UYVY,.pixelformat = V4L2_PIX_FMT_UYVY,.mbus_code = MEDIA_BUS_FMT_UYVY8_2X8,.bpp = 2,}, {.name = "YUYV-16",.fourcc = V4L2_PIX_FMT_YUYV,.pixelformat = V4L2_PIX_FMT_YUYV,.mbus_code = MEDIA_BUS_FMT_YUYV8_2X8,.bpp = 2,}, {.name = "YUV32 (X-Y-U-V)",.fourcc = V4L2_PIX_FMT_YUV32,.pixelformat = V4L2_PIX_FMT_YUV32,.mbus_code = MEDIA_BUS_FMT_AYUV8_1X32,.bpp = 4,}, {.name = "RAWRGB8 (SBGGR8)",.fourcc = V4L2_PIX_FMT_SBGGR8,.pixelformat = V4L2_PIX_FMT_SBGGR8,.mbus_code = MEDIA_BUS_FMT_SBGGR8_1X8,.bpp = 1,}, {.name = "RGB565_LE",.fourcc = V4L2_PIX_FMT_RGB565,.pixelformat = V4L2_PIX_FMT_RGB565,.mbus_code = MEDIA_BUS_FMT_RGB565_2X8_LE,.bpp = 2,}, {.name = "RGB565_BE",.fourcc = V4L2_PIX_FMT_RGB565,.pixelformat = V4L2_PIX_FMT_RGB565,.mbus_code = MEDIA_BUS_FMT_RGB565_2X8_BE,.bpp = 2,}, {.name = "JPEG",.fourcc = V4L2_PIX_FMT_JPEG,.pixelformat = V4L2_PIX_FMT_JPEG,.mbus_code = MEDIA_BUS_FMT_JPEG_1X8,.bpp = 2,}
};
一般加載后,設備為 /dev/video0.
然后運行第四節的 Qt 程序即可。