Soramichi's blog

Some seek complex solutions to simple problems; it is better to find simple solutions to complex problems

ASMedia ASM 3142 と OPPO Reno3 A の相性問題?

あらすじ

  • PC にスマホを繋いでいる時の充電が遅いので 5V 3A が流せると謳う PCIe USB-C 拡張ボードを購入
  • Linux マシンに装着し OPPO Reno3 A を繋いでみたがうまく動かない
  • どうやら相性問題っぽい??

買ったもの

購入したのは玄人志向USB3.2C-P2-PCIE3 というボード。 PC への接続は PCIe v3 x4(以上)で、USB 3.2 Gen2 の Type C ポートが 2 個ついている。 1 ポートのみ使用のときは最大で 5V 3A、2 ポート同時に使用した時は 5V 4A まで流せるらしい。 ただし USB PD (Power Delivery) には対応していない。 USB PD 非対応で 5V 3A 程度ならわざわざボードを買うほどなのか?という気もするが、ここによると Type A だと 5V 1.5A までしか流せないらしく、今は PC の Type A ポートに接続しているので意味があると思った。

f:id:sorami_chi:20210105112534j:plain

f:id:sorami_chi:20210105112540j:plain

f:id:sorami_chi:20210105112544j:plain

ボードの外観と接続した様子。SATA電源ケーブルから補助電源を取る仕組みになっている。ただ最大 5V x 4A == 20 W に対し PCIe x4 で供給できる電力は 25 W らしいので補助電源がいるのかは謎である。

なおこのボードは玄人志向が販売しているが実際はどこかの OEM なのか、この StarTech のボードと全く同じである。値段は玄人志向の方がかなり安い。 なお玄人志向のページには USB 3.2 Gen 2 とあり StarTech のページには USB 3.1 Gen 2 とあるが、これらは同じものらしい。 また BEYIMEI というベンダーのこのボードは周辺回路の配置が微妙に違うが使われているチップ(ASMedia ASM 3142)や SATA の電源をつなぐあたりが同じなので機能的にはほぼ同じものと思われる。

Linux での動作

本ボードのメインチップは ASMedia の ASM 3142 である。 玄人志向のページでは対応 OS 欄に Windows しか書いていないが、 まったく同じボードだと思われる StarTech のページでは Linux 対応が謳われている。 またASMedia のページでも Linux に対応していると書いてあるので、Linux でも問題なく動くだろうと判断した。

実際に接続してみると、このページにあるように ASM 3142 ではなく ASM 2142 として認識された。 ドライバは専用のものではなく汎用の xhci_hcd というものが使われている。 カーネルの configuration 一覧(例えば make menuconfig)で ASM とか 2142 とかを検索しても何も出てこないので専用のドライバはない(不要?)ようである。

$ lspci -v
...
03:00.0 USB controller: ASMedia Technology Inc. ASM2142 USB 3.1 Host Controller (prog-if 30 [XHCI])
    Subsystem: ASMedia Technology Inc. ASM2142 USB 3.1 Host Controller
    Flags: bus master, fast devsel, latency 0, IRQ 16
    Memory at df200000 (64-bit, non-prefetchable) [size=32K]
    Capabilities: <access denied>
    Kernel driver in use: xhci_hcd
    Kernel modules: xhci_pci
...

2021/01/06 追記xhci ドライバのコードは明示的に ASM 2142 と ASM 3142 を同じものだと思って書かれている。つまり 2142 として認識されるのは全く想定通りの動作である。このコミットログ"The ASM2142/ASM3142 (same PCI IDs) ..." とあり、ASM 2142 と ASM 3142 向けの修正が pdev->device == 0x2142 という条件のみで書かれている。

相性問題?

PC に接続ができたので早速 OPPO Reno3 A を Anker の PowerLine III 経由でつないでみたところ、充電されないどころかスマホ側で PC に接続されたことを認識しない(認識されればスマホ側に PC とデータ転送するかどうかをたずねる通知が出るはずだが、それがでない)。しかし逆に PC 側ではスマホが接続されたことをきちんと認識しており、dmesg や lsusb にはちゃんと OPPO の機器が繋がっていることが表示される。手元にあった別の Type C - Type C ケーブルで繋いでみても全く同じ結果だった。

$ sudo dmesg
...
[60965.205189] usb 5-1: new high-speed USB device number 14 using xhci_hcd
[60965.437758] usb 5-1: New USB device found, idVendor=22d9, idProduct=2764, bcdDevice= 4.14
[60965.437761] usb 5-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[60965.437762] usb 5-1: Product: SM6125-IDP _SN:895ABEB8
[60965.437763] usb 5-1: Manufacturer: OPPO
[60965.437764] usb 5-1: SerialNumber: 895abeb8
$ lsusb
...
Bus 005 Device 014: ID 22d9:2764 OPPO Electronics Corp. SM6125-IDP _SN:895ABEB8
...

ボード自体がちゃんと動いていることを確認するために、(1) Type C - Type A アダプタ + USB メモリ と (2) Type C - Type C ケーブル + タブレット を接続してみたところ、(1) ではちゃんとデータ転送ができ、(2) ではちゃんと充電されかつタブレット側で PC に接続されたことを認識した。 ただし (2) の充電はかなり遅く、明らかに 3A も流れていないと思われる。 さらに不可解なことに、Type C - Type A アダプタ経由で OPPO Reno3 A を接続すると充電もスマホ側で認識もされるという結果になった。

まとめると以下のような状態である。

機器 接続方法 結果
OPPO Reno 3A Type C - Type C ケーブル 充電せず、スマホ側で PC を認識せず、PC 側ではスマホを認識
USB メモリ Type C - Type A アダプタ 問題なし
タブレット Type C - Type C ケーブル 充電、タブレット側での PC 認識ともにするが、充電は遅い
OPPO Reno3 A Type C - Type A アダプタ + Type A - Type C ケーブル 充電、スマホ側での PC 認識ともにするが、充電は遅い

これ以上のことは現状よく分からないが、どうも OPPO Reno3 A は相性問題が起きやすい?らしく、こちらのブログにいろいろまとまっている。 その記事に「本来は、USB PDにしろQuick Chargeにしろ、最初はUSB標準の給電動作をした上で、機器間の通信で対応を確認して設定を変更する手順を踏みますから、全く給電されないということは起こらないはず」とあるように、 たとえお互いに対応した仕様がない場合でも一番 basic なUSB給電としては動くはずなので、今回の結果はかなりおかしな状態と思われる。 ボードからの電力がそもそも足りていないのであればまだ分かるが、Type C - Type A アダプタをかませるとちゃんと動くのも謎である。https://www.kernel.org/doc/html/v5.10/driver-api/usb/typec.html