MTK6735 Android之Camera驱动移植篇_mtk camera驱动 编译-程序员宅基地

技术标签: MTK 驱动  

MTK6735 Android之Camera驱动移植篇

首先我们需要向sensor原厂拿到我们对应平台型号的驱动hal层和kernel层的代码。

1.拷贝hal层代码到\vendor\mediatek\proprietary\custom\mt6735\hal\D1\imgsensor\目录下。

2.拷贝kernel层代码到\kernel-3.10\drivers\misc\mediatek\imgsensor\src\mt6735\目录下。

3.添加Sensor_id:\vendor\mediatek\proprietary\custom\mt6735\hal\D1\imgsensor_src\sensorlist.cpp

我的摄像头型号是ov8858这款sensor所以对应应该


//800w
#if defined(OV8858_MIPI_RAW)
    RAW_INFO(OV8858_SENSOR_ID, SENSOR_DRVNAME_OV8858_MIPI_RAW,NULL),
#endif

4.定义ID:\vendor\mediatek\proprietary\custom\common\kernel\imgsensor\inc\kd_imgsensor.h

#define OV8858_SENSOR_ID                        0x8858
#define SENSOR_DRVNAME_OV8858_MIPI_RAW          "ov8858mipiraw"
一般定义ID在这个文件差不多都定义了所以我们也不用去管,但是还是需要去看看

5.定义ID:\kernel-3.10\drivers\misc\mediatek\imgsensor/inc/kd_imgsensor.h和上面一样

6.绑定函数入口:\kernel-3.10\drivers\misc\mediatek\imgsensor\src\mt6735\kd_sensorlist.h


//800w
#if defined(OV8858_MIPI_RAW)
    {OV8858_SENSOR_ID, SENSOR_DRVNAME_OV8858_MIPI_RAW,OV8858_MIPI_RAW_SensorInit},
#endif

