2022年2月6日日曜日

【Android USB oscilloscope】(12) Android One S5 USB device descriptor(4種)

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

Androidプログラムについての書籍をAmazonの試し読みで調べました.
探したかったのは、
  ・Thread関連の情報
  ・USB関連の情報
  ・GPUで信号処理
を得られる書籍です.予想通りほとんどないです.
Threadについては「Expert向け」みたいな位置づけの和本が2つ在るかなというぐらいです.USBについてはゼロかもしれない.GPUは洋書があるかどうかってとこですがPythonにfocusしてたりしてちょっと違う.
ならばあまたある書籍は何を書いているのかというと、メインディッシュはUIです.それとgoogle mapやdatabaseのクライアントに関するissue.まぁそんなもんか.

ネットから情報を引っ張り出すしかないです.

ーーーー
さて、USB COMの件は前回までで一旦closeしておいて、今後はUSBで高速転送するやり方を調べます.とりあえずバルク転送でも出来ればいいでしょう.

手始めに、Android One S5をPCにUSB接続して、Android One S5のdevice descriptorを採取してみました.S5はUSB deviceの位置づけです.(S5はhostでない)

以下ではdevice descriptorを眺めてあれこれと味わうことします.

ですがその前に、、、スマホをPCにUSB接続したときに「どのモードで接続しますか?」と聞かれます.モードによってdevice descriptorが変わります.S5の4種類のモードのdevice descriptorを採取しました.4つをupしときます.


【充電のみのdevice descriptor】
全体像としては、Sharpのデバイスであり、MTPである、という位置づけになっています.
MTPならばファイルアクセスできてしまうのではないかと思いきや、、、windowsからはS5-SHという名で見えるだけでファイルは見えません.きっと、スマホがファイルアクセスを拒否してるのでしょう.

Device DescriptorにはSharpのVID/PIDがあります.
特定のClassなのかどうかは、interface descriptorを見てちょ、と言ってます.
------------ Device Descriptor ----------------------
bDeviceClass             : 0x00 (defined by interface descriptors)
idVendor                 : 0x04DD (Sharp Corporation)
idProduct                : 0x9C90
bcdDevice                : 0x0409

interface descriptorはclassについて「vendor specific」つまり謎のblack-boxと言ってます.Endpointは3つ.MTPと言ってます.
------------ Interface Descriptor -----------------
bNumEndpoints            : 0x03 (3 Endpoints)
bInterfaceClass          : 0xFF (Vendor Specific)
iInterface               : 0x05 (String Descriptor 5)
 Language 0x0409         : "MTP"

以下は3つのEndpointについて述べています.
EP1、スマホ→PC、バルク転送、パケットサイズ512bytes
EP1、PC→スマホ、バルク転送、パケットサイズ512bytes
EP2、スマホ→PC、インタラプト転送/6ms毎、パケットサイズ28bytes
----------- Endpoint Descriptor -----------------
bEndpointAddress         : 0x81 (Direction=IN EndpointID=1)
bmAttributes             : 0x02 (TransferType=Bulk)
wMaxPacketSize           : 0x0200 (max 512 bytes)

----------- Endpoint Descriptor -----------------
bEndpointAddress         : 0x01 (Direction=OUT EndpointID=1)
bmAttributes             : 0x02 (TransferType=Bulk)
wMaxPacketSize           : 0x0200 (max 512 bytes)

------------ Endpoint Descriptor -----------------
bEndpointAddress         : 0x82 (Direction=IN EndpointID=2)
bmAttributes             : 0x03 (TransferType=Interrupt)
wMaxPacketSize           : 0x001C
 Bits 10..0              : 0x1C (28 bytes per packet)
bInterval                : 0x06 (6 ms)


【MTP ファイル転送のdevice descriptor
全体像としては、Sharpのデバイスであり、MTPである、という位置づけになっています.
「充電のみ」とほぼ同じ内容です.(違うのはpowerのところだけ)

