零基础学习MTK平台camera引脚配置

文章目录

一、MTK平台的GPIO配置
1. MTK平台GPIO驱动程序提供了两个接口:
(1)内核空间:所提供的GPIO驱动程序,驱动程序可以调用其他函数,比如mt_set_gpio_dir、mt_set_gpio_mode等;

(2)用户空间:用户空间的程序可以通过发送IOCTL给/dev/ mtgpio的操作GPIO,如open、ioctl、write、read和close等函数。

adb shell  
cat /proc/kmsg  
cat /sys/devices/platform/pinctrl/mt_gpio  

以具体的mt_gpio路径为准,可以先使用find sys/  -name  "mt_gpio"进行查找)

       一般来说,GPIO引脚功能复用每个GPIO引脚支持四种模式,可作为EINT、GPIO、或I2C、SPI等,通过GPIO_MODE进行选择。每个GPIO可以配置的模式可以参考这个头文件kernel-4.X/arch/arm64/boot/dts/mediatek/mtXXXX-pinfunc.h。

GPIO_DIR:GPIO模式下,可配置为控制输入输出方向,置0是input,置1是output。在MTK平台的GPIO表的mode中,会看到有B(for both,既可设为输入也可设为输出),O(for output only),I0(for input only,作为输入且为低电平),I1(作为输入且为高电平)。

GPIO_DIN:通过访问寄存器可以得知输入的是高电平还是低电平

GPIO_DOUT:在引脚被配置为output后,控制输出高低电平

GPIO_PULLEN:是否支持上下拉,GPIO作为输入模式时生效。

         mtk的文档给的框图中没有标全,还有设置上下拉,SMT等属性。不过,在cat mt_gpio的时候会打印全相关配置。

PULL_SEL:GPIO_PULLEN只设置了是否使能上拉或下拉,而这个属性设置是上拉还是下拉。0=下拉;1=上拉。上拉是一个电阻接到一个电压,其实就是增强了IO的驱动能力;下拉是一个电阻接到地,保证IO口是低电平;

IES:输入使能,控制输入是否有效。

SMT:是否使能斯密特触发器

DRIVE:驱动能力,一般可取值0~7

([R1] [R0]):当前GPIO pin的上下拉并联电阻的使能状态;

                     1 0表示enable R1,disable R0

                     0 1表示disable R1,enable R0

                     1 1表示enable R1,enable R0

              没有打印表示当前GPIO pin不支持PUPD,即只有一个上拉电阻、一个下拉电阻。

2.配置dws文件
       使用vendor\mediatek\proprietary\scripts\dct中的DrvGen.exe,打开vendor\mediatek\ proprietary\bootable\bootloader\lk\target\{$project}\dct\dct下的codegen.dws进行GPIO等配置。

依次来看下GPIO的配置项:

EintMode:中断模式

Def.Mode:默认的模式,根据后面勾选的VarName1~3中选择默认模式

InPull En:是否支持上下拉

InPull Sel High:选择上拉还是下拉,勾选表示上拉

Def.Dir:input还是output

OutHigh:输出为高电平还是低电平

SMT#:SMT group

SMT:是否支持SMT(schmitt trigger)功能,波形过滤,输出方波或者脉冲波,延迟滞后具有消噪的功能,一般不用勾选。

IES:输入使能,控制输入是否有效,一般全选。

配置完成后点击保存会自动更新codegen.dws文件。

3.配置dts文件

在kernel-4.*\arch\arm64\boot\dts\mediatek目录下的dts文件中设置pinctrl。

&device{   
  ......  
  pinctrl-names = "aaa","bbb","ccc";  
  pinctrl-0 = <&xxx>;  
    pinctrl-1 = <&yyy>;  
    pinctrl-2 = <&zzz>;  
  ......  
};  
&pio {  
    xxx: config0 {  
        pins_cmd_dat {  
        pins = <PINMUX_GPIO1__FUNC_GPIO1>;  
            //设置GPIO mode,在boot/dts/中mtxxxx-pinfunc.h里有定义  
        slew-rate = <0>;  
            //设置GPIO dir,0为input,1为output  
        bias-pull-down = <11>;  
            //设置pull enable,下拉,后面的11并无影响,写00也可以  
        input-schmitt-enable = <0>;  
            //设置SMT enable          
        };  
    };  
    yyy: config1 {  
        pins_cmd_dat {  
        pins = <PINMUX_GPIO1__FUNC_GPIO1>;  
        slew-rate = <1>;  
        bias-pull-up = <11>;  
        output-low;    //设置低电平输出,只有在slew-rate设为1时才有效  
                       //output-high就是设置为高电平输出  
        input-schmitt-enable = <0>;           
        };  
    };  
    zzz: config2 {  
        pins_cmd_dat {  
        pins = <PINMUX_GPIO1__FUNC_GPIO1>;  
        slew-rate = <1>;  
        bias-disable;  
            //无上下拉设置,不能与bias-pull-down/up共存  
        output-low;  
        input-schmitt-enable = <0>;           
        };  
    };  
};  

