SPI Flashを高速に読み書きするツールにflashromがあります。flashromは対応しているメモリやライタが豊富なため、非常に便利です。今回はflashromを久しぶりに使用する際に初期化エラーに遭遇したため、その対処方法について紹介したいと思います。
flashromは様々なライタに対応するため、USBインタフェースのライブラリとしてlibusbを使用しています。そのため、特にWindows版のflashromにおいて、ライタの標準ドライバそのままでは下記のようなエラーが出て、初期化に失敗します。ライタの標準ドライバからlibusbに対応したドライバに変更する必要があります。
■CH341Aのエラー例
flashrom -p ch341a_spi
libusb: info [init_device] 0x45b:0x82a0 found 1 configurations but device isn't configured, forcing current configuration to 1
Couldn't open device 1a86:5512.
Error: Programmer initialization failed.
Couldn't open device 1a86:5512.
Error: Programmer initialization failed.
■CP2102Nのエラー例
flashrom -p developerbox
Opening the USB device at address 1-25 failed (LIBUSB_ERROR_NOT_SUPPORTED)!
Could not find a Developerbox programmer on USB.
Error: Programmer initialization failed.
Could not find a Developerbox programmer on USB.
Error: Programmer initialization failed.
■FT232Hのエラー例
flashrom -p ft2232_spi:type=232H
Unable to open FTDI device: -4 (usb_open() failed)
Error: Programmer initialization failed.
Error: Programmer initialization failed.
■標準ドライバからlibusbにドライバに変更する方法
⓪今回はWindows版flashromとしてこちらのバイナリを使用しました。flashromのバイナリの他にドライバを変更するツールzadig-X.X.exeも同梱されています。
@デバイス検索
flashromのバイナリに同梱されているzadig-X.X.exeを起動させ、OptionからList All Devicesをクリックします。
Aリストからライタとして使用するデバイスを選択後、置き換える対象として「WinUSB」を選択してReplace Driverをクリックします。
今回はUSB-EPP/I2C CH341Aを選択しました。なお、ドライバ変更を伴うため、ライタ以外のデバイスを選択しないように注意してください。
上記で数分待つと自動的にドライバ変更が完了します。初期化エラーが解消し、flashromで使用できるようになります。ただし、これまで標準ドライバで動いていたソフトウェアが逆に動作しなくなるor認識できなくなるため、flashrom以外の用途で使用する場合はドライバを標準ドライバに戻す必要があります。特にCP2102やFT232等ではWinUSBドライバに変更するとWindows側からCOMポートとして認識されなくなるため、flashrom以外の用途で使用する場合は注意が必要です。
その場合は下記のようにライタとして使用するデバイスを選択後、置き換える対象として「USB Serial(CDC)」を選択してReplace Driverをクリックしてもとに戻すことで標準ドライバに戻すことが可能です。
特にややこしい点として、使用するライタによってlibusbのエラー出力が異なるため、久しぶりにflashromを使用すると何が原因なのか調査に時間を要してしまいました。今後、flashromを活用した便利なコマンド例等を紹介したいと思います。