Welcome to pyusb's documentation!

PyUSB 1.0 - Pythonからの容易なUSBアクセス

はじめに

PyUSBモジュールは、ホストマシンのユニバーサルシリアルバス(USB)システムへのPythonからの容易なアクセスを提供します。

0.4バージョンまで、PyUSBはlibusbの薄いラッパーでした。 1.0バージョンでは、状況が大幅に変更されています。PyUSBは、APIが豊富で、バックエンドに依存せず容易にに使えるPythonUSBモジュールです。

ほとんどのPythonモジュールと同様に、PyUSBのドキュメントはPython docstringに基づいているため、pydocなどのツールで操作できます。

チュートリアルもご覧ください docs/tutorial.rst

PyUSBはLinuxとWindowsで開発およびテストされています。Python>= 3.6 かつ ctypes かつ 組み込みバックエンドの少なくとも1つが走るすべてのプラットフォームで正常に動作するはずです。

PyUSBはlibusb 1.0、libusb 0.1、OpenUSBをサポートしています。一部の特別な場合を除いて、ユーザーはそのことを気にする必要はありません。

あなたがPyUSBについて質問がある場合は、 docs/faq.rst のFAQまたはSourceForgeでホストされているPyUSBメーリングリストを参照してください。 PyUSB website で、メーリングリストに登録する方法の説明を見つけることができます。

インストール

PyUSBは pip でインストールします:

pip install pyusb

