質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

3678閲覧

デバイスの識別と通知

strike1217

総合スコア651

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1グッド

3クリップ

投稿2017/08/06 12:16

編集2017/08/06 12:46

デバイスの識別とアプリケーションへの通知なのですが・・・
まず、識別から

イメージ説明
USBcoreがusb_device_id構造体を元にデバイスに対応したドライバを決定するようです。
しかし、これでは、ハードウェアから送信されるデータには、毎回ベンダIDやデバイスIDをデータと共に送信しなければならないという事でしょうか?

データだけ送信しても、どのデバイスドライバに処理を依頼するのか分かりませんよね?
ネットワークのようにソケットみたいなものがあるならできそうですが、そのようなものはないかと・・・

次に通知です。
キーボードからの入力の場合、readシステムコールを発行しハードウェア割り込みが発生するまで待機すると思いますが、GUIのマウスの方はどうやってデータを取得しているのでしょうか?
マウス用のデバイスファイルの存在は確認できました。
このファイルにあるデータを取ってくるのでしょう。

イメージ説明
アプリケーションにマウスから割り込みがあったことを通知しないとポーリング方式のようになってしまいます。
誰が、どうやって通知しているのでしょう?

考えられるやり方
(1)GUIアプリケーションがスレッドを使用してreadシステムコールの発行

void catch(){ while(1){ [readシステムコールラッパ] <取ってきたデータの処理> } }

(2)シグナルを使ってアプリケーションに割り込む。
(そんなシグナルあったっけ?)

kpsmoused というマウス受信用のカーネルスレッドがあるようです。

androidのタッチスクリーンの場合、poll関数を使って、デバイスドライバの状態変化を待っているそうです。
(ポーリング方式ですかね)

分かる方いますでしょうか?
ちなみに、今回はキャラクタ型のデバイスの話に絞らせてもらいます。

Linux 64bit Debian系です。

[追記]
usb_device_id構造体を見ましたが・・・
このデバイスがマウスであるという情報を格納するためのメンバ変数が見つかりません。
このデバイスがUSBであるという識別をするためのマクロはあるようですが・・・
このデバイスがマウスであるという情報はどのようにして伝えているのでしょうか?

kazuyakazuya👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

USBのローレベルを触っていたのはUSB黎明期なので、もううろ覚えですがざっくり以下のイメージです。

USBハブがデバイス接続を検知してホスト・コントローラへ通知。
ホスト・コントローラは電源ON要求しデバイスに「アドレス」を割り当てます。
そして、デバイス・ディスクリプタを受け取ります。このデバイス・ディスクリプタにベンダーIDとプロダクトIDが入っています。
このあたりでデバドラをロードし、デバイス接続通知をなげていたような気がします。その際、デバイス・ハンドル(だったと思うのですが)を渡します。

デバイス・ドライバはデハイス・ハンドルを指定してコンフィグレーション・ディスクリプタを要求します。
ホスト・コントローラはデバイス・ハンドルに結び付けられたアドレスに対してコンフィグレーション・ディスクリプタを要求してデバドラへ返します。
デバドラはそれを見て、適切な構成を選択してコンフィグ要求します。
このコンフィグの完了で初期化完了です。

ちなみに、USB通信は全てホスト・コントローラが取り仕切っています。
1mSec毎に全てのデバイスにデータがないか?問い合わせ、データのあるデバイスはそれを送ると言う流れです。

コンフィグレーション・ディスクリプタに当該コンフィグ時のポーリング間隔が記載されています。マウスの場合は10mSecや16mSecが多いです。(ゲーミング・マウスはもっと速いかも。)
マウスのデバイスドライバからのリード要求が有るときは、ホスト・コントローラは上記ポーリング間隔で該当デバイスをポーリングし、データを受け取ったらデバドラへ返却します。

デバドラはそのデータに応じて、マウス入力をGUI制御機構(X-Window systemなど)に渡している筈です。
すいません、この辺は知りませんが、デバドラかX-Window systemがリード要求を発行している筈です。(GUIアプリは複数あるので、それらがマウスへのリード要求を発行すると排他的にマウス・データを受け取ってしまうのでシステムとしては適切に動作しないと思います。)

