Android camera sensor driver port

本文介绍了一款基于高通7627平台的camera驱动移植过程,包括内核驱动和用户空间驱动的具体步骤。从添加i2c设备到配置sensor参数,再到HAL层配置,提供了详尽的操作指南。

原文:http://hi.baidu.com/gcmao/blog/item/a4da224dfff68518b2de0535.html

 

近来刚接手项目的camera驱动,除了查看平台文档和sensor的到规格书,也在网上查看了高手们到经验。本人对camera还是比较陌生的,奈何公司无人过问,只好按部就班的来吧!

和大部分驱动的调试相差无几,还是在前人的工作基础上进行的。项目采用高通7627平台,sensor采用ov7675。

 

驱动移植

 

1.内核驱动移植

sensor信息记录在android/kernel/arch/arm/mach-msm/board-msm7x27.c文件中,board file中要更改的信息如下:

(1)为sensor添加相应的i2c驱动,加到i2c_devices[]数组中,这里是使用i2c总线的设备数组。机器启动时会注册相应设备。

 

static struct i2c_board_info i2c_devices[] = {

#ifdef CONFIG_MT9D112

{

I2C_BOARD_INFO("mt9d112", 0x60 >> 1),

},

#endif

......}

 

 

 

(2)msm_camera_sensor_info包含了设备启动信息。添加一个新的sensor驱动,就必须填写这样的一个结构体,包括sensor所使用的GPIO口。结构体中的sensor name将被用作driver id。

static struct msm_camera_sensor_info msm_camera_sensor_mt9d112_data = {

.sensor_name = "mt9d112", //将被用作driver id

.sensor_reset = 1, //sensor reset GPIO

.sensor_pwd = 20, //电源开关

.vcm_pwd = 0, //用作自动对焦。0表示不使用。

.vcm_enable = 0,

.pdata = &msm_camera_device_data,

.flash_data = &flash_mt9d112

};

另外还要把sensor注册成platform_device。

(3)修改i2c地址。gpio表修改,使用8线输入。修改camera_on_gpio_table[]和camera_off_gpio_table[]两个数组。由于平台采用的是双核架构,在功能上有所区分,个别GPIO需要在modem那边配置成app这边控制。

(4)创建自己的驱动文件。使用YUV sensor则查看android/kernel/drivers/media/video/msm/mt9d112.c,若使用bayer sensor则查看android/kernel/drivers/media/video/msm/mt9t013.c。这里不作详细说明。

(5)完成上述工作后,修改Kconfig和Makefile文件。

 

2.用户空间驱动

(1)用户空间驱动主要在vendor目录下,把自己的sensor加到sensors[]中,以便启动自己的senor。

static sensor_proc_start_t sensors[] = {

 

SENSORS_PROCCESS_START(mt9d112),

......};

(2)修改sensor相关参数:例如sensor类型,sensor输出格式,输出图像大小等等。/android/vendor/qcom-proprietary/mm-camera/targets/tgtcommon/sensor/mt9d112/mt9d112.c,这些参数必须得到正确的修改,否则sensor将启动不了。

(3)mt9d112_process_start函数中为VFE具体配置一些参数。

(4)mt9d112_video_config函数做了一些IO configuration调研,和内核mt9d112_set_sensor_mode是相关联的。通过IOCTL调用,相应的寄存器值会通过i2c总线写入sensor。

写入sensor寄存器的值(mt9d112_set_sensor_mode)必须和vfe_camif配置的值(mt9d112_video_config)相匹配,如果使用YUVsensor,需将每行像素值定义为预览模式下 的两倍。

其他重要的部分还包括HAL层的配置android/hardware/msm7k/libcamera/QualcommCameraHardware.cpp,

android/packages/apps/Camera/res/layout/camera.xml。

Cherry Pi V3S 是一款基于全志 V3S 芯片的小型嵌入式开发板,支持多种外设接口,包括 GPIO 和 MIPI 摄像头接口。以下将详细介绍如何在 Cherry Pi V3S 上配置 GPIO 驱动程序以及设置 MIPI 摄像头。 ### 配置 GPIO 驱动 GPIO(General Purpose Input/Output)是通用输入输出引脚,可以通过软件控制高低电平或读取外部信号。 #### 1. 内核设备树配置 在 Linux 系统中,GPIO 的配置通常需要修改设备树(Device Tree)。以全志 V3S 平台为例,设备树文件通常位于 `arch/arm/boot/dts/sun8i-v3s-*.dts` 中。 例如,启用某个 GPIO 引脚作为输出: ```dts gpio_demo: gpio-demo { compatible = "gpio-leds"; pinctrl-names = "default"; pinctrl-0 = <&pioPG15>; status = "okay"; }; ``` 其中 `pioPG15` 表示 PG15 引脚,可以在内核源码的 `include/dt-bindings/pinctrl/sun8i-v3s.h` 中找到相关定义[^1]。 #### 2. 用户空间操作 GPIO 在用户空间可以通过 `/sys/class/gpio` 接口访问 GPIO: ```bash echo 239 > /sys/class/gpio/export echo out > /sys/class/gpio/gpio239/direction echo 1 > /sys/class/gpio/gpio239/value ``` 这里的 `239` 是 PG15 对应的 GPIO 编号(计算方式为 `Gx * 32 + y`,PG15 为 `(6)*32 + 15 = 207`,具体编号可能因平台而异)。 ### 配置 MIPI 摄像头 MIPI CSI(Camera Serial Interface)是一种高速摄像头接口,适用于图像传感器与主控之间的连接。 #### 1. 设备树配置 MIPI 摄像头 假设使用 OV5640 摄像头模块,其 MIPI 接口需在设备树中声明: ```dts mipi_csi: mipi-csi@1a4 { compatible = "allwinner,sun8i-v3s-mipi-csi"; reg = <0x1a4 0x100>; interrupts = <47>; status = "okay"; port { #address-cells = <1>; #size-cells = <0>; ov5640_mipi: endpoint@0 { reg = <0>; remote-endpoint = <&camera_sensor_mipi>; }; }; }; ov5640: camera-sensor@3c { compatible = "ovti,ov5640"; reg = <0x3c>; clocks = <&ccu CLK_MIPI>; clock-names = "xclk"; pinctrl-names = "default"; pinctrl-0 = <&csi_mclk_pb2>; powerdown-gpios = <&pio PD14 GPIO_ACTIVE_LOW>; reset-gpios = <&pio PE11 GPIO_ACTIVE_HIGH>; status = "okay"; port { #address-cells = <1>; #size-cells = <0>; camera_sensor_mipi: endpoint@0 { reg = <0>; remote-endpoint = <&ov5640_mipi>; }; }; }; ``` 以上配置启用了 MIPI CSI 控制器,并连接了 OV5640 摄像头传感器。 #### 2. 加载驱动和测试摄像头 确保内核已编译并加载如下模块: ```bash modprobe v4l2_common modprobe sun8i_v3s_mipi_csi modprobe ov5640 ``` 使用 `v4l2-ctl` 工具查看设备节点: ```bash v4l2-ctl --list-devices ``` 如果成功识别到 `/dev/video0`,则可使用 `ffmpeg` 或 `mplayer` 进行测试: ```bash ffmpeg -f v4l2 -i /dev/video0 output.mp4 ``` 或 ```bash mplayer tv://device=/dev/video0 ``` ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值