Device DescriptorにはSharpのVID/PIDがあります.
特定のClassなのかどうかは、interface descriptorを見てちょ、と言ってます.
----------------- Device Descriptor ----------------------
bDeviceClass             : 0x00 (defined by interface descriptors)
idVendor                 : 0x04DD (Sharp Corporation)
idProduct                : 0x9C90
bcdDevice                : 0x0409

interface descriptorはclassについて「vendor specific」つまり謎のblack-boxと言ってます.Endpointは3つ.MTPと言ってます.
------------ Interface Descriptor -----------------
bNumEndpoints            : 0x03 (3 Endpoints)
bInterfaceClass          : 0xFF (Vendor Specific)
iInterface               : 0x05 (String Descriptor 5)
 Language 0x0409         : "MTP"

以下は3つのEndpointについて述べています.
EP1、スマホ→PC、バルク転送、パケットサイズ512bytes
EP1、PC→スマホ、バルク転送、パケットサイズ512bytes
EP2、スマホ→PC、インタラプト転送/6ms毎、パケットサイズ28bytes
ファイル転送するのにパケットサイズがたったの28じゃ遅くて仕方ないので、EP2はステータス情報のやり取りだけだと思われます.
ファイル転送はEP1でやるのでしょう.
------------- Endpoint Descriptor -----------------
bEndpointAddress         : 0x81 (Direction=IN EndpointID=1)
bmAttributes             : 0x02 (TransferType=Bulk)
wMaxPacketSize           : 0x0200 (max 512 bytes)

------------- Endpoint Descriptor -----------------
bEndpointAddress         : 0x01 (Direction=OUT EndpointID=1)
bmAttributes             : 0x02 (TransferType=Bulk)
wMaxPacketSize           : 0x0200 (max 512 bytes)

------------- Endpoint Descriptor -----------------
bEndpointAddress         : 0x82 (Direction=IN EndpointID=2)
bmAttributes             : 0x03 (TransferType=Interrupt)
wMaxPacketSize           : 0x001C
 Bits 10..0              : 0x1C (28 bytes per packet)
bInterval                : 0x06 (6 ms)

 
【PTP カメラのdevice descriptor
全体像としては、Sharpのデバイスであり、PTPである、USB規格のImageクラスである、という位置づけになっています.

Device DescriptorにはSharpのVID/PIDがあります.
特定のClassなのかどうかは、interface descriptorを見てちょ、と言ってます.
------------- Device Descriptor ----------------------
bDeviceClass             : 0x00 (defined by interface descriptors)
idVendor                 : 0x04DD (Sharp Corporation)
idProduct                : 0x9C92
bcdDevice                : 0x0409

interface descriptorはImage classのStill Image deviceと言ってます.Endpointは3つ.PTPと言ってます.
------------ Interface Descriptor -----------------
bNumEndpoints            : 0x03 (3 Endpoints)
bInterfaceClass          : 0x06 (Image)
bInterfaceSubClass       : 0x01 (Still Imaging device)
bInterfaceProtocol       : 0x01
iInterface               : 0x05 (String Descriptor 5)
 Language 0x0409         : "PTP"

以下は3つのEndpointについて述べています.
EP1、スマホ→PC、バルク転送、パケットサイズ512bytes
EP1、PC→スマホ、バルク転送、パケットサイズ512bytes
EP2、スマホ→PC、インタラプト転送/6ms毎、パケットサイズ28bytes
------------- Endpoint Descriptor -----------------
bEndpointAddress         : 0x81 (Direction=IN EndpointID=1)
bmAttributes             : 0x02 (TransferType=Bulk)
wMaxPacketSize           : 0x0200 (max 512 bytes)

------------- Endpoint Descriptor -----------------
bEndpointAddress         : 0x01 (Direction=OUT EndpointID=1)
bmAttributes             : 0x02 (TransferType=Bulk)
wMaxPacketSize           : 0x0200 (max 512 bytes)

------------- Endpoint Descriptor -----------------
bEndpointAddress         : 0x82 (Direction=IN EndpointID=2)
bmAttributes             : 0x03 (TransferType=Interrupt)
wMaxPacketSize           : 0x001C
 Bits 10..0              : 0x1C (28 bytes per packet)
bInterval                : 0x06 (6 ms)


