PCのプリンタ出力ポートからPPSを生成するためにpps_gen_parportカーネルモジュールを正常に使用した人はいますか?
このモジュールは、潜在的なロックの問題のためにバージョン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);
pps_gen_parportがデバイスに排他的にアクセスできるように、lpモジュールをブラックリストに追加しました。
# 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議論の目的で。
この分野に精通して提案する人はいますか?