二、MTK平台camera模块的GPIO配置
         这边以在MT8766_Q0平台配置为例。在确认codegen.dws与所在平台的GPIO配置一致后,还要注意各引脚在上电文件及dtsi中的配置是否正确。下面以添加一个新的regulator电源为例,当要配置一个GPIO电源时步骤大致相同,只是忽略5、6、7这三条操作,并将添加的语句中的regulator字眼都替换为gpio。

         该平台在kernel-4.*/drivers/misc/mediatek/imgsensor/src/mt6***/camera_hw/regulator/ regulator.c中默认写了三组regulator的pin

struct REGULATOR_CTRL regulator_control[REGULATOR_TYPE_MAX_NUM] = {  
    {"vcama"},  
    {"vcamd"},  
    {"vcamio"},  
};  

假设需要添加一个regulator电源,需要在以下文件中做如下工作:

1.kernel-4.*\drivers\misc\mediatek\imgsensor\src\mt6***\camera_hw\gpio\gpio.c

2.kernel-4.*\drivers\misc\mediatek\imgsensor\src\mt6***\camera_hw\gpio\gpio.h

3.kernel-4.*\drivers\misc\mediatek\imgsensor\src\mt6***\camera_hw\imgsensor_cfg_table.c

4.kernel-4.*\drivers\misc\mediatek\imgsensor\src\mt6***\camera_hw\imgsensor_cfg_table.h

5.kernel-4.*\drivers\misc\mediatek\imgsensor\src\mt6***\camera_hw\regulator\regulator.c

6.kernel-4.*\drivers\misc\mediatek\imgsensor\src\mt6***\camera_hw\regulator\regulator.h

7.8.kernel-4.*\arch\arm64\boot\dts\mediatek\cust_mt6XXX_camera.dtsi

要注意所有文件中添加的相对位置要保持一致

1. kernel-4.*\drivers\misc\mediatek\imgsensor\src\mt6***\camera_hw\gpio\gpio.c
 

 struct GPIO_PINCTRL gpio_pinctrl_list_cam[  
 GPIO_CTRL_STATE_MAX_NUM_CAM] = {  
 /* Main */  
 {"pnd1"},  
 {"pnd0"},  
 {"rst1"},  
 {"rst0"},  
 {"ldo_vcama_1"},  
 {"ldo_vcama_0"},  
+{"ldo_vcamio_1p8_1"},     //add  
+{"ldo_vcamio_1p8_0"},     //add  
 {"ldo_vcamd_1"},  
 {"ldo_vcamd_0"},  
 {"ldo_vcamio_1"},  
 {"ldo_vcamio_0"},  
};  

2. kernel-4.*\drivers\misc\mediatek\imgsensor\src\mt6***\camera_hw\gpio\gpio.h 

enum GPIO_CTRL_STATE_CAM {  
  /* Main */  
  GPIO_CTRL_STATE_PDN_H,  
  GPIO_CTRL_STATE_PDN_L,  
  GPIO_CTRL_STATE_RST_H,  
  GPIO_CTRL_STATE_RST_L,  
  GPIO_CTRL_STATE_LDO_VCAMA_H,  
  GPIO_CTRL_STATE_LDO_VCAMA_L,  
+ GPIO_CTRL_STATE_LDO_VCAMIO_1P8_H,     //add  
+ GPIO_CTRL_STATE_LDO_VCAMIO_1P8_L,     //add  
  GPIO_CTRL_STATE_LDO_VCAMD_H,  
  GPIO_CTRL_STATE_LDO_VCAMD_L,  
  GPIO_CTRL_STATE_LDO_VCAMIO_H,  
  GPIO_CTRL_STATE_LDO_VCAMIO_L,  
  GPIO_CTRL_STATE_MAX_NUM_CAM,  
};  

3. kernel-4.*\drivers\misc\mediatek\imgsensor\src\mt6***\camera_hw\imgsensor_cfg_table.c 

