1.Freescale平台的Android摄像头移植参考
http://blog.sina.com.cn/s/blog_54aa47930102vc6m.html
2.设置Androidfacing front camera 和facingback camera
(修改处见下文红色字体部分,已测试OK。android录像需要)
属性设置/freescaleandroid5.1/device/fsl/sabresd_6dq/init.i.MX6Q.rc
#set back camera.
setpropback_camera_name max9286_mipi # setprop back_camera_nameov5640_mipi
#set front camera.
setpropfront_camera_name ovmax9286_mipi # setprop front_camera_nameuvc,csi,ov5642_camera,ov5640_camera
此处设置的name必须参考drivers/media/platform/mxc/capture/max9286_mipi.c文件中
staticint ioctl_g_chip_ident(struct v4l2_int_device *s, int *id)
{
((structv4l2_dbg_chip_ident *)id)->match.type =
V4L2_CHIP_MATCH_I2C_DRIVER;
strcpy(((structv4l2_dbg_chip_ident *)id)->match.name,
"ovmax9286_mipi_deseiralizer");
return0;
}
即必须为"ovmax9286_mipi_deseiralizer"的子串。
HAL层源码位于/freescaleandroid5.1/hardware/imx/mx6/libcamera2
相关代码讲解
CameraModule.cpp
intcamera_get_number_of_cameras()
此函数主要用于获取CameraInfo信息
intGetDevPath(const char *pCameraName,
char *pCameraDevPath,
unsignedint pathLen)
此函数是获取CameraInfo信息的主要实现方法,主要是匹配name和devpath
本次修改的主要地方便在此:
//sprintf(dev_node,"/dev/%s", dir_entry->d_name);
if(strstr(pCameraName, "max9286_mipi")) // added
strcpy(dev_node,"/dev/video0"); // added
if(strstr(pCameraName, "ovmax9286_mipi")) // added
strcpy(dev_node,"/dev/video1"); // added
源码是采用遍历的方式去查找可用的video,如果找到一个可用的便就不在继续了。所以我们的问题就在此,无论是前还是后摄像头,都只会打开video0;所以此处我就强行指定了属性为“max9286_mipi”时,对应video0;属性为"ovmax9286_mipi"时,对应video1;
DeviceAdapter.cpp
DeviceAdapter::Create(constCameraInfo& info)
根据setprop匹配不同的文件,根据我们的实际情况,我并没有单独写出MAX9286的配置文件,而是使用通用的ovdevice配置,此文件主要是初始化数据格式及相应转换。
status_tDeviceAdapter::initialize(const CameraInfo& info)
设备初始化
sudocp out/target/product/sabresd_6dq/system/lib/hw/camera.imx6.so /media/XXX/system/lib/hw/
更新ramdisk.img初始化启动
mkimage-A arm -O linux -T ramdisk -C none -a 0x1080080 -n "Android RootFilesystem" -d out/target/product/sabresd_6dq/ramdisk.img /media/XXX/boot/uramdisk.img