嵌入式Linux时间同步 gpsd+chrony+pps

news2024/12/23 10:03:48

硬件设计

        GNSS模块输出pps到CPU,1PPS_1.8V用于V2X的pps,GPIO35_1.8V用于pps-gpio。这里做了pps一分二,由于距离太近不影响功能,焊接R35 0欧电阻。

 驱动配置

		gps_pps_pins:ublox_gps@2 {
				leadcore,pins = "gpio34";
				leadcore,function = "gpio";
				leadcore,pull = <MUXPIN_PULL_DISABLE>;
		};

		gps_pps2_pins:pps_gpio@0 {
				leadcore,pins = "gpio35";
				leadcore,function = "gpio";
				leadcore,pull = <MUXPIN_PULL_DISABLE>;
		};

        ublox_gps {
            compatible = "morningcore,ublox-gps";
            //gps_d1v8_ctrl = <&gpio 255 0>;
            gps_rst = <&gpio 255 0>;
            gps_pps = <&gpio 34 0>;
            pinctrl-names = "d1v8_ctrl_pins", "rst_pin", "pps_pins";
            pinctrl-0 = <&gps_d1v8_ctrl_pins>;
            pinctrl-1 = <&gps_rst_pins>;
            pinctrl-2 = <&gps_pps_pins>;
        };

        pps_gpio {
            compatible = "morningcore,pps-gpio";
            gps_pps2 = <&gpio 35 0>;
            pinctrl-names = "pps2_pins";
            pinctrl-0 = <&gps_pps2_pins>;
        };
drivers/comip/wireless/ublox-gps.c
{ .compatible = "morningcore,ublox-gps", },
    comip_mfp_config(MFP_PIN_GPIO(34), MFP_PIN_MODE_GPIO);
    pdata->gpio_pps = of_get_named_gpio(pdev->dev.of_node, "gps_pps", 0);
    if (pdata->gpio_pps < 0) {
        dev_err(&pdev->dev, "get gps_pps failed\n");
        return -EINVAL;
    }
    gpio_request(pdata->gpio_pps, "GPS pps GPIO");
    gpio_direction_input(pdata->gpio_pps);
    comip_mfp_config_pull(pdata->gpio_pps, MFP_PULL_DISABLE);
    gpio_free(pdata->gpio_pps);

        调试发现gpio34如果没有配置不响应v2x功能,这是为何?

drivers/pps/clients/pps-gpio.c
{ .compatible = "morningcore,pps-gpio", },
    pdata->gpio_pin = of_get_named_gpio(pdev->dev.of_node, "gps_pps2", 0);
    //printk("wzl-debug pdata->gpio_pin=%d\n", pdata->gpio_pin);
    if (pdata->gpio_pin < 0) {
        dev_err(&pdev->dev, "get gps_pps2 failed\n");
        return -EINVAL;
    }

    comip_mfp_config1(pdata->gpio_pin, MFP_PIN_MODE_GPIO);

    /* IRQ setup */
    irq = gpio_to_irq(pdata->gpio_pin);
    if (irq < 0) {
        pr_err("failed to map GPIO to IRQ: %d\n", irq);
        err = -EINVAL;
        goto return_error;
    }

    ret = gpio_request(pdata->gpio_pin, "GPS pps2 GPIO");
    if (ret) {
        pr_warning("failed to request GPIO %u\n", pdata->gpio_pin);
        return -EINVAL;
    }

    ret = gpio_direction_input(pdata->gpio_pin);
    if (ret) {
        pr_warning("failed to set pin direction\n");
        gpio_free(pdata->gpio_pin);
        return -EINVAL;
    }
    comip_mfp_config_pull(pdata->gpio_pin, MFP_PULL_DISABLE);
    gpio_free(pdata->gpio_pin);

    /* register IRQ interrupt handler */
    ret = request_irq(irq, pps_gpio_irq_handler,
            IRQF_TRIGGER_RISING, data->info.name, data);
    if (ret) {
        pps_unregister_source(data->pps);
        pr_err("failed to acquire IRQ %d\n", irq);
        err = -EINVAL;
        goto return_error;
    }

static irqreturn_t pps_gpio_irq_handler(int irq, void *data)
{
    const struct pps_gpio_device_data *info;
    struct pps_event_time ts;
    int rising_edge;

    disable_irq_nosync(irq);

    /* Get the time stamp first */
    pps_get_ts(&ts);

    info = data;

    rising_edge = gpio_get_value(info->pdata->gpio_pin);
    //printk("wzl-debug:pps_gpio_irq_handler rising_edge = %d\n", rising_edge);
    if ((rising_edge && !info->pdata->assert_falling_edge) ||
            (!rising_edge && info->pdata->assert_falling_edge))
        pps_event(info->pps, &ts, PPS_CAPTUREASSERT, NULL);
    else if (info->pdata->capture_clear &&
            ((rising_edge && info->pdata->assert_falling_edge) ||
             (!rising_edge && !info->pdata->assert_falling_edge)))
        pps_event(info->pps, &ts, PPS_CAPTURECLEAR, NULL);

    enable_irq(irq);

    return IRQ_HANDLED;
}

        打开驱动配置:

