RTKlib/постпроцессинг

ради любопытства скачал “Mate 8 OpenSource ( NXT Android 6.0,kernel,overseas) .tar.gz”
там внутри Kernel_Opensource.tar.gz лежат gps_bcm4752.c и gps_bcm47531.c в подкаталогах каталога drivers
но что в них написано - мне неведомо :slight_smile:

gps_bcm4752.c

#include <linux/platform_device.h>
#include <linux/delay.h>
#include <linux/module.h>
#include <linux/io.h>
#include <linux/gpio.h>
#include <linux/of_gpio.h>
#include <linux/device.h>
#include <linux/slab.h>
#include <linux/clk.h>
#include <linux/err.h>
#include <linux/errno.h>
#include <linux/pinctrl/pinctrl.h>
#include <linux/pinctrl/consumer.h>
#include <linux/printk.h>
#include <linux/huawei/gps/huawei_gps.h>
#include <linux/proc_fs.h>
#include <linux/uaccess.h>
#include <linux/stat.h>
#include <linux/rfkill.h>
#include <linux/delay.h>
#include <linux/init.h>
#include <linux/input.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/workqueue.h>
#include <linux/uaccess.h>
#include <linux/poll.h>
#include <linux/miscdevice.h>
#include <linux/wait.h>
#include <linux/sched.h>
#include <linux/platform_device.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/list.h>
#include <linux/version.h>
#include <linux/workqueue.h>
#include <linux/unistd.h>
#include <linux/bug.h>
#include <linux/mutex.h>
#include <linux/wakelock.h>
#include <linux/of.h>
#include <linux/of_platform.h>
#include <linux/of_device.h>


#ifdef CONFIG_HWCONNECTIVITY
#include <linux/huawei/hw_connectivity.h>
#endif

#define DTS_COMP_GPS_POWER_NAME "huawei,gps_power"
#define GPS_REF_CLK_FREQ_49M   (49152000L)
#define GPS_REF_CLK_FREQ_19M   (19200000L)

#define GPS_STANDBY         0
#define GPS_ACTIVE          1

#define GPS_IC_TYPE_4752 4752
#define GPS_IC_TYPE_47531 47531

#define GPS_REFCLK_SEL_ENABLE 1
#define GPS_REFCLK_SEL_DISABLE 0

extern int get_gps_ic_type();
extern int get_gps_ref_sel_enable();

typedef struct gps_bcm_info
{
    struct gpio gpioid_en;
    struct clk* clk;
    struct clk* refclk_sel;
    struct clk* refclk;
    struct pinctrl* pctrl;
    struct pinctrl_state* pins_normal;
    struct pinctrl_state* pins_idle;
} GPS_BCM_INFO;

static struct clk* gps_ref_clk = NULL;
static GPS_BCM_INFO* g_gps_bcm = NULL;

static ssize_t gps_write_proc_nstandby(struct file* filp, const char __user* buffer, size_t len, loff_t* off)
{
    char gps_nstandby = '0';
    printk(KERN_INFO "[GPS] gps_write_proc_nstandby \n");

    if ((len < 1) || (NULL == g_gps_bcm))
    {
        printk(KERN_ERR "[GPS] gps_write_proc_nstandby g_gps_bcm is NULL or read length = 0.\n");
        return -EINVAL;
    }

    if (copy_from_user(&gps_nstandby, buffer, sizeof(gps_nstandby)))
    {
        printk(KERN_ERR "[GPS] gps_write_proc_nstandby copy_from_user failed!\n");
        return -EFAULT;
    }

    if (gps_nstandby == '0')
    {
        printk(KERN_INFO "[GPS] gps nstandby.\n");
        gpio_set_value(g_gps_bcm->gpioid_en.gpio, GPS_STANDBY);
    }
    else if (gps_nstandby == '1')
    {
        printk(KERN_INFO "[GPS] gps active.\n");
        gpio_set_value(g_gps_bcm->gpioid_en.gpio, GPS_ACTIVE);
    }
    else
    {
        printk(KERN_ERR "[GPS] gps nstandby write error code[%d].\n", gps_nstandby);
    }

    return len;
}

