MTK 平台相机bringup流程

news2024/11/15 18:04:23

97bde696f3399120ccbfd6d85ac2645d.gif

和你一起终身学习,这里是程序员Android

经典好文推荐,通过阅读本文,您将收获以下知识点:

一、Camera 框架介绍
二、Camera Bringup 需要配置的文件
三、复盘总结

一、Camera 框架介绍

Camera 的框架分为 Kernel 部分和 hal 部分,其中kernel部分主要有两块:

  • image sensor driver,负责具体型号的sensor的id检测,上电,以及在preview、capture、初始化、3A等等功能设定时的寄存器配置;

  • isp driver,通过DMA将sensor数据流上传;
    HAL层部分主要有三部分组成:

  • imageio,主要负责数据buffer上传的pipe;

  • drv,包含imgsensor和isp的hal层控制;

  • feature io,包含各种3A等性能配置;

二、Camera Bringup 需要配置的文件

(本文以hi1634q型号的前摄为例,平台是mt6789,kernel版本为5.10)

2.1、Device Config Files

修改时删除多余的 sensor driver name,只保留自己的即可;

/device/mediateksample/k6789v1_64
ProjectConfig.mk

6e087789959161aead97b3d43898d0d4.jpeg

/device/mediatek/mt6789

CameraConfig.mk
device-camera.mk

2bc508260cd948085d5d1c30c6754781.jpeg

注意:CUSTOM_HAL_IMGSENSOR 、CUSTOM_HAL_SUB_IMGSENSOR 、CUSTOM_KERNEL_IMGSENSOR 、CUSTOM_KERNEL_SUB_IMGSENSOR 这四个必须都要指定 sensor name;不能遗漏b36f420125ef8bf781a9511fb9b6d56b.jpeg

/device/mediatek/common/kernel-headers
 
kd_imgsensor.h

指定 sensor name 和 sensor model id !这里一定要check不能出错!

351faa01d36b6893106bdb319a564ed1.jpeg

2.2、Kernel Config Files
/kernel-5.10/arch/arm64/configs
 
mgk_64_k510_defconfig

修改时删除多余的 sensor driver name,只保留自己的即可;20b522a1eae31f85b728a87463fa7d15.jpeg

/kernel-5.10/drivers/misc/mediatek/imgsensor/inc
 
kd_imgsensor.h

指定 sensor name 和 sensor model id 和 device config files 那边修改一样!这里一定要check不能出错!421643b3c981fcc14d12106b99721787.jpeg

/kernel-5.10/arch/arm64/boot/dts/mediatek
 
cust_mt6789_camera.dtsi

(1)修改 cust_mt6789_camera.dtsi 中 pio 节点的各个Pin number,其中 1 对应 sensor index, 最好是将其他不相关的 sensor 定义都删除,排除干扰,提供一个干净整洁的代码!并将文件中 kd_camera_hw1 节点中的 pin 增加对应节点,rst 引脚和 mclk 引脚需要根据原理图上的信息去 map 查找,具体对应的是哪个 gpio引脚,pinctrl也只需要保留对应节点即可(必须从0开始递增,否则遍历会出错!),如下图红圈部分:eb781e8755c308bc1517036d1d7b8655.jpeg05ecb1dd30b26559209b6c0744328b60.jpeg1d11a01ae9404821176e510ecdbb85c4.jpeg

(2) 在 cust_mt6789_camera.dtsi 文件中 kd_camera_hw1 节点中将采用 PMIC 供电方式的 pin 增加如下子节点,再加一个 cust-sensor = “sensor_mipi_raw”,或者是 cam1_enable_sensor = “sensor_mipi_raw ”(方便匹配指定sensor):3a5193825285e195430b217abdb89a93.jpeg

