MT6797项目相关

来源:互联网 发布:java写界面框架 编辑:程序博客网 时间:2024/05/22 07:54

一.编译步骤:

source build/envsetup.sh

工模密码:*#*#3646633#*#*

文档密码:2425575785

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

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.
 *
 *zhangwp@feimarobotics.com
 *
 */
#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("zhangwp@feimarobotics.com");
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断开后,初测没问题。


0 0
原创粉丝点击