MTk項目相關

一.編譯步驟:

source build/envsetup.sh

工模密碼:*#*#3646633#*#*

文檔密碼:2425575785

adb進工模:adb shell am start com.mediatek.engineermode/.EngineerMode 

config配置,從kernel-3.10\tools\dct\DrvGen.ext打開kernel-3.10\drivers\misc\mediatek\mach\mt6735\newmobi6735_65u_v_l1\dct\dct\codegen.dws文件,修改配置後,替換lk pl下的codegen.dws,

Eservice:  http://eservice.mediatek.com
DCC:
  http://dcc.mediatek.com
FES:
  https://fex.mediatek.com

Online:  https://online.mediatek.com


lunch 11 :eng版本有uartlog,user版本沒有uartlog,具體區別如下:

  

eng

user debug

user

uart 

 log buff

 uart

log buff 

 uart

log buff 

 pr_emerg

 Yes

  Yes

  No

 Yes

  No

 Yes

 pr_alert

 Yes

  Yes

  No

 Yes

  No

 Yes

 pr_crit

 Yes

  Yes

  No

 Yes

  No

 Yes

 pr_err

 Yes

  Yes

  No

 Yes

  No

 Yes

 pr_warning

 Yes

  Yes

  No

 Yes

  No

 Yes

 pr_notice

 Yes

  Yes

  No

 Yes

  No

 Yes

 pr_info

 Yes

  Yes

  No

 Yes

  No

 Yes

 pr_debug

 No

  Yes

  No

  No

  No

  No

 

make MTK_BUILD_ROOT=yes -j33 \r(直接make會導致uart只打印部分log後停掉)


On eng load, you can enable pr_debug on UART by echo 8 > /proc/sys/kernel/printk.

echo 1 4 1 7 >/proc/sys/kernel/printk -r   eng模式下disable串口uartlog


修改內核後,重新編譯boot.img即可:make bootimage.img

重新生成lk:mmm vendor/mediatek/proprietary/bootable/bootloader/lk:lk -j33

重新生成preload:mmm vendor/mediatek/proprietary/bootable/bootloader/preload:pl -j33

修改out下內容後重新生成system.img:make snod


二.遇到的問題及解決過程

1.eeprom讀寫,系統崩潰問題;

寫了個eeprom的驅動,上層去調用的時候,沒write read,系統就重啓,後面發現是i2c_client沒有申請空間的原因

eeprom_client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
if (!eeprom_client) {
return -ENOMEM;
}

/* 
 *
 * Copyright (C) 2010 ROCKCHIP, Inc.
 *
 * This software is licensed under the terms of the GNU General Public
 * License version 2, as published by the Free Software Foundation, and
 * may be copied, distributed, and modified under those terms.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 *[email protected]
 *
 */
#include <linux/module.h>
#include <linux/i2c.h>
#include <linux/bcd.h>
#include <linux/delay.h>
#include <linux/slab.h>
#include<linux/gpio.h>
#include <linux/miscdevice.h>
#include<linux/fs.h>
//#include "eeprom_at24c16.h"

#define EEPROM_SPEED 100 * 1000

#if 1
#define DBG(x...) printk(KERN_INFO x)
#else
#define DBG(x...) do { } while (0)
#endif

#if 1
#define ERR(x...) printk(KERN_ERR x)
#else
#define ERR(x...) do { } while (0)
#endif

struct i2c_client *eeprom_client;

static int i2c_master_reg8_recv(const struct i2c_client *client, const char reg, char *buf, int count, int scl_rate)
{
struct i2c_adapter *adap=client->adapter;
struct i2c_msg msgs[2];
int ret;
char reg_buf = reg;

msgs[0].addr = client->addr;
msgs[0].flags = client->flags;
msgs[0].len = 1;
msgs[0].buf = &reg_buf;
//msgs[0].scl_rate = scl_rate;


msgs[1].addr = 0x50;//client->addr;
msgs[1].flags = client->flags | I2C_M_RD;
msgs[1].len = count;
msgs[1].buf = (char *)buf;
//msgs[1].scl_rate = scl_rate;


ret = i2c_transfer(adap, msgs, 2);
return (ret == 2)? count : ret;
}

static int i2c_master_reg8_send(const struct i2c_client *client, const char reg, const char *buf, int count, int scl_rate)
 {
  struct i2c_adapter *adap=client->adapter;
struct i2c_msg msg;
int ret;
char *tx_buf = (char *)kmalloc(count + 1, GFP_KERNEL);
if(!tx_buf)
return -ENOMEM;
tx_buf[0] = reg;
memcpy(tx_buf+1, buf, count); 

msg.addr = client->addr;
msg.flags = client->flags;
msg.len = count + 1;
msg.buf = (char *)tx_buf;
//msg.scl_rate = scl_rate;

ret = i2c_transfer(adap, &msg, 1);
kfree(tx_buf);

return (ret == 1) ? count : ret;
}