struct IMGSENSOR_HW_CFG imgsensor_custom_config[] = {  
 {  
  IMGSENSOR_SENSOR_IDX_MAIN,  
  IMGSENSOR_I2C_DEV_0,  
  {  
   {IMGSENSOR_HW_PIN_MCLK, IMGSENSOR_HW_ID_MCLK},  
   {IMGSENSOR_HW_PIN_AVDD, IMGSENSOR_HW_ID_GPIO},  
+  {IMGSENSOR_HW_PIN_DOVDD_1P8, IMGSENSOR_HW_ID_REGULATOR},     //add  
   {IMGSENSOR_HW_PIN_DOVDD, IMGSENSOR_HW_ID_REGULATOR},  
   {IMGSENSOR_HW_PIN_DVDD, IMGSENSOR_HW_ID_GPIO},  
   {IMGSENSOR_HW_PIN_PDN, IMGSENSOR_HW_ID_GPIO},  
   {IMGSENSOR_HW_PIN_RST, IMGSENSOR_HW_ID_GPIO},  
   {IMGSENSOR_HW_PIN_NONE, IMGSENSOR_HW_ID_NONE},  
  },  
 },  
 ...  
};  
//上电时序中  
#if defined(*****_MIPI_RAW)  
 {  
  SENSOR_DRVNAME_*****_MIPI_RAW,  
  {  
   {RST, Vol_Low, 1},  
   {AVDD, Vol_2800, 0},  
   {DVDD, Vol_1200, 0},  
+  {DOVDD_1P8, Vol_1800, 1},     //add  
   {SensorMCLK, Vol_High, 1},  
   {RST, Vol_High, 1}  
  },  
 },  

4.kernel-4.*\drivers\misc\mediatek\imgsensor\src\mt6***\camera_hw\imgsensor_cfg_table.h 

enum IMGSENSOR_HW_PIN {  
 IMGSENSOR_HW_PIN_NONE = 0,  
 IMGSENSOR_HW_PIN_PDN,  
 IMGSENSOR_HW_PIN_RST,  
 IMGSENSOR_HW_PIN_AVDD,  
+IMGSENSOR_HW_PIN_DOVDD_1P8,     //add  
 IMGSENSOR_HW_PIN_DVDD,  
 IMGSENSOR_HW_PIN_DOVDD,  
#ifdef MIPI_SWITCH  
 IMGSENSOR_HW_PIN_MIPI_SWITCH_EN,  
 IMGSENSOR_HW_PIN_MIPI_SWITCH_SEL,  
#endif  
 IMGSENSOR_HW_PIN_MCLK,  
 IMGSENSOR_HW_PIN_MAX_NUM,  
 IMGSENSOR_HW_PIN_UNDEF = -1  
};  

5. kernel-4.*\drivers\misc\mediatek\imgsensor\src\mt6***\camera_hw\regulator\regulator.c 

struct REGULATOR_CTRL regulator_control[REGULATOR_TYPE_MAX_NUM] = {  
 {"vcama"},  
+{"vcamio_1p8"},     //add  
 {"vcamd"},  
 {"vcamio"},  
};  

    若添加的位置在最后,regulator_set中,高亮位置记得做相应修改IMGSENSOR_HW_PIN_AFVDD   

static enum IMGSENSOR_RETURN regulator_set(

    void *pinstance,

    enum IMGSENSOR_SENSOR_IDX   sensor_idx,

    enum IMGSENSOR_HW_PIN       pin,

    enum IMGSENSOR_HW_PIN_STATE pin_state)

{

    struct regulator     *pregulator;

    struct REGULATOR     *preg = (struct REGULATOR *)pinstance;

    int reg_type_offset;

    atomic_t             *enable_cnt;

    if (pin > IMGSENSOR_HW_PIN_AFVDD   ||

        pin < IMGSENSOR_HW_PIN_AVDD    ||

        pin_state < IMGSENSOR_HW_PIN_STATE_LEVEL_0 ||

        pin_state >= IMGSENSOR_HW_PIN_STATE_LEVEL_HIGH ||

        sensor_idx < 0)

        return IMGSENSOR_RETURN_ERROR;

     ......

6.kernel-4.**\drivers\misc\mediatek\imgsensor\src\mt6***\camera_hw\regulator\regulator.h

enum REGULATOR_TYPE {  
 REGULATOR_TYPE_VCAMA,  
+REGULATOR_TYPE_VCAMIO_1P8,     //add  
 REGULATOR_TYPE_VCAMD,  
 REGULATOR_TYPE_VCAMIO,  
 REGULATOR_TYPE_MAX_NUM  
};  

7.kernel-4.14\arch\arm64\boot\dts\mediatek\cust_mt6XXX_camera.dtsi

