Android下的摄像头驱动开发

时间:2022-11-24 17:26:15

这几天拿到一个MINI210开发板,于是尝试着把ov7670移植到开发板上.仔细的观察了一下友善给的驱动发现友善提供了ov9650的驱动,因为ov7670和ov9650的驱动比较类似.于是想在ov9650的基础上改动一下. 但是进入/opt/FriendlyARM/mini210/android/linux-2.6.35.7-android/drivers/media/video目录没有发现跟ov9650相关的源文件.看了一下Makefile 文件才知道友善竟然没有提供ov9650的源码(鄙视一下友善).

那只好自己动手了:

1.在”/opt/FriendlyARM/mini210/android/linux-2.6.35.7-android/drivers/media/video”目录下增加两个文件”fpov7670.c”和”fpov7670.h”.

2.在”/opt/FriendlyARM/mini210/android/linux-2.6.35.7-android/drivers/media/video”目录下找到”Makefile”这个文件.增加一行

12 “obj-$(CONFIG_VIDEO_FPOV7670)     += fpov7670.o”.

3.在”/opt/FriendlyARM/mini210/android/linux-2.6.35.7-android/drivers/media/video”目录下找到”Kconfig”

增加下面5行

123456 config VIDEO_FPOV7670 tristate "FPOV7670 Camera Sensor" depends on I2C && VIDEO_V4L2 ---help--- This driver supports FPOV7670 SoC camera module

4.最重要的是修改代码了.参照”s5k4ba.c”和”s5k4ba.h” 把”fpov7670.c”和”fpov7670.h”修改了.主要吧IIC配置修改即可.然后找到/opt/FriendlyARM/mini210/android/linux-2.6.35.7-android/arch/arm/mach-s5pv210/mach-mini210.c,加入fpov7670的配置.

01020304050607080910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 #ifdef CONFIG_VIDEO_FPOV7670  static int ov7670_power_en(int onoff) { printk("ov7670_power_en: power %s\n", onoff ? "ON" "Off"); return 0; }  static struct fpov7670_platform_data ov7670_plat = { .default_width = 640, .default_height = 480, .pixelformat = V4L2_PIX_FMT_YUYV, .freq = 40000000, .is_mipi = 0, }; static struct i2c_board_info  ov7670_i2c_info = { I2C_BOARD_INFO("FPOV7670", (0x42>>1)), .platform_data = &ov7670_plat, };  static struct s3c_platform_camera ov7670 = { .id        = CAMERA_PAR_A, .type        = CAM_TYPE_ITU, .fmt        = ITU_601_YCBCR422_8BIT, .order422    = CAM_ORDER422_8BIT_CBYCRY, .i2c_busnum    = 0, .info        = &ov7670_i2c_info, .pixelformat    = V4L2_PIX_FMT_YUYV, .srclk_name    = "mout_mpll", /* .srclk_name    = "xusbxti", */ .clk_name    = "sclk_cam1", .clk_rate    = 40000000, .line_length    = 640, .width        = 640, .height        = 480, .window        = { .left    = 0, .top    = 0, .width    = 640, .height    = 480, }, /* Polarity */ .inv_pclk    = 1, .inv_vsync    = 1, .inv_href    = 0, .inv_hsync    = 0,  .initialized    = 0, .cam_power    = ov7670_power_en, };  #endif

在驱动列表中加入ov7670驱动

0102030405060708091011121314151617181920212223242526272829303132333435363738 /* Interface setting */ static struct s3c_platform_fimc fimc_plat_lsi = { .srclk_name    = "mout_mpll", .clk_name    = "sclk_fimc", .lclk_name    = "sclk_fimc_lclk", .clk_rate    = 166750000, #if defined(CONFIG_VIDEO_S5K4EA) .default_cam    = CAMERA_CSI_C, #else #ifdef CAM_ITU_CH_A .default_cam    = CAMERA_PAR_A, #else .default_cam    = CAMERA_PAR_B, #endif #endif .camera        = { #ifdef CONFIG_VIDEO_S5K4ECGX &s5k4ecgx, #endif #ifdef CONFIG_VIDEO_S5KA3DFX &s5ka3dfx, #endif #ifdef CONFIG_VIDEO_S5K4BA &s5k4ba, #endif #ifdef CONFIG_VIDEO_S5K4EA &s5k4ea, #endif #ifdef CONFIG_VIDEO_OV9650 &ov9650, #endif #ifdef CONFIG_VIDEO_FPOV7670//新加入 &ov7670,//新加入 #endif //新加入 }, .hw_ver        = 0x43, };

5.在”/opt/FriendlyARM/mini210/android/linux-2.6.35.7-android”目录下 输入”make menuconfig” 回车,选择FPOV7670之后,make之.成功后把zImage烧入开发板.打开摄像头测试,出图了.

注意,因为我们FPOV7670的驱动是用在指纹采集上并不需要”自动曝光””调节白平衡”等功能.如果是用在拍照上,就需要加入上述功能.