このドキュメントで説明するソフトウェアは、Extended SupportまたはSustaining Supportのいずれかにあります。 詳細は、https://www.oracle.com/us/support/library/enterprise-linux-support-policies-069172.pdfを参照してください。
Oracleでは、このドキュメントに記載されているソフトウェアをできるだけ早くアップグレードすることをお薦めします。

機械翻訳について

6.8 USBデバイス・ドライバについて

Oracle Linuxの他のバスベースのサブシステムと同様に、USBデバイス・ドライバは、そのドライバ・オブジェクトをUSBサブシステムに登録します。 これにより、ベンダーIDとデバイスIDを使用して、USBハードウェアが存在するかどうかを識別できます。

USBデバイス・ドライバの実装は、LinuxとUNIXオペレーティング・システム間において様々な点で異なる場合があり、相違点のほとんどは、ドライバがUSBリクエストの処理に使用する関数、USBドライバのメソッドの表現やUSBデバイスのプロパティの定義に使用される構造体、およびUSBインフラストラクチャと通信するためのカーネル・インタフェース・ルーチンに関するものです。

<linux/usb.h>に定義されたusb_driver構造体とusb_device_id構造体は、USBドライバとドライバがサポートしているUSBデバイスのタイプを表します。 usb_driverでは、USBコアがデバイスで使用可能なメソッドの数を定義します。

struct usb_driver {
        const char *name;

        int (*probe) (struct usb_interface *intf,
                      const struct usb_device_id *id);

        void (*disconnect) (struct usb_interface *intf);

        int (*unlocked_ioctl) (struct usb_interface *intf, unsigned int code,
                        void *buf);

        int (*suspend) (struct usb_interface *intf, pm_message_t message);
        int (*resume) (struct usb_interface *intf);
        int (*reset_resume)(struct usb_interface *intf);

        int (*pre_reset)(struct usb_interface *intf);
        int (*post_reset)(struct usb_interface *intf);

        const struct usb_device_id *id_table;

        struct usb_dynids dynids;
        struct usbdrv_wrap drvwrap;
        unsigned int no_dynamic_id:1;
        unsigned int supports_autosuspend:1;
        unsigned int soft_unbind:1;
};

ドライバはprobe()メソッドとdisconnect()メソッドを定義して、デバイスがシステムに接続または取り外されたときの初期化とクリーンアップをサポートします。 また、usb_register()およびusb_deregister()をコールして、ドライバをUSBコアに登録/登録解除します。

urb構造体ではUSB要求ブロックを定義し、カーネルはこれを使用してUSBデバイスにデータを送信します。 データをデバイスに送信するには、ドライバのwrite()メソッドでusb_alloc_urb()を使用してurbを割り当て、usb_buffer_alloc()でデータ用のバッファを割り当て、copy_from_user()でデータをバッファに書き込み、usb_fill_bulk_urb()urbの詳細を入力し、usb_submit_urb()でurbをUSBコアに送信します。 USBコアはドライバのcallback()メソッドを呼び出して、トランザクションのステータスをレポートします。 ドライバはusb_buffer_free()を使用して、割り当てられたバッファを解放します。

デバイスからデータを読み取るには、ドライバのread()メソッドでusb_bulk_msg()を使用できます。

ドライバはusb_control_msg()を使用して、USB制御メッセージを送信します。

他にも便利なヘルパー関数があり、たとえば、usb_get_descriptor()usb_get_string()では、デバイス記述子情報やUSBデバイスに関する文字列を取得できます。