Camera Sensor

本文分享了在高通Android平台上调试Samsung 3MYUV FF sensor的经验。从准备工作开始,介绍了如何获取sensor spec及寄存器设定文件。接着阐述了调试环境的搭建过程,并详细记录了调试步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.youkuaiyun.com/tony_zouzou/article/details/7255646

 之前一段时间有幸在高通android平台上调试2款camera sensor,一款是OV的5M YUV sensor,支持jpeg out,同时也支持AF,调试比较比较简单,因为别的项目已经在使用了,只是把相关的驱动移植过来就好;另一款是Samsung的一款比较新的3M YUV FF sensor,在最新项目中要使用的,本文以调试该sensor为例,从底层驱动的角度分享一下高通android平台下调试camera的经验,而对于高通平台camera部分的架构以及原理不做过多的介绍。
一、准备工作
从项目中看,在硬件(板子)ready前,软件部分是要准备好的。单独从底层驱动来看,软件部分可以分为2个部分:一个是高通平台相关的再一个就是sensor部分的,通常的做法就是把sensor相关的设定移植到高通平台的框架之中。这样就需要先拿到sensor的spec以及厂商提供的sensor register setting fileSpec的用途是清楚高通平台和sensor通讯(读写寄存器)的时序以及相关参数设定;而厂商提供的setting file则是在使用camera各个功能(preview、snapshot...)时候需要写入到sensor中的.
本项目中,高通平台为MSM7X27,camera为Samsung 5CA。从spec中知道,该sensor的I2C ID为0x78,I2C的通信采用双字节方式,另外也弄清楚了读写sensor寄存器的规则,从调试角度看这些基本上够用了。另外厂商提供的setting file,其实就是寄存器列表,告诉我们再什么时候将哪些寄存器写入什么值,通常是一个寄存器地址再加上一个寄存器的值,不过Samsung提供的是PC上调试使用的文本,需要自己转换成c语言中的二维数组。从文件中看,寄存器数据可以分为几个部分:初始化、IQ设定(tuning相关)、clk设定、preview设定、snapshot设定,基本上有这几个就够了,其他的比如调节亮度啦、设定特殊效果啦、设置白平衡啦等等都可以自己通过spec来完成。
Sensor部分的东西搞定后,接下来就是修改高通camera部分的驱动了,主要有:
Kernal部分:
1、检查Sensor的电源配置,并修改软件中的设定。本项目中使用2.8/1.8/1.5共3个电源。
2、检查并修改sensor reset设置。注意reset的时间设定,务必和spec中一致,否则会导致sensor无法工作。
3、修改I2C驱动,使用双字节读写的接口,并完成读取sensor ID的接口。这个用来检验I2C通讯是否OK
4、导入寄存器设定,分别在初始化、preview、snapshot等几个部分写入对应的寄存器值。
注意:reset以及写寄存器部分一定要按照spec的规定加入一些delay,否则会导致sensor工作异常

User空间部分:
这个部分主要是根据硬件的规格来配置VFE,如sensor输出数据的格式,接口方式、分辨率大小、同步信号模式等,比较简单,但一定要检查仔细,任何一个地方不对都会导致调试失败。
到这里为止,软件部分的准备已经告一段落了。

二、调试环境准备(板子出来了,但sensor sample还没到位)
首先,测试点的准备。
调试前就需要想好,如果sensor无法工作,要怎么去debug,这就需要去测量一些信号,比如power、reset、I2C、M/P CLK、H/V同步信号、数据信号等,要确保这些信号都可以测量到。
其次要选择软件的调试环境,这里选择在ADB环境中执行高通的mm-qcamera-test程序来调试,相关的trace都可以打印出来。
这样就万事俱备,只欠sensor了。

三、调试(sensor终于拿到了)
将sensor接到板子上,开机后,ADB中运行调试程序,preview画面并没有出来,失败,有点小失望,本来觉得可以一气呵成的,但毕竟这是一个全新的sensor,任何一个地方没有想到位做到位都会导致失败。那就找原因吧。
1、首先从trace得知,I2C已经读到了sensor的ID:0x05CA,这可以说明I2C通讯是没有问题的
2、接着检查Sensor的电源配置,测量了供给sensor的3个电源,都是OK的。
3、测量MCLK,这个是提供给sensor使用的,正常(24MHZ)
4、测量PCLK,这个是sensor输出的,正常(58MHZ,高通上限为96MHZ),和寄存器中配置的一致。
5、测量H/V同步信号,这个是sensor输出的,正常。和FPS和分辨率一致。
6、测量数据信号,这个是sensor输出的,正常。(数据信号,示波器上可以看到)
这样看来,sensor已经在正常工作了,但为何preview画面没有出来呢?继续检查高通这边的设定。
从trace看,高通的VFE已经reset并且start了,但一直接没有输出preview数据,这就奇怪了,sensor明明已经输出了,为什么VFE接收后并没有把数据吐出来呢,难道这个sensor输出的数据VFE无法识别?为了验证这个问题,我在另一块板子上测量了OV sensor输出数据的波形,主要是M/P clk、H/V同步信号,然后再拿来对比,不过并没有发现异常,只是H/V同步信号有所不同,主要高低的占空比不太一致,会不会是这样信号的问题呢?为了进一步验证,我同时测量了H/V 信号和数据信号,这时发现OV sensor输出的数据信号是包在V帧同步信号的低电平中;而Samsung 5CA输出的数据信号是包在V帧同步信号的高电平中,会不会是因为V信号极性设置不对导致VFE没有读取到sensor输出的数据呢?重新检查了一下高通VFE的设定,果然有一个参数是用来设定V信号极性的,这个参数默认是Active Low的,我这边并没有去修改它。接着把这个参数修改为Active High,重新build、download后,开机运行,Ok了,preview画面可以正常显示了。到这里为止sensor的硬件调试可以算作完成了,后续的其他功能也可以慢慢完善了。


