在 Linux 上生成 PPS(每秒脉冲)

在 Linux 上生成 PPS(每秒脉冲)

有人成功使用 pps_gen_parport 内核模块在 PC 的打印机输出端口上生成 PPS 吗?

由于潜在的锁定问题,该模块几乎自从在 2.6.38 版本出现在内核中以来就被标记为损坏。然而,有一些未应用的补丁,它们(a)允许指定信号的极性,(b)原则上解决了锁定问题。

https://lore.kernel.org/patchwork/patch/760701/

https://lkml.org/lkml/2011/2/18/310

https://lore.kernel.org/patchwork/patch/760699/

应用补丁后,我能够使用 DKMS 在 x86_64 4.19.0 (Debian) 上构建模块,并且能够运行它,至少在短期内不会出现锁定。

通过调试消息,我可以看到代码正在通过系统调用运行,该系统调用应该写入并行端口(特别是脉冲选通信号),但附加的逻辑分析仪显示没有发生任何情况。我尝试在旧笔记本电脑上运行稍旧版本的代码,但成功率有限。

这来自https://github.com/torvalds/linux/blob/master/drivers/pps/generators/pps_gen_parport.c

    /* busy loop until the time is right for an assert edge */
    do {
        ktime_get_real_ts64(&ts2);
    } while (expire_time.tv_sec == ts2.tv_sec && ts2.tv_nsec < lim);

// Debugging output here is successful

    /* set the signal */
    port = dev->pardev->port;
    port->ops->write_control(port, SIGNAL); // Appears to have no effect

// Debugging output here is successful

    /* busy loop until the time is right for a clear edge */
    lim = NSEC_PER_SEC - dev->port_write_time;
    do {
        ktime_get_real_ts64(&ts2);
    } while (expire_time.tv_sec == ts2.tv_sec && ts2.tv_nsec < lim);

我已将 lp 模块列入黑名单,以便 pps_gen_parport 可以独占访问该设备,因此

# modprobe pps_gen_parport
# lsmod | grep par
pps_gen_parport        16384  0
parport_pc             32768  1
parport                57344  3 parport_pc,ppdev,pps_gen_parport

# dmesg -e
[ +11.585790] pps_gen_parport: parallel port PPS signal generator
[  +0.000133] pps_gen_parport: attached to parport0
[  +0.000049] pps_gen_parport: port write takes 1429ns
[Apr28 17:58] pps_gen_parport: we are late this time 1619629128.999968656
[Apr28 17:59] pps_gen_parport: we are late this time 1619629141.999983670

练习的目的是将计算机的 PPS 输出与其他设备的 PPS 信号进行比较,以便我可以了解计算机报告定时输入事件时应假设的延迟时间。

可能只是我在内存中应该包含哪些模块等方面犯了一些愚蠢的错误。

我已将代码上传到https://github.com/MarkMLl/pps_gen_parport出于讨论目的。

有没有人足够熟悉这个领域可以提出任何建议?

相关内容