static int eeprom_i2c_read(struct i2c_client *client, u8 reg, u8 buf[], unsigned len)
{
int ret; 
ret = i2c_master_reg8_recv(client, reg, buf, len, EEPROM_SPEED);
//ret = i2c_master_recv(client, buf, len);//(const struct i2c_client *client, char *buf, int count);
if (ret != len)
ERR("eeprom i2c read fail,ret=0x%x\n",ret);
//  printk("buf=%s\n",buf);
return ret; 
}

static int eeprom_i2c_write(struct i2c_client *client, u8 reg, u8 buf[], unsigned len)
{
int ret; 

ret = i2c_master_reg8_send(client, reg, buf, len, EEPROM_SPEED);
//ret = i2c_master_send(client,  buf_w, len);//(const struct i2c_client *client, const char *buf, int count)
if (ret != len)
ERR("eeprom i2c write fail,ret=0x%x\n",ret);

return ret; 
}

int eeprom_read_data(u8 reg, u8 buf[], unsigned len)
{
int ret,page_num,rest_num,i;  

DBG("eeprom read data,offset=0x%x,len=0x%x\n",reg,len);

if((len>0)&&(len<=16))
{
ret = eeprom_i2c_read(eeprom_client, reg, buf, len);
}
else
{
page_num = len/16;
rest_num = len%16;
for(i=0;i<page_num;i++)
{
ret=eeprom_i2c_read(eeprom_client, reg+i*16, buf+i*16, 16);
}
ret=eeprom_i2c_read(eeprom_client, reg+i*16, buf+i*16, rest_num);
}
return ret;
}

int eeprom_write_data(u8 reg, u8 buf[], unsigned len)
{
    int ret,page_num,rest_num,i; 

DBG("eeprom write data,offset=0x%x,len=0x%x \n",reg,len);
    DBG("buf=%s \n",buf);
if((len>0)&&(len<=16))
{
ret = eeprom_i2c_write(eeprom_client, reg, buf, len);
}
else
{
page_num = len/16;
rest_num = len%16;
for(i=0;i<page_num;i++)
{
ret=eeprom_i2c_write(eeprom_client, reg+i*16, buf+i*16, 16);
}
ret=eeprom_i2c_write(eeprom_client, reg+i*16, buf+i*16, rest_num);
}
    return ret;
}
static int at24c16_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
//u8 buf_test[4]="abc",buf_read_buf[4];
//int i;
DBG("enter at24c16_probe\n");
    
if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
return -ENODEV;
eeprom_client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
if (!eeprom_client) {
return -ENOMEM;
}
eeprom_client = client;

#if 0
eeprom_write_data(16,buf_test,4);
msleep(10);
eeprom_read_data(16,buf_read_buf,4);
for(i=0;i<4;i++)
{
printk("************simon read_buf:%x \n",buf_read_buf[i]);
}
printk("\n");
msleep(5000);
#endif

DBG("exit at24c16_probe!\n");
  
return 0;
}

static int at24c16_remove(struct i2c_client *client)
{
DBG("exit at24c16_remove!\n");

if (eeprom_client)
kfree(eeprom_client);
eeprom_client = NULL;
return 0;
}

static ssize_t eeprom_test_driver_read(
struct file *file, char *buf, size_t count, loff_t *ppos)
{
char buf_read_buf[37]="0";
DBG("*********simon in %s:%d\n",__FUNCTION__,__LINE__);
eeprom_read_data(16,buf_read_buf,37);
msleep(20);
DBG("*********simon in %s:%d,buf_read=%s\n",__FUNCTION__,__LINE__,buf_read_buf);

return 0;
}

static ssize_t eeprom_test_driver_write(
struct file *file, const char *buf, size_t count, loff_t *ppos)
{
char buf_test[37]="abcdefghijklmnopqrstuvwxyz0123456789";
DBG("*********simon in %s:%d,\n",__FUNCTION__,__LINE__);
eeprom_write_data(16,buf_test,37);

return 0;
}

static const struct file_operations eeprom_test_device_ops = {
.owner          = THIS_MODULE,
.read           = eeprom_test_driver_read,
.write = eeprom_test_driver_write,
};

static struct miscdevice eeprom_test_device = {
.minor = MISC_DYNAMIC_MINOR,
.name = "eeprom",
.fops = &eeprom_test_device_ops
};

static const struct of_device_id eeprom_of_match[] = {
{.compatible = "mediatek,eeprom",},
{},
};

MODULE_DEVICE_TABLE(of, eeprom_of_match);

static const struct i2c_device_id at24c16_id[] = {
{ "eeprom_at24c16", 0 },
{ }
};

static struct i2c_driver at24c16_driver = {
.driver = {
.name = "eeprom_at24c16",//0x50
.of_match_table = of_match_ptr(eeprom_of_match),
.owner = THIS_MODULE,
},
.probe = at24c16_probe,
.remove = at24c16_remove,
.id_table = at24c16_id,
};