7./kernel-3.10/drivers/misc/mediatek/mach/mt6735/<project>/camera/camera/目录下
添加摄像头上电时序kd_camera_hw.c:
if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV8858_MIPI_RAW, currSensorName)))
{
    printk("tangh SENSOR_DRVNAME_OV8858_MIPI_RAW \n ");
        //First Power Pin low and Reset Pin Low
        if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMPDN]) {
            if(mt_set_gpio_mode(pinSet[pinSetIdx][IDX_PS_CMPDN],pinSet[pinSetIdx][IDX_PS_CMPDN+IDX_PS_MODE])){PK_DBG("[CAMERA LENS] set gpio mode failed!! (CMPDN)\n");}
            if(mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMPDN],GPIO_DIR_OUT)){PK_DBG("[CAMERA LENS] set gpio dir failed!! (CMPDN)\n");}
            if(mt_set_gpio_out(pinSet[pinSetIdx][IDX_PS_CMPDN],pinSet[pinSetIdx][IDX_PS_CMPDN+IDX_PS_OFF])){PK_DBG("[CAMERA LENS] set gpio failed!! (CMPDN)\n");}
        }

        if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) {
                if(mt_set_gpio_mode(pinSet[pinSetIdx][IDX_PS_CMRST],pinSet[pinSetIdx][IDX_PS_CMRST+IDX_PS_MODE])){PK_DBG("[CAMERA SENSOR] set gpio mode failed!! (CMRST)\n");}
                if(mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMRST],GPIO_DIR_OUT)){PK_DBG("[CAMERA SENSOR] set gpio dir failed!! (CMRST)\n");}
                if(mt_set_gpio_out(pinSet[pinSetIdx][IDX_PS_CMRST],pinSet[pinSetIdx][IDX_PS_CMRST+IDX_PS_OFF])){PK_DBG("[CAMERA SENSOR] set gpio failed!! (CMRST)\n");}
            }

            //VCAM_IO
            if(TRUE != hwPowerOn(CAMERA_POWER_VCAM_IO, VOL_1800, mode_name))
            {
                PK_DBG("[CAMERA SENSOR] Fail to enable digital power (VCAM_IO), power id = %d \n", CAMERA_POWER_VCAM_IO);
                goto _kdCISModulePowerOn_exit_;
            }

            //VCAM_A
            if(TRUE != hwPowerOn(CAMERA_POWER_VCAM_A, VOL_2800,mode_name))
            {
                PK_DBG("[CAMERA SENSOR] Fail to enable analog power (VCAM_A), power id = %d\n", CAMERA_POWER_VCAM_A);
                goto _kdCISModulePowerOn_exit_;
            }
            //VCAM_D
            if(TRUE != hwPowerOn(CAMERA_POWER_VCAM_D, VOL_1500,mode_name))
            {
                 PK_DBG("[CAMERA SENSOR] Fail to enable digital power\n");
                 goto _kdCISModulePowerOn_exit_;
            }
             //AF_VCC
            if(TRUE != hwPowerOn(CAMERA_POWER_VCAM_AF, VOL_2800,mode_name))
            {
                PK_DBG("[CAMERA SENSOR] Fail to enable analog power (VCAM_AF), power id = %d \n", CAMERA_POWER_VCAM_AF);
                goto _kdCISModulePowerOn_exit_;
            }

            mdelay(5);

            //enable active sensor
            if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMPDN]) {
                if(mt_set_gpio_mode(pinSet[pinSetIdx][IDX_PS_CMPDN],pinSet[pinSetIdx][IDX_PS_CMPDN+IDX_PS_MODE])){PK_DBG("[CAMERA LENS] set gpio mode failed!! (CMPDN)\n");}
                if(mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMPDN],GPIO_DIR_OUT)){PK_DBG("[CAMERA LENS] set gpio dir failed!! (CMPDN)\n");}
                if(mt_set_gpio_out(pinSet[pinSetIdx][IDX_PS_CMPDN],pinSet[pinSetIdx][IDX_PS_CMPDN+IDX_PS_ON])){PK_DBG("[CAMERA LENS] set gpio failed!! (CMPDN)\n");}
            }

            mdelay(1);

            if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) {
                if(mt_set_gpio_mode(pinSet[pinSetIdx][IDX_PS_CMRST],pinSet[pinSetIdx][IDX_PS_CMRST+IDX_PS_MODE])){PK_DBG("[CAMERA SENSOR] set gpio mode failed!! (CMRST)\n");}
                if(mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMRST],GPIO_DIR_OUT)){PK_DBG("[CAMERA SENSOR] set gpio dir failed!! (CMRST)\n");}
                if(mt_set_gpio_out(pinSet[pinSetIdx][IDX_PS_CMRST],pinSet[pinSetIdx][IDX_PS_CMRST+IDX_PS_ON])){PK_DBG("[CAMERA SENSOR] set gpio failed!! (CMRST)\n");}
            }            
}
VCAM_IO、VCAM_A、VCAM_D和AF_VCC都是需要按照手册来修改


8.在ProjectConfig.mk中添加sensor


CUSTOM_HAL_IMGSENSOR=ov8858_mipi_raw
CUSTOM_HAL_MAIN_IMGSENSOR=ov8858_mipi_raw


CUSTOM_KERNEL_IMGSENSOR=ov8858_mipi_raw
CUSTOM_KERNEL_MAIN_IMGSENSOR=ov8858_mipi_raw
在\kernel-3.10\arch\arm64\configs\<project>中增加

CONFIG_CUSTOM_KERNEL_IMGSENSOR=“ov8858_mipi_raw”

现在我们编译下一般情况下是可以运行camera这个功能了,但是不免会遇到很多意外,例如我爬坑爬了挺久本来是一个很简单的移植,那现在就一起爬吧。
首先你可能会发现额怎么我的摄像功能不行?我的聚焦功能也没实现,闪光灯功能也没看到。运气好的话你可能也会遇到,当时找了很久都没发现问题后来请教了下大神帮我弄了下终于弄出来了但是还是云里雾里,在我的基础上也没怎么改。

我们当时直接把AF加上之后就正常,但是在ProjectConfig.mk把其它摄像头的驱动都屏蔽了,后面需要自己添加,这里有一点不明白就是添加两个兼容驱动写前和写后面的区别是什么可以互换不,如果哪位知道请评论下,感谢。