#
# PPS support
#
CONFIG_PPS=y
CONFIG_PPS_DEBUG=y

#
# PPS clients support
#
# CONFIG_PPS_CLIENT_KTIMER is not set
# CONFIG_PPS_CLIENT_LDISC is not set
CONFIG_PPS_CLIENT_GPIO=y

        启动时内核打印和pps设备节点信息:

linux_genvict:~# dmesg | grep pps
[    0.303184]{0} pps_core: LinuxPPS API ver. 1 registered
[    0.303191]{0} pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[    3.534376]{1} pps_core: source pps_gpio.7.-1 got cdev (252:0)
[    3.534387]{1} pps pps0: new PPS source pps_gpio.7.-1
[    3.540090]{1} pps pps0: Registered IRQ 195 as PPS source

linux_genvict:~# ls /dev/pps0 -l
crw-rw----    1 root     0         252,   0 Jan  1 00:08 /dev/pps0

应用编译

        使用Buildroot 2017.02.3源码,选择外部编译链,编译gpsd、pps和chrony工具:

Target packages  --->
	Hardware handling  --->
		[*] gpsd  ----
			(/dev/ttyS1) Where to look for GPSes (NEW)
			[*]   client debugging support (NEW)
			[*]   profiling support (NEW)
			[*]   NTP time hinting support (NEW) 
			[*]   PPS time syncing support (NEW) 
			[*]   allow gpsd to change device settings (NEW)
			[*]   allow gpsctl/gpsmon to change device settings (NEW)
			[*]   NMEA (NEW)
		[*] pps-tools
	Networking applications  --->
		[*] chrony
[wangyb@wangyb-VirtualBox:target]$ find ./ -name gps*
./usr/sbin/gpsd
./usr/sbin/gpsdctl
./usr/bin/gpspipe
./usr/bin/gpsdecode
./usr/bin/gpsctl
./usr/bin/gpsmon
./usr/bin/gps2udp
[wangyb@wangyb-VirtualBox:target]$ find ./ -name pps*
./usr/bin/ppstest
./usr/bin/ppsfind
./usr/bin/ppswatch
./usr/bin/ppsctl
[wangyb@wangyb-VirtualBox:target]$ find ./ -name chrony*
./var/lib/chrony
./usr/sbin/chronyd
./usr/bin/chronyc
[wangyb@wangyb-VirtualBox:target]$ readelf -d ./usr/sbin/gpsd

Dynamic section at offset 0x25820 contains 29 entries:
  标记        类型                         名称/值
 0x00000001 (NEEDED)                     共享库:[libusb-1.0.so.0]
 0x00000001 (NEEDED)                     共享库:[libm.so.6]
 0x00000001 (NEEDED)                     共享库:[librt.so.1]
 0x00000001 (NEEDED)                     共享库:[libdbus-1.so.3]
 0x00000001 (NEEDED)                     共享库:[libpthread.so.0]
 0x00000001 (NEEDED)                     共享库:[libc.so.6]

测试pps

        R35电路没有焊接的情况下:

linux_genvict:/data/upgrade# ./ppstest /dev/pps0 
trying PPS source "/dev/pps0"
found PPS source "/dev/pps0"
ok, found 1 source(s), now start fetching data...
time_pps_fetch() error -1 (Connection timed out)
time_pps_fetch() error -1 (Connection timed out)
time_pps_fetch() error -1 (Connection timed out)
time_pps_fetch() error -1 (Connection timed out)

        短接R35电阻,pps接在gpio35:

linux_genvict:/data/upgrade# ./ppstest /dev/pps0 
trying PPS source "/dev/pps0"
found PPS source "/dev/pps0"
ok, found 1 source(s), now start fetching data...
source 0 - assert 1686797890.917627372, sequence: 88 - clear  0.000000000, sequence: 0
source 0 - assert 1686797891.917628603, sequence: 89 - clear  0.000000000, sequence: 0
source 0 - assert 1686797892.917629680, sequence: 90 - clear  0.000000000, sequence: 0
source 0 - assert 1686797893.917603988, sequence: 91 - clear  0.000000000, sequence: 0
source 0 - assert 1686797894.917600834, sequence: 92 - clear  0.000000000, sequence: 0
source 0 - assert 1686797895.917604911, sequence: 93 - clear  0.000000000, sequence: 0
source 0 - assert 1686797896.917607372, sequence: 94 - clear  0.000000000, sequence: 0

        gpsd不使用pps:./gpsd -n -G /dev/ttygnss1

         gpsd使用pps:./gpsd -n -G /dev/ttygnss1 /dev/pps0 

 chrony校时

        添加chrony配置文件:/system/etc/chrony.conf