static int __init at24c16_init(void)
{
misc_register(&eeprom_test_device);
return i2c_add_driver(&at24c16_driver);
}

static void __exit at24c16_exit(void)
{
misc_deregister(&eeprom_test_device);
i2c_del_driver(&at24c16_driver);
}

MODULE_AUTHOR("[email protected]");
MODULE_DESCRIPTION("atmel 24c16 eeprom driver");
MODULE_LICENSE("GPL");

//fs_initcall(at24c16_init);
subsys_initcall_sync(at24c16_init);
//subsys_initcall(at24c16_init);
module_exit(at24c16_exit);

 2.i2c佔用的問題:cm4端發現他們發送的數據錯亂,後面發現是ap&cm4兩個主設置在操作i2c,後面把ap這邊i2c上掛的設備去掉就ok。


3.關閉wdt,echo 0 20 30 0 0 >/proc/wdk


4.main--Camra imx298調試

接在CSI-0,軟件上和CAMERA_MAIN相對應 i2c地址0x1a

 

alps/device/mediatek/common/kernel-headers/kd_imgsensor.h中增加

#define IMX298_SENSOR_ID    0x0298  //simon add 此ID從datasheet中出看默認

#define SENSOR_DRVNAME_IMX298_MIPI_RAW   "imx298mipiraw"  //simon add

 

kernel/driver/misc/mediatek/imgsensor/inc/kd_imgsensor.h中增加

#define IMX298_SENSOR_ID    0x0298  //simon add 此ID從datasheet中出看默認

#define SENSOR_DRVNAME_IMX298_MIPI_RAW   "imx298mipiraw"  //simon add

 

kernel/driver/misc/mediatek/imagsensor/src/mt6797/kd_sensorlist.h中增加

UINT32 IMX298_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc);     //simon add

#if defined(IMX298_MIPI_RAW)

    {IMX298_SENSOR_ID, SENSOR_DRVNAME_IMX298_MIPI_RAW, IMX298_MIPI_RAW_SensorInit}, //simon add

#endif

 

vendor/mediatek/proprietary/custom/mt6797/hal/imgsenosr_src/sensorlist.cpp中增加(注意順序一定要和kd_sensorlist.h中相對應)

#if defined(IMX298_MIPI_RAW)

    RAW_INFO(IMX298_SENSOR_ID, SENSOR_DRVNAME_IMX298_MIPI_RAW,NULL), //simon add

#endif

 

kernel/driver/misc/mediatek/imgsensor/src/mt6797/camera_hw/kd_camera_hw.c中增加上電時序(嚴格根據Datasheet或直接使用廠家提供的時序)

{SENSOR_DRVNAME_IMX298_MIPI_RAW,         //simon add

  {

   {SensorMCLK, Vol_High, 0},

   {AVDD, Vol_2800, 10},

   {DOVDD, Vol_1800, 10},

   {DVDD, Vol_1200, 10},

   {AFVDD, Vol_2800, 5},

   {PDN, Vol_Low, 0},

   {PDN, Vol_High, 0},

   {RST, Vol_Low, 0},

   {RST, Vol_High, 0}

   },

  },

ProjectConfig.mk和k97v1_64_op01_pre_debug_defconfig增加imx298_mipi_raw的相關配置

把kernel和hal的相關文件放到系統恰當目錄下

5.S5K5E8調試注意的地方

硬件接在CSI-2上,DWS中的I2C配置時需要設置爲CAMERA_MAIN_TWO,

由於供電上是直接用的PMU的電,沒有用GPIO控制,需要把kd_camera_hw.c中的GPIO_SUPPORTED該爲GPIO_UNSUPPORTED

 

PowerCust PowerCustList = {

{

 {GPIO_SUPPORTED, GPIO_MODE_GPIO, Vol_High}, /* for AVDD; */

 {GPIO_SUPPORTED, GPIO_MODE_GPIO, Vol_High}, /* for DVDD; */

 {GPIO_UNSUPPORTED, GPIO_MODE_GPIO, Vol_Low}, /* for DOVDD; */

 {GPIO_UNSUPPORTED, GPIO_MODE_GPIO, Vol_Low}, /* for AFVDD; */

 {GPIO_UNSUPPORTED, GPIO_MODE_GPIO, Vol_Low}, /* for SUB_AVDD; */

 {GPIO_UNSUPPORTED, GPIO_MODE_GPIO, Vol_Low}, /* for SUB_DVDD; */

 {GPIO_UNSUPPORTED, GPIO_MODE_GPIO, Vol_High}, /* for SUB_DOVDD; */

 {GPIO_UNSUPPORTED, GPIO_MODE_GPIO, Vol_High}, /* for MAIN2_AVDD; */ //simon add this is different with public board

 {GPIO_UNSUPPORTED, GPIO_MODE_GPIO, Vol_High}, /* for MAIN2_DVDD; */  //simon add

 {GPIO_UNSUPPORTED, GPIO_MODE_GPIO, Vol_High}, /* for MAIN2_DOVDD; */

/* {GPIO_SUPPORTED, GPIO_MODE_GPIO, Vol_Low}, */

 }

};

