Camera interface
From ArmadeusWiki
On this page you will find useful informations on how to use the Camera/CMOS Sensor Interface (CSI/CSI2) of the i.MX chip found on your APF and OPOS93Dev board. Currently only the APF27, APF6 & OPOS93 are supported.
Hardware
APF27
- All the signals of the i.MX27 CSI interface can be found on the J9 connector of the APF27Dev development board.
- You should connect an external camera/sensor compatible with the CSI interface (8bits data bus) to see something ;-). Here are the tested sensor models:
- All these sensors are controllable through an I2C interface. The one on J8 connector of APF27Dev can for example be used.
APF6
- APF6Dev boards have a wandcam (OV5640) compatible connector (near the PCIexpress one).
- MIPI bus is used on APF6Dev
OPOS93
- The OPOS93DEV board has a 15-pin Raspberry Pi Camera compatible connector (located below the OPOS93 SoC).
- A 2-lane MIPI CSI-2 bus is used.
- Tested with the OmniVision OV5647 sensor.
Driver
- From now we consider that you have a supported camera module plugged on your development board
- CSI interface can be driven through the V4L2 (Video For Linux) standard interface as soon as CSI/MIPI driver is loaded:
APF27 | APF6 (kernel 3.19+) |
---|---|
# modprobe mx27_camera
# modprobe ov96xx |
# modprobe -a mx6-camera mipi-csi2 ov5640-mipi |
- On OPOS93, the driver is automatically loaded when the camera is connected.
- Now it's up to you to configure your camera with the tools/API the camera driver is offering...
Test
- We have a small SDL/V4L2 app to quickly test that your camera is working properly (you will also need a LCD interface): target/demos/camera/capture/
- it may be installed by default on your rootfs depending on your Buildroot defconfig.
- to launch it (here to have a 640x480 camera image on a LW700 TFT):
# capture --width 640 --height 480 --cam_width 640 --cam_height 480
- To trigger autofocus (APF6 with 3.19+ kernel):
# v4l2-ctl -c auto_focus_start=1
- On OPOS93DEV, the pipeline must have the same configuration on every link in the pipeline.
- Let's create a script:
# cat << EOF >> setCam.sh && chmod +x setCam.sh SOURCE=$3 FORV4L2=$4 XL=$1 YL=$2 if [[$SOURCE == ""]]; then SOURCE=SBGGR10_1X10 fi if [[$FORV4L2 == ""]]; then FORV4L2=BG10 fi if [[$XL == ""]]; then XL=640 YL=480 fi BAYER=$SOURCE/$XL\x$YL echo Setting format to $XL/x$YL in $SOURCE - $FORV4L2 media-ctl -v -V "'csidev-4ae00000.csi':0 [fmt:$BAYER field:none]" media-ctl -v -V "'csidev-4ae00000.csi':1 [fmt:$BAYER field:none]" media-ctl -v -V "'mxc_isi.0':0 [fmt:$BAYER field:none]" media-ctl -v -V "'mxc_isi.0':1 [fmt:$BAYER field:none]" media-ctl -v -V "'crossbar':0 [fmt:$BAYER field:none]" media-ctl -v -V "'crossbar':2 [fmt:$BAYER field:none]" media-ctl -v -V "'ov5647 2-0036':0 [fmt:$BAYER field:none]" media-ctl -l "'ov5647 2-0036':0 -> 'csidev-4ae00000.csi':0[1]" v4l2-ctl -d /dev/video0 --set-fmt-video=width=$XL,height=$YL,pixelformat=$FORV4L2 v4l2-ctl -d /dev/v4l-subdev3 -c exposure=855 v4l2-ctl -d /dev/v4l-subdev3 -c gain_automatic=1 v4l2-ctl -d /dev/v4l-subdev3 -c auto_exposure=0 v4l2-ctl -d /dev/v4l-subdev3 -c white_balance_automatic=1 > EOF
- Run your script (if you put some arguments, remember the entire pipeline must have the same configuration) and check that all pads have the same format.
# .setCam.sh # media-ctl -p
- Try streaming to the framebuffer.
# gst-launch-1.0 --no-position v4l2src ! 'video/x-bayer,format=bggr10le,width=640,height=480,bpp=10,framerate=(fraction)10/1' ! bayer2rgbneon reduce-bpp=t show-fps=t silent=t ! fbdevsink device=/dev/fb0