有人成功使用 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出于讨论目的。
有没有人足够熟悉这个领域可以提出任何建议?