MTK Camera驱动移植

对于MTK Camera驱动移植一般分为四部分:

1、硬件IO口配置;

2、Camera驱动移植;

3、上电时序;

4、修改i2c控制器;


硬件电路:


1、GPIO配置

打开 mediatek\dct\DrvGen.exe 

选择 mediatek\custom\xiaoxi\kernel\dct\dct\codegen.dws 配置文件


设置前后摄像头的CMRST和CMPDN引脚,这是跟上电时序有关;




2、Camera驱动移植(以SP5507+SP2509为例)

(1)将kernel层代码整个目录sp5507_mipi_raw,sp2509_mipi_raw拷贝到mediatek/custom/common/kernel/imgsensor/目录下;
(2)将hal层代码整个目录sp5507_mipi_raw,sp2509_mipi_raw拷贝到mediatek/custom/common/hal/imgsensor/目录下;
         SP5507芯片与VO5670是用一款芯片,所以驱动程序也是同一套,上电时序也是一致;


(3)打开mediatek/custom/common/kernel/imgsensor/inc/kd_imgsensor.h文件, 定义sensor id和sensor name

#define SP5507MIPI_SENSOR_ID                    0x5670  
#define SENSOR_DRVNAME_SP5507MIPI_RAW           "sp5507_mipi_raw"

#define SP2509MIPI_SENSOR_ID                    0x2509
#define SENSOR_DRVNAME_SP2509MIPI_RAW           "sp2509_mipi_raw"

id和name的定义建议跟系统其它数据格式保持一致;


(4)在mediatek/custom/common/kernel/imgsensor/src/kd_sensorlist.h文件中声明初始化函数;

UINT32 SP5507_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc);  //该函数为kernel中的初始化函数;

UINT32 SP2509_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc);  //该函数为kernel中的初始化函数;

在kdSensorList数组中添加:

#if defined(SP5507_MIPI_RAW)    //该宏为驱动目录名大写
    {SP5507MIPI_SENSOR_ID, SENSOR_DRVNAME_SP5507MIPI_RAW, SP5507_MIPI_RAW_SensorInit},
#endif

#if defined(SP2509_MIPI_RAW)  //该宏为驱动目录名大写
    {SP2509MIPI_SENSOR_ID, SENSOR_DRVNAME_SP2509MIPI_RAW, SP2509_MIPI_RAW_SensorInit},
#endif


(5)在mediatek/custom/common/hal/imgsensor/src/sensorlist.cpp文件的SensorList数组中添加
#if defined(SP5507_MIPI_RAW)
    RAW_INFO(SP5507MIPI_SENSOR_ID, SENSOR_DRVNAME_SP5507MIPI_RAW, NULL),
#endif

#if defined(SP2509_MIPI_RAW)
    RAW_INFO(SP2509MIPI_SENSOR_ID, SENSOR_DRVNAME_SP2509MIPI_RAW, NULL),
#endif

代码位置要跟kdSensorList数组中的位置保持一致;


(6) 修改mediatek/config/pro/ProjectConfig.mk配置文件
CUSTOM_HAL_IMGSENSOR=sp5507_mipi_raw
CUSTOM_HAL_MAIN_IMGSENSOR=sp5507_mipi_raw  //后摄像头
CUSTOM_HAL_SUB_IMGSENSOR=sp2509_mipi_raw   //前摄像头
 
CUSTOM_KERNEL_IMGSENSOR=sp5507_mipi_raw
CUSTOM_KERNEL_MAIN_IMGSENSOR =sp5507_mipi_raw  //后摄像头
CUSTOM_KERNEL_SUB_IMGSENSOR=sp2509_mipi_raw  //前摄像头


(7)驱动文件的修改

修改kernel层中的XXXXmipiraw_Sensor.h文件中的Sensor ID宏为kd_imgsensor.h中定义的Sensor ID宏:

#define OV5670_SENSOR_ID  SP5507MIPI_SENSOR_ID 

与供应商确认i2c读写地址;