 cam0_vcama-supply = <&mt_pmic_vcama_ldo_reg>;  
+cam0_vcamio_1p8-supply = <&mt_pmic_vcamio_ldo_reg>;     //add  
 cam0_vcamd-supply = <&mt_pmic_vcamd_ldo_reg>;  
 cam0_vcamio-supply = <&mt_pmic_vcamio_ldo_reg>;  

如果是GPIO口,这里需去掉相应代码,并在上方的pinctrl中添加相应代码。

8.同时,要确保项目所在的.dts文件中

&pio { 
... 
}  

 及&kd_camera_hw1里面没有该电源的配置。该配置中,只配置作为GPIO使用的引脚。也就是当添加一个GPIO电源时,要记得往里面添加一组配置。


  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MTK平台上的camera驱动教学课程旨在教授学员有关MTK平台上如何编写、安装和调试camera驱动程序的知识和技能。在这门课程中,学员将学习如何使用MTK平台提供的相应工具和接口来开发和优化camera驱动,以实现更好的图像质量和性能。 课程的内容包括以下几个方面: 1. 理论知识:学员将了解摄像头驱动的基本原理和工作原理,包括硬件架构、设备驱动接口和底层算法等。 2. 驱动开发环境搭建:学员将学习如何在MTK平台上搭建合适的开发环境,包括操作系统、编译器和调试工具等。 3. 驱动编写:学员将学习如何编写MTK平台上的camera驱动程序,包括设备初始化、图像采集和处理等功能的实现。 4. 驱动安装与调试:学员将学习如何将开发好的驱动程序安装到MTK平台上,并进行调试和优化,以确保驱动的稳定性和性能。 5. 实践项目:学员将完成一个实际的项目,如编写一个简单的camera应用程序或实现某种特定的图像处理算法,以应用所学知识并提升实践能力。 通过这门课程,学员将掌握MTK平台camera驱动开发的基本技能,能够独立完成camera驱动的编写、安装和调试工作,并具备进一步深入研究和优化的能力。这对于从事手机软件开发、图像处理等领域的工程师和研究人员来说,将是一门非常实用和重要的课程。 ### 回答2: MTK平台Camera驱动教学课程是针对使用MTK芯片的开发人员设计的一门课程。该课程旨在教授学员有关MTK平台Camera驱动的基础知识、开发技巧和调试方法。 首先,课程将介绍MTK平台和其特点,帮助学员了解MTK芯片及其应用领域。接下来,课程将重点讲解Camera驱动的原理和工作机制,涵盖Camera传感器的工作原理、图像采集和处理流程等方面的知识。 课程还将介绍Camera驱动的开发环境和工具,如MTK平台上的Camera HAL层和相应的调试工具。学员将学会如何配置和编译Camera驱动,以及如何使用调试工具进行驱动的调试和性能优化。 除了理论知识的讲解,课程还将通过实例演示和实践操作帮助学员掌握Camera驱动的开发技巧。学员将有机会参与实际的Camera驱动开发项目,通过实践来加深对课程知识的理解和应用能力。 总结起来,MTK平台Camera驱动教学课程旨在提供一套系统化的学习资源,帮助学员全面了解和掌握MTK平台上的Camera驱动开发。通过学习这门课程,学员将能够独立进行MTK平台Camera驱动的开发和调试工作,从而为MTK芯片应用的开发和优化提供支持。 ### 回答3: MTK平台CMOS摄像头驱动开发是一门与软硬件结合紧密的技术课程。首先,学习者需要熟悉MTK平台的基本知识,包括芯片结构、嵌入式系统以及Linux操作系统的基本原理。其次,学习者需要了解摄像头工作原理和常用的摄像头传感器类型,例如CMOS和CCD传感器。在掌握这些基础知识后,学习者可以开始学习MTK平台上的摄像头驱动开发。 在开发摄像头驱动时,学习者需要掌握如何通过MTK平台提供的驱动接口与摄像头硬件进行通信。这包括配置摄像头的分辨率、帧率、曝光时间以及白平衡等参数。此外,还需要了解如何处理摄像头的数据传输和处理,例如图像的压缩、旋转、镜像等操作。 在学习过程中,学习者可以通过阅读相关的文档和资料,参考MTK平台提供的示例代码来加深理解。同时,实际动手开发和调试也是非常重要的,可以通过连接MTK平台开发板和摄像头来调试和验证自己的驱动代码。学习者还可以通过与其他开发者交流和分享经验,提升自己的开发能力。 总之,MTK平台摄像头驱动开发是一门需要结合软硬件知识的综合性课程,通过学习掌握相关的理论知识和实践经验,可以帮助学习者深入了解摄像头驱动的工作原理和开发流程,提高自己的技术水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值