static ssize_t gps_read_proc_nstandby(struct file* filp, const char __user* buffer, size_t len, loff_t* off)
{
    int gps_nstandby = 0;
    char tmp[2];
    memset(tmp, 0, sizeof(tmp));
    printk(KERN_INFO "[GPS] gps_read_proc_nstandby \n");
    if (len < 1 || NULL == g_gps_bcm)
    {
        printk(KERN_ERR "[GPS] gps_read_proc_nstandby g_gps_bcm is NULL or read length = 0.\n");
        return -EINVAL;
    }
    len = 1;
    printk(KERN_INFO "[GPS] gps_read_proc_nstandby off = %d\n", (unsigned int)*off);
    if ((unsigned int)*off > 0)
    {
        return 0;
    }
    gps_nstandby = gpio_get_value(g_gps_bcm->gpioid_en.gpio);
    sprintf(tmp, "%d", gps_nstandby);
    printk(KERN_INFO "[GPS] gps nstandby status[%s] \n", tmp);

    if (copy_to_user(buffer, tmp, len))
    {
        printk(KERN_ERR "[GPS] gps_read_proc_nstandby copy_to_user failed!\n");
        return -EFAULT;
    }
    *off += len;
    return len;
}

static const struct file_operations gps_proc_fops_nstandby =
{
    .owner = THIS_MODULE,
    .write = gps_write_proc_nstandby,
    .read = gps_read_proc_nstandby,
};

static int create_gps_proc_file(void)
{
    int ret = 0;
    struct proc_dir_entry* gps_dir = NULL;
    struct proc_dir_entry* gps_nstandby_file = NULL;
    gps_dir = proc_mkdir("gps", NULL);
    if (!gps_dir)
    {
        printk(KERN_ERR "[GPS] proc dir create failed\n");
        ret = -ENOMEM;
        return ret;
    }

    gps_nstandby_file = proc_create("nstandby", S_IRUGO | S_IWUSR | S_IWGRP | S_IFREG, gps_dir, &gps_proc_fops_nstandby);
    if (!gps_nstandby_file)
    {
        printk(KERN_ERR "[GPS] proc nstandby file create failed\n");
        ret = -ENOMEM;
        return ret;
    }
    printk(KERN_INFO "[GPS] gps create proc file ok. \n");

    return ret;
}

