MTK6735 Android之Camera驱动移植篇

本文详细介绍了MTK6735平台下ov8858摄像头驱动的移植过程,包括HAL层和Kernel层代码的配置、Sensor ID的设置、函数入口绑定等步骤,并解决了实际操作中遇到的问题。

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

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


<think>我们正在处理一个关于在MTK Android 5.1平台上移植充电IC驱动的问题。根据提供的引用,我们可以获取一些关于MTK平台驱动开发的信息,特别是Camera驱动和系统配置,但充电IC驱动移植的具体步骤没有直接给出。然而,我们可以根据MTK平台驱动开发的一般流程和Android驱动架构来提供指导。 步骤1:理解MTK平台的充电架构 MTK平台的充电驱动通常位于内核驱动层,并遵循MTK提供的充电框架。充电IC驱动需要与MTK的充电管理内核模块进行交互。 步骤2:获取充电IC的数据手册 需要获取充电IC的数据手册,了解其寄存器配置、通信接口(如I2C)和操作时序。 步骤3:创建驱动文件 在Linux内核中,为充电IC创建驱动文件。通常,这个驱动文件会放在`drivers/power/supply/`目录下。我们可以参考MTK平台已有的充电驱动(如`mediatek/kernel/drivers/power/`下的文件)。 步骤4:编写驱动代码 充电IC驱动通常包括以下部分: - 初始化函数(probe函数) - I2C通信接口(如果使用I2C) - 电源供应操作集(struct power_supply_ops)的实现,包括获取充电状态、充电电流、电压等 - 中断处理(如果需要) 步骤5:配置设备树(DTS) 在MTK平台,设备信息通常通过设备树(DTS)进行描述。我们需要在设备树中添加充电IC的节点,指定其I2C地址、中断引脚等。 例如,在设备树中添加一个I2C设备节点: ```dts &i2c1 { status = "okay"; clock-frequency = <400000>; charger_ic: charger@6b { compatible = "xxx,xxx"; // 替换为实际的兼容字符串 reg = <0x6b>; // I2C地址 interrupt-parent = <&pio>; interrupts = <10 IRQ_TYPE_EDGE_FALLING>; // 中断引脚配置 xxx,xxx = <...>; // 其他自定义属性 }; }; ``` 步骤6:配置内核选项 在内核配置中启用该驱动。通常需要在`make menuconfig`中配置相应的选项,或者直接修改项目配置文件(如`defconfig`)。 步骤7:编译和测试 将驱动编译进内核(或作为模块),烧录到设备进行测试。使用Logcat和dmesg查看内核日志,确保驱动正确加载并运行。 步骤8:与Android电源管理框架交互 充电状态需要上报到Android的BatteryService。MTK平台通常有自己的充电管理模块(如`mtk_charger`),我们的驱动需要与之对接。 注意事项: - 参考MTK提供的文档(如果有的话)和现有驱动代码(如`mediatek/kernel/drivers/power/`目录下的代码)。 - 确保遵循MTK的充电流程,包括充电状态机。 - 调试时,可以使用adb shell命令查看/sys/class/power_supply/目录下的充电信息。 由于引用中没有直接提供充电驱动移植示例,以上步骤基于一般Linux设备驱动开发和MTK平台的特点总结。 相关问题: 1. 如何调试MTK平台上的充电驱动? 2. 在MTK Android 5.1平台上,充电状态机是如何工作的? 3. 如何通过sysfs接口获取充电IC的状态信息?</think>### MTK Android 5.1 充电IC驱动移植指南 在MTK Android 5.1平台上移植充电IC驱动,需遵循MTK平台驱动架构和Android电源管理框架。以下是关键步骤: #### 1. **驱动代码准备** - 创建充电IC驱动文件(如`charger_ic_driver.c`),实现以下核心功能: ```c static struct power_supply_desc charger_desc = { .name = "mtk-charger", .type = POWER_SUPPLY_TYPE_BATTERY, .properties = charger_props, .num_properties = ARRAY_SIZE(charger_props), .get_property = charger_get_property, }; static int charger_probe(struct platform_device *pdev) { // 初始化硬件寄存器 mtk_charger_init_registers(); // 注册中断处理函数 request_irq(charger_irq, charger_interrupt, IRQF_TRIGGER_FALLING, "charger_ic", NULL); // 创建sysfs接口 power_supply_register(&pdev->dev, &charger_desc); } ``` #### 2. **设备树配置** 在设备树文件(如`cust_mt6735_battery.dtsi`)中添加节点: ```dts &i2c1 { charger_ic: charger@6b { compatible = "mediatek,external_charger"; reg = <0x6b>; // I2C地址 interrupt-parent = <&pio>; interrupts = <10 IRQ_TYPE_EDGE_FALLING>; // 中断引脚 charger-name = "primary_chg"; status = "okay"; }; }; ``` #### 3. **内核配置** - 修改内核配置文件(如`ProjectConfig.mk`): ```makefile CUSTOM_KERNEL_CHARGER = charger_ic MTK_SWCHR_SUPPORT = yes ``` - 在Kconfig中添加驱动编译选项: ```kconfig config CHARGER_IC_DRIVER tristate "External Charger IC Support" default n ``` #### 4. **HAL层对接** 在`hardware/libhardware/modules/charger/`中实现HAL接口: ```c static struct hw_module_methods_t charger_module_methods = { .open = charger_device_open }; struct charger_control_device_t { .get_charging_current = get_charging_current, .set_charging_current = set_charging_current, }; ``` #### 5. **电源管理框架集成** 修改Android电源服务: ```java // frameworks/base/services/core/java/com/android/server/BatteryService.java private void updateChargerStatus() { int status = mChargerDriver.getStatus(); // 调用底层驱动 mBatteryProps.chargerAcOnline = (status == CHARGER_AC); } ``` #### 6. **调试与验证** - 关键调试命令: ```bash adb shell dmesg | grep charger # 查看内核日志 adb shell cat /sys/class/power_supply/charger/uevent # 充电状态 ``` - 使用MTK调试工具(如ATE/MAUI)验证充电曲线 > **注意事项**: > 1. 需处理MTK平台特有的充电状态机(如`mtk_charger.c`中的`CHG_SETTING_VALID`状态) > 2. 确保兼容MTK的PMIC框架(如`mtk_power_management.h`) > 3. 遵循MTK的DVFS策略,避免充电时过热降频[^3] --- ### 相关问题 1. 如何调试MTK平台的充电IC驱动异常? 2. 在MTK Android 5.1上如何实现快充协议(如QC3.0)? 3. 充电驱动移植后如何验证其功耗性能? 4. MTK平台的设备树配置与主流Android设备有何区别? 5. 如何处理充电IC驱动MTK原厂PMIC的冲突?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值