Armadilloフォーラム

USB接続の機器へのデータ送信で送信完了を知る方法

shsuga

2021年9月10日 16時14分

以下の構成でシステムを構成しています。
・armadillo440
・USBでプリンタに接続
・usblp を使用してプリンタに印刷
印刷ポートにUSB経由でプリンタに送信していますが、デバイスレベルで相手のプリンタにデータが送信完了したことを検知したい。
理由)印刷ポートに書き込みを完了後に確実に相手プリンタにデータが届いたこと知りたい。

以上、よろしくお願いいたします。

コメント

at_akihito.irie

2021年9月21日 9時46分

入江です。

> 印刷ポートにUSB経由でプリンタに送信していますが、デバイスレベルで相手のプリンタにデータが送信完了したことを検知したい。
> 理由)印刷ポートに書き込みを完了後に確実に相手プリンタにデータが届いたこと知りたい。

linux-3.14-at/drivers/usb/class/usblp.cを見ると、

static ssize_t usblp_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
{
 :snip
		/*
		 * Step 2: Wait for transfer to end, collect results.
		 */
		rv = usblp_wwait(usblp, !!(file->f_flags&O_NONBLOCK));

となっており、元々usblpのwrite時に転送完了を待っているようですが、こち
らでは不十分でしょうか。

usblpのソースコードまでご確認頂きまして、ありがとうございます。
usblpが転送完了を待っているとの事で安心しましたが、アプリでは、/dev/lp0 に書き込んでいるので、
write しても、パイプに書き込んだ時点でwrite関数から戻って来るのではないでしょうか?

アットマークテクノの古賀です。

shsugaさん(2021年9月21日 22時23分):
>usblpのソースコードまでご確認頂きまして、ありがとうございます。
>usblpが転送完了を待っているとの事で安心しましたが、アプリでは、/dev/lp0 に書き込んでいるので、
>write しても、パイプに書き込んだ時点でwrite関数から戻って来るのではないでしょうか?

入江(2021年9月21日 9時46分):
>linux-3.14-at/drivers/usb/class/usblp.cを見ると、
>

static ssize_t usblp_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
{
 :snip
		/*
		 * Step 2: Wait for transfer to end, collect results.
		 */
		rv = usblp_wwait(usblp, !!(file->f_flags&O_NONBLOCK));

>
>となっており、元々usblpのwrite時に転送完了を待っているようですが、こち
>らでは不十分でしょうか。

上記 usblp_write() は、/dev/lpx の write() ハンドラ関数です。
 https://github.com/atmark-techno/linux-3.14-at/blob/0bbb482ec32a14812b2…
この関数が、上記の通り、渡されたデータを送出する while ループの中で、USB パイプへの書込みと書込み完了待ちを行っていますので、/dev/lpx への write() が終わった時点で、USB パイプからデータ送出が全て終わっていると思います。
 https://github.com/atmark-techno/linux-3.14-at/blob/master/drivers/usb/…

サポートありがとうございました。
まだ、実機では確認できていませんが、
特に変更の必要がない事が解り大変助かりました。
また何かありましたら、ご連絡いたしますので、
今後とも宜しくお願い致します。