投稿2017/08/06 14:42

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2017/08/06 14:52

「デバイス・ディスクリプタを受け取ります。このデバイス・ディスクリプタにベンダーIDとプロダクトIDが入っています。 このあたりでデバドラをロードし」 ああ、このあたりですね。 ベンダIDとプロダクトIDだけで、デバイスドライバを特定できるんでしょうか? 例えば、マウスですね。 クラスなドライバはLinuxカーネル側で用意されています。 (マウスを作った企業側で用意さているのではない。) なので、ベンダIDとプロダクトIDだけではマウスのドライバの特定は無理なのではないでしょうか?
strike1217

2017/08/06 15:19

ほお! なるほど! クラス番号が含まれているんですね!! ありがとうございます。
strike1217

2017/08/06 15:34 編集

USBをブスッとスロットに指し、デバイスドライバ特定されるのはわかりました。 実際にデータがデバイスから送信される際、パケット内に識別子を記述している箇所が見当たらないのですが・・・ http://toshiba.semicon-storage.com/jp/design-support/e-learning/mcupark/village/usb-interface-1.html これは、USBデバイスのアドレスとデバイスドライバを紐付けることで、デバイスドライバを特定しているという理解で良いんですかね?
strike1217

2017/08/07 03:24

データ送信の際に毎回ディスクリプタを送信するのは重いような気もしますが・・・
Chironian

2017/08/07 03:55

回答に記載した通り、下記のイメージです。 デバドラ (デバイス・ハンドル) | (デバイス・ハンドル) ホスト・コントローラ (アドレス) | (アドレス) USBデバイス ホスト・コントローラのドライバがデバイス・ハンドルと当該デバイスのアドレスのテーブルを管理していて、デバドラとやり取りする時はデバイス・ハンドで、デバイスとやり取りする時はアドレスで相手を特定する仕組みだったと思います。 そのURLは消費者向けの解説であり、技術者向けの解説ではありませんから、細かいことに言及していないだけと思います。 USBの規格書はUSBの公式サイトで誰でも無料で入手できます。 最新は3.1ですけど見るのたいへんです。2.0版が下記にあります。 http://www.usb.org/developers/docs/usb20_docs/#usb20spec
strike1217

2017/08/07 04:22

アドレスでドライバを特定しているんですね! 接続した後は、データのみを送信すれば良いわけですね。
strike1217

2017/08/07 04:26

マウスの方はキーボードとは異なり、ポーリング方式を採用していると考えてよろしいんですか?
Chironian

2017/08/07 04:34

USBマウスもUSBキーボードも、どちらも同じようにボーリングしてます。
strike1217

2017/08/07 04:44

あら、キーバードもポーリングなんですか! 何が割り込みデバイスで、何がポーリングデバイスなのか分かりませんね。
strike1217

2017/08/07 04:54

まさか・・・USBは全てポーリング方式ですか?
strike1217

2017/08/07 08:13

あら、そうなんですか! 初めて知りました。 ありがとうございます。
Chironian

2017/08/07 10:30

その通りです。
strike1217

2017/08/07 10:36

はい。わかりました。
strike1217

2017/08/08 05:16

あ、すいません。 「ホスト・コントローラは電源ON要求しデバイスに「アドレス」を割り当てます。」 この場合のアドレスとは、IOポートのアドレスのことでしょうか?
Chironian

2017/08/08 06:01

いいえ、違います。USBバス上でデバイスを識別するためのアドレスです。
strike1217

2017/08/08 09:07

バスの方ですね!! わかりました
strike1217

2017/08/08 09:25

デバイスディスクリプタとは、USBだけについてくるものですか? PCIの方を調べても、コンフィギュレーション空間しかでてきませんが・・・ PCIデバイスのほうにもデバイスディスクリプタってあるんでしょうか?
Chironian

2017/08/08 10:41

USBのデバイス・ディスクリプタはUSB規格で厳密に定められています。一般用語ではありません。 PCIに似たようなディスクリプタが有るか無いかは知りません。
strike1217

2017/08/08 10:52

そうですか。わかりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問