再修改hal层中的camera_info_XXXXmipiraw.h中的SENSOR_ID和SENSOR_DRVNAME为kd_imgsensor.h中定义的宏,修改config.ftbl.XXXX_mipi_raw.h中的FTABLE_DEFINITION(SENSOR_DRVNAME_XXXX_MIPI_RAW)的SENSOR_DRVNAME为kd_imgsensor.h中定义的sensor name宏;


(8)修改上电时序

打开mediatek\custom\pro\kernel\camera\camera\kd_camera_hw.c文件

修改kdCISModulePowerOn()函数;

SP5507上电时序


SP2509上电时序



[cpp]  view plain  copy
  1. int kdCISModulePowerOn(CAMERA_DUAL_CAMERA_SENSOR_ENUM SensorIdx, char *currSensorName, BOOL On, char* mode_name)  
  2. {  
  3.     u32 pinSetIdx = 0;//default main sensor  
  4.   
  5. #define IDX_PS_CMRST 0    //RST索引  
  6. #define IDX_PS_CMPDN 4    //PDN索引  
  7.   
  8. #define IDX_PS_MODE 1  
  9. #define IDX_PS_ON   2  
  10. #define IDX_PS_OFF  3  
  11.   
  12.     u32 pinSet[2][8] =   
  13.     {  
  14.         //for main sensor   //后摄像头  
  15.         {  
  16.             GPIO_CAMERA_CMRST_PIN,  
  17.             GPIO_CAMERA_CMRST_PIN_M_GPIO,   /* mode */  
  18.             GPIO_OUT_ONE,                   /* ON state */  
  19.             GPIO_OUT_ZERO,                  /* OFF state */  
  20.             GPIO_CAMERA_CMPDN_PIN,  
  21.             GPIO_CAMERA_CMPDN_PIN_M_GPIO,  
  22.             GPIO_OUT_ONE,   
  23.             GPIO_OUT_ZERO,  
  24.         },  
  25.         //for sub sensor   //前摄像头  
  26.         {  
  27.             GPIO_CAMERA_CMRST1_PIN,   //RST引脚  
  28.             GPIO_CAMERA_CMRST1_PIN_M_GPIO,  
  29.             GPIO_OUT_ONE,    //上电电平  
  30.             GPIO_OUT_ZERO,   //下电电平  
  31.             GPIO_CAMERA_CMPDN1_PIN,  //PDN引脚  
  32.             GPIO_CAMERA_CMPDN1_PIN_M_GPIO,   
  33.             GPIO_OUT_ONE,    //上电电平  
  34.             GPIO_OUT_ZERO,   //下电电平  
  35.         }  
  36.     };  
  37.   
  38.   
  39.     if (DUAL_CAMERA_MAIN_SENSOR == SensorIdx){  
  40.         pinSetIdx = 0;  
  41.         searchMainSensor = KAL_TRUE;  
  42.     }  
  43.     else if (DUAL_CAMERA_SUB_SENSOR == SensorIdx) {  
  44.         pinSetIdx = 1;  
  45.         searchMainSensor = KAL_FALSE;  
  46.     }  
  47.   
  48.     PK_DBG("[kdCISModulePowerOn]:pinSetIdx=%d\n",pinSetIdx);  
  49.   
  50.     //power ON  
  51.     if (On)   //上电时序  
  52.     {  
  53.         PK_DBG("kdCISModulePowerOn -on:currSensorName=%s\n",currSensorName);  
  54.   
  55.         if (currSensorName && ((0 == strcmp(SENSOR_DRVNAME_SP2509MIPI_RAW,currSensorName))))  
  56.         {  
  57.             {  
  58.                 PK_DBG("kdCISModulePowerOn get in---  %s \n",currSensorName);  
  59.                 PK_DBG("[ON_general 2.8V]sensorIdx:%d \n",SensorIdx);  
  60.                 /* SP2509只有两个电源 */                        
  61.                 if(TRUE != hwPowerOn(CAMERA_POWER_VCAM_D2, VOL_1800,mode_name))  //VCAM_IO  先打开DVDDIO电源  
  62.                 {  
  63.                     PK_DBG("[CAMERA SENSOR] Fail to enable digital power\n");  
  64.                     //return -EIO;  
  65.                     goto _kdCISModulePowerOn_exit_;  
  66.                 }             
  67.                 mdelay(1);  
  68.                   
  69.                 if(TRUE != hwPowerOn(CAMERA_POWER_VCAM_A, VOL_2800,mode_name))  //再打开AVDD电源  
  70.                 {  
  71.                     PK_DBG("[CAMERA SENSOR] Fail to enable analog power\n");  
  72.                     //return -EIO;  
  73.                     goto _kdCISModulePowerOn_exit_;  
  74.                 }             
  75.                 mdelay(1);  
  76.       
  77.                 if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST])  
  78.                 {                                         
  79.                     /* RST和PDN先置为低电平 */   
  80.                     //PDN/STBY pin     
  81.                     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!! \n");}  
  82.                     if(mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMPDN],GPIO_DIR_OUT)){PK_DBG("[CAMERA LENS] set gpio dir failed!! \n");}  
  83.                     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!! \n");}  
  84.                     //RST pin  
  85.                     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!! \n");}  
  86.                     if(mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMRST],GPIO_DIR_OUT)){PK_DBG("[CAMERA SENSOR] set gpio dir failed!! \n");}  
  87.                     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!! \n");}  
  88.                     mdelay(1);  
  89.                       
  90.                     //PDN/STBY pin   //PWD高电平脉冲 持续10ms  
  91.                     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!! \n");}  
  92.                     mdelay(10);   
  93.                     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!! \n");}  
  94.                     mdelay(10);   
  95.                       
  96.                     //RST pin   //然后RST置高电平  
  97.                     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!! \n");}  
  98.                     mdelay(10); //  
  99.                 }  
  100.   
  101.                 //disable inactive sensor   //关闭不使用的摄像头  
  102.                 if(pinSetIdx == 0 ) {//disable sub  
  103.                     if (GPIO_CAMERA_INVALID != pinSet[1][IDX_PS_CMRST]) {  
  104.                         if(mt_set_gpio_mode(pinSet[1][IDX_PS_CMRST],pinSet[1][IDX_PS_CMRST+IDX_PS_MODE])){PK_DBG("[CAMERA SENSOR] set gpio mode failed!! \n");}  
  105.                         if(mt_set_gpio_mode(pinSet[1][IDX_PS_CMPDN],pinSet[1][IDX_PS_CMPDN+IDX_PS_MODE])){PK_DBG("[CAMERA LENS] set gpio mode failed!! \n");}  
  106.                         if(mt_set_gpio_dir(pinSet[1][IDX_PS_CMRST],GPIO_DIR_OUT)){PK_DBG("[CAMERA SENSOR] set gpio dir failed!! \n");}  
  107.                         if(mt_set_gpio_dir(pinSet[1][IDX_PS_CMPDN],GPIO_DIR_OUT)){PK_DBG("[CAMERA LENS] set gpio dir failed!! \n");}  
  108.                         if(mt_set_gpio_out(pinSet[1][IDX_PS_CMRST],pinSet[1][IDX_PS_CMRST+IDX_PS_OFF])){PK_DBG("[CAMERA SENSOR] set gpio failed!! \n");} //low == reset sensor  
  109.                         if(mt_set_gpio_out(pinSet[1][IDX_PS_CMPDN],pinSet[1][IDX_PS_CMPDN+IDX_PS_OFF])){PK_DBG("[CAMERA LENS] set gpio failed!! \n");} //high == power down lens module  
  110.                     }  
  111.                 }  
  112.                 else {  
  113.                     if (GPIO_CAMERA_INVALID != pinSet[0][IDX_PS_CMRST]) {  
  114.                         if(mt_set_gpio_mode(pinSet[0][IDX_PS_CMRST],pinSet[0][IDX_PS_CMRST+IDX_PS_MODE])){PK_DBG("[CAMERA SENSOR] set gpio mode failed!! \n");}  
  115.                         if(mt_set_gpio_mode(pinSet[0][IDX_PS_CMPDN],pinSet[0][IDX_PS_CMPDN+IDX_PS_MODE])){PK_DBG("[CAMERA LENS] set gpio mode failed!! \n");}  
  116.                         if(mt_set_gpio_dir(pinSet[0][IDX_PS_CMRST],GPIO_DIR_OUT)){PK_DBG("[CAMERA SENSOR] set gpio dir failed!! \n");}  
  117.                         if(mt_set_gpio_dir(pinSet[0][IDX_PS_CMPDN],GPIO_DIR_OUT)){PK_DBG("[CAMERA LENS] set gpio dir failed!! \n");}  
  118.                         if(mt_set_gpio_out(pinSet[0][IDX_PS_CMRST],pinSet[0][IDX_PS_CMRST+IDX_PS_OFF])){PK_DBG("[CAMERA SENSOR] set gpio failed!! \n");} //low == reset sensor  
  119.                         if(mt_set_gpio_out(pinSet[0][IDX_PS_CMPDN],pinSet[0][IDX_PS_CMPDN+IDX_PS_OFF])){PK_DBG("[CAMERA LENS] set gpio failed!! \n");} //high == power down lens module  
  120.                     }  
  121.                 }  
  122.   
  123.                 mdelay(50);  
  124.             }  
  125.         }  
  126.         else if (currSensorName && ((0 == strcmp(SENSOR_DRVNAME_SP5507MIPI_RAW,currSensorName))))  
  127.         {  
  128.             {  
  129.                 PK_DBG("kdCISModulePowerOn get in---  %s \n",currSensorName);  
  130.                 PK_DBG("[ON_general 2.8V]sensorIdx:%d \n",SensorIdx);  
  131.                 /* SP5507有三个电源 */                             
  132.                 if(TRUE != hwPowerOn(CAMERA_POWER_VCAM_D2, VOL_1800,mode_name))  //VCAM_IO  先打开DOVDD电源  
  133.                 {  
  134.                     PK_DBG("[CAMERA SENSOR] Fail to enable digital power\n");  
  135.                     //return -EIO;  
  136.                     goto _kdCISModulePowerOn_exit_;  
  137.                 }             
  138.                   
  139.                 if(TRUE != hwPowerOn(CAMERA_POWER_VCAM_A, VOL_2800,mode_name))  //再打开AVDD电源  
  140.                 {  
  141.                     PK_DBG("[CAMERA SENSOR] Fail to enable analog power\n");  
  142.                     //return -EIO;  
  143.                     goto _kdCISModulePowerOn_exit_;  
  144.                 }             
  145.                   
  146.                 if(TRUE != hwPowerOn(CAMERA_POWER_VCAM_D, VOL_1200,mode_name))   //最后打开DVDD电源  
  147.                 {  
  148.                     PK_DBG("[CAMERA SENSOR] Fail to enable analog power\n");  
  149.                     //return -EIO;  
  150.                     goto _kdCISModulePowerOn_exit_;  
  151.                 }             
  152.                 mdelay(1);  
  153.       
  154.                 if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST])  
  155.                 {     
  156.                     /* 先把RET(SHUTDOWN)和PWDN置为低电平 */                                       
  157.                     //PDN/STBY pin  
  158.                     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!! \n");}  
  159.                     if(mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMPDN],GPIO_DIR_OUT)){PK_DBG("[CAMERA LENS] set gpio dir failed!! \n");}  
  160.                     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!! \n");}  
  161.                     //RST pin  
  162.                     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!! \n");}  
  163.                     if(mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMRST],GPIO_DIR_OUT)){PK_DBG("[CAMERA SENSOR] set gpio dir failed!! \n");}  
  164.                     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!! \n");}  
  165.                     mdelay(1);  
  166.                                           
  167.                     //RST pin    
  168.                     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!! \n");}  
  169.                     mdelay(2);        
  170.                       
  171.                     //PDN/STBY pin  
  172.                     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!! \n");}  
  173.                     mdelay(20);   
  174.                 }  
  175.   
  176.                 //disable inactive sensor  //关闭其他摄像头  
  177.                 if(pinSetIdx == 0 ) {//disable sub  
  178.                     if (GPIO_CAMERA_INVALID != pinSet[1][IDX_PS_CMRST]) {  
  179.                         if(mt_set_gpio_mode(pinSet[1][IDX_PS_CMRST],pinSet[1][IDX_PS_CMRST+IDX_PS_MODE])){PK_DBG("[CAMERA SENSOR] set gpio mode failed!! \n");}  
  180.                         if(mt_set_gpio_mode(pinSet[1][IDX_PS_CMPDN],pinSet[1][IDX_PS_CMPDN+IDX_PS_MODE])){PK_DBG("[CAMERA LENS] set gpio mode failed!! \n");}  
  181.                         if(mt_set_gpio_dir(pinSet[1][IDX_PS_CMRST],GPIO_DIR_OUT)){PK_DBG("[CAMERA SENSOR] set gpio dir failed!! \n");}  
  182.                         if(mt_set_gpio_dir(pinSet[1][IDX_PS_CMPDN],GPIO_DIR_OUT)){PK_DBG("[CAMERA LENS] set gpio dir failed!! \n");}  
  183.                         if(mt_set_gpio_out(pinSet[1][IDX_PS_CMRST],pinSet[1][IDX_PS_CMRST+IDX_PS_OFF])){PK_DBG("[CAMERA SENSOR] set gpio failed!! \n");} //low == reset sensor  
  184.                         if(mt_set_gpio_out(pinSet[1][IDX_PS_CMPDN],pinSet[1][IDX_PS_CMPDN+IDX_PS_OFF])){PK_DBG("[CAMERA LENS] set gpio failed!! \n");} //high == power down lens module  
  185.                     }  
  186.                 }  
  187.                 else {  
  188.                     if (GPIO_CAMERA_INVALID != pinSet[0][IDX_PS_CMRST]) {  
  189.                         if(mt_set_gpio_mode(pinSet[0][IDX_PS_CMRST],pinSet[0][IDX_PS_CMRST+IDX_PS_MODE])){PK_DBG("[CAMERA SENSOR] set gpio mode failed!! \n");}  
  190.                         if(mt_set_gpio_mode(pinSet[0][IDX_PS_CMPDN],pinSet[0][IDX_PS_CMPDN+IDX_PS_MODE])){PK_DBG("[CAMERA LENS] set gpio mode failed!! \n");}  
  191.                         if(mt_set_gpio_dir(pinSet[0][IDX_PS_CMRST],GPIO_DIR_OUT)){PK_DBG("[CAMERA SENSOR] set gpio dir failed!! \n");}  
  192.                         if(mt_set_gpio_dir(pinSet[0][IDX_PS_CMPDN],GPIO_DIR_OUT)){PK_DBG("[CAMERA LENS] set gpio dir failed!! \n");}  
  193.                         if(mt_set_gpio_out(pinSet[0][IDX_PS_CMRST],pinSet[0][IDX_PS_CMRST+IDX_PS_OFF])){PK_DBG("[CAMERA SENSOR] set gpio failed!! \n");} //low == reset sensor  
  194.                         if(mt_set_gpio_out(pinSet[0][IDX_PS_CMPDN],pinSet[0][IDX_PS_CMPDN+IDX_PS_OFF])){PK_DBG("[CAMERA LENS] set gpio failed!! \n");} //high == power down lens module  
  195.                     }  
  196.                 }  
  197.   
  198.                 mdelay(50);  
  199.             }  
  200.         }  
  201.     }  
  202.     //power OFF  
  203.     else    //下电时序  
  204.     {  
  205.         PK_DBG("kdCISModulePowerOn -off:currSensorName=%s\n",currSensorName);  
  206.   
  207.         if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_SP2509MIPI_RAW, currSensorName)))  
  208.         {  
  209.             PK_DBG("kdCISModulePowerOff, get in---SENSOR_DRVNAME_IMX219_MIPI_RAW \n");  
  210.   
  211.             if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) {  
  212.                 //RST pin  
  213.                 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!! \n");}  
  214.                 if(mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMRST],GPIO_DIR_OUT)){PK_DBG("[CAMERA SENSOR] set gpio dir failed!! \n");}  
  215.                 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!! \n");} //low == reset sensor  
  216.                 mdelay(1);  
  217.                 //PDN/STBY pin  
  218.                 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!! \n");}  
  219.                 if(mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMPDN],GPIO_DIR_OUT)){PK_DBG("[CAMERA LENS] set gpio dir failed!! \n");}  
  220.                 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!! \n");}  
  221.                 mdelay(1);        
  222.             }  
  223.   
  224.             if(TRUE != hwPowerDown(CAMERA_POWER_VCAM_A,mode_name)) {  
  225.                 PK_DBG("[CAMERA SENSOR] Fail to OFF analog power:VCAM_A:VOL_2800\n");  
  226.                 //return -EIO;  
  227.                 goto _kdCISModulePowerOn_exit_;  
  228.             }  
  229.               
  230.             if(TRUE != hwPowerDown(CAMERA_POWER_VCAM_D2, mode_name)) {  
  231.                 PK_DBG("[CAMERA SENSOR] Fail to OFF digital power:VCAM_D:VOL_1200\n");  
  232.                 //return -EIO;  
  233.                 goto _kdCISModulePowerOn_exit_;  
  234.             }  
  235.               
  236.             mdelay(1);    
  237.                   
  238.       //PDN pull down  
  239.       if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMPDN]) {  
  240.         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!! \n");}  
  241.                 if(mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMPDN],GPIO_DIR_OUT)){PK_DBG("[CAMERA LENS] set gpio dir failed!! \n");}  
  242.                 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!! \n");}  
  243.                 mdelay(1);  
  244.       }      
  245.         }   
  246.         else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_SP5507MIPI_RAW, currSensorName)))  
  247.         {  
  248.             PK_DBG("kdCISModulePowerOff, get in---SENSOR_DRVNAME_IMX219_MIPI_RAW \n");  
  249.   
  250.             if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) {  
  251.                 //RST pin  
  252.                 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!! \n");}  
  253.                 if(mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMRST],GPIO_DIR_OUT)){PK_DBG("[CAMERA SENSOR] set gpio dir failed!! \n");}  
  254.                 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!! \n");} //low == reset sensor  
  255.                 mdelay(2);  
  256.                 //PDN/STBY pin  
  257.                 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!! \n");}  
  258.                 if(mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMPDN],GPIO_DIR_OUT)){PK_DBG("[CAMERA LENS] set gpio dir failed!! \n");}  
  259.                 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!! \n");}  
  260.                 mdelay(1);        
  261.             }  
  262.               
  263.             if(TRUE != hwPowerDown(CAMERA_POWER_VCAM_D, mode_name)) {  
  264.                 PK_DBG("[CAMERA SENSOR] Fail to OFF digital power:VCAM_D:VOL_1200\n");  
  265.                 //return -EIO;  
  266.                 goto _kdCISModulePowerOn_exit_;  
  267.             }         
  268.               
  269.             if(TRUE != hwPowerDown(CAMERA_POWER_VCAM_A,mode_name)) {  
  270.                 PK_DBG("[CAMERA SENSOR] Fail to OFF analog power:VCAM_A:VOL_2800\n");  
  271.                 //return -EIO;  
  272.                 goto _kdCISModulePowerOn_exit_;  
  273.             }  
  274.               
  275.             if(TRUE != hwPowerDown(CAMERA_POWER_VCAM_D2, mode_name)) {  
  276.                 PK_DBG("[CAMERA SENSOR] Fail to OFF digital power:VCAM_D:VOL_1200\n");  
  277.                 //return -EIO;  
  278.                 goto _kdCISModulePowerOn_exit_;  
  279.             }         
  280.             mdelay(1);           
  281.         }   
  282.   }  
  283.   
  284.     return 0;  
  285.   
  286. _kdCISModulePowerOn_exit_:  
  287.     return -EIO;  
  288. }  

根据芯片的上电时序图把大致的上电时序设置好就可以使摄像头工作起来;这里的上电时序没有像协议时序那般严格,只需要大致配置好就可以了;


4、修改i2c控制器
打开mediatek\custom\common\kernel\imgsensor\src\kd_sensorlist.c,修改 i2c_register_board_info(SUPPORT_I2C_BUS_NUM, &i2c_devs, 1);中的SUPPORT_I2C_BUS_NUM设置为实际电路使用的i2c控制器


如果开机后,相机无法起来,那就应该查看系统log,判断是否能够获取到Camera的ID,硬件上必须保证I2C能够正常通信;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值