makestep 0.1 3
rtcsync
allow
leapsectz right/UTC
driftfile /var/lib/chrony/drift
dumpdir /var/run/chrony

refclock PPS /dev/pps0 refid PPS lock GPSD prefer precision 1e-7 poll 2
refclock SHM 0 refid GPSD precision 1e-1 offset 0.9999 delay 0.2 poll 2

        参考博客:嵌入式Linux 时间同步 gpsd+chrony_gpsd chrony_sep4075的博客-CSDN博客

        先运行gpsd,然后运行./chronyd -f /system/etc/chrony.conf:

         使用套接字方法让 chronyd 连接到 gpsd,添加配置:

refclock SOCK /var/run/chrony.ttygnss1.sock refid GPS precision 1e-1 offset 0.9999
refclock SOCK /var/run/chrony.pps0.sock refid PPS precision 1e-7

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/649468.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

echarts几个公司内部数据可视化图表必

目录 折线图 日负荷折线图最大需求表柱状图 日电量柱状图分时电量功率因数三相温度水球图 年月日负荷率图散点图 三相平衡 最近公司有一个需求&#xff0c;要做一个数据可视化的页面&#xff0c;所有的图表都在下面&#xff0c;做这些都是本人自己写的&#xff0c;全部都是真…

【笔记】Fastapi 服务器部署无法访问接口

主要原因&#xff1a; # 主函数 if __name__ "__main__":uvicorn.run(appmain:app, host127.0.0.1, port8181, reloadFalse)以上都是测试环境&#xff0c;可以使用127.0.0.1&#xff0c;但是服务器上不能用这个地址&#xff0c;要改为0.0.0.0。 参考&#xff1a;服…

Qt_C++读写NXP、富士通15693标签支持windows国产linux操作系统

常用15693标签NXP ICODE存储结构说明 片内含1024位E2PROM&#xff0c;共分为32 Block&#xff0c;每个Block 32bit。其中64位为唯一序列号&#xff0c;32位用作特殊功能&#xff08;EAS、AFI、DSFID等&#xff09;&#xff0c;32位用于Block锁定&#xff0c;其余为用户使用区。…

mock测试(挡板测试)

https://www.cnblogs.com/lc-blogs/p/17027617.html mock测试&#xff08;挡板测试&#xff09;就是在测试过程中&#xff0c;对于某些不容易构造或者不容易获取的对象&#xff0c;用一个虚拟的对象来创建以便测试的测试方法。 比如&#xff1a;测试天气这个接口&#xff0c;最…

RIP协议路由配置(Cisco Packet Tracer)

实验环境&#xff1a; windows10操作系统、思科模拟器、网络正常&#xff1b; 实验内容&#xff1a; 新建packettracer拓扑图&#xff1b;设置PC机的网络配置信息&#xff1b;配置路由器的接口IP&#xff1b;为路由器的RIP添加地址&#xff1b;为路由器添加静态路由。测试PC…

由于找不到wpcap.dll导致软件无法运行的解决办法,特此记录

由于找不到wpcap.dll导致软件无法运行的解决办法&#xff0c;特此记录提示 目录 前言 一、解决找不到wpcap.dll错误的办法 前言 今天在运行一个软件时弹出&#xff0c;找不到wpcap.dll&#xff0c;无法运行的弹出&#xff0c;目前已解决此问题&#xff0c;特此记录&#xff…

MQTT服务等级

1.QoS含义 Quality of Service,服务质量 很多时候&#xff0c;使用 MQTT 协议的设备都运行在网络受限的环境下&#xff0c;而只依靠底层的 TCP传输协议&#xff0c;并不能完全保证消息的可靠到达。因此&#xff0c;MQTT 提供了 QoS机制&#xff0c;其核心是设计了多种消息交互…

什么是electron?

Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需要本地开发 经验 election的主要组成部分&#xff1a;…

5、共享模型之内存

目录 5.1 Java的内存模型5.2 可见性1、退不出的循环2、解决办法&#xff1a;3、可见性 vs 原子性 5.3 有序性1、为什么会有指令重排2、如何禁止指令重排3、原理之volatile4、happens-before 5.1 Java的内存模型 JMM 即 Java Memory Model&#xff08;Java内存模型&#xff09;…