(3)在对应的 i2c 总线中定义 camera 设备,i2c0 到 i2c8,具体是哪一条 i2c 路线需要到原理图查找,同时设备在 i2c 线上的地址是 sensor 的物理地址的高七位的值(实际过程中此地址只需要不和 i2c 路线的其它设备地址冲突即可,但是为了便于查找,尽量使用高七位的地址),同时删除无关的设备配置,包括其它的camera sensor、eeprom 相关、点亮 sensor 的原理图上不存在的引脚配置。fd70cbc08ed380973b683437e95234d2.jpeg

/kernel-5.10/drivers/misc/mediatek/imgsensor/src/common/v1_1
 
hi1634q_mipi_raw

此目录下添加驱动文件,仿照类似型号 sensor 修改成自己的,然后改成自己的名字,删除 mipi_raw 下的eeprom 以及 makefile 中的 eeprom 相关,排除干扰项。

到 sensor.c 和 sensor.h 文件修改具体内容,主要包括 imgsensor_info、init_setting、preview_setting 等 mode setting 中的数据、winsize_info 数据修改,最后修改 driver 的入口函数 XXX_MIPI_RAW_SensorInit(),一般在 sensor.c 文件最下面。9520656ef51f07447ff63ba846db65df.jpeg9a15a87d2a22ab75abdcc8502c91a0e3.jpegc1dcfcb189b73a3b7499611e4fd72ff0.jpeg

imgsensor_sensor_list.c
imgsensor_sensor_list.h

imgsensor_sensor_list.h 中添加相应的 sensor 的 init(入口函数) 的函数;b046e20066051cc2e5ea8c70fc03ed69.jpeg

imgsensor_sensor_list.c 中添加相应的 sensor 的id、name、init(入口函数) ,注意顺序和 vendor 层相对应,此处需要注意的是最好把位置放在你对应sensor idx 的位置上,这样就不会有匹配出错的情况出现。6cb903ba1157e4929abb4cfc8202762a.jpeg

imgsensor_pwr_seq.c
此文件中修改引脚电压值以及上电延时等信息,注意 sensor driver name 的大小写,同时严格按照 sensor data 上电模块的说明,添加延时。需要注意的是 AVDD, DVDD, DOVDD 的电压需要确认是否正确,并且在上完前两路电之后第三路电最好加个 1ms 的延迟,不然可能会出现意料之外的问题;0c2aff88c6b98a75dbf0a93c42d7d788.jpeg

/kernel-5.10/drivers/misc/mediatek/imgsensor/src/common/v1_1/camera_hw/
 
imgsensor_cfg_table.c

此处修改硬件配置信息,主要是三路电的配置,是 regulator 还是 gpio类型的,如果 sensor 原理图有其它引脚,也可以继续添加,同时删除原理图不存在的引脚,例如 pdn 引脚。7b27754a8729526a79c193d959e45d4e.jpeg

2.3、Vender Config Files
/vendor/mediatek/proprietary/custom/common/hal/imgsensor_src
 
sensorlist.cpp

Note: sensorlist.cpp 中的 SensorList[] 与 imgsensor_sensor_list.c 中的 gimgsensor_sensor_list 的 sensor 的顺序必须一致,否则 user space 和 kernel space 在通过 ioctl 传递命令 id 时会对应错误。d8df8336f641572401286202b569ec8c.jpeg

/vendor/mediatek/proprietary/custom/mt6789/hal/imgsensor_src
 
cfg_setting_imgsensor.cpp

注意:kernel 底层的MCLK_0/1/2 ----> 分别对应HAL层的 MCLK_1/2/3f6fcd6d7fa728f3efe5226e97e9ce3b9.jpeg

Tunning文件
Note:

(1)Tuning Parameter 与 Metadata 可以采用下图作为参考,参考复制对应文件夹并将其中所有的Sensor Name、Sensor Id等更改成当前需要porting的sensor的对应名称,一共三处。此处需要注意:参考的sensor tunning 配置必须对应上,例如 前摄只能参考和 sub 相关的文件配置,否则会出现踩内存现象;f0e597961d1175aab018ed175c43e99c.jpeg