添加AF在ProjectConfig.mk:


CUSTOM_KERNEL_LENS = ad5820af fm50af dw9714af dummy_lens

我使用的是fm50af。
在\vendor\mediatek\proprietary\custom\<project>\hal\sendepfeature下面新建一个你驱动对应名字的文件,添加config.ftbl.ov8858_mipi_raw.h这个文件到里面去,此文件在给你hal层代码里面有。把这些完成之后你重新new一把最后看到功能都出来了,如果还没出来你把ProjectConfig.mk里面的camera的其它关于摄像头的后置驱动全部去掉留下你正在移植那个试试,包括你kernel目录里面的deconfig里面。

现在差不多都搞定了。打开摄像头看到上下左右都反了,那我们就得看下寄存器改方向了查看了8858相关寄存器,发现修改方向的是0x3820和0x3821按照对应修改即可,.sensor_output_dataformat = SENSOR_OUTPUT_FORMAT_RAW_B这个是修改颜色的你们也应该会遇到问题,四种状态:B、Gb、R、Gr
 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010783226/article/details/93379123

智能推荐

坐标核查——判断点是否在多边形内_百度地图 坐标点判断是否在一个多边形内 算法-程序员宅基地

文章浏览阅读1.1k次,点赞5次,收藏10次。坐标核查——判断点是否在多边形内(PNPOLY算法)提出问题解决思路PNPOLY算法边界坐标集获取python实现提出问题最近开始了实习,前两天导师提出了一个问题,让我试着用自己的思路去解决它。问题是这样的:由于采集到的基站的经纬度坐标信息不准确,导致生成的可视化坐标图里,基站标到海里去了。试想这样的bug让用户看到也太丑了8。解决思路所以解决思路就是:没有思路。我的意思是,哪里出错..._百度地图 坐标点判断是否在一个多边形内 算法

AOA定位IQ定位原理_aoa iq-程序员宅基地

文章浏览阅读2.7k次,点赞2次,收藏10次。_aoa iq

linux中的伪终端编程,Linux中的伪终端编程-程序员宅基地

文章浏览阅读512次。如何操作伪终端:伪终端的使用是成对出现的,分为master 和 slaver主设备:/dev/ptmx (i850上的主设备名)从设备:动态生成:/dev/pts/0.......x功能:写入主设备的信息,可以从从设备上读出;写入从设备的信息,可以从主设备读出。用以实现对串口的多路复用。以下是测试代码Ubuntu 下的编译方法:gcc -Wall ptyhost.c -o ptyhost -uti..._linux c 伪终端编程openpty

Mac 安装 scipy 失败问题的 简单解决方案 manim依赖库 2021年05月_macos failed: scipy/stats/_hypotests_pythran.cpp-程序员宅基地

文章浏览阅读2.2k次。Mac 安装 scipy 失败问题的 简单解决方案 manim依赖库2021年05月问题描述:系统:macOS Big Surpython:系统自带3.8~2.3IDE:pycharm2021.1.1 (Professional Edition)安装numpy(1.20.3)正常,安装至scipy时,从最新版本1.63一直安装失败。尝试过升级pip,setuptools(56.2.0),wheel(0.36.2)后,仍然失败。解决方案:1.下载最新的pyt..._macos failed: scipy/stats/_hypotests_pythran.cpp

linux tail 查找字符串,Linux grep、tail命令的混合使用-程序员宅基地

