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
をレベル名 critical
、 error
、 warning
、info
、 debug
のいずれかで定義します。
デフォルトでは、メッセージは 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_descriptor
は find
とほぼ同じように動作しますが、2つの例外があります:
find_descriptor
は、最初のパラメータとして、あなたが検索したいデスクリプタの親デスクリプタを受け取ります。backend
2 パラメータはありません。
たとえば、構成デスクリプタ cfg
があり、インターフェース1のすべての代替設定を検索したい場合は、次のようにします:
import usb.util
alt = usb.util.find_descriptor(cfg, find_all=True, bInterfaceNumber=1)
find_descriptor
は usb.util
モジュールにあることに注意してください。 また、前述の custom_match
パラメータも受け入れます。
同じデバイスを複数扱うには¶
コンピューター同じデバイスが2接続されていることがあります。それらをどのように区別すればよいでしょうか? Device
オブジェクトには、USB仕様の一部ではないが、非常に便利な2つの追加属性があります。それは bus
と address
属性です。
ただし、これらの属性はバックエンドからのものであり、バックエンドがそれらをサポートしないことは自由です。その場合、それらは None
に設定されます。そうじゃない場合は、これらの属性はデバイスのバス番号とバスアドレスを表し、あなたのご想像どおり、同じ idVendor
と idProduct
属性を持つ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
オブジェクトを使用することもでき、 その際、 interface
と alternate_setting
パラメータは bInterfaceNumber
と bAlternateSetting
フィールドから自動的に推論されます。 例えば:
>>> 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)のフィールド bmRequestType
、 bmRequest
、 wValue
、 wIndex
です。 5番目のパラメーター(訳注:data_or_wLength=None)は、OUT転送のデータ・ペイロード、またはIN転送で読み取るバイト数です。 データペイロードは、array __init__
メソッドのパラメーターとして使用できる任意のシーケンス型にすることができます。 データ・ペイロードがない場合、パラメータは None
(またはIN転送の場合は0)でなければなりません。 操作のタイムアウトを指定する最後のオプションパラメータ(訳注:timeout=None)が1つあります。 指定しない場合は、デフォルトのタイムアウトが使用されます(詳しくは後で説明します)。 OUT転送では、戻り値は実際にデバイスに送信されたバイト数です。IN転送では、戻り値はデータが読み込まれた array オブジェクトです。
他の転送については、メソッド write
と read
を使用して、データの書き込みと読み取りを行います。転送タイプを気にする必要はありません。転送タイプはエンドポイント・アドレスから自動的に決定されます。エンドポイント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 オブジェクトを read
と ctrl_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/ldconfig や gcc や objdump など)を実行してライブラリファイルを見つけようとします。
これらのプログラムがないか、ライブラリ・キャッシュが無効になっているシステムでは、この機能は使用できません。 この制限を克服するために、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 usb
を import 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つの原因が考えられます:
あなたが libusb ライブラリをインストールしていない場合。
あなたが libusb ライブラリを標準の共有ライブラリパス置いてない場合。
あなたの libusb のバージョンがとても古い場合。
あなたの 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 ライブラリ・パスをバックエンドに渡すにはどうすればよいですか?¶
tutorial の Specify libraries by hand (邦訳:ライブラリを手動で指定する) を参照。
選択した構成(configuration)の、すでに構成(configured)されているデバイスで set_configuration() を 呼び出す/呼び出さない 方法は?¶
通常、 set_configuration()
はデバイスの初期化中に呼び出されます。 libusb documentation の libusb_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にアクセスできるようにします。
本パッケージはイカのモジュールとサブバッケージをエクスポートします:
usb.core - the main USB implementation
usb.legacy - the compatibility layer with 0.x version
usb.backend - the support for backend implementations.
usb.control - USB standard control requests.
usb.libloader - helper module for backend library loading.
バージョン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.libusb1
¶usb.backend.libusb1.get_backend
- 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¶
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._lookup
¶
usb._lookups - Lookup tables for USB
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¶
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
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() - 存在するデバイスを表示する関数。
モジュール内容¶
usb.core.Endpoint
usb.core.Interface
usb.core.Configuration
usb.core.Device
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
- 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
- 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