Using Video Camera OV5640
1 OV5640 Specification
5 megapixel (2592x1944) camera
Pixel Size: 1.4 x 1.4 μm
Optical size: 1/4"
Max video resolution: 2592x1944@15fps
Max frame rate: QVGA@120fps
Maximum exposure times (seconds): 0.97
Selectable video resolutions: 2592x1944@15fps 1080p@30fps, 720p@60fps, 480p@90fps
automatic image control functions: automatic exposure control (AEC), automatic white balance (AWB), automatic band filter (ABF), automatic 50/60 Hz luminance detection, and automatic black level calibration (ABLC)
support for output formats: RAW RGB, RGB565/555/444, CCIR656, YUV422/420, YCbCr422, and compression
2 Setup
2.1 Enable OV5640 in Linux Kernel Configuration
1 Enter the kernel configuration by running the following command in the top directory of project.
make kconfig
2 Selects sub-menus: Device Drivers>Multimedia support>Media ancillary drivers>Camera sensor devices
3 Select “OmniVision OV5640 sensor support” and press <Y>. Then save and exit.
2.2 Modify Device-tree Source
Device-tree source files of SP7350 are located in linux/kernel/arch/arm64/boot/dts/sunplus/.
Here lists all files for SP7350 boards:
Boards | Device-tree source files |
C3V-W EVB | sp7350-ev.dts |
Modify device tree source file to define OV5640 source for driver
2.2.1 Using SP7350 MIPI/CSI-RX4
Open OV5640_IN4 macro to add OV5640 node and link mipicsirx4.
2.2.2 Using SP7350 Other MIPI/CSI-RX
Define OV5640 node in i2c node:
i2c {
#address-cells = <1>;
#size-cells = <0>;
ov5640: ov5640@3c {
compatible = "ovti,ov5640";
reg = <0x3c>;
clocks = <&ov5640_clk>;
clock-names = "xclk";
AVDD-supply = <&ov5640_avdd_2p8v>;
DOVDD-supply = <&ov5640_dovdd_1p8v>;
DVDD-supply = <&ov5640_dvdd_1p5v>;
port {
ov5640_out: endpoint {
remote-endpoint = <&csi1_ep1>;
clock-lanes = <0>;
data-lanes = <1 2>;
};
};
};
};
port: Should contain one endpoint sub-node used to model connection to the video receiver according to the specification defined in Documentation/devicetree/bindings/media/video-interfaces.txt.
Video receiver endpoint sub-node should defined in mipicsirx node. For example:
mipicsirx: csirx@f8005480 {
port@0 {
reg = <0>;
/* MIPI CSI-2 bus endpoint */
csi1_ep1: endpoint {
remote-endpoint = <&ov5640_out>;
bus-type = <4>;
clock-lanes = <0>;
data-lanes = <1 2>;
};
};
2.3 Compile and Burn
Downloading and Compiling Code | 7. Build code
2.4 Connect Sensor Module
Using C3V-W board MIPI/CSI-RX4, as follows:
2.5 Check
After the burning is completed, start the board. The system should print the following information through the serial port.
After the system startup is completed, the video device can be viewed.
3 Test
3.1 v4l2-ctl Command
This command is used to control V4L2 devices from the command line. It allows you to query device capabilities, set device parameters, and capture video and still image.
Use v4l2-ctl --all --device /dev/video0 command getting device all information.
3.2 Capture Image
3.2.1 Config Video Device
Use v4l2-ctl -d /dev/video0 --set-ctrl params=value setting device controls.
If your OV5640 module supports autofocus, you can execute the following command to enable it.
3.2.2 Capture
Use v4l2-ctl --list-formats-ext --device /dev/video0
querying device video format.
Use v4l2-ctl --stream
capture UYVY format image.
--set-fmt-video=width=1280,height=720,pixelformat=
UYVY
set image format--stream-count <count> stream <count> buffers. The default is to keep streaming forever. This count does not include the number of initial skipped buffers as is passed by --stream-skip.
--stream-skip <count> skip the first <count> buffers. The default is 0.
--stream-to <file> stream to this file. The default is to discard the data. If <file> is '-', then the data is written to stdout and the --silent option is turned on automatically.
--stream-mmap <count> capture video using mmap() [VIDIOC_(D)QBUF] count: the number of buffers to allocate. The default is 3.
After executing the capture command, the stream data is written to /home/root/OV5640_UYVY_720P.yuv
.
3.3 Display Image Raw Data
3.3.1 Download and Install Raw Image Viewer
Download raw image viewer from PixelViewer | Carina Studio. And PixelViewer is an open source project based cross-platform image which viewer supports reading raw Luminance/YUV/RGB/ARGB/Bayer pixels data from file and rendering it.
3.3.2 Use PixelViewer to Open Image
Config render params by 3.2.2 v4l2-ctl capture command
4 Performance testing of OV5640 on SP7350
rootfs:Yocto
tools:v4l2-ctl
viewer: YUView
format: YUV422(UYVY)
test frame count: 300 Frame
4.1 Do not write camera data to rootfs
Test command:
Result:
Frame size/Frame rate/Format | bitrate | CPU loading | memory | FPS | drop frame |
1920*1080@30FPS UYVY | 124.416MB/s | 1.9% | 0.0 | 30 | NO |
1920*1080@15FPS UYVY | 62.208MB/s | 1.9% | 0.0 | 15 | NO |
1280*720@60FPS UYVY | 110.592MB/s | 2.0% | 0.0 | 60 | NO |
1280*720@30FPS UYVY | 55.296MB/s | 1.9% | 0.0 | 30 | NO |
1280*720@15FPS UYVY | 27.648MB/s | 2.0% | 0.0 | 15 | NO |
640*480@60FPS UYVY | 36.864MB/s | 1.9% | 0.0 | 60 | NO |
640*480@30FPS UYVY | 18.432MB/s | 1.9% | 0.0 | 30 | NO |
640*480@15FPS UYVY | 9.216MB/s | 1.9% | 0.0 | 15 | NO |
4.2 Write camera data to rootfs
Test command:
Result:
Frame size/Frame rate/Format | bitrate | CPU loading | memory | FPS | Drop frame | Video |
1920*1080@30FPS UYVY | 124.416MB/s | 32.7% | 0.0 | 30 | NO | normal |
1920*1080@15FPS UYVY | 62.208MB/s | 17.0% | 0.0 | 15 | NO | normal |
1280*720@60FPS UYVY | 110.592MB/s | 30.2% | 0.0 | 60 | NO | video is dark. |
1280*720@30FPS UYVY | 55.296MB/s | 15.1% | 0.0 | 30 | NO | normal |
1280*720@15FPS UYVY | 27.648MB/s | 7.5% | 0.0 | 15 | NO | normal |
640*480@60FPS UYVY | 36.864MB/s | 11.3% | 0.0 | 60 | NO | video is pinkish |
640*480@30FPS UYVY | 18.432MB/s | 5.7% | 0.0 | 30 | NO | normal |
640*480@15FPS UYVY | 9.216MB/s | 2.6% | 0.0 | 15 | NO | normal |