(2) 修改过程中注意 sensor name 和 driver 驱动的大小写问题即可,具体的 mediatek 信息不会影响点亮阶段,但会对后续的出图细节有影响,需要点亮之后再进行调试

(3)Kernel 版本号可以根据当前 Project 的 ProjectConfig.mk 中的 LINUX_KERNEL_VERSION 得知。

Driver 是 v1_1 或者其他版本可以通过 Platform 下的 Makefile 中的 COMMON_VERSION 得知。

/vendor/mediatek/proprietary/custom/mt6789/hal/imgsensor/ver1/

478f54543327485d0377fcdedacebeac.jpeg

0cccd267cb1a2c01247d6abd8f44931d.jpeg

/vendor/mediatek/proprietary/custom/mt6789/hal/imgsensor_metadata/

a6241b24a4c876c885918d9e6445ed53.jpegeba3fac419247569c94859afccff2790.jpeg

/vendor/mediatek/proprietary/custom/common/hal/imgsensor_metadata/sensor/

b603e04219d7d393c8a3c44ed8e5ad2d.jpeg

/vendor/mediatek/proprietary/scripts/soong/mtkcam/
 
mtkcamvars.go

322039a5ac92099a74a3a11a871c69ef.jpeg

/vendor/mediatek/proprietary/tools/dct/dws/mt6789
 
k6789v1_64.dws

dws(设备树相关)check gpio,一般不需要改动。6eac5c16572c80cd11a03a448f3089d0.jpeg

/vendor/mediatek/proprietary/hardware/mtkcam/include/mtkcam/drv/
 
IHalSensor.h

检查一下信息是否和 kernel 层信息相同或者是否需要添加 sensor ,一般不需要改动。9350e39d854961bf1879546231db4ccc.jpeg

三、复盘总结

通过上面的代码流程,可以知道上开机时,camera模块先会将所有的MCLK打开,然后对依次对对应的sensor进行上电,读取ID(判断I2C是否正常通讯)。这部分调试过程中遇到的问题总结如下:

3.1、注意事项

kernel 重要的是 module 的驱动代码和设备树添加,驱动代码的改动需要根据模组厂给的配置文档,一般里面包含了驱动的所有信息,包括一些 dts 配置、init setting、i2c_addr、分辨率(注意屏比例)、上电时序等一些重要信息
device 中 config.mk 文件修改后,要将 out 相关所有目录删除,再全部编译,否则会导致踩内存的橙色界面
vender 参考的 sensor tunning 配置必须对应上,例如 前摄只能参考和 sub 相关的文件配置,否则会出现踩内存现象
参考 sensor 进行复制替换时注意大小写的问题!!!
注意排除干扰项、无关项,单独点亮一颗 sensor 时,先到 config 文件删除其余无关的 sensor 驱动,eeprom 相关的也删除,camera 设备原理图没有的引脚也要到 dtsi 和上电相关的文件 cfg_table.c 中删除。

3.2、ID读取不到,I2C不通

检查上电时序,3项电压(AVDD/DVDD/IOVDD)是否正确;
检查 kernerl 层的 imgsensor_sensor_list.c 和 vendor 层的 sensorlist.cpp 中的位置是否一致。
I2C地址及通道设置是否正确;
确认 i2c 可以正常通信,通过万用表看看有无电流,万用表也可以用来测量配置的 regulator 是否正确,测量电压时首先屏蔽 imgsensor_hw.c 中的下电代码,最后编译完成,通过 i2c write/read 工具读写寄存器,将对应 regulator 的所有电源全部打开,之后测量电压。
检查 cfg_setting_imgsensor.cpp 中 MCLK 和 HW 链接配置是否正确;
如果还是无法读到 sensor id,先熟悉以下驱动代码以及上电代码,通过打印 log 的方式检查具体执行到哪个模块:camera 的入口在 imgsensor.c 最下方的 init 函数,通过它绑定一个 platform 的驱动,我们在到驱动对应的 probe 函数下看它如何执行,主要包括设备的匹配注册,imgsensor_hw_init,imgsensor_proc_init,sensorlist_init,其中上电部分的代码通过 imgsensor_hw_init 到达 imgsensor_hw.c 文件,获取硬件信息配置之后分别到平台定义的标准化接口 mclk.c、regulator.c、gpio.c 中执行标准化接口,这样一路打印 log,大概率会发现上电过程哪里出现问题,根据问题去检查对应模块。
读到 sensor id 之后,如果相机无法预览,需要到 imgsensor.c 以及驱动代码中检查 open 之后的执行情况,check 驱动中的 init_setting 、mode setting 、imgsensor_winsize_info 是否正确。