由於MTK公版那邊CSI-2這一路camera沒有通,軟件上講起改爲sub,patch如下

敝司在evb板上覆現了您現在的問題,(1)只安裝main_two,在開機的時候會嘗試搜索多次;(2)安裝main + main_two,無法出圖,工模下也沒有main_2;且貴司的基線版本看起來較舊,p66?預計也無法看到main_2

基於此,請按照以下建議,在軟件上將main_2識別成sub
1)文件:kd_camera_hw.c函數:kdCISModulePowerOn變量:pinSetIdx //影響DVDDDOVDDAVDDAFVDDPWDNRESET
修改後的code爲:
    if (DUAL_CAMERA_MAIN_SENSOR == SensorIdx) {
        pinSetIdx = 0;
    } else if (DUAL_CAMERA_SUB_SENSOR == SensorIdx) {
        pinSetIdx = 2; // 1
    } else if (DUAL_CAMERA_MAIN_2_SENSOR == SensorIdx) {
        pinSetIdx = 1;    // 2
    }
2)文件:cfg_setting_imgsensor.cpp函數:getSensorMclkConnection //影響MCLK
修改後的code爲:
MINT32 getSensorMclkConnection(EDevId const eDevId)
{
switch (eDevId)
{
case eDevId_ImgSensor0://main
return eMclk_1;
case eDevId_ImgSensor1://sub
return eMclk_3;    //eMclk_2
case eDevId_ImgSensor2://3d
return eMclk_2;    //eMclk_3
default:
break;
}
return -1;
}
3)文件:cfg_setting_imgsensor.cpp函數:getMipiSensorPort //影響mipi接口
修改後的code爲:
MINT32 getMipiSensorPort(EDevId const eDevId)
{
switch (eDevId)
{
case eDevId_ImgSensor0://main
return ePort_1;
case eDevId_ImgSensor1://sub
return ePort_3;    //ePort_2
case eDevId_ImgSensor2://3d
return ePort_2;    //ePort_3
default:
break;
}
return -1;

}

6.kconfig的修改,

.cd kernel-3.18

mkdir out

ARCH=arm64 make O=out k97v1_64_op01_pre_debug_defconfig(目標targer——debug)

(get old config)

ARCH=arm64 make O=out menuconfig(config interface)

7.codegen.dws的i2c裏面沒有msp430設備,直接在dts裏面增加

&i2c5 {

    #address-cells = <1>;

    #size-cells = <0>;

    msp430@2d {

        compatible = "msp430";

        reg = <0x2d>;

    };

}; 

8.flash不能掛載:解析音頻的一個xml文件失敗,原因是device中註釋不對。