static int k3_gps_bcm_probe(struct platform_device* pdev)
{
    GPS_BCM_INFO* gps_bcm = NULL;
    struct device* gps_power_dev = &pdev->dev;
    struct device_node* np = gps_power_dev->of_node;
    enum of_gpio_flags gpio_flags;
    int ret = 0;

    printk(KERN_INFO "[GPS] start find gps_power and ic type is bcm4752 \n");
    gps_bcm = kzalloc(sizeof(GPS_BCM_INFO), GFP_KERNEL);
    if (!gps_bcm)
    {
        printk(KERN_ERR "[GPS] Alloc memory failed\n");
        return -ENOMEM;
    }

    gps_bcm->gpioid_en.gpio = of_get_gpio_by_prop(np , "huawei,gps_en" , 0 , 0 , &gpio_flags);

    if (!gpio_is_valid(gps_bcm->gpioid_en.gpio))
    {
        printk(KERN_ERR "[GPS] get huawei,gps_en gpio failed. and request again\n");
        gps_bcm->gpioid_en.gpio = of_get_named_gpio(np, "huawei,gps_en", 0);
        if(!gpio_is_valid(gps_bcm->gpioid_en.gpio))
        {
            printk(KERN_ERR "[GPS] get huawei,gps_en gpio failed.\n");
            ret = -1;
            goto err_free_gps;
        }
    }

    ret = gpio_request(gps_bcm->gpioid_en.gpio, "gps_enbale");
    if (ret)
    {
        printk(KERN_ERR "[GPS] gpio_direction_output %d failed, ret:%d\n", gps_bcm->gpioid_en.gpio, ret);
        goto err_free_gps_en;
    }
    gpio_export(gps_bcm->gpioid_en.gpio, false);
    ret = gpio_direction_output( gps_bcm->gpioid_en.gpio, 0);
    if (ret)
    {
        printk(KERN_ERR "[GPS] gpio_direction_output %d failed, ret:%d\n", gps_bcm->gpioid_en.gpio, ret);
        goto err_free_gps_en;
    }
    printk(KERN_INFO "[GPS] finish gpio_direction_output gps_power\n");

    ret = create_gps_proc_file();
    if (ret)
    {
        printk(KERN_ERR "[GPS] gps create proc file failed.\n");
        goto err_free_gps_en;
    }

    /* Set 32KC clock */
    gps_bcm->clk = of_clk_get_by_name(np, "gps_32k");
    if (IS_ERR(gps_bcm->clk))
    {
        printk(KERN_ERR "[GPS] clk_32k get failed!\n");
        ret = -1;
        goto err_free_gps_en;
    }
    ret = clk_prepare_enable(gps_bcm->clk);
    if (ret)
    {
        printk(KERN_ERR "[GPS] clk_32k enable is failed\n");
        goto err_free_clk;
    }
    printk(KERN_INFO "[GPS] clk_32k is finished\n");

    gps_bcm->pctrl = devm_pinctrl_get(gps_power_dev);
    if (IS_ERR(gps_bcm->pctrl))
    {
        printk(KERN_ERR "[GPS] pinctrl get error!\n");
        ret = -1;
        goto err_free_clk;
    }
    gps_bcm->pins_normal = pinctrl_lookup_state(gps_bcm->pctrl, "default");
    if (IS_ERR(gps_bcm->pins_normal))
    {
        printk(KERN_ERR "[GPS] gps_bcm->pins_normal lookup error!\n");
        ret = -1;
        goto err_free_pinctrl;
    }

    gps_bcm->pins_idle = pinctrl_lookup_state(gps_bcm->pctrl, "idle");
    if (IS_ERR(gps_bcm->pins_idle))
    {
        printk(KERN_ERR "[GPS] gps_bcm->pins_idle lookup error!\n");
        ret = -1;
        goto err_free_pinctrl;
    }

    ret = pinctrl_select_state(gps_bcm->pctrl, gps_bcm->pins_normal);
    if (ret)
    {
        printk(KERN_ERR "[GPS] pinctrl_select_state error!\n");
        goto err_free_pinctrl;
    }
    printk(KERN_INFO "[GPS] pinctrl is finish\n");

    /*Read dtsimage to get the ref_clk_enable properity*/

    if(GPS_REFCLK_SEL_ENABLE == get_gps_ref_sel_enable())
    {
        gps_bcm->refclk = of_clk_get_by_name(np, "ref_clk");
        if (IS_ERR(gps_bcm->refclk))
        {
            printk(KERN_ERR "[GPS] ref_clk get failed!\n");
            ret = -1;
            goto err_free_pinctrl;
        }
        gps_bcm->refclk_sel = of_clk_get_by_name(np, "ref_clk_sel");
        if (IS_ERR(gps_bcm->refclk_sel))
        {
            printk(KERN_ERR "[GPS] ref_clk_sel get failed!\n");
            ret = -1;
            goto err_free_refclk;
        }
        ret = clk_set_rate(gps_bcm->refclk_sel, GPS_REF_CLK_FREQ_49M);
        if (ret < 0)
        {
            printk(KERN_ERR "[GPS] ref_clk_sel set rate failed\n");
            ret = -1;
            goto err_free_refclk_sel;
        }
    }
    else
    {
        gps_bcm->refclk = of_clk_get_by_name(np, "clk_gps");
        if (IS_ERR(gps_bcm->refclk))
        {
            printk(KERN_ERR "[GPS] ref_clk get failed!\n");
            ret = -1;
            goto err_free_pinctrl;
        }
        ret = clk_set_rate(gps_bcm->refclk, GPS_REF_CLK_FREQ_19M);
        if (ret < 0)
        {
            printk(KERN_ERR "[GPS] ref_clk_sel set rate failed\n");
            ret = -1;
            goto err_free_refclk;
        }
    }

    gps_ref_clk = gps_bcm->refclk;
    printk(KERN_INFO "[GPS] ref clk is finished!\n");
    platform_set_drvdata(pdev, gps_bcm);
    g_gps_bcm = gps_bcm;
    return 0;

err_free_refclk_sel:
    clk_put(gps_bcm->refclk_sel);
err_free_refclk:
    clk_put(gps_bcm->refclk);
err_free_pinctrl:
    pinctrl_put(gps_bcm->pctrl);
err_free_clk:
    clk_put(gps_bcm->clk);
err_free_gps_en:
    gpio_free(gps_bcm->gpioid_en.gpio);
err_free_gps:
    kfree(gps_bcm);
    gps_bcm = NULL;
    g_gps_bcm = NULL;
    return ret;
}