文章浏览阅读3.3k次。grepLinux grep命令用于查找文件里符合条件的字符串。grep指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设grep指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为"-",则grep指令会从标准输入设备读取数据。语法grep [-abcEFGhHilLnqrsvVwxy][-A][-B][-C][-d][-e][-..._tail 查找字符串

matlab隐含层个数设置,BP神经网络隐藏层节点数如何确定-程序员宅基地

文章浏览阅读3k次。新人求教:本人的输入矩阵为p,每一列为一个特征向量,每一行为一个样本,现在我想按列归一化,我自己写的用for循环逐列归一化,但是发现输出反归一化还原时不好处理,求老师们教教有没有一些函数的使用技巧能按列归一化后而且能使得能方便地反归一化得到输出。网络输入p、输出t见下:p =[ 695.50 1.60 2.06 38.00 31...._matlab中设置bp隐含层数量的代码

随便推点

【Shiro 自学笔记二】自定义 Realm 实现 MD5 加密、加盐与再散列_md5 中的realm-程序员宅基地

文章浏览阅读356次。文章目录什么是MD5加盐散列Shiro 实现 MD5 加密基本 MD5 加密加盐与散列自定义 Realm 实现登录验证自定义 Realm 实现 MD5 加密声明加密算法声明加盐和散列上一期我们完成了基本的登录操作,然而,直接通过明文密码登录显然是非常不安全的。因此,我们必须对密码进行加密以加强信息的安全性。什么是MD5MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value)_md5 中的realm

给一个二值图,求出最大连通区域(可用深度优先和广度优先算法)_一张边界图,如何连通并二值化-程序员宅基地

文章浏览阅读3.7k次。转载自:https://www.codetd.com/article/6541194这个问题是我在SLAM求职宝典系列D2篇中遗留的问题,因为内容较多现在单独将其列出进行解答。本篇内容分为四个部分:目录(1)二值图(2)求最大连通区域的算法(3)代码实现,以及DFS 和BFS(4) OpenCV中连通域的求解(C++ & Python)..._一张边界图,如何连通并二值化

Pycharm启动慢、运行卡的解决办法_pycharm打开谷歌浏览器运行缓慢-程序员宅基地

文章浏览阅读1.6w次,点赞13次,收藏53次。前提:现在的电脑标配都 4G 以上内存了,不过很多IDE仍然是以低配电脑为标准,去配置软件占用硬件的程度因为内存会直接影响到软件的性能,如果pycharm启动慢和运行卡顿可以通过加大软件的运行内存。步骤/方法方法一:pycharm 菜单栏找到 ---- help ---- edit custom VM options…修改 pycharm64.exe.vmoptions 文件Xms..._pycharm打开谷歌浏览器运行缓慢

模糊综合评价模型原理及matlab实现_模糊综合评判--空气质量评估例题matlab-程序员宅基地

文章浏览阅读4w次,点赞149次,收藏886次。资料来源:微信公众号《数学建模学习交流》目录1. 概述2. 经典集合和模糊集合的基本概念2.1 经典集合和特征函数2.2 模糊集合和隶属函数3. 隶属函数的三种确定方法3.1 模糊统计法3.2 借助已有的客观尺度4. 应用:模糊综合评价(评判)4.1 评价问题概述4.2 一级模糊综合评价模型4.2.1 一级模糊综合评判模型在人事考核中的应用..._模糊综合评判--空气质量评估例题matlab

vue-router的push和replace的区别_vue饿router的push和replace-程序员宅基地

文章浏览阅读5.3w次,点赞15次,收藏58次。1.this.$router.push()描述:跳转到不同的url,但这个方法会向history栈添加一个记录,点击后退会返回到上一个页面。2.this.$router.replace()描述:同样是跳转到指定的url,但是这个方法不会向history里面添加新的记录,点击返回,会跳转到上上一个页面。上一个记录是不存在的。3.this.$router.go(n)相对于当前页面向..._vue饿router的push和replace

荣耀会不会没有鸿蒙系统,华为没有放弃荣耀手机老用户,都有机会鸿蒙系统,这下放心了吧...-程序员宅基地

文章浏览阅读140次。荣耀9X手机年内升级鸿蒙操作系统,为华为这个做法点赞自从新荣耀成立之后,鸿蒙操作系统的更新以及4月陆续从旗舰机开始开放,这个时候很多荣耀的老用户都慌了,那么我们怎么办可以不可以用,曾经荣耀CEO赵明说会遵循行业之间的相关规定,所以这也让荣耀手机是否可以用鸿蒙系统变得扑朔迷离,最近终于被实锤了,既然荣耀9X都可以升级,那么估计荣耀30系列、荣耀20系列应该都有机会的!IT之家3月12日消息 根据微博..._荣耀放弃鸿蒙系统

推荐文章

热门文章

相关标签