【ADB 開発用のdevice descriptor
debuggerモードです.

Device Descriptorになんとgoogleの名が登場しました.debuggerモードではgoogleの端末になるんですね.
特定のClassなのかどうかは、interface descriptorを見てちょ、と言ってます.
------------- Device Descriptor ----------------------
bDeviceClass             : 0x00 (defined by interface descriptors)
idVendor                 : 0x18D1 (Google Inc.)
idProduct                : 0x4EE7
bcdDevice                : 0x0409

interface descriptorはclassについて「vendor specific」つまり謎のblack-boxと言ってます.Endpointは2つ.ADBと言ってます.
----------- Interface Descriptor -----------------
bNumEndpoints            : 0x02 (2 Endpoints)
bInterfaceClass          : 0xFF (Vendor Specific)
bInterfaceSubClass       : 0x42
bInterfaceProtocol       : 0x01
iInterface               : 0x05 (String Descriptor 5)
 Language 0x0409         : "ADB Interface"

以下は2つのEndpointについて述べています.
EP1、PC→スマホ、バルク転送、パケットサイズ512bytes
EP1、スマホ→PC、バルク転送、パケットサイズ512bytes
------------- Endpoint Descriptor -----------------
bEndpointAddress         : 0x01 (Direction=OUT EndpointID=1)
bmAttributes             : 0x02 (TransferType=Bulk)
wMaxPacketSize           : 0x0200 (max 512 bytes)

------------ Endpoint Descriptor -----------------
bEndpointAddress         : 0x81 (Direction=IN EndpointID=1)
bmAttributes             : 0x02 (TransferType=Bulk)
wMaxPacketSize           : 0x0200 (max 512 bytes)


以上が(スマホがUSB deviceの時の)device descriptor4種盛りでした.特に予想外な点はないです.

しかし、、、こうゆう使い方をする場合はどうしたらいいんだろう?
「スマホがUSB deviceで、PCから波形データをスマホに流し込んで、スマホに波形表示させる」
このケースでは、user specificな第5モードが必要になると思われる.どうするんだろ?
まさかスマホのVID/PIDを乗っ取れるとは思えない.何等かのフレームワーク上での活動を余儀なくされるんじゃないのかな.

#AOAってのがある   AOA 2.0 とは

11へ               13へ

かしこ

5 件のコメント:

  1. S5はOTG行けたんですね、おめでとうさんです^^)。

    返信削除
    返信
    1. OTGできました.お金損しなくてよかったよかった.

      削除
  2. >Threadについては「Expert向け」みたいな位置づけ
    いや、やはり Thread を、
    「サルでもわかるように」
    説明するのは、不可能ですよ。
    ※精々出来て、前に書いたサンプル
    https://hirasaka001.blogspot.com/2022/02/android-usb-oscilloscope10.html
    程度のもの。これ以上になると、残念ながら、
    「サルには絶対わからない」「サルにもわかるように書くのは不可能」

    ※というか、 Thread は、Expertでも「出来るなら、使いたくない奥義」の一種です。
    (よく考えずに使うと、バグしか生まない。実は「排他制御」という、それだけで「一冊の本が書けるくらい」の、面倒事を抱え込むことになる。これを始めると、
    ソフトは「思った通り」には動かず、「作った通り」に動く、を、実感できますw。

    返信削除
    返信
    1. これは予想ですが、Androidも、OSのバージョンによってThread の扱いが違ったりしてるんじゃないでしょうか?
      ※前にも書いたと思いますが、システムによってThreadの扱いは、全く違います。
      なので、ことThreadに関して言えば「言語やOSを跨いだ書き方」は、ほとんど不可能です。だいたい各環境固有のモノになってしまいます。
      ※そういう意味では、Threadは、「奥義中の奥義」と言えるかもしれません。
      (いろんな環境でやってると、「あっちだとこれでいけるんだけどなー」みたいなことがよくあります。)

      削除
    2. >Thread を、「サルでもわかるように」説明するのは、不可能

      はははそうですか.

      UIデバイスでフィルタとか重い処理をさせようとすると表では無理ですからねぇ.

      裏世界ピクニック...

      削除