あなたのシステムではlibusb(1.0または0.1)またはOpenUSBをが走っている必要があることに注意してください。 Windowsユーザーの場合、libusb 1.0 DLLは releases で提供されます(7zアーカイブを参照)。libusb Webサイトで更新を確認してください( http://www.libusb.info )。 MacOSユーザーの場合 brew install libusb が正しく実行するために必要です。

PyUSB 1.0 を使ってプログラミング

手前味噌ですが…

PyUSB 1.0は、容易なる USB アクセスを可能にする Python ライブラリです。 PyUSBはいくつかの機能を提供します:

100% Python で書かれています:

Cで記述された0.xバージョンとは異なり、1.0バージョンはPythonで記述されています。 これにより、CのバックグラウンドがないPythonプログラマーはPyUSBがどのように機能するかをよりよく理解できます。

特定のプラットフォームに偏らず、中立です:

1.0バージョンは、フロントエンド-バックエンド スキーム 実装です。 これにより、システム固有の実装の詳細とAPIが分離されています。 2つの層の間の接着剤は IBackend インターフェースです。 PyUSBには、libusb 1.0、libusb 0.1、OpenUSB用の組み込みバックエンドが付属しています。 必要に応じて、独自のバックエンドを作成することもできます。

ポータビリティ:

PyUSBは、Python>=3.6 かつ ctypes かつ サポートされている組み込みバックエンドの少なくとも1つを備えたすべてのプラットフォームで実行可能です。

最強に簡単:

USB デバイスとの通信がこれまでになく簡単になりました。 USBは複雑なプロトコルですが、PyUSBにはほとんどの一般的な構成に適したデフォルトの構成があります。

アイソクロナス転送(isochronous transfers)のサポート:

基礎となるバックエンドがアイソクロナス転送(isochronous transfers)をサポートしている場合、PyUSBはアイソクロナス(isochronous transfers)転送をサポートします。

PyUSBはUSBプログラミングの苦痛を軽減しますが、このチュートリアルでは、最小限のUSBプロトコルの予備知識があることを前提としています。 USBについて何も知らない場合は、優れたJan Axelsonの著書 USB Complete をお勧めします。(訳注: USB Complete: The Developer's Guide (Complete Guides series) (English Edition) https://www.amazon.co.jp/dp/B00U58R0FA/ 日本語版もあるが版数が古そう)

もうお話は充分、さぁコーディングしましょう!

紳士録

まず、PyUSBモジュールの概要を説明します。 PyUSBモジュールは usb パッケージの下にあり、以下のモジュールがあります:

モジュール

説明

core

メイン USB モジュール。

util

ユーティリティ関数。

control

Standard control requests.

legacy

バージョン 0.x 系 互換レイヤ。

backend

組み込みのバックエンドを含むサブパッケージ。

たとえば、coreモジュールをインポートするには、次のように入力します:

>>> import usb.core
>>> dev = usb.core.find()

それじゃあ初めましょう

以下は、見つかった最初のOUTエンドポイント(OUT endpoint)に 'test' 文字列を送信する単純際まわりないプログラムです:

import usb.core
import usb.util

# find our device
dev = usb.core.find(idVendor=0xfffe, idProduct=0x0001)

# was it found?
if dev is None:
    raise ValueError('Device not found')

# set the active configuration. With no arguments, the first
# configuration will be the active one
dev.set_configuration()

# get an endpoint instance
cfg = dev.get_active_configuration()
intf = cfg[(0,0)]

ep = usb.util.find_descriptor(
    intf,
    # match the first OUT endpoint
    custom_match = \
    lambda e: \
        usb.util.endpoint_direction(e.bEndpointAddress) == \
        usb.util.ENDPOINT_OUT)

assert ep is not None

# write the data
ep.write('test')

最初の2行でPyUSBパッケージモジュールをインポートします。 usb.core がメインモジュールで、 usb.util はユーティリティ関数です。その次の命令はデバイスを検索し、見つかった場合はインスタンスオブジェクトを返します。 なければ None が返されます。その後、使用する構成(configuration)を設定します。必要な構成(configuration)を示す引数が指定されていないことに注意してください。 ご覧のとおり、多くのPyUSB関数には、ほとんどの一般的なデバイスのデフォルトがあります。この場合、その構成セット(configuration set)は最初に見つかったものです。

次に、私たちが関心のあるエンドポイント(endpoint)を探します。 私たちは最初のインターフェース(interface)内で検索します。 エンドポイント(endpoint)を見つけたら、データをエンドポイント(endpoint)に送信します。

私たちがエンドポイントアドレス(endpoint address)を事前に知っている場合は、デバイス(device)オブジェクトから write 関数を呼び出すだけです。

dev.write(1, 'test')

ここでは、私たちはエンドポイントアドレス(endpoint address) 1 に文字列 'test' を書き込みます。 これらすべての機能については、次節で詳しく説明します。

問題は何?

エラー発生時、PyUSBの全ての関数は1つの例外を発生させます。Python標準例外 に加えて、PyUSBはUSB関連エラーの usb.core.USBError を定義しています。

あなたはPyUSBログ機能を使用することもできます。 logging モジュールを使用します。 これを有効にするには、環境変数 PYUSB_DEBUG をレベル名 criticalerrorwarninginfodebug のいずれかで定義します。

デフォルトでは、メッセージは sys.stderr に送信されます。 必要に応じて、 PYUSB_LOG_FILENAME 環境変数を定義することで、ログメッセージをファイルにリダイレクトできます。 その値が有効なファイルパスである場合、メッセージはそれに書き込まれ、そうでない場合は、 sys.stderr に送信されます。

あなたはそこにいますか?

core モジュールの find() 関数は、システムに接続されたデバイスを見つけて列挙するために使用されます。 たとえば、デバイスのvendor ID(ベンダーID)が 0xfffe 、 product ID(製品ID)が 0x0001 であるとします。 それを探したい場合は、次のように進めます:

import usb.core

dev = usb.core.find(idVendor=0xfffe, idProduct=0x0001)
if dev is None:
    raise ValueError('Our device is not connected')

以上で、関数はデバイスを表す usb.core.Device オブジェクトを返します。 デバイスが見つからない場合、 None を返します。 実際には、デバイス・デスクリプタ( Device Descriptor )の任意のフィールドを使用できます。 たとえば、システムにUSBプリンターが接続されているかどうかを確認するにはどうすればよいでしょうか。 これはとても簡単です:

# actually this is not the whole history, keep reading
if usb.core.find(bDeviceClass=7) is None:
    raise ValueError('No printer found')

7は、USB仕様によるプリンタークラスのコードです。 ちょっと待てや!存在するすべてのプリンターを列挙したい場合はどうなりますか?問題ありません:

# this is not the whole history yet...
printers = usb.core.find(find_all=True, bDeviceClass=7)

# Python 2, Python 3, to be or not to be
import sys
sys.stdout.write('There are ' + len(printers) + ' in the system\n.')

何が起きたのでしょう? 少々説明する時がきたようです。 find には find_all というパラメータがあり、デフォルトはFalseです。 false 1 の場合、 find は指定された基準に一致する最初に見つかったデバイスを返します(詳細はもうちょい後で)。 もしあなたが true の値を与えると、 find は代わりに基準に一致するすべてのデバイスのイテレータを返します。 以上です!簡単でしょ?

これで終わり?いいえ。私はあなたにすべての歴史を話したわけではありません。多くのデバイスは実際にはクラス情報をデバイス・デスクリプタ( Device Descriptor )ではなくインターフェイス・デスクリプタ( Interface Descriptor )に入れます。 したがって、システムに接続されているすべてのプリンターを本当に見つけるには、すべての構成、次にすべてのインターフェイスを渡り歩き、いずれかのインターフェイスの bInterfaceClass フィールドが7に等しいかどうかを確認する必要があります。 私のような プログラマー なら、もっと簡単な方法があるのか疑問に思うでしょう。 もちろん答えはYES。 まず、接続されているすべてのプリンターを見つけるための最終的なコードを見てみましょう。

import usb.core
import usb.util
import sys

class find_class(object):
    def __init__(self, class_):
        self._class = class_
    def __call__(self, device):
        # first, let's check the device
        if device.bDeviceClass == self._class:
            return True
        # ok, transverse all devices to find an
        # interface that matches our class
        for cfg in device:
            # find_descriptor: what's it?
            intf = usb.util.find_descriptor(
                                        cfg,
                                        bInterfaceClass=self._class
                                )
            if intf is not None:
                return True

        return False

printers = usb.core.find(find_all=1, custom_match=find_class(7))

custom_match パラメータは、デバイスオブジェクトを受け取る呼び出し可能なオブジェクトを受け入れます。一致するデバイスの場合はtrueを返し、一致しないデバイスの場合はfalseを返す必要があります。 必要に応じて、 custom_match とデバイスフィールドを組み合わせることもできます:

# find all printers that belongs to our vendor:
printers = usb.core.find(find_all=1, custom_match=find_class(7), idVendor=0xfffe)

今ここでは、0xfffe ベンダーのプリンターのみに関心があります。

お主、何者じゃ!

やった!デバイスを見つけました。が、そのデバイス君とお話をする前に、構成、インターフェース、エンドポイント、転送タイプなどについて詳しく知りたいと思います…

あなたがデバイスを持っている場合は、あなたはオブジェクトのプロパティとして任意のデバイス・デスクリプタ・フィールドにアクセスできます:

>>> dev.bLength
>>> dev.bNumConfigurations
>>> dev.bDeviceClass
>>> # ...

デバイスで有効な構成にアクセスするときは、あなたはデバイスを反復処理(iterate)できます:

for cfg in dev:
    sys.stdout.write(str(cfg.bConfigurationValue) + '\n')

同様に、構成を反復(iterate)してインターフェイスにアクセスしたり、インターフェイスを反復(iterate)してエンドポイントにアクセスしたりできます。 各種類のオブジェクトには、それぞれのデスクリプタのフィールドが属性として含まれています。 例を見てみましょう:

for cfg in dev:
    sys.stdout.write(str(cfg.bConfigurationValue) + '\n')
    for intf in cfg:
        sys.stdout.write('\t' + \
                         str(intf.bInterfaceNumber) + \
                         ',' + \
                         str(intf.bAlternateSetting) + \
                         '\n')
        for ep in intf:
            sys.stdout.write('\t\t' + \
                             str(ep.bEndpointAddress) + \
                             '\n')

次のように、添え字を使用してデスクリプタにランダムにアクセスすることもできます:

>>> # access the second configuration
>>> cfg = dev[1]
>>> # access the first interface
>>> intf = cfg[(0,0)]
>>> # third endpoint
>>> ep = intf[2]

ご覧のとおり、インデックスはゼロベースです。 ちょっと待って! 私がインターフェイスにアクセスする方法に奇妙な点があります…はい、そうです、構成の添え字は2つのアイテムのシーケンスを受け入れます。最初のアイテムはインターフェイスのインデックスで、2番目のアイテムは代替設定です。したがって、最初のインターフェイスにアクセスするが、2番目の代替設定には、 cfg[(0,1)] と書き込みます。

それでは、デスクリプタを見つける強力な方法である find_descriptor ユーティリティ関数について学びましょう。 私たちはプリンター検索の例でそれをすでに見ています。 find_descriptorfind とほぼ同じように動作しますが、2つの例外があります:

  • find_descriptor は、最初のパラメータとして、あなたが検索したいデスクリプタの親デスクリプタを受け取ります。

  • backend 2 パラメータはありません。

たとえば、構成デスクリプタ cfg があり、インターフェース1のすべての代替設定を検索したい場合は、次のようにします:

import usb.util
alt = usb.util.find_descriptor(cfg, find_all=True, bInterfaceNumber=1)

find_descriptorusb.util モジュールにあることに注意してください。 また、前述の custom_match パラメータも受け入れます。

同じデバイスを複数扱うには

コンピューター同じデバイスが2接続されていることがあります。それらをどのように区別すればよいでしょうか? Device オブジェクトには、USB仕様の一部ではないが、非常に便利な2つの追加属性があります。それは busaddress 属性です。 ただし、これらの属性はバックエンドからのものであり、バックエンドがそれらをサポートしないことは自由です。その場合、それらは None に設定されます。そうじゃない場合は、これらの属性はデバイスのバス番号とバスアドレスを表し、あなたのご想像どおり、同じ idVendoridProduct 属性を持つ2つのデバイスを区別するために使用できます。

私はどのようにすればいいですか?

接続されたUSBデバイスは、いくつかの標準的なリクエストを使って構成する必要があります。私は USB 仕様の調査を始めたとき、デスクリプタ(descriptors)、構成(configurations)、インターフェイス(interfaces)、代替設定(alternate settings)、転送タイプ(trannsfer types)、その他もろもろで混乱していました。そして最悪なことに、たったひとつの構成設定でも無視したら動かないのです。 PyUSBはあなたがこれをできるだけ簡単にできるようにすることを目指します。たとえば、デバイス・オブジェクトを取得した後、それと通信する前に最初に行う必要があることの1つは、 set_configuration リクエストを発行することです。 このリクエストのパラメータは、あなたが関心のある構成(configuration)にある bConfigurationValue です。 ほとんどのデバイスには構成(configuration)が1つしかなく、使用する構成値を追跡するのは面倒です(私が見たほとんどは単純にハードコーディングしています)。それゆえ PyUSBでは、あなたが引数なしで set_configuration を呼び出すだけで済むようにしてあります。 この場合、最初に見つかった構成(configuration)が設定されます(デバイスに1つしかない場合は、その構成値を気にする必要はありません)。 たとえば、 bConfigurationValue フィールドが5 3 に等しい構成(configuration)デスクリプタが1つあるデバイスがあるとします。以下の呼び出しはいずれも同様に機能します:

>>> dev.set_configuration(5)
# or
>>> dev.set_configuration() # we assume the configuration 5 is the first one
# or
>>> cfg = util.find_descriptor(dev, bConfigurationValue=5)
>>> cfg.set()
# or
>>> cfg = util.find_descriptor(dev, bConfigurationValue=5)
>>> dev.set_configuration(cfg)

えっへん! Configuration オブジェクトを set_configuration のパラメータとして使用できます! はい、そしてそれ自身を当座(current)の構成(configuration)として設定するための set メソッドもあります。

構成する必要がある場合と必要ない場合があるもう1つの設定は、インターフェイスの代替設定です。各デバイスは一度に1つのアクティブ化された構成(configration)のみを持つことができ、各構成(configuration)には複数のインターフェイスがあり、すべてのインターフェイスを同時に使用できます。 インターフェイスを論理デバイスと考えると、この概念をよりよく理解できます。 たとえば、多機能プリンターを想像してみましょう。これは同時にプリンターとスキャナーです。 物事をシンプルに(または少なくともできるだけシンプルに)保つために、構成(configuration)が1つしかないと考えてみましょう。 プリンターとスキャナーがあるため、構成には2つのインターフェースがあり、1つはプリンター用、もう1つはスキャナー用です。 複数のインターフェースを持つデバイスは、複合デバイスと呼ばれます。 多機能プリンターをコンピューターに接続すると、オペレーティングシステムは2つの異なるドライバーをロードします。すなわち、あなたがお持ちの「論理」機器ごとに1つです。 4

じゃあ代替設定(alternate setting)の方はどうなの? ええ、インターフェイスには1つ以上の代替設定があります。 代替設定が1つしかないインターフェイスは、代替設定がないと見なされます( 5 )。 代替設定(alternate setting)はインターフェイス用であり、構成(configuration)はデバイス用です。つまり、各インターフェイス対して、アクティブにできる代替設定(alternate setting)は1つだけです。 たとえば、USB仕様では、デバイスのプライマリ代替設定(alternate setting)にアイソクロナス・エンドポイント(isochronous endpoint)を含めることはできないため( 6 ) 、ストリーミングデバイスには少なくとも2つの代替設定(alternate setting)が必要で、2番目の設定にはアイソクロナス・エンドポイント(isochronous endpoint)があります。 ただし、構成(configuration)とは異なり、代替設定(alternate setting)が1つだけのインターフェイスを設定する必要はありません( 7 )。 set_interface_altsetting 関数でインターフェイスの代替設定(alternate setting)を選択します:

>>> dev.set_interface_altsetting(interface = 0, alternate_setting = 0)

警告

USB仕様では、追加の代替設定(alternate settings)のないインターフェイスに対するSET_INTERFACEリクエストを受信した場合、デバイスはエラーを返すことが許可されているとされています。したがって、インターフェースに複数の代替設定(alternate settings)があるか、またはSET_INTERFACEリクエストを受け入れるかどうか不明な場合は、次のようにtry-exceptブロック内で set_interface_altsetting を呼び出すのが最も安全な方法です:

try:
    dev.set_interface_altsetting(...)
except USBError:
    pass

あなたは関数のパラメータとして Interface オブジェクトを使用することもでき、 その際、 interfacealternate_setting パラメータは bInterfaceNumberbAlternateSetting フィールドから自動的に推論されます。 例えば:

>>> intf = find_descriptor(...)
>>> dev.set_interface_altsetting(intf)
>>> intf.set_altsetting() # wow! Interface also has a method for it

警告

その Interface オブジェクトはアクティブな構成(configuration)デスクリプタに属している必要があります。

私とお話して頂戴

いよいよUSBデバイスと通信する方法を学ぶ時が来ました。 USBには、バルク(bulk)と割り込み(interrupt)とアイソクロナス(isochronous)と制御(control)の、4種類の転送方法があります。 私は各転送方法の目的とそれらの間の違いを説明するつもりはありません。私は、あなたが少なくともUSB転送の基本を知っているものとして扱います。

制御(control)転送は、仕様に記載されている構造化データを持つ唯一の転送です。他の転送は、USBの観点からは生データを送受信するだけです。 そのため、制御(control)転送を処理するためだけに別の関数があり、他のすべての転送は同じ関数によって管理されます。

あなたは ctrl_transfer メソッドを介して制御(control)転送を発行します。それはOUT転送とIN転送の両方に使用されます。転送方向は bmRequestType パラメータによって決定されます。

ctrl_transfer パラメータは制御要求構造(control request structure)とほとんど同じです。 以下は、制御(control)転送を行う方法の例です(8):

>>> msg = 'test'
>>> assert dev.ctrl_transfer(0x40, CTRL_LOOPBACK_WRITE, 0, 0, msg) == len(msg)
>>> ret = dev.ctrl_transfer(0xC0, CTRL_LOOPBACK_READ, 0, 0, len(msg))
>>> sret = ''.join([chr(x) for x in ret])
>>> assert sret == msg

この例では、デバイスがループバック・パイプとして機能する2つのカスタム制御要求(custom control request)を実装していると想定しています。 CTRL_LOOPBACK_WRITE メッセージで書き込んだものは、 CTRL_LOOPBACK_READ メッセージで読み取ることができます。

最初の4つのパラメータは、標準制御転送構造(standard control transfer)のフィールド bmRequestTypebmRequestwValuewIndex です。 5番目のパラメーター(訳注:data_or_wLength=None)は、OUT転送のデータ・ペイロード、またはIN転送で読み取るバイト数です。 データペイロードは、array __init__ メソッドのパラメーターとして使用できる任意のシーケンス型にすることができます。 データ・ペイロードがない場合、パラメータは None (またはIN転送の場合は0)でなければなりません。 操作のタイムアウトを指定する最後のオプションパラメータ(訳注:timeout=None)が1つあります。 指定しない場合は、デフォルトのタイムアウトが使用されます(詳しくは後で説明します)。 OUT転送では、戻り値は実際にデバイスに送信されたバイト数です。IN転送では、戻り値はデータが読み込まれた array オブジェクトです。

他の転送については、メソッド writeread を使用して、データの書き込みと読み取りを行います。転送タイプを気にする必要はありません。転送タイプはエンドポイント・アドレスから自動的に決定されます。エンドポイント1にループバック・パイプがあると想定したループバックの例を以下に示します:

>>> msg = 'test'
>>> assert len(dev.write(1, msg, 100)) == len(msg)
>>> ret = dev.read(0x81, len(msg), 100)
>>> sret = ''.join([chr(x) for x in ret])
>>> assert sret == msg

最初(endpoint)と3番目(timeout)のパラメーターはread/write両方のメソッドで等しくそれぞれエンドポイント・アドレスとタイムアウトです。 2番目のパラメーターは、データ・ペイロード(write)または読み取るバイト数(read)です。 read メソッドの戻り値は array オブジェクトのインスタンスで、write メソッドの戻り値はで書き込んだバイト数です。

ベータ2バージョン以降、バイト数の代わりに、データが読み込まれる array オブジェクトを readctrl_transfer に渡すこともできます。 この場合、読み込むバイト数は、配列の長さと array.itemsize 値の積になります。

ctrl_transfer と同様に、 timeout パラメータはオプションです。 timeout が省略された場合、操作のタイムアウト値として Device.default_timeout プロパティが使用されます。

自分自身を制御する

転送関数に加えて、モジュール usb.control は、標準のUSB制御要求(standard USB control request)を実装する関数を提供し、 usb.util モジュールには、文字列デスクリプタを返すための便利な関数 get_string があります。

オマケ

優れた抽象化の背後には、優れた実装があります

初期の頃は libusb しかありませんでした。次にlibusb 1.0が登場し、libusb 0.1と1.0がリリースされました。 その後、OpenUSB が開発され、現在私たちは、USBライブラリのバベルの塔( Tower of Babel )に住んでいます(9) 。 PyUSBはそれをどのように扱いますか? ええ、PyUSBは民主的なライブラリです。あなたは好きなライブラリを選択できます。 実際、独自のUSBライブラリを最初から作成して、PyUSBに使用するように指示することができます。 しかし、あなたはたぶんlibusb 1.0を使用するのがいいでしょう。

find 関数には、まだ説明していないパラメータがあります。これは backend パラメータです。 指定しない場合は、組み込みのバックエンドの1つが使用されます。 バックエンドは usb.backend.IBackend から継承されたオブジェクトで、オペレーティング・システム固有のUSBの実装を担当します。ご想像のとおり、既にPyUSBに組み込み済なのはlibusb 1.0(デフォルト)とlibusb 0.1とOpenUSB(非推奨)バックエンドです。

あなたは独自のバックエンドを作成・使用することができます。 IBackend から継承し、必要なメソッドを実装するだけです。 方法については、 usb.backend パッケージのドキュメントをご覧ください。

ホンマわがままやなぁ…

Pythonには、自動メモリ管理 (automatic memory management)と呼ばれるものがあります。 これは、仮想マシンがオブジェクトをメモリから解放するタイミングを決定することを意味します。 内部的には、PyUSBは動作する必要のあるすべての低レベルのリソース(インターフェイスの要求、デバイス・ハンドルなど)を管理し、ほとんどのユーザーはそのことを心配する必要はありません。ただし、Pythonのオブジェクトの自動破棄には非決定的(nondetrministic)な性質があるため、ユーザーは割り当てられたリソースがいつ解放されるかを予測できません。一部のアプリケーションは、確定的にリソースを割り当てて解放する必要があります。これらの種類のアプリケーションのために、 usb.util モジュールはリソース管理を扱うための一連の関数を持っています。

あなたがインターフェイス(interface)を手動で要求(claim)および解放(release)したい場合、あなたは claim_interface 関数と release_interface 関数を使用できます。 claim_interface は、デバイスが、あなたが指定したインターフェイスをまだ要求していない場合、それを要求します。 デバイスが既にインターフェイスを要求済であある場合は何もしません。 同様に、 release_interface は、あなたが指定のインターフェイスが既に要求(claim)済の場合、それを解放します。まだインターフェイスが要求されていない場合は何もしません。あなたはこの手動インターフェイス要求(manual interface claim)を使用して、libusb のドキュメントに記載されている構成選択の問題( configuration selection problem )を解決できます。

あなたが、デバイス・オブジェクトによって割り当てられたすべてのリソース(要求済のインターフェースを含む)を解放したい場合は、 dispose_resources 関数を使用できます。 割り当てられたすべてのリソースを解放し、デバイス・オブジェクト(デバイス・ハードウェア自体ではない)を、find 関数呼び出しから戻ってきた直後の状態にします。

ライブラリを手動で指定する

一般に、バックエンドは、USBアクセスAPIを実装する共有ライブラリのラッパーです。 デフォルトでは、バックエンドは find_library() ctypes 関数を使用します。 Linuxや他のUNIX風オペレーティングシステムでは、 find_library は外部プログラム( /sbin/ldconfiggccobjdump など)を実行してライブラリファイルを見つけようとします。

これらのプログラムがないか、ライブラリ・キャッシュが無効になっているシステムでは、この機能は使用できません。 この制限を克服するために、PyUSBではカスタムの find_library() 関数をバックエンドに提供できます。

このようなシナリオの例です:

>>> import usb.core
>>> import usb.backend.libusb1
>>>
>>> backend = usb.backend.libusb1.get_backend(find_library=lambda x: "/usr/lib/libusb-1.0.so")
>>> dev     = usb.core.find(..., backend=backend)

get_backend() 関数の find_library 引数に注意してください。この引数では、バックエンドの正しいライブラリを見つける責任がある関数を指定します。

古臭いルール

あなたが古いPyUSB API(バージョン 0.X 系統)を使用してアプリケーションを作成していた場合、新しいAPIを使用するようにコードを更新する必要があるかどうかを悩んでいるかもしれません。まあ、できればそうすべきですが、そうする必要はありません。 PyUSB 1.0には usb.legacy 互換モジュールが付属しています。新しいAPIの上に古いAPIを実装します。「では、アプリケーションを機能させるために、import usbimport usb.legacy as usb に置き換えるだけでよいですか?」答えは「はい」です。これでうまくいきますが、でも、これすらも必要はありません。 アプリケーションをそのまま実行すると、 usb.legacy からすべてのパブリック・シンボルが import usb ステートメントによってインポートされるため、そのまま機能します。問題が発生した場合は、おそらくあなたは何かしらバグを発見したということです。(訳注:とは言え、互換なのはあくまでPyUSBだけであってPyUSBが参照するPython標準ライブラリが変更になっていることがある。手元ではUSBError.messageをUSBError.strerrorに修正する必要があった。USBErrorがIOErrorを継承しているため。)

1

TrueまたはFalse(先頭大文字)とは、Python言語のそういう値を意味します。そして私がtrueやfalseを言うとき、それはtrueとfalseに評価されるPythonのあらゆる表現を意味します。

2

各々のバックエンドのドキュメントを参照してください。

3

USB仕様では、構成(configuration)に順番になるような値を義務付けていません(訳注:次の値が+1で得られると期待するな、飛び飛びバラバラを覚悟せよということ)。 インターフェイスと代替設定(alternate setting)番号についても同様です。

4

実際はもう少し複雑ですが、ここでの説明はとしては十分です。

5

私もそれが奇妙に聞こえることは知っています。

6

これは、デバイスの構成(configuration)時にアイソクロナス転送用の帯域幅がない場合、デバイスを成功裏に列挙できるためです。

7

デバイスは未構成の状態(unconfigured state)であることが許可されているため、これは構成(configration)では発生しません。

8

PyUSBでは、制御(control)転送はエンドポイント0でのみ発行されます。代替制御エンドポイント(alternate control endpoint)を持つデバイスは非常に非常にまれです(私はそのようなデバイスを全く見たことがありません)。

9

単なる冗談です。真剣に受け止めないでください。 でも、多くの選択肢は、選択肢がないよりも優れています。

FAQ

"No backend available" エラーを修正するにはどうすればいいですか?

通常、この問題には次の4つの原因が考えられます:

  1. あなたが libusb ライブラリをインストールしていない場合。

  2. あなたが libusb ライブラリを標準の共有ライブラリパス置いてない場合。

  3. あなたの libusb のバージョンがとても古い場合。

  4. あなたの PyUSB バージョンがとても古い場合。

何が問題なのかをデバッグするには、あなたの環境で以下のスクリプトを実行します:

import os
os.environ['PYUSB_DEBUG'] = 'debug'
import usb.core
usb.core.find()

これにより、デバッグメッセージがコンソールに出力されます。 それでも何が起こっているのか分からないときは、当該のデバッグ出力を掲載して、メーリングリストに助けを求めてください。

Windowsにlibusbをインストールするにはどうすればいいですか?

libusb または libusb-win32 をWindowsにインストールするには、 zadig を使用してください。

Zadigはlibusb-1.0.dllをインストールしないため、libusb 1.0バックエンドを使用するには、Pythonインストールの適切な場所にlibusb-1.0.dllを配置する必要があることに注意してください。

指定のバックエンドの使用を強制するにはどうすればいいですか?

libusb1 バックエンド使用例:

>>> import usb.core
>>> from usb.backend import libusb1
>>> be = libusb1.get_backend()
>>> dev = usb.core.find(backend=be)

libusb ライブラリ・パスをバックエンドに渡すにはどうすればよいですか?

tutorialSpecify libraries by hand (邦訳:ライブラリを手動で指定する) を参照。

選択した構成(configuration)の、すでに構成(configured)されているデバイスで set_configuration() を 呼び出す/呼び出さない 方法は?

通常、 set_configuration() はデバイスの初期化中に呼び出されます。 libusb documentationlibusb_set_configuration() は次のように述べています:

あなたが、選択した構成(configuration)で既に構成(configure)されているデバイスでこの関数を呼び出すと、この関数は軽量のデバイスリセット(lightweight device reset)として機能します。すなわち、当座(current)の構成(configuration)を使用してSET_CONFIGURATIONリクエストを発行し、ほとんどのUSB関連デバイスの状態をリセットします(altsettingをゼロにリセットし、エンドポイントをクリアし停止、resetをトグル)。

したがって、その後 write() を呼び出すと、タイムアウトエラーが発生します。

この動作に対する解決策の一つは、 configuration selection and handling (構成(configuration)の選択と処理)で説明されているように、現在アクティブな構成を検討することです。 "必要な構成(configuration)が既にアクティブである場合、構成(configuration)を選択する必要はありません"

try:
    cfg = dev.get_active_configuration()
except usb.core.USBError:
    cfg = None
if cfg is None or cfg.bConfigurationValue != cfg_desired:
    dev.set_configuration(cfg_desired)

API Reference

This page contains auto-generated API reference documentation 1.

usb

PyUSB - Pythonから簡単にUSBにアクセスできるようにします。

本パッケージはイカのモジュールとサブバッケージをエクスポートします:

バージョン1.0以降では、メインのPyUSB実装は「usb.core」モジュールにあります。 新しいアプリケーションではそれを使用することをお勧めします。

サブパッケージ

usb.backend

usb.backend - バックエンド・インターフェイス

本モジュールからは以下がエスクポートされます:

  • IBackend - バックエンド・インターフェイス

バックエンド(backend)は、IBackendインターフェイスを実装するPythonオブジェクトです。 これを行う最も簡単な方法は、IBackendから継承することです。

PyUSBはすでにlibusbバージョン0.1と1.0、およびOpenUSBライブラリのバックエンドを提供しています。 PyUSBに含まれるバックエンド・モジュールは、バックエンド・オブジェクトのインスタンスを返すget_backend()関数をエクスポートする必要があります。必要に応じて、独自にカスタマイズしたバックエンドを提供できます。 以下に、バックエンド実装モジュールのスケルトンを示します:

import usb.backend

class MyBackend(usb.backend.IBackend):
    pass

def get_backend():
    return MyBackend()

あなたは、あなたがカスタマイズしたバックエンドを usb.core.find() 関数のバックエンド・パラメータとして渡すことで使用できます。例えば:

import custom_backend
import usb.core

myidVendor = 0xfffe
myidProduct = 0x0001

mybackend = custom_backend.get_backend()

dev = usb.core.find(backend = mybackend, idProduct=myidProduct,
                    idVendor=myidVendor)

カスタム・バックエンドの場合、アプリケーション・コードがバックエンドをインスタンス化するため、あなたは get_backend()関数を提供する必要はありません。

find()関数にバックエンドを指定しない場合、内部ルールに従ってデフォルトのバックエンドの1つを使用します。 詳細については、find()関数のドキュメントを参照してください。

サブモジュール
usb.backend.libusb0
Module Contents
Functions
  • usb.backend.libusb0.get_backend

usb.backend.libusb0.get_backend(find_library=None)
usb.backend.libusb1
Module Contents
Functions
  • usb.backend.libusb1.get_backend

Attributes
usb.backend.libusb1.LIBUSB_SUCCESS = 0
usb.backend.libusb1.LIBUSB_ERROR_IO
usb.backend.libusb1.LIBUSB_ERROR_INVALID_PARAM
usb.backend.libusb1.LIBUSB_ERROR_ACCESS
usb.backend.libusb1.LIBUSB_ERROR_NO_DEVICE
usb.backend.libusb1.LIBUSB_ERROR_NOT_FOUND
usb.backend.libusb1.LIBUSB_ERROR_BUSY
usb.backend.libusb1.LIBUSB_ERROR_TIMEOUT
usb.backend.libusb1.LIBUSB_ERROR_OVERFLOW
usb.backend.libusb1.LIBUSB_ERROR_PIPE
usb.backend.libusb1.LIBUSB_ERROR_INTERRUPTED
usb.backend.libusb1.LIBUSB_ERROR_NO_MEM
usb.backend.libusb1.LIBUSB_ERROR_NOT_SUPPORTED
usb.backend.libusb1.LIBUSB_ERROR_OTHER
usb.backend.libusb1.LIBUSB_TRANSFER_COMPLETED = 0
usb.backend.libusb1.LIBUSB_TRANSFER_ERROR = 1
usb.backend.libusb1.LIBUSB_TRANSFER_TIMED_OUT = 2
usb.backend.libusb1.LIBUSB_TRANSFER_CANCELLED = 3
usb.backend.libusb1.LIBUSB_TRANSFER_STALL = 4
usb.backend.libusb1.LIBUSB_TRANSFER_NO_DEVICE = 5
usb.backend.libusb1.LIBUSB_TRANSFER_OVERFLOW = 6
usb.backend.libusb1.get_backend(find_library=None)
Package Contents
Classes
  • usb.backend.IBackend

class usb.backend.IBackend

Bases: usb._objfinalizer.AutoFinalizedObject

バックエンド・インターフェイス

IBackendは、バックエンド実装の基本的なインターフェイスです。 デフォルトでは、インターフェイスのメソッドはNotImplementedError例外を発生させます。 バックエンド実装は、必要な機能を提供するためにメソッドを置き換える必要があります。

Pythonは動的型付き言語であるため、IBackendから継承する義務はありません。IBackendのように動作するものはすべてIBackendです。 ただし、IBackendから継承することをことを強くお勧めします。IBackendから継承すると、一貫したデフォルトの動作が提供されます。

enumerate_devices(self)

この関数は、システムで検出された各USBデバイスの実装定義のデバイスIDを生成する反復可能(iterable)なオブジェクトを返すために必要です。

デバイス識別オブジェクト(device identification object)は、インターフェイスの他のメソッドへの引数として使用されます。

get_parent(self, dev)

与えたデバイスの親デバイスを返します。

get_device_descriptor(self, dev)

与えたデバイスのデバイス・デスクリプタを返します。

返されるオブジェクトには、すべてのデバイス・デスクリプタ・フィールドをメンバー変数としてアクセス可能にする必要があります。 これらは、int型に変換可能である必要があります(等しい必要はありません)。

devは、enumerate_devices()メソッドによって返されるイテレータによって生成されるオブジェクトです。

get_configuration_descriptor(self, dev, config)

与えたデバイスの構成(configuration)デスクリプタを返します。

返されるオブジェクトには、メンバー変数としてアクセス可能なすべての構成(configuration)デスクリプタ・フィールドが必要です。これらは、int型に変換可能である必要があります(等しい必要はありません)。

devパラメータはデバイス識別オブジェクトです。configは構成(congigure)の論理インデックスです(bConfigurationValueフィールドではありません)。「論理インデックス」とは、GET_DESCRIPTORリクエストの結果としてペリフェラルによって返される構成の相対的な順序を意味します。

get_interface_descriptor(self, dev, intf, alt, config)

与えたデバイスのインターフェイス・デスクリプタを返します。

返されるオブジェクトには、すべてのインターフェイス・デスクリプタ・フィールドをメンバー変数としてアクセスできるようにする必要があります。 これらは、int型に変換可能である必要があります(等しい必要はありません)。

devパラメータはデバイス識別オブジェクトです。 intfパラメータは(bInterfaceNumberフィールドではなく)インターフェイスの論理インデックスであり、altは(bAlternateSetting値ではなく)代替設定(alternate setting)の論理インデックスです。すべてのインターフェイスに複数の代替設定(alternate setting)があるわけではありません。この場合、altパラメータはゼロにする必要があります。configは構成(configuration)の論理インデックスです(bConfigurationValueフィールドではありません)。

get_endpoint_descriptor(self, dev, ep, intf, alt, config)

与えたデバイスのエンドポイント・デスクリプタを返します。

返されるオブジェクトには、メンバー変数としてアクセス可能なすべてのエンドポイント・デスクリプタ・フィールドが必要です。 これらは、int型に変換可能である必要があります(等しい必要はありません)。

epパラメーターは、必要なエンドポイント・デスクリプタのエンドポイント論理インデックス(bEndpointAddressフィールドではない)です。 dev、intf、alt、configは、get_interface_descriptor()メソッドですでに説明済のものと同じ値です。

open_device(self, dev)

データ交換(data exchange)のためにデバイスを開きます。

このメソッドは、通信のためにdevパラメーターで識別されたデバイスを開きます。 このメソッドは、転送メソッドなどの通信関連メソッドを呼び出す前に呼び出す必要があります。

通信インスタンス(communication instance)を識別するハンドルを返します。 このハンドルを通信メソッド(communication method)に渡す必要があります。

close_device(self, dev_handle)

デバイス・ハンドルをクローズする。

このメソッドは、デバイスの通信チャネルを閉じ、それに関連するすべてのシステムリソースを解放します。

set_configuration(self, dev_handle, config_value)

アクティブなデバイス構成(configurtion)をセットする。

このメソッドは、デバイスのアクティブな構成を設定するために呼び出す必要があります。 dev_handleパラメータはopen_device()メソッドによって返される値であり、config_valueパラメータは関連する構成(configure)デスクリプタのbConfigurationValueフィールドです。

get_configuration(self, dev_handle)

当座(current)のアクティブなデバイス構成(configuration)を取得。

このメソッドは、現在アクティブな構成(configuration)のbConfigurationValueを返します。バックエンドとOSに応じて、キャッシュされた値が返されるか、制御要求(control request)が発行されます。dev_handleパラメータは、open_deviceメソッドによって返される値です。

set_interface_altsetting(self, dev_handle, intf, altsetting)

インターフェイス代替設定(alternate setting)をセットする。

このメソッドは、インターフェイスに複数の代替設定(alternate setting)がある場合にのみ呼び出す必要があります。dev_handleは、open_device()メソッドによって返される値です。intfとaltsettingは、それぞれ関連するインターフェイス(interface)のbInterfaceNumberフィールドとbAlternateSettingフィールドです。

claim_interface(self, dev_handle, intf)

指定のインターフェイスを要求(claim)します。

インターフェイスの要求(claim)はUSB仕様自体には関係ありませんが、通常はUSBライブラリに必要な呼び出しです。システム上のインターフェイスへの排他的アクセスを要求(request)します。このメソッドは、いずれかの転送(transfer)メソッドを使用する前に呼び出す必要があります。

dev_handleはopen_device()メソッドによって返された値で、intfは欲しいインターフェイスのbInterfaceNumberフィールドです。

release_interface(self, dev_handle, intf)

要求済のインターフェイス(claimed interface)を開放する。

dev_handleとintfは、claim_interfaceメソッドと同様のパラメーターです。

bulk_write(self, dev_handle, ep, intf, data, timeout)

一括書き込み(bulk write)を実行します。

dev_handleは、open_device()メソッドによって返される値です。 epパラメータは、データが送信されるエンドポイントのbEndpointAddressフィールドです。 intfは、エンドポイントを含むインターフェイスのbInterfaceNumberフィールドです。 dataパラメータは、送信されるデータです。 これは、array.arrayクラスのインスタンスでなければなりません。 timeoutパラメータは、操作のタイムアウトをミリ秒単位で指定します。

本メソッドは書き込んだバイト数を返します。

bulk_read(self, dev_handle, ep, intf, buff, timeout)

一括読み取り(bulk read)を実行します。

dev_handleは、 open_device()メソッドによって返される値です。 epパラメーターは、データの受信元となるエンドポイントのbEndpointAddressフィールドです。 intfは、エンドポイントを含むインターフェイスのbInterfaceNumberフィールドです。 buffパラメータは、読み取られたデータを受け取るためのバッファです。バッファの長さのバイト数だけデータが読み取られます。timeoutパラメータは、操作のタイムアウトをミリ秒単位で指定します。

本メソッドは実際に読み取ったバイト数を返します。

intr_write(self, dev_handle, ep, intf, data, timeout)

割り込み書き込み(interrupt write)を実行します。

dev_handleは、open_device()メソッドによって返される値です。 epパラメータは、データが送信されるエンドポイントのbEndpointAddressフィールドです。 intfは、エンドポイントを含むインターフェイスのbInterfaceNumberフィールドです。 dataパラメータは、送信されるデータです。 これは、array.arrayクラスのインスタンスでなければなりません。 timeoutパラメータは、操作のタイムアウトをミリ秒単位で指定します。

本メソッドは書き込んだバイト数を返します。

intr_read(self, dev_handle, ep, intf, size, timeout)

読み取りの割込転送(interrupt read)を実行します。

dev_handleは、open_device()メソッドによって返される値です。epパラメーターは、データの受信元となるエンドポイントのbEndpointAddressフィールドです。intfは、エンドポイントを含むインターフェイスのbInterfaceNumberフィールドです。buffパラメータは、読み取られたデータを受け取るためのバッファです。バッファの長さのバイト数だけデータが読み取られます。timeoutパラメータは、操作のタイムアウトをミリ秒単位で指定します。

本メソッドは実際に読み取ったバイト数を返します。

iso_write(self, dev_handle, ep, intf, data, timeout)

アイソクロナス書き込みを実行します。

dev_handleは、open_device()メソッドによって返される値です。 epパラメータは、データが送信されるエンドポイントのbEndpointAddressフィールドです。 intfは、エンドポイントを含むインターフェイスのbInterfaceNumberフィールドです。 dataパラメータは、送信されるデータです。 これは、array.arrayクラスのインスタンスでなければなりません。 timeoutパラメータは、操作のタイムアウトをミリ秒単位で指定します。

本メソッドは書き込んだバイト数を返します。

iso_read(self, dev_handle, ep, intf, size, timeout)

アイソクロナス読み取りを実行します。

dev_handleは、open_device()メソッドによって返される値です。epパラメーターは、データの受信元となるエンドポイントのbEndpointAddressフィールドです。intfは、エンドポイントを含むインターフェイスのbInterfaceNumberフィールドです。buffパラメータは、読み込まれたデータを受け取るためのバッファであり、バッファの長さのバイト数だけデータが読み込まれます。timeoutパラメータは、操作のタイムアウトをミリ秒単位で指定します。

本メソッドは実際に読み取ったバイト数を返します。

ctrl_transfer(self, dev_handle, bmRequestType, bRequest, wValue, wIndex, data, timeout)

エンドポイント0(ゼロ)で制御(control)転送を実行します。

転送の方向は、セットアップパケットのbmRequestTypeフィールドから推測されます。

dev_handleは、 open_device() メソッドによって返される値です。 bmRequestTypeとbRequestとwValueとwIndexは、セットアップパケットの同名のフィールドです。 dataは配列オブジェクトです。OUTリクエストの場合はデータ・ステージで送信するバイトを格納しており、INリクエストの場合は読み取ったデータを保持するバッファです。 送信または受信が要求されたバイト数は、配列の長さにdata.itemsizeフィールドを掛けたものと同じです。 timeoutパラメータは、操作のタイムアウトをミリ秒単位で指定します。

OUT転送時は書き込んだバイト数を返します。IN転送時は読み込んだデータをarray.arrayオブジェクトとして返します。

clear_halt(self, dev_handle, ep)

エンドポイントの停止/失速(halt/stall)状態をクリアします。

reset_device(self, dev_handle)

デバイスをリセットする。

is_kernel_driver_active(self, dev_handle, intf)

カーネル・ドライバーがインターフェイスでアクティブかどうかを確認します。

カーネル・ドライバがアクティブな場合、あなたはインターフェイスを要求(claim)できず、バックエンドは入出力を実行できません。

detach_kernel_driver(self, dev_handle, intf)

インターフェイスからカーネル・ドライバを取り外します。

成功ならば、あなたはインターフェイスを要求(claim)して入出力を実行可能です。

attach_kernel_driver(self, dev_handle, intf)

以前 detach_kernel_driver() を使用して切り離されていたインターフェイスのカーネル・ドライバーを再接続します。

サブモジュール

usb._debug
Module Contents
Functions
  • usb._debug.methodtrace

  • usb._debug.functiontrace

usb._debug.methodtrace(logger)
usb._debug.functiontrace(logger)
usb._interop
Module Contents
Functions
  • usb._interop._next

Attributes
  • usb._interop._reduce

  • usb._interop._set

  • usb._interop._update_wrapper

usb._interop._reduce
usb._interop._set
usb._interop._next(iter)
usb._interop._update_wrapper
usb._lookup
  • usb._lookups - Lookup tables for USB

Module Contents
usb._lookup.descriptors
usb._lookup.device_classes
usb._lookup.interface_classes
usb._lookup.ep_attributes
usb._lookup.MAX_POWER_UNITS_USB2p0 = 2
usb._lookup.MAX_POWER_UNITS_USB_SUPERSPEED = 8
usb.control

usb.control - USB 標準制御要求(standard control requests)

本モジュールからは以下がエスクポートされます:

  • get_status - get recipeint status

  • clear_feature - clear a recipient feature

  • set_feature - set a recipient feature

  • get_descriptor - get a device descriptor

  • set_descriptor - set a device descriptor

  • get_configuration - get a device configuration

  • set_configuration - set a device configuration

  • get_interface - get a device interface

  • set_interface - set a device interface

Module Contents
Functions
  • usb.control.get_status

  • usb.control.clear_feature

  • usb.control.set_feature

  • usb.control.get_descriptor

  • usb.control.set_descriptor

  • usb.control.get_configuration

  • usb.control.set_configuration

  • usb.control.get_interface

  • usb.control.set_interface

Attributes
  • usb.control.ENDPOINT_HALT

  • usb.control.FUNCTION_SUSPEND

  • usb.control.DEVICE_REMOTE_WAKEUP

  • usb.control.U1_ENABLE

  • usb.control.U2_ENABLE

  • usb.control.LTM_ENABLE

usb.control.ENDPOINT_HALT = 0
usb.control.FUNCTION_SUSPEND = 0
usb.control.DEVICE_REMOTE_WAKEUP = 1
usb.control.U1_ENABLE = 48
usb.control.U2_ENABLE = 49
usb.control.LTM_ENABLE = 50
usb.control.get_status(dev, recipient=None)

指定の受信者(recipient)のステータスを返す。

dev は、リクエストの送信先となるデバイス・オブジェクトです。

受信者(recipient)は、 None (デバイスからステータスが照会される) または Interface または Endpoint デスクリプタにすることができます。

ステータス値は整数として返され、下位ワードは2バイトのステータス値からなります。

usb.control.clear_feature(dev, feature, recipient=None)

指定の機能(feature)をクリアまたは無効にします。

dev は、リクエストの送信先となるデバイス・オブジェクトです。

featureには、あなたが無効にしたい機能(feature)を指定します。

受信者(recipient)は、 None (デバイスからステータスが照会される) または Interface または Endpoint デスクリプタにすることができます。

usb.control.set_feature(dev, feature, recipient=None)

指定の機能(feature)を設定または有効化します。

dev は、リクエストの送信先となるデバイス・オブジェクトです。

featureにはあなたが有効にしたい機能(feature)を指定します。

受信者(recipient)は、 None (デバイスからステータスが照会される) または Interface または Endpoint デスクリプタにすることができます。

usb.control.get_descriptor(dev, desc_size, desc_type, desc_index, wIndex=0)

指定のデスクリプタを返す。

dev は、リクエストの送信先となるデバイス・オブジェクトです。

desc_sizeはデスクリプタのサイズを指定します。

desc_typeとdesc_indexは、それぞれデスクリプタのタイプとインデックスです。 wIndexインデックスは文字列デスクリプタに使用され、言語IDを表します。文字列デスクリプタ以外タイプの記述子の場合、wIndexはゼロです。

usb.control.set_descriptor(dev, desc, desc_type, desc_index, wIndex=None)

存在するデスクリプタを更新するか、または新しいデスクリプタを追加します。

dev は、リクエストの送信先となるデバイス・オブジェクトです。

descほげほげなパラメータ達は、デバイスに送信されるデスクリプタです。 desc_typeとdesc_indexは、それぞれデスクリプタのタイプとインデックスです。 wIndexインデックスは文字列デスクリプタに使用され、言語IDを表します。 文字列デスクリプタ以外のタイプのデスクリプタの場合、wIndexはゼロです。

usb.control.get_configuration(dev)

デバイスの、当座(current)でアクティブな構成(configuration)を取得します。

dev は、リクエストの送信先となるデバイス・オブジェクトです。

キャッシュされたデータを使用する可能性がある Device.get_active_configuration メソッドとは異なり、この関数は常にデバイス・リクエストを実行します。

usb.control.set_configuration(dev, bConfigurationNumber)

当座(current)とする構成(configuration)を設定します。

dev は、リクエストの送信先となるデバイス・オブジェクトです。

usb.control.get_interface(dev, bInterfaceNumber)

インターフェイスの代替設定(alternate setting)の当座(current)を取得します。

dev は、リクエストの送信先となるデバイス・オブジェクトです。

usb.control.set_interface(dev, bInterfaceNumber, bAlternateSetting)

インターフェイスの代替設定(alternate setting)を設定します。

dev は、リクエストの送信先となるデバイス・オブジェクトです。

usb.core

usb.core - コアUSB機能

本モジュールからは以下がエスクポートされます:

  • Device - USBデバイスを表すクラス。

  • Configuration - 構成(configuration)デスクリプターを表すクラス。

  • Interface - インタフェース(interface)デスクリプターを表すクラス。

  • Endpoint - エンドポイント(endpoint)デスクリプターを表すクラス。

  • find() - USBデバイス達を探す関数

  • show_devices() - 存在するデバイスを表示する関数。

モジュール内容
Classes
  • usb.core.Endpoint

  • usb.core.Interface

  • usb.core.Configuration

  • usb.core.Device

Functions
  • usb.core.find

  • usb.core.show_devices

exception usb.core.USBError(strerror, error_code=None, errno=None)

Bases: OSError

USBエラーの例外クラス。

USB関連のエラーが発生した場合、バックエンドはこの例外を発生させる必要があります。バックエンド固有のエラーコードは、 'backend_error_code' メンバー変数を介して利用できます。

exception usb.core.USBTimeoutError(strerror, error_code=None, errno=None)

Bases: USBError

接続タイムアウトエラーの例外クラス。

USB接続での呼び出しがタイムアウトエラーコードを返す場合、バックエンドはこの例外を発生させる必要があります。

exception usb.core.NoBackendError

Bases: ValueError

有効なバックエンドが見つからない場合の例外クラス。

class usb.core.Endpoint(device, endpoint, interface=0, alternate_setting=0, configuration=0)

Bases: object

エンドポイントオブジェクトを表します。

このクラスには、USB仕様に従ったエンドポイントデスクリプターのすべてのフィールドが含まれています。クラスプロパティとしてアクセスできます。たとえば、エンドポイントデスクリプターのフィールドbEndpointAddressにアクセスするには、以下のようにします:

>>> import usb.core
>>> dev = usb.core.find()
>>> for cfg in dev:
>>>     for i in cfg:
>>>         for e in i:
>>>             print e.bEndpointAddress
__repr__(self)
戻り値

repr(self)

__str__(self)
戻り値

str(self)

write(self, data, timeout=None)

エンドポイントにデータを書き込みます。

パラメータデータにはエンドポイントに送信されるデータが含まれ、タイムアウトは操作の制限時間です。転送タイプとエンドポイントアドレスは自動的に推測されます。

このメソッドは、書き込まれたバイト数を返します。

詳細については、Device.write()メソッドを参照してください。

read(self, size_or_buffer, timeout=None)

エンドポイントからデータを読み取ります。

パラメータsize_or_bufferは、読み取るバイト数、またはデータが挿入される配列オブジェクトのいずれかであり、timeoutは操作の時間制限です。転送タイプとエンドポイントアドレスは自動的に推測されます。

このメソッドは、配列オブジェクトまたは実際に読み取られたバイト数のいずれかを返します。

詳細については、Device.read()メソッドを参照してください。

clear_halt(self)

エンドポイントのhalt/status条件をクリアします。

_str(self)
class usb.core.Interface(device, interface=0, alternate_setting=0, configuration=0)

Bases: object

インターフェイスオブジェクトを表します。

このクラスには、USB仕様に従ったインターフェースデスクリプターのすべてのフィールドが含まれています。クラスプロパティとしてアクセスできます。たとえば、インターフェイスデスクリプターのフィールドbInterfaceNumberにアクセスするには、以下のようにします:

>>> import usb.core
>>> dev = usb.core.find()
>>> for cfg in dev:
>>>     for i in cfg:
>>>         print i.bInterfaceNumber
__repr__(self)
戻り値

repr(self)

__str__(self)

インターフェイスのすべての情報を表示します。

endpoints(self)
戻り値

そのデバイスの構成群をタプルで返します。

set_altsetting(self)

インターフェイスの代替設定を設定します。

__iter__(self)

インターフェイスのすべてのエンドポイントを繰り返し処理します。

__getitem__(self, index)
戻り値

指定された位置にあるエンドポイントオブジェクト。

_str(self)
_get_full_descriptor_str(self)
class usb.core.Configuration(device, configuration=0)

Bases: object

構成(configuration)オブジェクトを表します。

このクラスには、USB仕様に従ったconfigurationデスクリプターのすべてのフィールドが含まれています。 クラスプロパティとしてアクセスできます。 たとえば、configurationデスクリプターのフィールドbConfigurationValueにアクセスするには、以下のようにします:

>>> import usb.core
>>> dev = usb.core.find()
>>> for cfg in dev:
>>>     print cfg.bConfigurationValue
__repr__(self)
戻り値

repr(self)

__str__(self)
戻り値

str(self)

interfaces(self)
戻り値

そのデバイスの構成インターフェース達をタプルで返します。

set(self)

この構成をアクティブな構成として設定します。

__iter__(self)

構成(configuration)のすべてのインターフェースを反復処理します。

__getitem__(self, index)
戻り値

指定された位置にあるInterfaceオブジェクト。

indexは、それぞれインターフェイスインデックスと代替設定インデックスを持つ2つの値のタプルです。 例:

>>> interface = config[(0, 0)]
_str(self)
_get_full_descriptor_str(self)
class usb.core.Device(dev, backend)

Bases: usb._objfinalizer.AutoFinalizedObject

Deviceオブジェクトです。

このクラスには、USB仕様に基づくデバイス・デスクリプタのすべてのフィールドが含まれています。 あなたはそれらにクラスのプロパティとしてアクセスできます。 たとえば、デバイス・デスクリプタのフィールドbDescriptorTypeにアクセスするには、次のようにします:

>>> import usb.core
>>> dev = usb.core.find()
>>> dev.bDescriptorType

さらに、クラスはハードウェアと通信するメソッドを提供します。 通常、アプリケーションは最初にset_configuration()メソッドを呼び出してデバイスを既知の構成済み状態(a known conifgured state)にし、代替設定が複数ある場合、オプションでset_interface_altsetting()を呼び出して、使用するインターフェイスの代替設定を選択し、 write() や read() メソッドでデータを送受信します。

新しいハードウェアで作業する場合、最初の試行は次のようになります:

>>> import usb.core
>>> dev = usb.core.find(idVendor=myVendorId, idProduct=myProductId)
>>> dev.set_configuration()
>>> dev.write(1, 'test')

このサンプルでは、対象のデバイスを見つけ(myVendorIdおよびmyProductIdをデバイスの対応する値で置き換える必要があります)、デバイスを構成し(デフォルトでは、構成値(configuration value)は1であり、ほとんどのデバイスの一般的な値です)、エンドポイント0x01へデータを幾つか書き込みます。

書き込み、読み取り、およびctrl_transferメソッドのタイムアウト値はミリ秒単位で指定します。このパラメーターを省略した場合、代わりにDevice.default_timeout値が使用されます。Device.default_timeoutプロパティは、ユーザがいつでも設定できます。

default_timeout
__repr__(self)
__str__(self)
configurations(self)
戻り値

そのデバイスの構成群をタプルで返します。

property langids(self)

USBデバイスでサポートされている言語IDコードを返します。

これらは、Windows開発者に馴染みのある16ビットコードです。たとえば、en-USの代わりに0x0409と言います。詳細については、usb.org開発者サイトのUSB_LANGIDS.pdfを参照してください。 この配列にないLANGIDを使用する文字列要求は、デバイスに送信しないでください。

このプロパティは、最初にアクセスされたときに一部のUSBトラフィックを引き起こし、将来の使用のために結果の値をキャッシュします。

property serial_number(self)

USBデバイスのシリアル番号文字列デスクリプター(serial number string descriptor)を返します。

このプロパティは、最初にアクセスされたときに一部のUSBトラフィックを引き起こし、将来の使用のために結果の値をキャッシュします。

property product(self)

USBデバイスの製品文字列記述子(product string descriptor)を返します。

このプロパティは、最初にアクセスされたときに一部のUSBトラフィックを引き起こし、将来の使用のために結果の値をキャッシュします。

property parent(self)
戻り値

親デバイス。

property manufacturer(self)

USBデバイスの製造元の文字列記述子(manufacturer string descriptor)を返します。

このプロパティは、最初にアクセスされたときに一部のUSBトラフィックを引き起こし、将来の使用のために結果の値をキャッシュします。

property backend(self)

そのデバイスが使っているバックエンドを返します。

set_configuration(self, configuration=None)

アクティブなconfigurationをセットします。

configurationパラメーターは、アクティブとして設定するconfigurationのbConfigurationValueフィールドです。 このメソッドをパラメーターなしで呼び出すと、最初に見つかったconfigurationが使用されます。デバイスに複数のconfigurationがあることはほとんどないため、引数なしでメソッドを呼び出すだけでデバイスを準備できます。

get_active_configuration(self)
戻り値

現在の構成セットを表す構成オブジェクト。

set_interface_altsetting(self, interface=None, alternate_setting=None)

インターフェイスの代替設定を設定します。

あなたが、インターフェイスを使用する必要があり、そのインターフェイスに複数の代替設定がある場合は、あなたはこのメソッドを呼び出して適切な代替設定を選択する必要があります。 1つまたは2つのパラメーターを指定せずにメソッドを呼び出すと、set_configurationメソッドと同じ方法で、デバイスで最初に見つかったメソッドが選択されます。

通常、インターフェイスには代替設定が1つしかないため、この呼び出しは必要ありません。 ほとんどのデバイスでは、代替設定が複数あるかどうかに関係なく、引数なしでこのメソッドを呼び出すことは有害ではありません。USB仕様では許可されていますが、代替設定が1つしかない場合、デバイスは要求をサイレントに無視するためです。追加の代替設定がないデバイスは、SET_INTERFACE要求に応答してホストにエラーを返します。

疑わしい場合は、try/except句でラップされた引数なしで呼び出すことをお勧めします:

>>> try:
>>>     dev.set_interface_altsetting()
>>> except usb.core.USBError:
>>>     pass
clear_halt(self, ep)

epに指定したエンドポイントの halt/stall 状態をクリアします。

reset(self)

デバイスをリセットします。

write(self, endpoint, data, timeout=None)

エンドポイントにデータを書き込みます。

このメソッドは、デバイスにデータを送信するために使用されます。 エンドポイントパラメータは、エンドポイントと通信するbEndpointAddressメンバーに対応します。

データパラメータは、配列型に変換可能な型のようなシーケンスである必要があります(配列モジュールを参照)。

タイムアウトはミリ秒単位で指定されます。

このメソッドは、書き込まれたバイト数を返します。

read(self, endpoint, size_or_buffer, timeout=None)

エンドポイントからデータを読み取ります。

このメソッドは、デバイスからデータを受信するために使用されます。 エンドポイントパラメータは、エンドポイントと通信するbEndpointAddressメンバーに対応します。 size_or_bufferパラメーターは、読み取るバイト数を指定するか、データを受信するためのバッファーを提供します(配列型のオブジェクトである必要があります)。

タイムアウトはミリ秒単位で指定されます。

size_or_bufferパラメーターが読み取るバイト数である場合、メソッドは読み取られたデータを含む配列オブジェクトを返します。 size_or_bufferパラメーターが配列オブジェクトの場合、実際に読み取られたバイト数を返します。

ctrl_transfer(self, bmRequestType, bRequest, wValue=0, wIndex=0, data_or_wLength=None, timeout=None)

エンドポイント0で制御転送(control transfer)を行います。

このメソッドは、エンドポイント0を介して制御転送を発行するために使用します(エンドポイント0は常に制御エンドポイントである必要があります)。

パラメータbmRequestType、bRequest、wValue、wIndexは、USB標準制御要求(Standard Control Request)フォーマットと同じです。

制御要求には、書き込み/読み取り用のデータペイロードがある場合とない場合があります。ある場合は、bmRequestTypeフィールドの方向ビットを使用して、目的の要求方向を推測します。ホストからデバイスへの要求(OUT)の場合、data_or_wLengthパラメーターは送信するデータペイロードであり、配列オブジェクトに変換可能なシーケンスタイプである必要があります。 この場合、戻り値はデータペイロードに書き込まれたバイト数です。 デバイスからホストへの要求(IN)の場合、data_or_wLengthは、データペイロードで読み取るバイト数を指定する制御要求のwLengthパラメーターであり、その戻り値はデータが読み取られる配列オブジェクトです。またはdata_or_wLengthはデータが読み取られる配列オブジェクトであり、戻り値は読み取られたバイト数です。

is_kernel_driver_active(self, interface)

インターフェイスに関連付けられているカーネルドライバがあるかどうかを確認します。

カーネルドライバがアクティブな場合、オブジェクトは入出力を実行できません。

interfaceパラメータは、チェックするデバイスインターフェイス番号です。

detach_kernel_driver(self, interface)

カーネルドライバーを取り外します(detach)。

成功すると、あなたは入出力を実行できるようになります。

interfaceパラメータは、ドライバを取り外す(detach)デバイスインターフェイス番号です。

attach_kernel_driver(self, interface)

以前にdetach_kernel_driver()を使って切り離し(detach)した、指定のインターフェイスのカーネル・ドライバを再接続(re-attach)します。

interface パラメータは、ドライバを接続したい、デバイスのインターフェイス番号を指定します。

__iter__(self)

デバイスのすべての構成(configuration)を繰り返します。

__getitem__(self, index)
戻り値

指定された位置にある構成オブジェクト。

_finalize_object(self)
__get_timeout(self, timeout)
__set_def_tmo(self, tmo)
__get_def_tmo(self)
_str(self)
_get_full_descriptor_str(self)
usb.core.find(find_all=False, backend=None, custom_match=None, **args)

USBデバイスを見つけてそれを返します。

find()は、USBデバイスを検出するために使用される関数です。デバイスに一致するように、USBデバイスデスクリプターフィールドの任意の組み合わせを引数として渡すことができます。例えば:

find(idVendor=0x3f4, idProduct=0x2009)

idVendorフィールドが0x3f4に等しく、idProductが0x2009に等しいデバイスのDeviceオブジェクトを返します。

基準に一致するデバイスが複数ある場合は、最初に見つかったデバイスが返されます。一致するデバイスが見つからない場合、関数はNoneを返します。すべてのデバイスを取得する場合は、パラメーターfind_allをTrueに設定すると、findは一致するすべてのデバイスのイテレーターを返します。一致するデバイスが見つからない場合は、空のイテレータが返されます。 例:

for printer in find(find_all=True, bDeviceClass=7):
    print (printer)

この呼び出しにより、すべてのUSBプリンターがシステムに接続されます。(一部のデバイスはクラス情報をインターフェイスデスクリプターに配置するため、実際にはそうではない場合があります)。

あなたはカスタマイズされた一致基準を使用することもできます:

dev = find(custom_match = lambda d: d.idProduct=0x3f4 and d.idvendor=0x2009)

カスタマイズされた一致を使用したより正確なプリンター探索器は、以下のようになります:

def is_printer(dev):
    import usb.util
    if dev.bDeviceClass == 7:
        return True
    for cfg in dev:
        if usb.util.find_descriptor(cfg, bInterfaceClass=7) is not None:
            return True

for printer in find(find_all=True, custom_match = is_printer):
    print (printer)

これで、デバイスクラスコードがインターフェイスデスクリプターにある場合でも、プリンタが見つかります。

カスタマイズされた一致をデバイスデスクリプターフィールドと組み合わせることができます。この場合、フィールドは一致する必要があり、custom_matchはTrueを返す必要があります。前の例では、製造元0x3f4に属するすべてのプリンターを取得する場合、コードは以下のようになります:

printers = list(find(find_all=True, idVendor=0x3f4, custom_match=is_printer))

「すべてのデバイスを一覧表示する」関数としてfindを使用する場合は、find_all = Trueで呼び出します:

devices = list(find(find_all=True))

最後に、カスタムバックエンドをfind関数に渡すことができます:

find(backend = MyBackend())

PyUSBには、libusb 0.1、libusb 1.0、およびOpenUSB用のバックエンドが組み込まれています。 バックエンドを明示的に指定しない場合、find()関数は、システムの可用性に応じて、事前定義されたバックエンドの1つを選択します。

バックエンドについては、usb.backendモジュールで説明されています。

usb.core.show_devices(verbose=False, **kwargs)

接続されているデバイスに関する情報を表示します。

verbose フラグは、verbose or not に設定されます。 * kwargsはfind()関数に直接渡されます。

usb.legacy
モジュール内容
クラス
  • usb.legacy.Endpoint

  • usb.legacy.Interface

  • usb.legacy.Configuration

  • usb.legacy.DeviceHandle

  • usb.legacy.Device

  • usb.legacy.Bus

関数
  • usb.legacy.busses

Attributes
usb.legacy.__author__ = Wander Lairson Costa
usb.legacy.USBError
usb.legacy.CLASS_AUDIO = 1
usb.legacy.CLASS_COMM = 2
usb.legacy.CLASS_DATA = 10
usb.legacy.CLASS_HID = 3
usb.legacy.CLASS_HUB = 9
usb.legacy.CLASS_MASS_STORAGE = 8
usb.legacy.CLASS_PER_INTERFACE = 0
usb.legacy.CLASS_PRINTER = 7
usb.legacy.CLASS_VENDOR_SPEC = 255
usb.legacy.DT_CONFIG = 2
usb.legacy.DT_CONFIG_SIZE = 9
usb.legacy.DT_DEVICE = 1
usb.legacy.DT_DEVICE_SIZE = 18
usb.legacy.DT_ENDPOINT = 5
usb.legacy.DT_ENDPOINT_AUDIO_SIZE = 9
usb.legacy.DT_ENDPOINT_SIZE = 7
usb.legacy.DT_HID = 33
usb.legacy.DT_HUB = 41
usb.legacy.DT_HUB_NONVAR_SIZE = 7
usb.legacy.DT_INTERFACE = 4
usb.legacy.DT_INTERFACE_SIZE = 9
usb.legacy.DT_PHYSICAL = 35
usb.legacy.DT_REPORT = 34
usb.legacy.DT_STRING = 3
usb.legacy.ENDPOINT_ADDRESS_MASK = 15
usb.legacy.ENDPOINT_DIR_MASK = 128
usb.legacy.ENDPOINT_IN = 128
usb.legacy.ENDPOINT_OUT = 0
usb.legacy.ENDPOINT_TYPE_BULK = 2
usb.legacy.ENDPOINT_TYPE_CONTROL = 0
usb.legacy.ENDPOINT_TYPE_INTERRUPT = 3
usb.legacy.ENDPOINT_TYPE_ISOCHRONOUS = 1
usb.legacy.ENDPOINT_TYPE_MASK = 3
usb.legacy.ERROR_BEGIN = 500000
usb.legacy.MAXALTSETTING = 128
usb.legacy.MAXCONFIG = 8
usb.legacy.MAXENDPOINTS = 32
usb.legacy.MAXINTERFACES = 32
usb.legacy.RECIP_DEVICE = 0
usb.legacy.RECIP_ENDPOINT = 2
usb.legacy.RECIP_INTERFACE = 1
usb.legacy.RECIP_OTHER = 3
usb.legacy.REQ_CLEAR_FEATURE = 1
usb.legacy.REQ_GET_CONFIGURATION = 8
usb.legacy.REQ_GET_DESCRIPTOR = 6
usb.legacy.REQ_GET_INTERFACE = 10
usb.legacy.REQ_GET_STATUS = 0
usb.legacy.REQ_SET_ADDRESS = 5
usb.legacy.REQ_SET_CONFIGURATION = 9
usb.legacy.REQ_SET_DESCRIPTOR = 7
usb.legacy.REQ_SET_FEATURE = 3
usb.legacy.REQ_SET_INTERFACE = 11
usb.legacy.REQ_SYNCH_FRAME = 12
usb.legacy.TYPE_CLASS = 32
usb.legacy.TYPE_RESERVED = 96
usb.legacy.TYPE_STANDARD = 0
usb.legacy.TYPE_VENDOR = 64
class usb.legacy.Endpoint(ep)

Bases: object

エンドポイント デスクリプター オブジェクト。

class usb.legacy.Interface(intf)

Bases: object

インターフェース デスクリプター オブジェクト。

class usb.legacy.Configuration(cfg)

Bases: object

configuration デスクリプター オブジェクト。

class usb.legacy.DeviceHandle(dev)

Bases: usb._objfinalizer.AutoFinalizedObject

_finalize_object(self)
bulkWrite(self, endpoint, buffer, timeout=100)

指定されたエンドポイントに対してバルク書き込み要求(request)を実行します。

パラメータ
  • endpont -- エンドポイント番号。

  • buffer -- 書き込むシーケンスデータバッファ。このパラメータは、任意のシーケンスタイプにすることができます。

  • timeout -- ミリ秒単位の操作タイムアウト(デフォルト: 100)。

戻り値

書き込まれたバイト数。

bulkRead(self, endpoint, size, timeout=100)

指定されたエンドポイントに対してバルク読み取り要求(request)を実行します。

パラメータ
  • endpoint -- エンドポイント番号。

  • size -- 読み取るバイト数。

  • timeout -- ミリ秒単位の操作タイムアウト(デフォルト: 100)。

戻り値

データが読み取られたタプル。

interruptWrite(self, endpoint, buffer, timeout=100)

指定されたエンドポイントに対して割り込み(interrupt)書き込み要求(request)を実行します。

パラメータ
  • endpoint -- エンドポイント番号。

  • buffer -- 書き込むシーケンスデータバッファ。このパラメータは、任意のシーケンスタイプにすることができます。

  • timeout -- ミリ秒単位の操作タイムアウト(デフォルト: 100)。

戻り値

書き込まれたバイト数。

interruptRead(self, endpoint, size, timeout=100)

指定されたエンドポイントに対して割り込み(interrupt)読み取り要求(request)を実行します。

パラメータ
  • endpoint -- エンドポイント番号。

  • size -- 読み取るバイト数。

  • timeout -- ミリ秒単位の操作タイムアウト(デフォルト: 100)。

戻り値

データが読み取られたタプル。

controlMsg(self, requestType, request, buffer, value=0, index=0, timeout=100)

デバイスのデフォルトの制御パイプ(control pipe)に対して制御要求(control request)を実行します。

パラメータ
  • requestType -- データフローの方向、要求(request)のタイプ、および受信者(recipient)を指定します。

  • request -- リクエストを指定します。

  • buffer -- 転送が書き込み転送の場合、bufferは転送データのシーケンスです。それ以外の場合、bufferは読み取るバイト数です。

  • value -- デバイスに渡す指定の情報(デフォルト:0)。

  • index -- デバイスに渡す指定の情報(デフォルト:0)。

  • timeout -- ミリ秒単位の操作タイムアウト(デフォルト: 100)。

戻り値

書き込まれたバイト数。

clearHalt(self, endpoint)

指定のエンドポイントの停止(halt)ステータスをクリアします。

パラメータ

endpoint -- エンドポイント番号。

claimInterface(self, interface)

オペレーティングシステムにinterfaceを要求(claim)します。

パラメータ

interface -- インターフェイス番号またはInterfaceオブジェクト。

releaseInterface(self)

以前にclaimInterfaceで要求(claim)されたインターフェースを解放します。

reset(self)

接続されているポートにRESETを送信して、指定のデバイスをリセットします。

resetEndpoint(self, endpoint)

指定のエンドポイントのすべての状態(all states)をリセットします。

パラメータ

endpoint -- エンドポイント番号。

setConfiguration(self, configuration)

デバイスのアクティブなconfigurationを設定します。

パラメータ

configuration -- configuration値またはConfigurationオブジェクト。

setAltInterface(self, alternate)

現在のインターフェースのアクティブな代替設定(alternate setting)を設定します。

パラメータ

alternate -- 代替設定番号(alternate setting naumber)またはInterfaceオブジェクト。

getString(self, index, length, langid=None)

indexおよびlangidで指定された文字列デスクリプターをデバイスから取得します。

パラメータ
  • index -- デバイス内のデスクリプターのインデックス。

  • length -- 文字列のバイト数(無視される)

  • langid -- 言語ID。 省略した場合、最初の言語が使用されます。

getDescriptor(self, desc_type, desc_index, length, endpoint=- 1)

デスクリプターのタイプとインデックスによって識別されるデバイスからデスクリプターを取得します。

パラメータ
  • desc_type -- デスクリプタータイプ。

  • desc_index -- デスクリプターのインデックス。

  • len -- デスクリプター長。

  • endpoint -- 無視される。

detachKernelDriver(self, interface)

カーネルドライバーをインターフェイスから切り離します(detach)(カーネルドライバーが接続されている(attach)場合は、アクセス許可と操作はOSでサポートされています)。

パラメータ

interface -- インターフェイス番号またはInterfaceオブジェクト。

class usb.legacy.Device(dev)

Bases: object

Deviceデスクリプターオブジェクト

open(self)

デバイスを開いて使用します。

戻り値

DeviceHandleオブジェクト

class usb.legacy.Bus(devices)

Bases: object

Busオブジェクト。

usb.legacy.busses()
戻り値

USBバス達のタプル。

usb.libloader
Module Contents
関数
  • usb.libloader.locate_library

  • usb.libloader.load_library

  • usb.libloader.load_locate_library

exception usb.libloader.LibraryException

Bases: OSError

I/O関連エラーの基本クラス。

exception usb.libloader.LibraryNotFoundException

Bases: LibraryException

I/O関連エラーの基本クラス。

exception usb.libloader.NoLibraryCandidatesException

Bases: LibraryNotFoundException

I/O関連エラーの基本クラス。

exception usb.libloader.LibraryNotLoadedException

Bases: LibraryException

I/O関連エラーの基本クラス。

exception usb.libloader.LibraryMissingSymbolsException

Bases: LibraryException

I/O関連エラーの基本クラス。

usb.libloader.locate_library(candidates, find_library=ctypes.util.find_library)

指定のfind_library()関数(またはctypes.util.find_library)を使用して、候補にリストされているライブラリを見つけようとします。最初に見つかったライブラリを返します。これは、find_library()に応じて、ライブラリの名前またはライブラリファイルへのパスになります。ライブラリが見つからない場合はNoneを返します。

パラメータ
  • candidates -- ライブラリ名達の反復可能オブジェクト(iterable)

  • find_library -- 1つの位置引数(候補)を受け取り、ライブラリが見つかった場合に空でないstrを返す関数。"false"値(None、False、empty str)は、「ライブラリが見つからなかった」と解釈されます。指定されていない場合、またはNoneの場合、デフォルトはctypes.util.find_libraryです。

usb.libloader.load_library(lib, name=None, lib_cls=None)

ライブラリをロードします。例外をキャッチしてログに記録します。

戻り値

ロードしたライブラリまたはNone

パラメータ
  • lib -- ロードしたライブラリへのパス名

  • name -- ライブラリの識別子(identifier)(ロギング用)。デフォルトはNoneです。

  • lib_cls -- ライブラリクラス。デフォルトはNone (→ ctypes.CDLL)

usb.libloader.load_locate_library(candidates, cygwin_lib, name, win_cls=None, cygwin_cls=None, others_cls=None, find_library=None, check_symbols=None)

ライブラリのロードと配置

戻り値

ロードされたライブラリ

パラメータ
  • candidates -- locate_library()の為の候補リスト

  • cygwin_lib -- cygwinライブラリの名前

  • name -- lib識別子(identifier)(ロギング用)。デフォルトはNone。

  • win_cls -- win32プラットフォームでライブラリをインスタンス化するために使用されるクラス。デフォルトはNoneです。(→ ctypes.CDLL)

  • cygwin_cls -- cygwinプラットフォーム用のライブラリクラス。デフォルトはNoneです。(→ ctypes.CDLL)

  • others_cls -- 他のすべてのプラットフォーム用のライブラリクラス。デフォルトはNone (→ ctypes.CDLL)

  • find_library -- locate_library()参照。デフォルトはNone。

Check_symbols

None、またはロードされたライブラリが有効と見なされるために提供する必要のあるシンボルのリスト(hasattr(<>))のいずれか。 LibraryMissingSymbolsExceptionは、シンボルが欠落している場合に発生(raise)します。

Raises

NoLibraryCandidatesException

Raises

LibraryNotFoundException

Raises

LibraryNotLoadedException

Raises

LibraryMissingSymbolsException

usb.util

usb.util - ユーティリティ関数群。

本モジュールからは以下がエスクポートされます:

  • endpoint_address - エンドポイント絶対アドレスを返す。

  • endpoint_direction - エンドポイントの転送方向を返す。

  • endpoint_type - エンドポイントタイプを返す。

  • ctrl_direction - 制御転送control transfer)の転送方向を返す。

  • build_request_type - 制御転送(control transfer)のbmRequestTypeフィールドを構築します。

  • find_descriptor - 内部デスクリプター(inner descriptor)を探します。

  • claim_interface - 明示的にインターフェースを要求(claim)します。

  • release_interface - 明示的にインターフェースを解放します。

  • dispose_resources - オブジェクトによって割り当てられた内部リソースを解放します。

  • get_langids - get_langids-サポートされている文字列言語(string language)のリストをデバイスから取得します。

  • get_string - デバイスから文字列デスクリプターを取得します。

モジュール内容
関数
  • usb.util.endpoint_address

  • usb.util.endpoint_direction

  • usb.util.endpoint_type

  • usb.util.ctrl_direction

  • usb.util.build_request_type

  • usb.util.create_buffer

  • usb.util.find_descriptor

  • usb.util.claim_interface

  • usb.util.release_interface

  • usb.util.dispose_resources

  • usb.util.get_langids

  • usb.util.get_string

Attributes
usb.util.__author__ = Wander Lairson Costa
usb.util.DESC_TYPE_DEVICE = 1
usb.util.DESC_TYPE_CONFIG = 2
usb.util.DESC_TYPE_STRING = 3
usb.util.DESC_TYPE_INTERFACE = 4
usb.util.DESC_TYPE_ENDPOINT = 5
usb.util.ENDPOINT_IN = 128
usb.util.ENDPOINT_OUT = 0
usb.util.ENDPOINT_TYPE_CTRL = 0
usb.util.ENDPOINT_TYPE_ISO = 1
usb.util.ENDPOINT_TYPE_BULK = 2
usb.util.ENDPOINT_TYPE_INTR = 3
usb.util.CTRL_TYPE_STANDARD
usb.util.CTRL_TYPE_CLASS
usb.util.CTRL_TYPE_VENDOR
usb.util.CTRL_TYPE_RESERVED
usb.util.CTRL_RECIPIENT_DEVICE = 0
usb.util.CTRL_RECIPIENT_INTERFACE = 1
usb.util.CTRL_RECIPIENT_ENDPOINT = 2
usb.util.CTRL_RECIPIENT_OTHER = 3
usb.util.CTRL_OUT = 0
usb.util.CTRL_IN = 128
usb.util._ENDPOINT_ADDR_MASK = 15
usb.util._ENDPOINT_DIR_MASK = 128
usb.util._ENDPOINT_TRANSFER_TYPE_MASK = 3
usb.util._CTRL_DIR_MASK = 128
usb.util._dummy_s
usb.util.SPEED_LOW = 1
usb.util.SPEED_FULL = 2
usb.util.SPEED_HIGH = 3
usb.util.SPEED_SUPER = 4
usb.util.SPEED_UNKNOWN = 0
usb.util.endpoint_address(address)

エンドポイント絶対アドレスを返します。

addressパラメータは、エンドポイント・デスクリプターのbEndpointAddressフィールドです。

usb.util.endpoint_direction(address)

エンドポイントの方向を返します。

addressパラメータは、エンドポイントデスクリプターのbEndpointAddressフィールドです。可能な戻り値はENDPOINT_OUTまたはENDPOINT_INです。

usb.util.endpoint_type(bmAttributes)

エンドポイントの転送タイプを返します。

bmAttributesパラメーターは、エンドポイントデスクリプターのbmAttributesフィールドです。 可能な戻り値は、ENDPOINT_TYPE_CTRL、ENDPOINT_TYPE_ISO、ENDPOINT_TYPE_BULK、ENDPOINT_TYPE_INTR です。

usb.util.ctrl_direction(bmRequestType)

制御要求(control request)の方向を返します。

bmRequestTypeパラメーターは、制御転送(control transfere)のbmRequestTypeフィールドの値です。可能な戻り値はCTRL_OUTまたはCTRL_INです。

usb.util.build_request_type(direction, type, recipient)

制御要求(control requests)の為にbmRequestTypeフィールドを構築します。

これらは、制御要求(control request)のbmRequestTypeを作成するための従来の関数です。

directionパラメーターは、CTRL_OUTまたはCTRL_INにすることができます。typeパラメータは、CTRL_TYPE_STANDARD、CTRL_TYPE_CLASS、CTRL_TYPE_VENDOR、CTRL_TYPE_RESERVEDにすることができます。 recipientは、CTRL_RECIPIENT_DEVICE、CTRL_RECIPIENT_INTERFACE、CTRL_RECIPIENT_ENDPOINT、またはCTRL_RECIPIENT_OTHERです。

bmRequestTypeの値を返す。

usb.util.create_buffer(length)

読み取り関数に渡されるバッファを作成します。

読み取り関数は出力バッファを受け取ることができるため、データは決まった場所に読み取られ、オブジェクトを再利用できます。これにより、新しい読み取り呼び出しごとに新しいオブジェクトを作成するオーバーヘッドを回避できます。この関数は、指定された長さの互換性のあるシーケンスバッファを作成します。

usb.util.find_descriptor(desc, find_all=False, custom_match=None, **args)

内部デスクリプター(inner descriptor)を探します。

find_descriptorは、core.find()関数と同じように機能しますが、一般的なデスクリプターオブジェクトに対して機能します。 たとえば、devというDeviceオブジェクトがあり、bConfigurationValueが1に等しいこのオブジェクトのconfigurationが必要な場合、コードは以下のようになります:

>>> cfg = util.find_descriptor(dev, bConfigurationValue=1)

デスクリプターの任意のフィールドを一致基準として使用でき、core.find()と同じようにカスタマイズされた一致を指定できます。find_descriptor関数は、find_allパラメーターも受け入れる事ができ、その場合は1つのデスクリプターではなくイテレーターを取得します。

usb.util.claim_interface(device, interface)

明示的にインターフェース(interface)を要求(claim)します。

PyUSBユーザーは通常、ライブラリが自動的に処理するため、インターフェイスの要求(claim)について心配する必要はありません。 ただし、確定的なインターフェイスの要求(claim)が必要な場合があります。 これらのまれなケースでは、claim_interfaceを使用できます。

以前にclaim_interfaceを呼び出したかまたはデバイスオブジェクトによって内部的に呼び出された場合、インターフェイスがすでに要求(claim)されていた場合は、何も起こりません。

usb.util.release_interface(device, interface)

明示的にインターフェースを解除します。

この関数は、claim_interfaceの呼び出しを通じて、またはデバイスオブジェクトによって内部的に呼び出された、以前に要求されたインターフェイスを解放するために使用されます。

通常、デバイスオブジェクトが自動的に処理するため、あなたはポリシーの要求について心配する必要はありません。

usb.util.dispose_resources(device)

オブジェクトによって割り当てられた内部リソースを解放します。

たとえば、別のアプリケーションがデバイスと通信できるようにするために、あなたは指定指名的なリソース解放をする必要がある場合があります。 Pythonは指定指名的な破棄を提供しないため、この関数は、デバイスハンドルやインターフェイスポリシーなど、デバイスによって割り当てられたすべての内部リソースを解放します。

この関数を呼び出した後、デバイスオブジェクトを通常どおり使用し続けることができます。 リソースが再び必要になる場合は、自動的に割り当てられます。

usb.util.get_langids(dev)

サポートされている言語IDのリストをデバイスから取得します。

ほとんどのクライアントコードは、この関数を直接呼び出すべきではありませんが、代わりにDeviceオブジェクトのlangidsプロパティを使用します。これにより、必要に応じてこの関数が呼び出され、結果がキャッシュされます。

USB LANGIDは、Windows開発者に馴染みのある16ビット整数です。たとえば、en-USの代わりに0x0409と言います。完全であるとは主張していないリストについては、usb.orgサイトのどこかにあるファイルUSB_LANGIDS.pdfを参照してください。「システムソフトウェアは、現在このリストにないLANGIDの列挙と選択を許可する必要があります」("system software must allow the enumeration and selection of LANGIDs that are not currently on this list.")が要求されます。 また、「システムソフトウェアは、デバイスによって提示されるLANGIDコード配列(文字列インデックス= 0)で定義されていないLANGIDを要求してはなりません」("system software should never request a LANGID not defined in the LANGID code array (string index = 0) presented by a device.")も要求されます。 クライアントコードは、特定の言語IDの文字列要求を発行する前に、このタプルをチェックできます。

devは、サポートされている言語IDが取得されるDeviceオブジェクトです。

戻り値は整数のLANGIDのタプルであり、デバイスが文字列をまったくサポートしていない場合は空になる可能性があります(USB 3.1 仕様書 r1.0 section 9.6.9で許可されています)。 その場合、クライアントコードは文字列をまったく要求しないでください。

空のタプルを返す代わりに、文字列をサポートしていない一部のデバイスでは、この関数からUSBErrorが発生する場合があります。デバイスのlangidsプロパティのアクセサーはそのケースをキャッチし、空のタプルを提供するため、クライアントコードは、この関数を直接呼び出す代わりにlangidsプロパティを使用して、この詳細を無視できます。

usb.util.get_string(dev, index, langid=None)

デバイスから文字列記述子(string descriptor)を取得します。

devは、文字列が読み取られるDeviceオブジェクトです。

indexは文字列デスクリプターのインデックスであり、langidはデスクリプターの言語IDです。langidを省略すると、最初の言語IDの文字列デスクリプターが返されます。

ゼロが実際の文字列のインデックスになることはありません。USB仕様では、デバイスが文字列インデックスフィールドでゼロを使用して、文字列が提供されていないことを示すことができます。したがって、呼び出し元はそのケースを特別に処理する必要はありません。この関数は、インデックスがゼロの場合にNoneを返し、デバイスへのトラフィックを生成しません。

戻り値はデスクリプターに存在するUnicode文字列であり、要求されたインデックスがゼロの場合はNoneです。

1

Created with sphinx-autoapi