一.编译步骤:
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
#include
#include
#include
#include
#include
#include
#include
//#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 = ®_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
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
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 //影响DVDD、DOVDD、AVDD、AFVDD、PWDN、RESET
修改后的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
#include
// #include
// for EPO file
#include
#include
#include
#include
#include
#include
#include
// 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
/******************************************************************************
* 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.