USB-PD
2025/3/9時点のusb-pdの翻訳
はじめに¶
AppleはカスタムUSB-PDメッセージを使用してデバッグなどの目的でType-Cポートのピンの多重化を制御しています。USB-PDの通信はポートのCCxライン(ポート方向によってCC1またはCC2)で行われます。
情報を提供してくれたt8012devの皆さんに感謝します。 https://web.archive.org/web/20211023034503/https://blog.t8012.dev/ace-part-1/ を参照してください。Apple M1 Mac(2020)のコントローラはCD3217 『Ace2』です。
予備知識としてUSB-PD specを参照すると良いでしょう。
AppleはUSB ID(0x5AC)を持つベンダー固有の構造化されたVDM(Vendor Define Message、ベンダ定義メッセージ)メッセージを使用していますが、メッセージは SOP'DEBUG(UFPから発信する場合)またはSOP"DEBUG(DFPから発信する場合)のパケットスタートトークンを使用する必要があります(規格では未使用のため コントローラによっては送信できない場合あり)。VDMのヘッダーは0x5ac8000|(コマンド)形式です。
MacはOSが起動した後にのみDFPとして動作するため、このプロトコルはDFP(すなわち電源)として動作させることが推奨されます。
以下コマンドは、vdmtoolのシリアルコンソールに簡単に貼り付けられるように、16進数カンマ区切りフォーマットになっています。このプロトコルでは、32ビットのVDMワードの上位から下位までをパックした16ビットのデータユニットを多用しており、ゼロ終端となっています。
コマンドの返信には『リクエストコマンド ID|0x40』を使用します。コマンド0x10への返答は『コマンド 0x50』などです。
Chips¶
- CD3215C00 『ACE1』 - これは ROM/OTP コードが異なる TPS65983 らしい
- CD3217B12 『ACE2』 - 不確かだがいくつかの違いを持つ実際に新しいシリコンだろう。他のTI製部品と同じかもしれない。初期のM1デバイスはすべてこの部品を使用。ファームウェアの構成は多少異なる
ポート¶
Macの各ポートでVDM対応が異なる場合があります。デバッグ機能は通常1つのポートでのみ対応します。
2020 MacBook Air (M1)¶
端に最も近いポートに全てのデバッグ機能があります。
2020年のMac Mini (M1)¶
一番左のポート(電源入力に一番近い)に全てのデバッグ機能があります。
2019年 16インチMacBook Pro (MacBookPro16,1 - Titan Ridge)¶
前方と後方の左ポートはそれぞれ7つのアクションを報告します。 後方右ポートは4つのアクションを報告します。 前方右ポートは3つのアクションを報告します。
2019年モデルの13インチMacBook Pro (MacBookPro15,2 - Titan Ridge)¶
前方左ポートは8つのアクションを報告しています。 後方左ポートは5つのアクションを報告します。 後方右ポートは、4つのアクションを報告します。 前方右ポートは3つのアクションを報告します。
2017年の13インチMacBook Pro (MacBookPro14,2 - Alpine Ridge)¶
後方左ポートは4つのアクションを報告しています。 前方左ポートと前方右ポートはそれぞれ3つのアクションを報告します。後方右ポートは2つのアクションを報告します。
コマンド¶
0x10 アクションリストの取得¶
5ac8010
それぞれの『アクション』は行うべきことまたはミックスすべき信号のいずれかです。
M1 Mac Mini (2020) 左ポートからの応答例:
5ac8010
>VDM 5AC8010
<VDM RX SOP'DEBUG (7) [704F] 5AC8050 46060606 2060301 3060106 1050303 8030809 1030000
^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
vdm hdr action list
これはアクション0x4606、0x606、0x206、0x301、0x306、0x106、0x105、0x303、0x803、0x809、0x103の対応を示しています。
MacBookPro16,1は、前方左ポートの動作0x602、0x606、0x601、0x403、0x302、0x501、0x301、後方左ポートの動作0x205、0x206、0x103、0x602、0x302、0x501、0x301、後方右ポートの動作0xE04、0x501、0x301、0x302、前方右ポートの動作0x302、0x501、0x301に対応しています。
MacBookPro15,2は、前方左ポートのアクション0x207、0x205、0x602、0x606、0x501、0x601、0x301、0x302、後方左ポートのアクション0x403、0x602、0x302、0x501、0x103、0x301、0x302、前方右ポートのアクション0x302、0x501、0x301に対応しています。
MacBookPro14,2では、後方左ポートのアクション0x403、0x602、0x301、0x302、前方左ポートのアクション0x302、0x205、0x301、前方右ポートのアクション0x302、0x802、0x301、後方右ポートのアクション0x301、0x302に対応しています。
0x11 アクション情報の取得¶
5ac8011,<actionid>
特定のアクションに関する情報を16ビットのショートユニットで返します(ゼロ終端)。
M1 Mac Miniの場合アクションごとに以下のような情報が返されます:
Action Info reply
4606 0183
0606 0183
0206 0187 020C 0318 8001
0301 0187 020C 0303
0306 0187 020C 800C
0106 8001
0105 8000
0303 0187 0221 0303 809E 0030 6030 000C
0803 0187 0221 8001
0809 0187 0221 8001
0103 8000
0x12: アクションの実行¶
5ac8012,<actionid>[,args]
指定されたアクションを実行するかピンのセットにマッピングします。
actionid
は下位16ビットにアクションIDを保持し、フィールドは次のようになります:
Bits Description
25 If 1 exits the mode, instead of entering it
24 Persist through soft reset. Seems to do something in DFP mode.
23 If 1 attempts to exit conflicting modes before entering this one
22-16 Bit mask of lines to map to this action
15-0 Action ID
レスポンスの例
5ac8012,40306
>VDM 5AC8012 40306
<VDM RX SOP'DEBUG (5) [504F] 5AC8052 44740000 306 0 0
^^^^^^^ ^^^^\------------ pin states
vdm hdr connection/line state
- 接続/回線状態: 16ビットのヘッダショート(
(ConnectionState << 14) | (LineState[i] << (2 * i))
,iは0から7、排他的)に続いて、各ピンセットからどのアクションがmuxされるかを示す7つのショートが続く。ConnectionStateは、切断されている場合は0、方向に応じて標準的な接続デバイスの場合は1または2、オーディオおよびデバッグ接続の場合は3。LineStateは2ビットの値でその意味は現在不明 - ピンの状態:1つのピンペアに1つのアクションID、16ビット長
この場合アクション306はピンセット2(3番目のピンセット)にマップされています。
ピンセット¶
2020年Mac Mini (M1)より:
- 0: Secondary D+,D- (VCONN側コネクタのUSB2データペア)
- 1: Primary D+,D- (CC側コネクタのUSB2データペア)。これらはホスト側にブリッジされておらず異なる信号を出すことができるのがデバッグポートならではの特徴。ケーブルはCC側に1ペアのみ!
- 2: SBU1,SBU2
- 3-6: 不明(SSTX/SSRXペア?)
Mac側でコネクタの向きを自動調整しているので、ケーブル側から見るとピンは常に同じになります。向きの調整は相手側の機器が行います。
アクション¶
103: PDリセット¶
これには0x8000の引数が必要です(『アクション情報の取得』から取得)。
5AC8012,0103,80000000
>VDM(D) 5AC8012 103 80000000
Disconnect: cc1=0 cc2=0
VBUS OFF
Disconnected
(PD renegotiation occurs)
105: 再起動¶
これには0x8000の引数が必要です(『アクション情報の取得』から抜粋)。
5AC8012,0105,80000000
>VDM(D) 5AC8012 105 80000000
<VDM RX SOP"DEBUG (5) [524F] 5AC8052 44740000 306 0 0
Disconnect: cc1=0 cc2=0
VBUS OFF
Disconnected
S: DISCONNECTED
IRQ: VBUSOK (VBUS=OFF)
(device reboots and PD renegotiates)
rebootコマンドについて¶
Arduino IDEのシリアルモニタから『5AC8012,0105,80000000』というコマンドが送られてきますが、もっと手軽にMacをリブートしたい場合は以下のコマンドを試してみてください:
Option 1:
echo "5AC8012,0105,80000000" | picocom -c -b 500000 --imap lfcrlf -qrx 1000 /dev/<あなたのArduinoシリアルデバイス>
Option 2:
stty 500000 </dev/<あなたのArduinoシリアルデバイス>
echo > /dev/<あなたのArduinoシリアルデバイス>
echo 5AC8012,0105,80000000 > /dev/<あなたのArduinoシリアルデバイス>
しかし、default Arduino operations on Serial portのために、上記のコマンドは多くの場合失敗しランダムに成功します。 しかし、以下のPythonコードは、コマンドデータを送信する前にArduinoを手動でリセットすることで、正常に動作することがわかりました:
import serial
import time
ser = serial.Serial("/dev/<your Arduino Serial device>", 500000, dsrdtr=True)
ser.dtr = True
ser.dtr = False
time.sleep(0.5)
ser.dtr = True
time.sleep(2)
ser.write(b'5AC8012,0105,80000000\n')
ser.close()
106: DFU / ホールドモード¶
これには0x8001の引数が必要です(『アクション情報の取得』から取得)。これはDFPモード(MacがUFPとして動作する)でのみ正しく動作します。
5AC8012,0106,80010000
>VDM(D) 5AC8012 106 80010000
<VDM RX SOP"DEBUG (5) [544F] 5AC8052 44740000 306 0 0
(device reboots in DFU mode, no PD renegotiation occurs)
このモードは特別です。Mac Miniではハードシャットダウンすると通常PD通信とUFPモード(Rd open)が無効になります。しかし、このモードからのハードシャットダウン(例:電源ボタンの長押し)では、PD通信が有効なままマシンがパワーダウンします。また、105を介して通常モードで再起動することも可能で、この場合もPDはリセットされず、既存のモードが有効なままとなります。これは、マシンのリセットを通じてデバッグ接続を維持するために使用することができます。
FIXME: あるいはヘッダの persist ビットのせいかもしれません。もっとテストが必要です。
306: デバッグ用 UART¶
Pin order: TX, RX
これはピンセット0~2(D+/D- B、D+/D- A、またはSBU1/2)にマッピングできます。UARTは1.2Vの電圧レベルを使用しています。
5AC8012,840306
>VDM 5AC8012 840306
<VDM RX SOP'DEBUG (5) [584F] 5AC8052 44740000 306 0 0
(UART is now mapped to SBU1/2)
ピン1がTX、ピン2がRXで、方向が意味を持ちます(CC=CC2の場合は反転します)。つまりCCピンと同じコネクタ側(AまたはB)のSBUピンがTXになります。
606: DFU USB¶
ピンの順番です。D+, D- (当然)
DFUモードでは自動的にピンセット1(D+/D-プライマリ)にマッピングされますが、移動することも可能です。
DFUをもう一方のD+/D-セットに移動させるには:
5AC8012,2020606
>VDM(D) 5AC8012 2020606
<VDM RX SOP"DEBUG (5) [5E4F] 5AC8052 44400000 0 0 0
5AC8012,810606
>VDM(D) 5AC8012 810606
<VDM RX SOP"DEBUG (5) [504F] 5AC8052 44430606 0 0 0
(DFU is now on secondary D+/D- pair (pin set 0))
4606: USBのデバッグ¶
面白いです。これはメインCPU駆動ではなくシステムがオフの時にも列挙されます(パーシステントモード)。電源の移行時に再列挙されます。
[277048.498917] usb 1-4.4.3: New USB device found, idVendor=05ac, idProduct=1881, bcdDevice= 1.20
[277048.498920] usb 1-4.4.3: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[277048.498921] usb 1-4.4.3: Product: Debug USB
[277048.498921] usb 1-4.4.3: Manufacturer: Apple Inc.
lsusb
Bus 001 Device 097: ID 05ac:1881 Apple, Inc. Debug USB
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 255 Vendor Specific Class
bDeviceSubClass 255 Vendor Specific Subclass
bDeviceProtocol 255 Vendor Specific Protocol
bMaxPacketSize0 64
idVendor 0x05ac Apple, Inc.
idProduct 0x1881
bcdDevice 1.20
iManufacturer 1 Apple Inc.
iProduct 2 Debug USB
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 0x0027
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xc0
Self Powered
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 3
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 255 Vendor Specific Subclass
bInterfaceProtocol 255 Vendor Specific Protocol
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 4
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 4
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 4
Device Qualifier (for other device speed):
bLength 10
bDescriptorType 6
bcdUSB 2.00
bDeviceClass 255 Vendor Specific Class
bDeviceSubClass 255 Vendor Specific Subclass
bDeviceProtocol 255 Vendor Specific Protocol
bMaxPacketSize0 64
bNumConfigurations 1
can't get debug descriptor: Resource temporarily unavailable
Device Status: 0x0001
Self Powered
0803: I²Cバス(3.3V)¶
ピンの順序: SCL, SDA
デバイスアドレス(シフトなし): 0x38, 0x3f
通常のブート時では興味深いことをしませんが、macOSでは何かします。
また、時々、START 00 STOP (ACKサイクルなし)を低速で送信するだけの場合もあります(?)。
0809: もう一つのI²Cバス(3.3V)¶
ピンの順序: SCL, SDA
デバイスアドレス(シフトなし): 0x6b, 0x38, 0x3f,
TBD¶
- 0206 1.2Vへの弱い(30kΩ)プル、GNDへの反応なし、トランジションなし。SWDである可能性
- 0301 1.2V、1つのピンがハイにドライブ、もう1つはドライブしない。もう1つのUART? DFUモードでHigh-z、Highピンが電源/ブートを追跡する以外の何も動きなし
- 0303 ピンセット1-2にのみマップ?GND?遷移なし。未使用のUARTモード?