---------------------------------------------------------------------------

今后会调一些sensor,故转载过来学习。近来刚接手项目的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),//这是7bit形式,采用硬件I2C,把真实的读或写地址右移一位即可},#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层的配置vendor/qcom/android-open/libcamera2\QualcommCameraHardware.cpp, android\packages\apps\Camera\res\layout\camera.xml。

http://blog.youkuaiyun.com/eqwewr/article/details/7935729

----------------------------------------------------------------------------------------------

  今后会调一些sensor,故转载过来学习。

       近来刚接手项目的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),//这是7bit形式,采用硬件I2C,把真实的读或写地址右移一位即可},

#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层的配置vendor/qcom/android-open/libcamera2\QualcommCameraHardware.cpp, android\packages\apps\Camera\res\layout\camera.xml。

http://blog.youkuaiyun.com/luobin1984/article/details/8098262

<think>好的,用户想了解CarSim中Camera Sensor的配置和使用方法。首先,我需要回忆一下CarSim的相关文档和功能模块。CarSim主要用于车辆动力学仿真,传感器配置可能在车辆模型或者测试设置里。 用户提到的Camera Sensor,可能涉及视觉传感器的参数设置,比如摄像头的位置、朝向、视场角等。配置步骤应该包括在CarSim界面中找到传感器模块,添加摄像头,调整参数,然后进行仿真测试。 另外,用户提供的引用内容中有关于Stereo camera、Fisheye camera等,这可能意味着CarSim支持不同类型的摄像头模型,需要确认是否如此,并说明如何选择不同的摄像头类型。 还要考虑数据输出的配置,比如图像的分辨率、帧率,以及如何将摄像头数据导出或与其他系统(如MATLAB/Simulink)集成。这部分可能需要引用具体的菜单路径或参数设置界面。 可能还需要提到实际应用中的例子,比如ADAS系统的测试,如何利用摄像头数据进行车道线检测或障碍物识别。这里可以结合引用中的Lane marker sensor和Object sensor,说明摄像头与其他传感器的协同工作。 用户的问题可能涉及具体操作步骤,所以回答需要分步骤说明,并确保术语准确,比如“Vehicle Dynamics > Sensor Configuration”这样的路径是否真实存在,可能需要查阅CarSim的官方文档结构来确认。 最后,生成的相关问题要围绕摄像头配置的扩展应用、参数优化、多传感器融合等,确保覆盖用户可能感兴趣的后续方向。</think>### CarSim摄像头传感器配置与使用方法 CarSim中摄像头传感器的配置涉及参数设置、安装位置调整和仿真数据输出三个主要步骤: 1. **传感器类型选择** - 在`Vehicle Dynamics > Sensor Configuration`菜单中创建新传感器 - 支持单目摄像头($f=4.3\ mm$)、鱼眼摄像头($FOV=180°$)和立体视觉(基线$b=0.3\ m$)等类型[^1] 2. **安装参数设置** ```text Position (X,Y,Z): [1.2, 0, 0.6] // 单位:米 Orientation (yaw,pitch,roll): [0°, -5°, 0°] Resolution: 1920x1080 @ 30fps FOV: 水平60°/垂直45° 噪声模型:高斯噪声(σ=0.05) ``` 3. **数据输出配置** - 通过`Output Channels`设置捕获以下数据流: - 原始RGB图像(BMP/PNG格式) - 深度图(需启用深度传感器) - 目标检测元数据(XML/JSON格式) - 支持与MATLAB/Simulink的实时数据接口(使用UDP/TCP协议) 4. **典型应用场景** ```python # 示例:ADAS车道保持测试 import carsim_api camera = carsim_api.Sensor('front_cam') while sim_running: frame = camera.get_frame() lane_detection(frame) steering_control() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值