2022年2月7日月曜日

【Android USB oscilloscope】(13) Linuxに接続した Android One S5 のせいで USBError: [Errno 16] Resource busy

余っているAndroidスマホをオシロにしよう!

スマホにバルク転送する実験をしたいでーす.
こんなUSB接続でね.
     Linux(host) ----> スマホ(device)

それでまずはLinux hostに何等かのバルク転送をさせたいでーす.

PythonのUSBpyで簡単にできるようです.こちらのページなどを参考にします.

ぶっちゃけこういうPython sourceで動きました.簡単でいいや.
VID/PID=18d1/4ee7はAndroid One S5のUSBデバッグモードにおける値です.読者の手持ちのスマホによっては異なる数字かもしれません.その他の詳細説明は参考ページを見てください.
import usb.core
dev = usb.core.find(idVendor=0x18d1, idProduct=0x4ee7)
if dev is None:
    raise ValueError('Device not found')
dev.set_configuration()
dev.reset()
cfg = dev.get_active_configuration()
intf = cfg[(0,0)]
ep = usb.util.find_descriptor( intf,
    custom_match = lambda e: \
        usb.util.endpoint_direction(e.bEndpointAddress) == \
        usb.util.ENDPOINT_OUT)
print(ep)
assert ep is not None
ep.write('test')

これを text.py に保存し、Linux上で python3 text.py で動かします.無印pythonだと動きません.importで停まる.

実際にUSBへバルクの"test"が飛んだかどうかは未確認ですが、たぶん飛んでると思います.

ーーーー
ここでひとつ注意があります.
USB deviceとしてAndroid One S5をLinuxへ接続したわけですが、、、

USB接続モードをMTPなどにしておくと上記python codeがエラーで停まります.
usb.core.USBError: [Errno 16] Resource busy
誰かがS5を掴んで離さないみたいです.lsusbで調べますと、
% lsusb -t
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 480M
    |__ Port 2: Dev 22, If 0, Class=Vendor Specific Class, Driver=usbfs, 480M
原因はDriver=usbfsです.S5にUSB file systemのデバドラがbindされちゃってました.MTPなのでさもありなんですね.PTPにしたらしたで画像デバドラがbindされちゃうと思われます.

解決するには、USB接続モードをUSBデバッグモードにしておきます.(Linux hostにはAndroid StudioのADBがインストされてないとする)
% lsusb -t
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 480M
    |__ Port 2: Dev 19, If 0, Class=Vendor Specific Class, Driver=, 480M
Driver=""のようにフリーになったので上記python codeがちゃんと動きます.

12へ               14へ

かしこ

0 件のコメント:

コメントを投稿