static void K3_gps_bcm_shutdown(struct platform_device* pdev)
{
    GPS_BCM_INFO* gps_bcm = platform_get_drvdata(pdev);
    printk(KERN_INFO "[GPS] K3_gps_bcm_shutdown!\n");

    if (!gps_bcm)
    {
        printk(KERN_ERR "[GPS] gps_bcm is NULL,just return.\n");
        return;
    }

    platform_set_drvdata(pdev, NULL);
    kfree(gps_bcm);
    gps_bcm = NULL;
    g_gps_bcm = NULL;
    return;
}

static const struct of_device_id gps_power_match_table[] =
{
    {
        .compatible = DTS_COMP_GPS_POWER_NAME,   // compatible must match with which defined in dts
        .data = NULL,
    },
    {
    },
};

MODULE_DEVICE_TABLE(of, gps_power_match_table);

static struct platform_driver k3_gps_bcm_driver =
{
    .probe          = k3_gps_bcm_probe,
    .suspend        = NULL,
    .remove         = NULL,
    .shutdown       = K3_gps_bcm_shutdown,
    .driver = {
        .name = "huawei,gps_power_4752",
        .owner = THIS_MODULE,
        .of_match_table = of_match_ptr(gps_power_match_table), // dts required code
    },
};

static int __init k3_gps_bcm_init(void)
{
#ifdef CONFIG_HWCONNECTIVITY
    //For OneTrack, we need check it's the right chip type or not.
    //If it's not the right chip type, don't init the driver
    if (!isMyConnectivityChip(CHIP_TYPE_BCM))
    {
        printk(KERN_ERR "gps chip type is not match, skip driver init");
        return -EINVAL;
    }
    else
    {
        printk(KERN_INFO "gps chip type is matched with Broadcom, continue");
    }
#endif
    if(GPS_IC_TYPE_4752 != get_gps_ic_type())
    {
        printk(KERN_ERR "gps chip type is matched with Broadcom, and it is not 4752\n");
        return -EINVAL;
    }
    printk(KERN_INFO "gps chip type is matched with Broadcom, and it is 4752\n");
    return platform_driver_register(&k3_gps_bcm_driver);
}

static void __exit k3_gps_bcm_exit(void)
{
    platform_driver_unregister(&k3_gps_bcm_driver);
}

int set_gps_ref_clk_enable_bcm4752(bool enable)
{
    int ret = 0;

    printk(KERN_INFO "[GPS] set_gps_ref_clk_enable(%d) \n", enable);
    if (IS_ERR(gps_ref_clk))
    {
        printk(KERN_ERR "[GPS] ERROR: refclk is invalid! \n");
        return -1;
    }

    if (enable)
    {
        ret = clk_prepare_enable(gps_ref_clk);
        if (ret < 0)
        {
            printk(KERN_ERR "[GPS] ERROR: refclk enable failed! \n");
            return -1;
        }
    }
    else
    {
        clk_disable_unprepare(gps_ref_clk);
    }
    printk(KERN_INFO "[GPS] set_gps_ref_clk_enable finish \n");

    return 0;
}

module_init(k3_gps_bcm_init);
module_exit(k3_gps_bcm_exit);

MODULE_AUTHOR("DRIVER_AUTHOR");
MODULE_DESCRIPTION("GPS Boardcom 47511 driver");
MODULE_LICENSE("GPL");

