OpenOCD: 複数の FT2232 / FT232R を間違わずに使う

FT2232 や FT232R を OpenOCD で使う場合で、かつ複数のデバイスを使っている場合だと、OpenOCD がどちらのデバイスを使うべきかわからず、先に見つかった方にアクセスします。これを防ぎ、ある一つのデバイス側に固定する方法が、いくつかあります

FT2232 (aka ftdi)

ftdi_device_desc

同じ FT2232 チップを使っていても、 USB の iProduct に入っている名前が異なる場合があります。例えば秋月電子の FT2232 Module だと Dual RS232 と入っているが、 Digilent Arty A7 に実装されている FT2232 だと Digilent USB Device となっています。 ftdi_device_desc が異なれば、これを指定することで使用するデバイスを決めることができます。この値は、たいてい OpenOCD のボードファイルか、インターフェイスファイルに記載されています。

ftdi_serial

USB の iSerial を使うはずです (調べてない)。

FT232R

ft232r_serial_desc

ft232r adapter driver 固有の方法で、デバイスのシリアル番号を指定する方法です。ファイルに書くなら

ft232r_serial_desc A904DQNM

コマンドラインで指定するなら

-c 'ft232r_serial_desc A904DQNM'

とします。

上記の例では A904DQNM がシリアル番号。この番号の取得方法は

$ lsusb -v -d 0403:6001 g iSerial
  iSerial                 3 A904DQNM
  iSerial                 3 A904DR1F

adapter usb location

adapter driver に依存しない方法。

adapter usb location 1-6.1.2

最後の数字は、 指定するデバイスの USB topology。 lsusb -t で探せます。

$ lsusb -t
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 5000M
    |__ Port 6: Dev 8, If 0, Class=Hub, Driver=hub/4p, 5000M
        |__ Port 1: Dev 9, If 0, Class=Hub, Driver=hub/4p, 5000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/12p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/3p, 480M
        |__ Port 1: Dev 4, If 0, Class=Human Interface Device, Driver=usbhid, 12M
        |__ Port 2: Dev 6, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
    |__ Port 2: Dev 3, If 0, Class=, Driver=, 12M
    |__ Port 6: Dev 21, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 1: Dev 22, If 0, Class=Hub, Driver=hub/4p, 480M
            |__ Port 2: Dev 30, If 0, Class=Vendor Specific Class, Driver=, 12M
            |__ Port 3: Dev 33, If 0, Class=Vendor Specific Class, Driver=ftdi_sio, 480M
            |__ Port 3: Dev 33, If 1, Class=Vendor Specific Class, Driver=ftdi_sio, 480M
    |__ Port 7: Dev 7, If 0, Class=Wireless, Driver=btusb, 12M
    |__ Port 7: Dev 7, If 1, Class=Wireless, Driver=btusb, 12M
    |__ Port 8: Dev 9, If 1, Class=Video, Driver=uvcvideo, 480M
    |__ Port 8: Dev 9, If 0, Class=Video, Driver=uvcvideo, 480M

調べ方

他のデバイスの場合は、 OpenOCD のコードから探してください。基本的に TCL で設定できるようになっているので、ドライバーコードにある command_registration 型の変数に入っている .handler をチェックすると良いです。