9.selinux :問題:,編譯的二進制文件放到system/bin下面,init中加運行後會導致系統不能起來。

     分析:selinux會對系統下的目錄文件進程等進行加密處理,從Android5.0加入的安全機制(http://blog.csdn.net/innost/article/details/19641487)

     解決:在system/core/rootdir/init.rc中:

service console /system/bin/sh
    class core
    console
    disabled
#    user shell
#    seclabel u:r:shell:s0


10.GPS NDK,com_android_server_location_GpsLocationProvider.cpp,中init過程註冊了回調,要實現NDK,要把裏面的init直接返回

static jboolean android_location_GpsLocationProvider_init(JNIEnv* env, jobject obj)
{
 
ALOGE(" %s ",__FUNCTION__);
return JNI_FALSE;

11.CM4中的SPI和AP這邊的共用導致的問題:AP這邊接的是FPC1145,把該模塊從defconfig和projectConfig.mk中註釋掉即可。


12.GPS相關

 (1 )GPS輸出的是NMEA格式的數據,頻率1HZ,芯片MT6176,initspeed 38400,link_speed 921600 26m時鐘 時鐘頻偏採用默認2000ppm 

 (NMEA解析http://blog.csdn.net/zhandoushi1982/article/details/7947682)

(GPS調試log分析總結http://blog.csdn.net/goodtalent/article/details/50157791)

(2)GPS頻率由1Hz改爲10HZ在vender/mediatek/proprietary/hardware/connectivity/gps/mnl/mnl_aosp/mnld/src/mnld/c

    /*setting 1Hz/5Hz */
    if (g_is_1Hz) {
        init_cfg.fix_interval = 100;               //  1000-->100 5Hz update rate
    } else {
         init_cfg.fix_interval = 200;               //  5Hz update rate
    }

再替換相應的庫:vendor/mediatek/propriety/hardware/connectivity/gps/mnl/mnl_aosp/mnld/libs/libmnl.so  libRSDTimestamp.a libRSDTimestamp.a

(3)位GPS的hardware增加和native的socket通道

#define _MTK_GPS_C_
#include <sys/ioctl.h>
#include <sys/time.h>
// #include <linux/mtgpio.h>
// for EPO file
#include <sys/stat.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <cutils/properties.h>
// for read NVRAM
#include "libnvram.h"
#include "CFG_GPS_File.h"
#include "CFG_GPS_Default.h"
#include "CFG_file_lid.h"
#include "Custom_NvRam_LID.h"
#include "mnl_linux.h"
#include "SUPL_encryption.h"
#include <private/android_filesystem_config.h>
/******************************************************************************
* Macro & Definition
******************************************************************************/
//#define LIB_MQUEUE
#define MNL_MSG_RING_SIZE 128
#define MAX_RETRY_COUNT 20
/******************************************************************************
* Static variables
******************************************************************************/
#if defined(LIB_MQUEU)
// message queue file descriptor
static mqd_t mnl_agps_mq_fd = -1;
struct mq_attr mnl_agps_mq_attr;
#else
#endif
/******************************************************************************
* Extern Variables
******************************************************************************/
extern FILE *dbglog_fp;
extern MTK_GPS_BOOL enable_dbg_log;


extern int deltat_read_clear(long *diff_sec);   // newT - oldT
// for read NVRAM
extern MNL_CONFIG_T mnl_config;
extern ap_nvram_gps_config_struct stGPSReadback;
extern int gps_nvram_valid;
char nvram_init_val[PROPERTY_VALUE_MAX];


/*=============================================================================
*
*   Utility functions for NMEA
*
=============================================================================*/


#if defined(LIB_MQUEU)
#else
#endif
#define PMTK_FS_REQ_MEAS                736
#define PMTK_FRAME_TIME_ACK             737
#define PMTK_FS_SLEEPMODE               738


#define MTK_MNLDTOSUPERSENSOR         "/data/supersensor/fmgps/mnld2fm"
int nativesock = 0;

/*=
============================================================================
*
*   Porting Layer functions
*
=============================================================================*/
/*****************************************************************************
 * FUNCTION
 *  mtk_gps_sys_init
 * DESCRIPTION
 *
 * PARAMETERS
 *
 * RETURNS
 *
 *****************************************************************************/
int mtk_gps_sys_init()
{
    // int gps_nvram_fd = 0;
    F_ID gps_nvram_fd;
    int file_lid = AP_CFG_CUSTOM_FILE_GPS_LID;
    int rec_size;
    int rec_num;
    int i;
    int read_nvram_ready_retry = 0;


nativesock = socket(PF_LOCAL, SOCK_DGRAM, 0);    // for native gps message
 
    /* create message queue */
#if defined(LIB_MQUEUE)
    mnl_agps_mq_attr.mq_maxmsg = 72;
    mnl_agps_mq_attr.mq_msgsize = sizeof(MTK_GPS_AGPS_AGENT_MSG);
    mnl_agps_mq_attr.mq_flags   = 0;
    mnl_agps_mq_fd = mq_open (MNL_AGPS_MQ_NAME, O_CREAT|O_RDWR|O_EXCL, PMODE, &mnl_agps_mq_attr);


    if (mnl_agps_mq_fd == -1) {
        MNL_MSG("Fail to create mnl_agps_msg_queue, errno=%s\n", strerror(errno));
        if (errno == EEXIST) {
            MNL_MSG("mnl_agps_msg_queue already exists, unlink it now ...\n");
            mq_unlink(MNL_AGPS_MQ_NAME);
        }
        return MTK_GPS_ERROR;
    }
#else
#endif
#ifdef MTK_GPS_NVRAM
    MNL_MSG("Start to read nvram");
    while (read_nvram_ready_retry < MAX_RETRY_COUNT) {
        read_nvram_ready_retry++;
        property_get("service.nvram_init",nvram_init_val,NULL);
        if (strcmp(nvram_init_val, "Ready") == 0 || strcmp(nvram_init_val, "Pre_Ready") == 0) {
            MNL_MSG("nvram_init_val Ready");
            break;
        } else {
            MNL_MSG("nvram_init_val not Ready,sleep 500ms");
            usleep(500*1000);
        }
    }
    MNL_MSG("Get nvram restore ready retry cc=%d\n", read_nvram_ready_retry);
    if (read_nvram_ready_retry >= MAX_RETRY_COUNT) {
        MNL_MSG("Get nvram restore ready faild, return\n");
        return MTK_GPS_ERROR;
    }


    memset(&stGPSReadback, 0, sizeof(stGPSReadback));


    gps_nvram_fd = NVM_GetFileDesc(file_lid, &rec_size, &rec_num, ISREAD);
    if (gps_nvram_fd.iFileDesc >= 0) {
        read(gps_nvram_fd.iFileDesc, &stGPSReadback , rec_size*rec_num);
        NVM_CloseFileDesc(gps_nvram_fd);


        if (strlen(stGPSReadback.dsp_dev) != 0) {
            gps_nvram_valid = 1;
            // strncpy(mnl_config.dev_dsp, stGPSReadback.dsp_dev, sizeof(mnl_config.dev_dsp));


            MNL_MSG("GPS NVRam (%d * %d) : \n", rec_size, rec_num);
            MNL_MSG("dsp_dev(/dev/stpgps) : %s\n", stGPSReadback.dsp_dev);
            // MNL_MSG("gps_if_type : %d\n", stGPSReadback.gps_if_type);
            MNL_MSG("gps_tcxo_hz : %d\n", stGPSReadback.gps_tcxo_hz);
            MNL_MSG("gps_tcxo_ppb : %d\n", stGPSReadback.gps_tcxo_ppb);
            MNL_MSG("gps_tcxo_type : %d\n", stGPSReadback.gps_tcxo_type);
            MNL_MSG("gps_lna_mode : %d\n", stGPSReadback.gps_lna_mode);
            // MNL_MSG("gps_sbas_mode : %d\n", stGPSReadback.gps_sbas_mode);
        } else {
            MNL_MSG("GPS NVRam mnl_config.dev_dsp == NULL \n");
        }
    }
    else {
           MNL_MSG("GPS NVRam gps_nvram_fd == NULL \n");
    }
    #endif
    return MTK_GPS_SUCCESS;
}
/*****************************************************************************
 * FUNCTION
 *  mtk_gps_sys_uninit
 * DESCRIPTION
 *
 * PARAMETERS
 *
 * RETURNS
 *
 *****************************************************************************/
int mtk_gps_sys_uninit() {
#if defined(LIB_MQUEUE)
    mq_close(mnl_mq_fd);         /* Close message queue in parent */
    mq_unlink(MNL_MQ_NAME);      /* Unlink message queue */
    mq_close(mnl_agps_mq_fd);    /* Close message queue in parent */
    mq_unlink(MNL_AGPS_MQ_NAME);  /* Unlink message queue */
#else
#endif


    return MTK_GPS_SUCCESS;
}


// -1 means failed, 0 means success
int mtk_nativegps_send(int sockfd, void* dest, char* buf, int size) {
    int ret = 0;
    int len = 0;
    struct sockaddr_un soc_addr;
    socklen_t addr_len;
    int retry = 10;


    strcpy(soc_addr.sun_path, dest);
    soc_addr.sun_family = AF_UNIX;
    addr_len = (offsetof(struct sockaddr_un, sun_path) + strlen(soc_addr.sun_path) + 1);


    MNL_MSG("mtk_daemon_send %d size %d ", sockfd, size);
    while ((len = sendto(sockfd, buf, size, 0,
        (const struct sockaddr *)&soc_addr, (socklen_t)addr_len)) == -1) {
        if (errno == EINTR) continue;
        if (errno == EAGAIN) {
            if (retry-- > 0) {
                usleep(100 * 1000);
                continue;
            }
        }
        MNL_MSG("[hal2mnld] ERR: sendto dest=[%s] len=%d reason =[%s]\n",
            (char *)dest, size, strerror(errno));
        ret = -1;
        break;
    }
       // unlink(soc_addr.sun_path);
    return ret;
}




/*****************************************************************************
 * FUNCTION
 *  mtk_gps_sys_nmea_output_to_app
 * DESCRIPTION
 *  Transmit driver debug message to APP
 *  (The function body needs to be implemented)
 * PARAMETERS
 *  msg         [IN]
 * RETURNS
 *  success(MTK_GPS_SUCCESS)
 *****************************************************************************/
INT32
mtk_gps_sys_nmea_output_to_app(const char* buffer, UINT32 length) {


if(0 == access(MTK_MNLDTOSUPERSENSOR,0)) {
int ret = -1;
MNL_MSG("start send nmea to %s", MTK_MNLDTOSUPERSENSOR);
ret = mtk_nativegps_send(nativesock, MTK_MNLDTOSUPERSENSOR, (char*)buffer, (int)length);
if(0 != ret )
MNL_MSG("send nmea to %s fail", MTK_MNLDTOSUPERSENSOR);
}


    if (enable_dbg_log == MTK_GPS_TRUE) {
        // Need to use prop to control debug on/of
        MNL_MSG("%s %d", buffer, length);
    }
    return MTK_GPS_SUCCESS;
}


/*****************************************************************************
 * FUNCTION
 *  mtk_gps_sys_epo_open
 * DESCRIPTION
 *  Open EPO file
 * RETURNS
 *  success(MTK_GPS_SUCCESS)
 *****************************************************************************/
INT32
mtk_gps_sys_epo_open(void) {
    return MTK_GPS_ERROR;  // 0
}


/*****************************************************************************
 * FUNCTION
 *  mtk_gps_sys_epo_close
 * DESCRIPTION
 *  Close EPO file
 * RETURNS
 *  void
 *****************************************************************************/
void
mtk_gps_sys_epo_close(void) {
    return;
}


/*****************************************************************************
 * FUNCTION
 *  mtk_gps_sys_epo_read
 * DESCRIPTION
 *  Read EPO file
 *  (blocking read until reaching 'length' or EOF)
 * PARAMETERS
 *  buffer      [OUT]
 *  offset      [IN]
 *  length      [IN]
 *  p_nRead     [OUT]
 * RETURNS
 *  success(MTK_GPS_SUCCESS)
 *****************************************************************************/
INT32
mtk_gps_sys_epo_read (void* buffer, UINT32 offset, UINT32 length,
                      UINT32* p_nRead) {
    return MTK_GPS_ERROR;  // 0
}


/*****************************************************************************
 * FUNCTION
 *  mtk_gps_sys_pmtk_cmd_cb
 * DESCRIPTION
 *  Notify porting layer that MNL has received one PMTK command.
 * PARAMETERS
 *  UINT16CmdNum        [IN]  The received PMTK command number.
 * RETURNS
 *  void
 *****************************************************************************/
void
mtk_gps_sys_pmtk_cmd_cb(UINT16 UINT16CmdNum) {
    ;
}
unsigned char
calc_nmea_checksum1(const char* sentence) {
    unsigned char checksum = 0;


    while (*sentence) {
        checksum ^= (unsigned char)*sentence++;
    }


    return  checksum;
}


INT32 mtk_gps_sys_frame_sync_meas_req(MTK_GPS_FS_WORK_MODE mode) {
    char szBuf_cipher[64];
    char sztmp[64];
    char outbuf[64];


    memset(outbuf,0,sizeof(outbuf));
    memset(sztmp,0,sizeof(sztmp));
    memset(szBuf_cipher,0,sizeof(szBuf_cipher));
    sprintf(sztmp,"PMTK%d,1,%d",PMTK_FS_REQ_MEAS,mode);
    sprintf(outbuf,"$%s*%02X\r\n",sztmp,calc_nmea_checksum1(sztmp));


   // #ifdef ENABLE_SUPL_PMTK_ENCRYPTION
    SUPL_encrypt((unsigned char *)outbuf, (unsigned char *)szBuf_cipher, strlen(outbuf));
   // #else
   // memcpy(szBuf_cipher, outbuf, strlen(outbuf));
   // #endif
    mtk_gps_sys_agps_disaptcher_callback(MTK_AGPS_CB_SUPL_PMTK, strlen(szBuf_cipher), szBuf_cipher);


    return MTK_GPS_SUCCESS;
}


INT32 mtk_gps_sys_frame_sync_enable_sleep_mode(unsigned char mode) {
    char szBuf_cipher[64];
    char sztmp[64];
    char outbuf[64];


    memset(outbuf,0,sizeof(outbuf));
    memset(sztmp,0,sizeof(sztmp));
    memset(szBuf_cipher,0,sizeof(szBuf_cipher));
    sprintf(sztmp,"PMTK%d,%d",PMTK_FS_SLEEPMODE,mode);
    sprintf(outbuf,"$%s*%02X\r\n",sztmp,calc_nmea_checksum1(sztmp));




   // #ifdef ENABLE_SUPL_PMTK_ENCRYPTION
    SUPL_encrypt((unsigned char *)outbuf, (unsigned char *)szBuf_cipher, strlen(outbuf));
   // #else
   // memcpy(szBuf_cipher, outbuf, strlen(outbuf));
   // #endif
    mtk_gps_sys_agps_disaptcher_callback(MTK_AGPS_CB_SUPL_PMTK, strlen(szBuf_cipher), szBuf_cipher);


    return MTK_GPS_SUCCESS;
}
INT32 mtk_gps_sys_frame_sync_meas_req_by_network(void) {
    char szBuf_cipher[64];
    char sztmp[64];
    char outbuf[64];


    memset(outbuf,0,sizeof(outbuf));
    memset(sztmp,0,sizeof(sztmp));
    memset(szBuf_cipher,0,sizeof(szBuf_cipher));
    sprintf(sztmp,"PMTK%d,0,0",PMTK_FS_REQ_MEAS);
    sprintf(outbuf,"$%s*%02X\r\n",sztmp,calc_nmea_checksum1(sztmp));


   // #ifdef ENABLE_SUPL_PMTK_ENCRYPTION
    SUPL_encrypt((unsigned char *)outbuf, (unsigned char *)szBuf_cipher, strlen(outbuf));
   // #else
   // memcpy(szBuf_cipher, outbuf, strlen(outbuf));
   // #endif
    mtk_gps_sys_agps_disaptcher_callback(MTK_AGPS_CB_SUPL_PMTK, strlen(szBuf_cipher), szBuf_cipher);


    return MTK_GPS_SUCCESS;
}

(4)關閉AGPS,Drone Mode

MNL_CONFIG_T mnl_config =
{
    .init_speed = 38400,
    .link_speed = 921600,
    .debug_nmea = 1,
    .debug_mnl  = MNL_NEMA_DEBUG_SENTENCE, /*MNL_NMEA_DEBUG_NORMAL,*/
    .pmtk_conn  = PMTK_CONNECTION_SOCKET,
    .socket_port = 7000,
    .dev_dbg = DBG_DEV,
    .dev_dsp = DSP_DEV,
    .dev_gps = GPS_DEV,
    .bee_path = BEE_PATH,
    .epo_file = EPO_FILE,
    .epo_update_file = EPO_UPDATE_HAL,
    .qepo_file = QEPO_FILE,
    .qepo_update_file = QEPO_UPDATE_HAL,
    .delay_reset_dsp = 500,
    .nmea2file = 0,
    .dbg2file = 0,
    .nmea2socket = 1,
    .dbg2socket = 0,
    .timeout_init = 0,
    .timeout_monitor = 0,
    .timeout_wakeup = 0,
    .timeout_sleep = 0,
    .timeout_pwroff = 0,
    .timeout_ttff = 0,
    .EPO_enabled = 0,//1--->0 EPO是可以提供星曆輔助數據
    .BEE_enabled = 0,//1--->0 BEE是可以提供星曆輔助數據
    .SUPL_enabled = 0,//1--->0 關閉AGPS


(5) GPS搜不到星或搜星少,2G RF校準,校準後clock穩定些,不會出現漂移。

13 init.rc中運行bin可執行文件

       service blackbox /system/bin/blackbox
    class late_start
user root


14 dws修改:要修改kernel lk preload下的共三個codegen.dws


15 camera相關

(1)光流攝像頭100幀 60H在,CameraA,4K=3840x2160  4086x2304 YCBcr_420_888    2K=2304x1296

      (2)API2.

 vendor/mediatek/propertary/custom/mt6797/hal/imgsensor_metadata/common/config_static_metadata_common.h

        CONFIG_METADATA_BEGIN(MTK_HAL_VERSION)
       
    CONFIG_ENTRY_VALUE(MTK_HAL_VERSION_3_3, MINT32)//


       
CONFIG_METADATA_END()

16 user編譯模式下打開debug

on property:ro.debuggable=1
   
start console

build/core/main.mk : ADDITIONAL_DEFAULT_PROPERTIES += ro.debuggable=1


17 ap功率小,輸出聲音小:ap有四種模式,直接將GPIO拉高是D模式,要用脈衝控制使其工作在AB模式。D模式輸出的是方波,硬件需要加低通濾波電路,AB模式輸出的是模擬正玄波,可以直接加到喇叭。

18 AP概率性讀不到電池數據:msp430把i2c拉低了,原因可能是時鐘太快(400K),改爲100K 再測,發現還是不行,最後發現是AP和M3兩個主控都接在了這個i2c上,把M3上的i2c斷開後,初測沒問題。

19 source build/envsetup.sh ;lunch full_newmobi6735_65u_v_l1-userdebug 

20 mmm -B bootable/bootloader/lk:lk -j64  mmm -B bootable/bootloader/preloader:pl -j64 ;

21 kernel改動後可直接make bootimage -j64 ,如果沒效果 先mmm  kernel-3.10:kernel -j64在 make bootimage -j64,如果改動了config,需要mmm  -B kernel-3.10:kernel -j64

22.

 1、DSI vdo mode下的數據速率data_rate的大致計算公式爲:
Data rate= (Height+VSA+VBP+VFP)*(Width+HSA+HBP+HFP)* total_bit_per_pixel*frame_per_second/total_lane_num
比如
(1280+10+14+16)*(720+10+50+50)*8*60/4
 (1320*830*24*60/4)/1024*1024*2=188
 (1306*772*24*60/4)/1024*1024*2=173
2、DSI cmd mode下的數據速率data_rate的大致計算公式爲:
Data rate= width*height*1.2* total_bit_per_pixel*frame_per_second/total_lane_num

參數註釋:
data_rate : 表示的是數據速率
width,height  :屏幕分辨率
VSA VBP VFP :DSI vdo mode的vertical porch配置參數
HSA HBP HFP :DSI vdo mode的horizontal porch配置參數
total_bit_per_pixel :表示的是一個pixel需要用幾個bit來表示,比如RGB565的話就是16個bit
frame_per_second :就是我們通常看到的fps,叫做幀率,表示每秒發送多少個幀,一般是60幀每秒
total_lane_num :表示的是data lane的對數。

3、DSI採用的是雙邊採樣,則clk等於數據速率的一半,因此: clk=data_rate/2
 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章