Посмотрите, что находится в файле linux/huawei/gps/huawei_gps.h
и вообще linux/huawei/gps/*

Я думал что сначала будет вот эта новость

Только этот файл, huawei_gps.h

#ifndef _HUAWEI_GPS_H
#define _HUAWEI_GPS_H

#ifdef CONFIG_HWCONNECTIVITY
#include <linux/huawei/hw_connectivity.h>
#endif

#ifdef CONFIG_CONNECTIVITY_HI110X
#if 0
extern int set_gps_ref_clk_enable_hi110x(bool enable);
#else
static inline int set_gps_ref_clk_enable_hi110x(bool enable)
{
	return 0;
}
#endif
#endif


#ifdef CONFIG_BCMGPS
extern int set_gps_ref_clk_enable_bcm(bool enable);
#endif

static inline int set_gps_ref_clk_enable(bool enable)
{
    int ret = 0;
#ifdef CONFIG_HWCONNECTIVITY
    if (isMyConnectivityChip(CHIP_TYPE_HI110X )) {
        #ifdef CONFIG_CONNECTIVITY_HI110X
        printk(KERN_INFO "cfg ps type is matched with hi110x, continue\n");
        ret = set_gps_ref_clk_enable_hi110x(enable);
        #endif
    } else {
        #ifdef CONFIG_BCMGPS
        ret = set_gps_ref_clk_enable_bcm(enable);
        #endif
    }
#else 

    #ifdef CONFIG_CONNECTIVITY_HI110X
        ret = set_gps_ref_clk_enable_hi110x(enable);
    #endif

    #ifdef CONFIG_BCMGPS
            ret = set_gps_ref_clk_enable_bcm(enable);
    #endif

#endif

    return ret;
}

#endif

в drivers ещё есть gps_bcm_common.c - MODULE_DESCRIPTION(“GPS Boardcom gps common driver”);

Нее, это все неинтересно. BCM4774 - целый монстр-контроллер, который включает wifi, bt
и datafusion от всяких сенсоров, от него бы на самом деле внутреннюю прошивку поиметь неплохо,
но для этого надо покупать довольно дорогой смартфон :wink:
На ублоксовском форуме задают забавные вопросы типа
https://forum.u-blox.com/index.php?qa=7625&qa_1=about-dynseed-and-fixseed
дроны они наверное спуфить собираются :roll_eyes:

Navilock собирается “в ближайшее время” выпустить приемники серии NL-82022MP
http://www.navilock.com/produkte/N_62755/merkmale.html?setLanguage=en
на базе NEO-M8U (урезанный DeadReckoning без внешних данных wheeltick, но с акселерометром+гироскопом Bosch BMI160).
Доступа к сырым GPS данным и прошивке там конечно нет :sunglasses:

Вот нашел в китайских просторах доки по ubx-m8030.https://yadi.sk/d/zK7QM0oW3EeNhq

Неплохой вебинар про метод РРР.

Обнаружились исходники для Huawei Mate 8
https://github.com/RaindropOS/android_kernel_huawei_next
а в них drivers/huawei_platform/connectivity/bcm/gps
https://github.com/RaindropOS/android_kernel_huawei_next/tree/c44a848caac35ac4ccc454b74cde24afe0806a13/drivers/huawei_platform/connectivity/bcm/gps
Это уже теплее.

ВСMGPS на этих устройствах на последовательном порту /dev/ttyAMA3

Хотел написать про железо и GPS на mate 9, но придется отложить на неделю. превед вертухаям.

Вопрос по языку программирования, известному как “write once, debug everywhere”.
андроид полностью падает вот с таким сообщением при использовании программы gnsslogger.apk ( https://github.com/google/gps-measurement-tools/tree/master/GNSSLogger ) :


 art/runtime/indirect_reference_table.cc:138] JNI ERROR (app bug): local reference table overflow (max=512)
 art/runtime/indirect_reference_table.cc:138] local reference table dump:
 art/runtime/indirect_reference_table.cc:138]   Last 10 entries (of 512):
 art/runtime/indirect_reference_table.cc:138]       511: 0x13ecf000 java.lang.Class<android.location.GnssMeasurement>
 art/runtime/indirect_reference_table.cc:138]       510: 0x136808a8 android.location.GnssMeasurement[] (7 elements)
 art/runtime/indirect_reference_table.cc:138]       509: 0x13bd1400 byte[] (11 elements)
 art/runtime/indirect_reference_table.cc:138]       508: 0x13bd1478 byte[] (11 elements)
 art/runtime/indirect_reference_table.cc:138]       507: 0x13d1b900 byte[] (40 elements)
 art/runtime/indirect_reference_table.cc:138]       506: 0x13d1b938 byte[] (40 elements)
 art/runtime/indirect_reference_table.cc:138]       505: 0x13bd1670 byte[] (11 elements)
 art/runtime/indirect_reference_table.cc:138]       504: 0x13bd1d78 byte[] (11 elements)
 art/runtime/indirect_reference_table.cc:138]       503: 0x13bcb148 byte[] (11 elements)
 art/runtime/indirect_reference_table.cc:138]       502: 0x13bcb1c0 byte[] (11 elements)
 art/runtime/indirect_reference_table.cc:138]   Summary:
 art/runtime/indirect_reference_table.cc:138]         1 of android.location.GnssMeasurement[] (7 elements)
 art/runtime/indirect_reference_table.cc:138]         1 of android.location.GnssClock
 art/runtime/indirect_reference_table.cc:138]         2 of java.lang.Class (1 unique instances)
 art/runtime/indirect_reference_table.cc:138]       390 of byte[] (11 elements) (390 unique instances)
 art/runtime/indirect_reference_table.cc:138]       118 of byte[] (40 elements) (118 unique instances)

Вот эти “висячие” byte[40] и byte[11] это предыдущие навигационые subframes для GPS и глонаса соответственно,
которые и забили local reference table.
Может я чего недопонимаю в этом языке, но разве DeleteLocalRef в
https://android.googlesource.com/platform/frameworks/base/+/android-7.0.0_r30/services/core/jni/com_android_server_location_GnssLocationProvider.cpp


    JNIEnv* env = AndroidRuntime::getJNIEnv();
    jobject navigationMessage = translate_gnss_navigation_message(env, message);
    env->CallVoidMethod(mCallbacksObj,
                        method_reportNavigationMessages,
                        navigationMessage);
    env->DeleteLocalRef(navigationMessage);

должен “освободить” память под массивом, являющийся частью navigationMessage ?
На Mate 9 Galileo raw data работает, но как-то не очень здорово. Вот пример сырых данных для E14


Raw,2352904,92654000000,,,-1174133401345816604,0.0,6.3731318907790016,,,0,14,0.0,1074,2657120,7,37.32952117919922,-594.4398950144232,0.07155628388788515,1,-5963.906697538496,0.0010088905692100525,,,,,0,,6

I/NAV не видел, и это видимо связано с проблемой navigationMessage.
EGNOS тоже почему-то не дает никаких сырых данных, а Beidou я пока не пробовал:
для этого надо редактировать конфигурационный XML gps4774config.xml на readonly диске ( EnableBeidou=“true”)


  <gll_features
        EnableLowPowerPmm="true"
        EnableOnChipMiCtrl="true"
        EnableInternalBlanking="false" 
        EnableGalileo="true"
  />

Также было бы интересно отключить глонас, но совершенно непонятно как, и можно ли вообще это сделать.

Про C++ что ли?
Использование JNI требует аккуратности, как и всё остальное в мире C/C++.

Должен удалить локальную ссылку, сделав доступным объект для garbage collection. Проблема не в нём, а в методе JavaObject::callSetter:

template<>
void JavaObject::callSetter(const char* method_name, uint8_t* value, size_t size) {
    jbyteArray array = env_->NewByteArray(size);
    env_->SetByteArrayRegion(array, 0, size, (jbyte*) value);
    jmethodID method = env_->GetMethodID(
            clazz_,
            method_name,
            "([B)V");
    env_->CallVoidMethod(object_, method, array);
}[/code]

При вызове NewByteArray создаётся локальная ссылка (array), но потом нигде не удаляется. При вызове из Java это не страшно, т.к. таблица локальных ссылок при возврате в Java очищается, а вот во всяких callback-механизмах это порождает утечки памяти.

OK, что делать ™ ? Написать логгер на c++ тоже будет непросто, хотя и по другим причинам.
Интересно, что все гуглопримеры по доступным ссылкам относятся к Qualcomm, а не к BCM477*, и везде показывают только “Raw” и нигде
“Nav”:


Nav,24,257,1,0,5,34,-61,-107,27,17,-128,-83,-69,20,-44,-30,86,19,-123,-117,81,63,81,0,24,40,67,54,-57,41,92,-54,-23,9,-126,103,-66,15,110,122,-104,47,64,2,-85
Nav,28,257,1,0,5,34,-61,-107,27,17,-128,-83,-69,20,-44,-30,-13,24,-59,-116,52,63,79,-64,55,40,67,54,49,41,90,-11,92,9,-125,-103,42,15,56,-29,-116,47,64,2,-85
Nav,30,257,1,0,5,34,-61,-107,27,17,-128,-83,-69,20,-44,-30,86,19,-123,-117,81,63,81,0,24,40,67,54,-57,41,92,-54,-23,9,-126,103,-66,15,110,122,-104,47,64,2,-85

глонасс тоже какой-то кривой (не редуцированный из FCN в SVN), поэтому у меня очень
глубокие сомнения, что он вообще используется в решении


Nav,93,769,1,0,7,56,116,56,121,30,52,-65,-11,-77,-13,120
Nav,96,769,1,0,7,56,116,56,121,30,52,-65,-11,-77,-13,120
Nav,98,769,1,0,7,56,116,56,121,30,52,-65,-11,-77,-13,120
Nav,105,769,1,0,7,56,116,56,121,30,52,-65,-11,-77,-13,120
Nav,106,769,1,0,7,56,116,56,121,30,52,-65,-11,-77,-13,120

Наверное юзать более свежие версии андроида.
В октябре прошлого года это поправили:

https://android.googlesource.com/platform/frameworks/base/+/fe427f24e5788612bc271bfff1b07b36ecebf3af%5E%21/#F0

Судя по тегам это исправление попало в релиз начиная с версии 7.1.1

Это к сожалению во многих случаях (в большинстве ?) невозможно.
Функция сия находится в библиотеке libandroid_servers.so


readelf -Ws /system/lib64/libandroid_servers.so | c++filt | grep Setter

416: 0000000000021f38   164 FUNC    GLOBAL DEFAULT   12 void android::JavaObject::callSetter<unsigned char>(char const*, unsigned char*, unsigned long)

Ее конечно можно и для 7.0.0 попытаться пересобрать с патчем, или же пытаться пропатчить сам бинарник.
В любом случае надо еще разблокировать ‘readonly’ для /system (методы предлагаемые на xda-developers.com у меня не работают)


/dev/block/dm-0 /system ext4 ro,seclabel,relatime,data=ordered 0 0

+5

А финт, если либу положить в сборку APK и она загрузиться первой. А то и вовсе может быть возможно переназначить этот вызов на свой JavaObject::callSetterFix. По крайней мере при сборке на обычном С++ бывает ругается, что существуют две реализации и он выбирает какую-то одну.
Вообще андроид странный, я 4 месяца пытался собрать rtkgps+, чтобы он не падал на моём телефоне. И вот недавно я выяснил причину, что в java и в нативном коде массивы которые копировались друг в друга были разной длинный. Но на моём андроиде копирование молча падало в дебрях системы, на на более новых нет, и как бы работало О_о
Так же спасибо Sergey Astakhov, твои unix сокеты пригодились.
П.С. Так же я узнал секрет, как на андроиде записывать логи с приёмника с timetag-ом, что бы потом их можно было повторять в rtknavi - надо в конце имени файла добавить ::T

Единственный телефон с BCM4774 (AFAIK http://www.myfixguide.com/manual/huawei-honor-8-teardown ), для которого есть LineageOS 14.1 это Huawei Honor 8
https://forum.xda-developers.com/showpost.php?p=71279818
В нем “GPS fixed” (whatever that means) и Galileo официально не поддерживается (хотя само железо умеет ).
Для Mate 9 есть самопальный ROM https://forum.xda-developers.com/mate-9/development/shield-rom-mate-9-t3560304 и для него пишуть


Bugs:
- GPS doens't work if you aren't on B156 base

B156 я устанавливать не хочу, т.к. в нем пофиксили Vulnerability ID: HWPSIRT-2017-01060
http://www.huawei.com/en/psirt/security-advisories/2017/huawei-sa-20170306-01-smartphone-en
которую я естественно фиксить не хочу :slight_smile:
Я дизассемблировал libandroid_servers.so из него (objdump отсюда https://releases.linaro.org/components/toolchain/binaries/latest/aarch64-linux-gnu , IDApro для arm64 у меня нет, а demo для него не работает), и там конечно никакие кетайцы memory leak в navmessage
править и не думали.
При этом для Kirin960


- Huawei NOT RELEASING Kernel source code

Так что ситуация на данный момент довольно запутанная.
Если у кого есть телефон с 7.1.1 (и Qualcomm ?), то интересно узнать о вашем experience.

Я все-таки снес стандартную прошивку, и заменил ее на самопал :sunglasses:
Теперь все read-write. GPS не работает по следующей причине


[   16.240081s][pid:1,cpu4,init]init: (Parsing /init.connectivity.gps.rc took 0.00s.)
[   18.029235s][pid:1,cpu7,init]init: Starting service 'gpsdaemon'...
[   19.310211s][pid:1,cpu4,init]init: Service gpsd_4774 does not have a SELinux domain defined.
[   19.696044s][pid:1,cpu6,init]init: Service 'gpsdaemon' (pid 459) exited with status 0

В /sepolicy gpsd_4774 действительно нет, в /property_contexts есть


ctl.gpsd_4774                   u:object_r:gpsd_prop:s0

а добавить контекст в init.connectivity.gps.rc


    service gpsd_4774  /vendor/bin/glgps4774 -c /data/gps/gpsconfig.xml
    socket gps seqpacket 660 gps system
    class late_start
    user gps
    group system inet sdcard_rw wakelock
    disabled

не удается, так как при перезапуске он заменяется на версию из какого-то ramdisk.
При этом в ramdisk из boot.img такого файла нет (???)
В телефоне до хрена partitions, везде бекапы, резервные копии, логи.
Никакого ЦРУ не надо, китайцы какие только данные по дискам не распихали :roll_eyes:
Этот glgps4774 еще через AtCmdTransportPort=“/dev/appvcom9”
посылает телефону магические команды.
В SuplTlsCertPath=“/data/cust/xml/server.pem” никакого сертификата нет.
При этом есть запароленная пара
/vendor/etc/gnss/config/gnss_lss_slp_thirdparty.p12
и запароленный ключъ
/vendor/etc/gnss/config/gnss_lss_rfg_key_thirdparty.pem :roll_eyes:
Интересно кто и для чего ими пользуется. Пароль же тоже должен где-то
лежать.
cacert_location.pem и xtra_root_cert.pem отсутствуют.


Disk /dev/block/sda: 4 MB, 4194304 bytes, 8192 sectors
Disk /dev/block/sdb: 4 MB, 4194304 bytes, 8192 sectors
Disk /dev/block/sdc: 16384 sectors, 64.0M

Number  Start (sector)    End (sector)  Size Name
     1             128             255  512K frp
     2             256             767 2048K persist
     3             768            2047 5120K reserved1

Disk /dev/block/sdd: 124928000 sectors,  576M
Number  Start (sector)    End (sector)  Size Name
     1             128             255  512K vrl
     2             256             383  512K vrl_backup
     3             384            2559 8704K modem_secure
     4            2560            4095 6144K nvme
     5            4096           20479 64.0M oeminfo
     6           20480           28671 32.0M secure_storage
     7           28672           36863 32.0M modem_om
     8           36864           37887 4096K modemnvm_factory
     9           37888           38911 4096K modemnvm_backup
    10           38912           41983 12.0M modemnvm_img
    11           41984           43007 4096K modemnvm_system
    12           43008           63487 80.0M splash2
    13           63488          129023  256M cache
    14          129024          129535 2048K bootfail_info
    15          129536          130047 2048K misc
    16          130048          138239 32.0M reserved2
    17          138240          139263 4096K reserved10
    18          139264          141311 8192K hisee_fs
    19          141312          145407 16.0M dfx
    20          145408          149503 16.0M rrecord
    21          149504          149567  256K fw_lpm3_a
    22          149568          150527 3840K reserved3_a
    23          150528          151551 4096K hisee_img_a
    24          151552          154623 12.0M fastboot_a
    25          154624          155647 4096K vector_a
    26          155648          156159 2048K isp_boot_a
    27          156160          159743 14.0M isp_firmware_a
    28          159744          162815 12.0M fw_hifi_a
    29          162816          164863 8192K teeos_a
    30          164864          181247 64.0M recovery2_a
    31          181248          185343 16.0M sensorhub_a
    32          185344          193535 32.0M boot_a
    33          193536          209919 64.0M recovery_a
    34          209920          214015 16.0M dts_a
    35          214016          214527 2048K trustfirmware_a
    36          214528          228863 56.0M modem_fw_a
    37          228864          241663 50.0M reserved4_a
    38          241664          262143 80.0M modemnvm_update_a
    39          262144          270335 32.0M patch_a
    40          270336          278527 32.0M version_a
    41          278528          479231  784M vendor_a
    42          479232          528383  192M product_a
    43          528384          577535  192M cust_a
    44          577536         1777663 4688M system_a
    45         1777664         1810431  128M reserved5
    46         1810432        15615999 52.6G userdata

Нашел, где находится используемый ramdisk.cpio.gz,
он в сборке .img на /dev/block/sdd32 с характерным названием boot_a
Также полностью пересобрал AOSP (7.0.0_r30) для generic_arm64 из исходников.