如何学习Java“高并发”,并在项目中实际应用?

前几天收到一位粉丝私信&#xff0c;说的是他才一年半经验&#xff0c;去面试却被各种问到分布式&#xff0c;高并发&#xff0c;多线程之间的问题。基础层面上的是可以答上来&#xff0c;但是面试官深问的话就不会了&#xff01;被问得都怀疑现在Java招聘初级岗位到底招的是初…

DMHS同步原理介绍以及DM8同步到DM8

一、DMHS原理介绍 1.DMHS介绍 达梦数据实时同步软件 DMHS 是达梦公司推出的新一代支持异构环境的高性能、高可靠和高可扩展的数据库实时同步系统。该产品基于成熟的关系数据模型和标准接口&#xff0c;跨越多种软硬件平台实现秒级数据实时同步。该产品可广泛应用于应急系统、…

什么是产品经理 | 文末赠书

目录 一. 产品经理是什么&#xff1f;二. 产品经理需要具备的技能三. 产品经理的职责四. 产品经理在软件开发过程中如何平衡不同利益方的需求&#xff1f;五. 入门建议六. 发展前景七. 总结&#x1f981;文末福利图书介绍作者简介 一. 产品经理是什么&#xff1f; 产品经理是指…

使用阿里巴巴开源神器Arthas进行性能分析

目录 前言&#xff1a; Arthas介绍 启动 分析命令 Profiler工具 前言&#xff1a; Arthas是一款由阿里巴巴开源的Java诊断工具&#xff0c;它可以在生产环境中帮助开发人员快速地定位问题&#xff0c;并进行高效的性能分析。通过在命令行中输入简单的命令&#xff0c;开发人员…

Win10开机后自动显示右键菜单怎么办?

Win10开机后自动显示右键菜单怎么办&#xff1f;用户打开Win10电脑后发现电脑自动显示右键菜单&#xff0c;如果是使用联想电脑的用户&#xff0c;需要打开联想管家&#xff0c;关掉联想锁屏即可&#xff0c;若是系统不兼容导致的&#xff0c;这时候用户就需要恢复Win10系统来解…

前端性能优化:高在性能,大在范围,必要前置知识一网打尽!(上)

前言 前端性能优化 又是个听起来很高大上的词&#xff0c;确实是的&#xff0c;因为它需要 高在性能&#xff0c;大在范围 &#xff0c;所幸很多大佬都已经输出了很多高质量的内容供大家参考&#xff0c;作者最近也在学习和了解这方面的内容&#xff0c;对如下文中的一些理解若…

死磕测试 10 余年,呕心整理出了核心知识点已经做成PDF,无私奉献

前言&#xff1a; 想在面试、工作中脱颖而出&#xff1f;想在最短的时间内快速掌握 软件测试 的核心基础知识点&#xff1f;想要成为一位优秀的测试工程师&#xff1f;本篇文章能助你一臂之力&#xff01; 目前正值招聘求职旺季&#xff0c;很多同学对一些新技术名词都能侃侃…

智能文本生成:进展与挑战

智能文本生成&#xff1a;进展与挑战 万小军 北京大学王选计算机研究所 摘要&#xff1a;智能文本生成是人工智能与自然语言处理领域的前沿研究方向&#xff0c;也是AI生成内容&#xff08;AIGC&#xff09;的关键技术支撑&#xff0c;近些年受到学术界和产业界的高度关注&…

[笔记]pg常用命令

数据库版本 &#xff1a;9.6.6 注意 &#xff1a;PostgreSQL中的不同类型的权限有SELECT,INSERT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER,CREATE,CONNECT,TEMPORARY,EXECUTE 和 USAGE。 1. 登录PG数据库 以管理员身份 postgres 登陆&#xff0c;然后通过 #psql -U postg…

【TA100 】3.3 曲面细分与几何着色器---大规模草渲染

一、两者的应用列举 1-1.曲面细分着色器的应用 ①海浪、雪地等 2著名的应用&#xff1a;和置换贴图&#xff08;DIsplacement mapping&#xff0c;也叫位移贴图&#xff09;结合使用 ● 使用普通法线的模型&#xff0c;在边缘部分的凹凸感会不理想 ● 如果使用置换贴图&#…

HarmonyOS学习路之开发篇—Java UI框架(自定义组件与布局 二)

自定义布局 当Java UI框架提供的布局无法满足需求时&#xff0c;可以创建自定义布局&#xff0c;根据需求自定义布局规则 常用接口 Component类相关接口 接口名称 作用 setEstimateSizeListener 设置测量组件的侦听器 setEstimatedSize 设置测量的宽度和高度 onEstima…