3.3、Camera 启动时间过长

检查 Sensor 上电时序要求的延时,是否有偏长的情况;
去掉多余的 I2C 地址,因为大部分驱动会多添加一些地址;
OTP的加载调整到每次开机时第一次打开加载,之后不加载;
sensorInit如果时间过长,可以调节I2C speed(400->1000);

原文链接:https://blog.csdn.net/Sugar_wolf/article/details/127512088

【腾讯文档】Camera学习知识库
https://docs.qq.com/doc/DSWZ6dUlNemtUWndv

友情推荐:

Android 开发干货集锦

至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

a4a05e2a87e9e4ecd29c3a9c1aacfd3b.jpeg

点击阅读原文,为大佬点赞!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/655927.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

需求分析引言:架构漫谈(一)

本文主要对架构的概念做一些介绍,并引申出需求分析的重要性。 后续准备做一个系列,定期介绍我工作以来的一些需求实现的案例。 注:因为架构的内容比较庞大,里面的每个点,都可以扩展成一系列的文章, 因此&am…

基于Java精品酒销售管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

PoseiSwap 即将在 6 月 18 日开启 IDO,白名单申请者超 14000 人

根据PoseiSwap官方公告,PoseiSwap正式确定了将在6月18日0:00(UTC)正式在Bounce上开启IDO活动,目前本次活动的白名单申请用户已经突破了14000人。除了Bounce外,PoseiSwap将陆续在BitForex(6月23日…

uniapp + vue3 + uviewPlus 搭建多端项目框架

随着vite.js越来越受开发者青睐,很多大厂的项目都偏向于vue3开发,想着uniapp搭配vite4.x搭建多端项目效果会怎么样?经过一番实践发现果然不错! 版本信息 HBuilderX: 3.8.4 Vite: 4.2.1 uView-Plus: 3.1.31初始化uniappvue3项目 …

PSINS工具箱学习(一)下载安装初始化、SINS-GPS组合导航仿真、习惯约定与常用变量符号、数据导入转换、绘图显示

文章目录 一、前言二、相关资源三、下载安装初始化1、下载PSINSyymmdd.rar工具箱文件2、解压文件3、初始化4、启动工具箱导览 四、习惯约定与常用变量符号1、PSINS全局变量结构体 glv2、坐标系定义3、姿态阵/姿态四元数/欧拉角 Cnb/qnb/att4、IMU采样数据 imu5、AVP导航参数 av…

Python基础(5)——变量

Python基础(5)——变量 文章目录 Python基础(5)——变量目标一. 变量的作用二. 定义变量2.1 标识符2.2 命名习惯2.3 使用变量2.4 认识bug 三. Debug工具3.1 打断点3.2 Debug调试3.2.1 Debug输出面板分类 四. 认识数据类型总结 目标…

【JAVA集合篇】LinkedList详解

文章目录 简介继承体系源码分析主要属性Node节点构造方法添加元素删除元素 栈总结经典面试题 简介 上篇文章我们详细分析ArrayList的使用及源码:【JAVA集合篇】ArrayList源码详解 ,本章我们来聊聊LinkedList的使用及源码,LinkedList和ArrayL…

Ceph:关于Ceph 集群如何访问的一些笔记

写在前面 准备考试,整理 Ceph 相关笔记博文内容涉及,Ceph 集群四种访问方式介绍及 Demo,Ceph 客户端支持的操作介绍理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意…

科大讯飞星火大模型评测:从职场到日常生活,样样精通

文 | 大力财经 今年最热门的话题当属OpenAI发布ChatGPT 3.5版本,全球用户对此纷纷追捧。在国内领域,百度、阿里巴巴、字节跳动、360、腾讯和科大讯飞等厂商纷纷推出大型模型,加入“百模大战”的竞赛。 大模型在自然语言处理领域可以显著提高…

推荐几款适用的项目管理工具,助力您的项目更高效运作

随着企业规模的扩大和业务范围的增加,中小型企业近年来越来越重视项目管理。Zoho Projects 是一款适用于中小型企业的项目管理工具,可以帮助中小型企业更好地进行项目管理,提高工作效率和协作效果。 一、强大的项目管理能力 Zoho Projects提供…

华为OD机试之AI面板识别

AI面板识别 题目描述 AI识别到面板上有N(1 ≤ N ≤ 100)个指示灯,灯大小一样,任意两个之间无重叠。 由于AI识别误差,每次别到的指示灯位置可能有差异,以4个坐标值描述AI识别的指示灯的大小和位置(左上角…

启智平台使用教程

1.创建项目 填写完需要的信息后,点击“创建项目”即可。 进入到下面这个界面 2.创建调试任务 点击“新建调试任务” 算力集群推荐选择“智算网络集群” 新建项目的时候必须要选择镜像,可以根据自己的需要选择合适的镜像。可以把原镜像的安装包删除&…

基于html+css的图展示132

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

关于ASA搜索竞价排名广告

通过调研发现,60%的应用是通过搜索引擎发现的,这一定程度上也反映出用户需要先通过搜索引擎和社交媒体搜索寻找APP的占比较大,我们可以借助应用商店内的排名推荐广告,来改变应用被发现的渠道。 通过广告投放和ASO优化&#xff0c…

软件开发项目的工作量估算方法 —— 代码统计分析工具

目录 软件开发项目的阶段 工作量估算方法 参考比例 最佳实践 移植项目工作量评估工具 —— 代码统计分析工具 代码统计分析工具 —— 分析用参数调整面板 结论 在软件开发项目中,工作量估算是项目成功的关键之一。正确的工作量估算可以帮助开发团队做好时间管…

Elasticsearch 如何把评分限定在0到1之间?

本文题目来自微信群讨论。 在 Elasticsearch 中,评分(或打分)通常在查询过程中进行,以判断文档的相关性。 默认的打分机制使用的是 BM25,但你也可以通过自定义的打分查询(function_score)来自定…

Python进阶语法之lambda函数

Python进阶语法之lambda函数 在Python中,lambda函数也被称为匿名函数,它是定义简单函数的一种快捷方式。lambda函数与普通函数一样,可以接收任意数量的参数,但是只能有一个表达式。在本文中,我们将通过丰富的例子和解…

Python与深度学习:Keras、PyTorch和Caffe的使用和模型设计

第一章:介绍 深度学习已经成为当今计算机科学领域的热门技术,而Python则是深度学习领域最受欢迎的编程语言之一。在Python中,有多个深度学习框架可供选择,其中最受欢迎的包括Keras、PyTorch和Caffe。本文将介绍这三个框架的使用和…

Advanced-C.02.程序设计

C语言概述 C程序的结构 C语句分类 表达式语句 xyz; 函数调用语句 printf("Hello World!"); 控制语句 if语句、switch语句、do while语句、while语句、for语句、break语句、goto语句、continue语句、return语句 复合语句 {xy;yz;zx;} 空语句 while(getchar()!\n){;}…

数据结构-各种树(二叉树、二叉查找树、平衡二叉树、红黑树、B树、B+树)

文章目录 二叉树二叉查找树平衡二叉树红黑树B树B树 二叉树 概念:二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一…