分类: 嵌入式
2011-11-26 22:02:41
友善在新的版本上闭源了多媒体相关的驱动,而我花了好多钱从友善那里买的camera不能浪费啊,所以就只好自己porting了。好久不写东西了,而且在libreoffice里排好版贴上来就乱了,凑合着看吧。
系统版本:
Kernel:2.36
Android:2.3.1
一:CMOScamera
1:Kernel部分
这部分主要基于2.28版本的代码(这个版本的代码是开源的)。要做些修改使编译通过,没有太大的改动。
主要是下面几个部分:
s3c_fimc_core.c
//staticconst struct file_operations s3c_fimc_fops
staticconst struct v4l2_file_operations s3c_fimc_fops = {
s3c_fimc3x_regs.c
s3c_fimc_set_input_address
if(frame->planes == 1)
end_y= start_y + (width * height * 2);
后面的函数自己找吧,不写文件了。
s3c_fimc_v4l2_querybuf())
b->memory= V4L2_MEMORY_MMAP;//this is set to zero in v4l2-ioctl.c
if(b->memory != V4L2_MEMORY_MMAP)
return-EINVAL;
ov9650驱动那部分要添加probe函数。去掉以前的I2C设备注册的函数。
staticint ov965x_probe(struct i2c_client *client,const struct i2c_device_id*did)
{
s3c_fimc_register_camera(&ov965x_data);
ov965x_data.client= client;
i2c_set_clientdata(client,&ov965x_data);
printk("=========ov965x_probe\n");
}
return0;
}
2:Android libcamera 部分:
主要基于google原来的Fake camera的代码和Nexus的代码修改。其实就是基于V4l2的程序,网上其他这种代码也很多(比如mjpeg-stream)。
其中要注意的是尺寸要设对。2.28代码里ov9650驱动中只用640X480部分的代码是正确的,其他尺寸的要自己对照datasheet修改。再者就是格式,目前是设成RBG,YUV格式surfacefinger那边不认,而且还要改下surfacefinger那边的代码,强制设成RGB。不过我看友善最新的代码是设成YUV的,应该还有其他的办法。
二:USBcamera:
这个要简单些。如果是买的友善的摄像头,这个摄像头UVC驱动是支持的,直接插上就能用。不过要注意,如果开机之前插的话,usbcamera的设备节点是dev/video0,cmos camera 是dev/video1。开机后查usb camera是video2,cmos camera是video0.另外还要注意设备节点的权限, 默认权限不够。还有就是在previewthread中的delay去掉,这个是fake camra用的,不去掉的话usb camera会挂掉。反正是用poll,并不需要delay。
代码过段时间整理一下会放到github上。
欢迎来信讨论6410 相关问题。hnmsky#gmail。com #换掉