ikko LABS
← Blog
キャプチャーボード電子工作HDMIJLCPCBPCB

MS2109でHDMIキャプチャボードを自作した記録

2026年10月15日

この記事の要点

  • JLCPCBに在庫のあるICだけでHDMIキャプチャボードを設計しました
  • 使ったのはMacroSilicon MS2109(HDMI入力 → USB2.0 UVC出力)
  • 以前作った基板のBOMと突き合わせて、20種のうち13種を同じ部品番号で流用しました
  • 届いた基板は一発でHigh-Speed認識し、1080p30の映像が出ました
  • 映像に乗っていたノイズは、基板の不良ではなくMJPEG圧縮が原因でした

はじめに

HDMIキャプチャボードを自作してみたくなりました。

市販のドングルは1000円台で買えるので、コスト的なメリットはまったくありません。ただ、中身がどうなっているのか、どこまで自分で作れるのかを知りたかったのが動機です。

この記事は、試した順にそのまま記録しています。うまくいかなかったことや、途中で間違いに気づいて直したことも、消さずに残しました。同じものを作る人よりは、「こういう手順で進めるのか」という流れを見たい人の役に立てばと思っています。

部品はすべてJLCPCBに在庫があるもので揃えました。手はんだする部品を減らしたかったのと、1枚だけ作るなら部品調達の手間が一番のコストになるためです。

👇市販品を分解したPCB

完成した構成/回路図

HDMI Type-Aで受けた映像を、USB 2.0のUVCデバイスとしてPCに流す構成です。PCからは普通のWebカメラと同じように見えます。

使ったもの

役割部品LCSC番号備考
キャプチャSoCMS2109C961325QFN-48-EP 7×7mm
ファーム格納AT24C16C561263SOP-8のI2C EEPROM
降圧DC-DC ×2SY8089A1AACC4790743.3Vと1.2Vを生成
ESDアレイ ×2TPD4E05U06DQARC1387140.5pF 4ch、TMDS用
HDMIコネクタHDMI-019SC111617Type-Aレセプタクル
水晶X322524MOB4SIC7059024MHz CL=12pF
インダクタ ×2WPN4020H2R2MTC983612.2µH / 4.3A
フェライトビーズ ×2BLM18PG121SN1DC14709120Ω@100MHz
USB接続2.54mm 1×4ピンヘッダC5116483VBUS / D− / D+ / GND

全20種・51点、部品代は1枚あたり約$5.5でした。

基板

4層基板、板厚1.6mm、JLCPCBの標準スタックアップJLC04161H-7628を指定しています。

レイヤ用途
L1部品面。TMDSとUSBの差動をここに集約
L2GNDベタ。分割しない
L3電源(3V3 / A3V3 / V33USB / 1V2)
L4低速信号 + GNDベタ

なぜMS2109にしたか

候補を並べて在庫を見た

JLCPCBの実装用在庫を実際に確認して、候補を絞りました。

型番入出力パッケージ在庫単価
MS2109HDMI → USB2.0QFN-48-EP 7×7776個$2.26〜3.65
MS2130HDMI → USB3.0QFN-64-EP 9×9663個$3.08〜4.73
MS2131HDMI → USB3.0LQFP-100 14×1441個$4.31〜6.15
MS2106Eアナログ → USB2.0LQFP-48実装在庫なし$1.12〜1.91

MS2130のUSB3.0は魅力的でしたが、QFN-64の9mm角で基板難易度が上がること、初めて作るなら動くことを優先したいことから、MS2109にしました。

MS2106Eはアナログ(コンポジット / S端子)入力用で、方向が違います。JLCPCBの実装部品リストにも載っていなかったので、選ぶなら手はんだ前提になります。

参考にした設計

  • YuzukiHD/YuzukiHCC ─ MS2109のオープンソース設計(CERN-OHL-P)。ガーバーとBOMが揃っています
  • BertoldVdb/ms-tools ─ MS2109のEEPROMを読み書きするツール(MIT)

データシートの応用回路とこの2つを突き合わせながら設計しました。

回路の要点

電源は3.3Vと1.2Vの2系統

USB VBUSの5Vから、SY8089A1AACで3.3Vと1.2Vを作ります。

1.2Vをリニアレギュレータで作ると (5−1.2)×0.25A ≒ 0.95W の損失になって発熱するので、ここは必ずスイッチング方式にします。

SY8089A1AACの基準電圧は0.6Vで、出力は Vout = 0.6 × (1 + RH/RL) です。

レールRHRL計算値MS2109の許容
3.3V10kΩ2.2kΩ3.327V3.15〜3.55V
1.2V10kΩ10kΩ1.200V1.14〜1.26V

分圧の上側抵抗RHと並列に、270pFのCffを入れています。Silergyのアプリケーションノートは RH=100kΩ に対して Cff=22pF を推奨していますが、手持ちの抵抗値に合わせてRHを10kΩスケールに落としたので、ゼロ点が同じになるようCffも10倍にしました。

補足 なぜSY8253ADCにしなかったか

手持ちにSY8253ADC(3A / 500kHz)もありましたが、最低入力電圧が4.5VでUSB VBUSの下限4.40Vに対して余裕がないこと、500kHzだと2.2µHではリップル電流が約1Aになって負荷0.2Aに対して過大なことから、見送りました。SY8089は2.5V〜入力・1.5MHzなので、バスパワー向きです。

3.3Vはフェライトで3つに分ける

MS2109は3.3V系の電源ピンが3種類に分かれています。

AVDD33はTMDS入力段のアナログ電源なので、デジタル系のノイズから切り離します。V33USBはUSB PHY専用で、データシートが「100nF + 10µFをピン直近に」と明記しています。

一方、AVDD12とDVDD12は分ける必要がありません。データシートの応用回路も、pin 19 / 27 / 33 / 41をすべてVDD12という1つのネットに繋いでいます。

デカップリングは「レール単位」ではなく「ピン単位」

ここは設計の途中で数え直して直した部分です。

同じレールでも、コンデンサは電源ピン1本につき1個置きます。デカップリングの目的は、そのピンから見た電流ループのインダクタンスを潰すことなので、ピンから数mm離れただけで効かなくなります。

MS2109の電源ピンがQFNのどこにあるかを並べると、こうなりました。

レールピンQFN上の辺100nF
V33USB6, 7, 8左のみ1(連続ピンで実質1ノード)
DVDD3316, 23, 44下・下・上3
AVDD3324, 30, 47下・右・上3
DVDD1219, 41下・上2
AVDD1227, 33右・右2

1.2Vは単一レールですが、pin 19が下辺、pin 41が上辺とパッケージの反対側にあるので、2個では足りず4個必要です。

AVDD33も3辺に散っているので3個要ります。最初に書いた回路図ではここが1個になっていて、見直しで気づきました。

HDMI入力部

HDMI接続
1, 3, 4, 6, 7, 9, 10, 12TMDS 4ペア → ESD → MS2109
2, 5, 8, 11, 17GND
13 (CEC), 14 (予約)NC
15, 16 (DDC)47kΩでHDMI +5Vへプルアップ
18 (+5V)1kΩ → HDRXDET、100nF → GND
19 (HPD)1kΩ ← HDRXHPD

注意 DDCのプルアップは3.3Vに引かない

HDMI規格では、シンク側がソースの供給する+5V(pin 18)に対してプルアップを持ちます。MS2109のDDCピンは3.3Vなので、規格が想定する1.5〜2kΩではなく、データシート指定の47kΩという弱いプルアップを使います。

+5V検出は分圧しません。 コネクタpin 18の5Vを1kΩ経由でそのままHDRXDETに入れます。MS2109側の内部クランプと1kΩで電流を制限する設計で、データシートの応用回路どおりです。

水晶は4パッド品

X322524MOB4SIはSMD3225-4Pです。2端子だと思って描いていたのですが、途中で気づいて直しました。

パッド機能接続
1水晶端子XTIN (pin 1)
2ケース(金属リッド)GND
3水晶端子XTOUT (pin 2)
4ケース(金属リッド)GND

2と4は金属リッドに内部接続されたシールド端子です。浮かせたままにすると、リッドがアンテナとして働いて発振の安定度が落ちます。

負荷容量の12pF×2は、データシートの応用回路がNC表記だったので最初はDNPにするつもりでしたが、結局実装しました。CL=12pFの水晶に12pFの負荷容量だと周波数が数十ppm高めに出ますが、USB映像では問題になりません。

USBは4ピンヘッダにした

Type-Cレセプタクルをやめて、2.54mmの1×4ピンヘッダにしました。ピン順は 1=VBUS / 2=D− / 3=D+ / 4=GND です。

これはUSB-Aケーブルの線色順(赤・白・緑・黒)とそのまま一致するので、市販のUSBケーブルを切って直接はんだ付けすれば1:1で対応します。

Type-Cをやめたことで、CC1/CC2のプルダウン抵抗2個が不要になりました。

注意 USB 2.0 High Speedは480Mbps

D±には90Ωの差動インピーダンスとシールドが要りますが、ピンヘッダとジャンパ線にはどちらもありません。配線は10cm以内に、D+とD−を撚って、GNDを添わせてください。失敗するとHigh Speedの認識に失敗してUSB 1.1モードに落ち、640×480しか出せなくなります。

以前作った基板から部品を流用する

手元に以前作った別の基板(PoEとDDR4を載せたもの)のBOMがあったので、突き合わせてみました。結果、20種のうち13種が同じLCSC部品番号で流用できました。

流用元→ 新基板内容
U17, U18ESDアレイTPD4E05U06DQAR
L1, L2インダクタ2.2µH / 4.3A / 48mΩ
C11等100nF ×15Murata GRM155
C66等10µF 0805 ×4
C3等22µF 0805 ×3
C70270pF ×2SY8089のCff
C38等12pF ×2水晶負荷容量
D5LED赤に変更
R3, R5, R9, R11等抵抗 4種FOJAN FRC0402Fシリーズ

一番の当たりはESDアレイでした。前の基板でTPD4E05U06DQARを使っていて、これがそのままTMDS用に使えました。TIがデータシートでHDMI 2.0用途を明示している部品です。

流用に合わせて設計を2箇所変えました。

  • CC抵抗を5.1kΩ→4.7kΩ ─ USB-C規格のRdは5.1kΩ±20%なので範囲内(結局Type-Cをやめたので不要になりました)
  • FB分圧を100k/22k→10k/2.2k ─ どちらも手持ちにある値

部品代は$4.73→$5.56と$0.83上がりました。Murataのコンデンサと4×4mmインダクタが汎用品より高いためです。品種統一を優先するかコストを優先するかの判断になります。

水晶は、前の基板がX322525MOB4SI(25MHz)で周波数が違ったので流用できませんでしたが、選んだX322524MOB4SIは同じYXCの同シリーズ24MHz版でした。フットプリントとライブラリはそのまま使えました。

基板の設計ルール

JLCPCBの製造限界と、追加費用がかからない実用ラインは別物です。

製造限界

項目2層4層
配線幅 / 間隔(1oz)0.1 / 0.1 mm0.09 / 0.09 mm
ビア(穴 / パッド)0.15 / 0.25 mm同左

追加費用の境界

  • 配線幅/間隔 3.0〜3.5 mil → 4〜8層で注文金額の +20%
  • ビア穴 0.3 mm 未満 → 標準より割高

つまり5mil / 5mil・ビア0.3mmに収めれば追加費用なしです。

ただし効くのはインピーダンス

4層標準スタックアップJLC04161H-7628はL1-L2間のプリプレグが0.2104mm(Dk=4.4)です。ここからL1を引くと、必要な線幅はこうなります。

用途目標線幅W間隔S
TMDS差動100Ω約0.22 mm約0.18 mm
USB D±差動90Ω約0.24 mm約0.13 mm
単線50Ω約0.35 mm—

最小値の0.09mmよりはるかに太いので、最小配線幅はボトルネックになりません。細く引けることより、規定の太さで引けるスペースを確保することが設計課題になります。

2層では作れない

参考までに、2層で同じことをやろうとすると線幅がこうなります。

構成L1-L2間の誘電体厚100Ω差動に必要な線幅
2層 1.6mm約1.53 mm約2.0 mm
2層 0.6mm約0.53 mm約0.7 mm
4層 1.6mm0.21 mm約0.22 mm

MS2109はQFN-48の0.5mmピッチでパッド幅が0.25mmです。2層だとパッドの8倍幅の配線を0.25mmのパッドに繋ぐことになり、そもそも描けません。

さらに、データシートが「差動線の直下層は配線を通さずベタGNDを確保」と要求しているので、2層で信号面の裏を全部GNDにしてしまうと、4系統の電源を通す層がなくなります。

ビア

用途穴 / 外径
標準0.3 / 0.6 mm
混み合った所0.3 / 0.45 mm

MS2109のEPのサーマルビアは0.3mm穴 / 0.6mmパッドを3×3、1.2mmピッチにしました。EPは5.3mm角なので余裕で入ります。

TMDSとUSBの差動線にはビアを打っていません。データシートは「ビア2個以内」としていますが、理想はゼロです。

届いた基板の動作確認

JLCPCBから届いた基板

通電前にやったこと

測定器はテスタしかなかったので、通電前のチェックを厚めにしました。

まず部品の員数と向きを目視で確認しました。QFNのピン1マーク、ICの向き、未実装の部品がないかを一通り見ます。

次にテスタの抵抗レンジで、電源を入れない状態で測ります。

測定点期待値根拠
VBUS ↔ GND数百kΩ以上DC経路なし
3V3 ↔ GND約12kΩFB分圧 10k + 2.2k
1V2 ↔ GND約20kΩFB分圧 10k + 10k

導通レンジでは、3V3↔A3V3と3V3↔V33USBが鳴ること(フェライトのDCR)、3V3↔1V2が鳴らないことを確認しました。

テストポイントは全レールに出しておいたので、ここが楽でした。

初回通電はUSB充電器で

HDMIは挿しません。 この基板の電源はUSB VBUSだけで、HDMI側の+5Vは検出入力とDDCプルアップ源にしか使っていないので、HDMIだけ挿しても何も起きません。

むしろHDMIを先に挿すと、MS2109の電源が0Vのままソース側の+5Vが1kΩ経由でHDRXDETに入ることになります。無給電のICに電圧が加わる状態で、ラッチアップの原因になります。

PCに挿す前に、USB充電器で通電しました。電源系の確認はVBUSがあればできるので、データ線が繋がらない充電器で十分です。万一短絡していても壊れるのは充電器だけで済みます。

電圧はこうなりました。

測定点設計値許容範囲
3V33.327 V3.20 〜 3.45 V
A3V33.32 V3V3 −10mV以内
V33USB3.32 V3V3 −10mV以内
1V21.200 V1.16 〜 1.24 V

5点とも範囲内でした。

PCに挿す

EEPROMは空のまま実装したので、MS2109内蔵ROMのデフォルト設定で立ち上がるかを見ます。

USB Device Tree Viewerの結果です。

表示 USB Device Tree Viewer

Vendor ID : 0x534D (Hefei Macrosilicon Technology Co., Ltd.)
Product ID : 0x2109
Manufacturer String : "MACROSILICON"
Product String : ---
USB Version : 2.0 (480 Mbit/s)
Device Connection Speed : High-Speed
Video : UVC Version 1.00
-------- Default Video Modes --------
1920 x 1080 @ 30 fps : MJPEG
1920 x 1080 @ 5 fps : YUY2
1600 x 1200 @ 30 fps : MJPEG
1600 x 1200 @ 5 fps : YUY2
1280 x 1024 @ 30 fps : MJPEG
1280 x 1024 @ 8 fps : YUY2
1280 x 960 @ 30 fps : MJPEG
1280 x 960 @ 8 fps : YUY2
1360 x 768 @ 30 fps : MJPEG
1360 x 768 @ 8 fps : YUY2
1280 x 720 @ 30 fps : MJPEG
1280 x 720 @ 10 fps : YUY2
1024 x 768 @ 30 fps : MJPEG
1024 x 768 @ 10 fps : YUY2
800 x 600 @ 30 fps : MJPEG
800 x 600 @ 20 fps : YUY2
720 x 576 @ 30 fps : MJPEG
720 x 576 @ 25 fps : YUY2
720 x 480 @ 30 fps : MJPEG, YUY2
640 x 480 @ 30 fps : MJPEG, YUY2

読み取れたことです。

  • Device Connection Speed が High-Speed ─ D±の配線とインピーダンスが正常
  • Product String が空 ─ EEPROM未書き込みの確認(予定どおり)
  • 解像度リストがデータシート§6.4 表6.3と完全に一致 ─ ROMが正常にブートしてUVCディスクリプタを正しく吐いている

HDMIソースを繋ぐと、1920×1080@30の映像が出ました。

映像のノイズを追いかける

映像は出たのですが、画面に色のついたノイズが乗っていました。

PCのデスクトップをキャプチャすると、小さな文字のところがマゼンタとシアンに染まります。TMDSの配線が悪いのか、USBの転送エラーなのかを切り分けたくて、キャプチャした画像の画素値を調べました。

数字を見る

測定結果
黒い文字のRGB(22, 22, 23)
マゼンタ部のRGB(246, 167, 247)
R − B の分布平均 −0.2

黒い文字が完全な無彩色です。TMDSのチャンネルが1本落ちていれば、ここに色が付くはずです。

マゼンタ部はRとBがほぼ同値(246と247)で、Gだけが80ほど低い。そしてR−Bの平均が−0.2、つまりRとBが完璧に連動しています。

さらに、大きな文字を拡大するとエッジまで真っ黒で、色にじみが一切ありません。白背景も純白のままでした。

つまり輝度(Y)は完全に正常で、色差(Cb/Cr)だけが細かい文字のところでのみ崩れていることになります。

TMDSの配線やインピーダンスに問題があれば、大きな黒ベタやエッジにもスパークルや横スジが出ます。USB転送エラーなら、平坦な白い部分もブロック単位で壊れます。どちらも起きていませんでした。

正体はMJPEG圧縮だった

MS2109は1920×1080@30をUSB 2.0に押し込むため、MJPEGで圧縮しています。

  • 非圧縮なら 1920×1080×2byte×30fps = 124 MB/s(約1Gbps)
  • USB 2.0 High-Speedの実効帯域は 約20 MB/s
  • つまり圧縮率は約6:1

実写なら6:1はほぼ無劣化ですが、細かい文字にはこれが効きます。そこにクロマサブサンプリングが乗るので、色情報が最初に犠牲になります。マゼンタとシアンが交互に出るのは、まさにその壊れ方です。

そして今回はPCのデスクトップを映していました。小さな文字が画面全体に敷き詰められている、MJPEGにとって最悪の被写体です。

解像度リストが答えを持っていた

気づいてから改めてUVCの解像度リストを見ると、YUY2(非圧縮)のフレームレートの付き方に規則がありました。

モードデータレート
1920×1080 @5 YUY220.7 MB/s
1280×720 @10 YUY218.4 MB/s
640×480 @30 YUY218.4 MB/s

どれも約18〜21 MB/sに揃っています。 これがUSB 2.0 High-Speedの実効帯域の上限で、MacroSiliconはそこに収まるようにfpsを決めていたわけです。

対策

YUY2モードを使えば無劣化でキャプチャできます。

用途推奨モード
PC画面・文字を読む1920×1080 @5 YUY2
PC画面・多少動く1280×720 @10 YUY2
ゲーム・動画1920×1080 @30 MJPEG

市販のMS2109ドングルも同じ症状が出るので、この基板が特別悪いわけではありませんでした。

根本的に解決するならUSB 3.0のMS2130にするしかありません。

まだ確認していないこと

  • EEPROMの書き込み ─ Product Stringが空のままです。ms-toolsで書き込めば製品名やEDIDを自分のものにできます。ただし画質は変わりません(圧縮率は帯域で決まるため)
  • 音声 ─ UACデバイスとして見えているかの確認
  • 4系統の同時キャプチャ ─ 調べたところ、UVCのisochronous帯域予約が壁になりそうです。USB 2.0で isochronousに割ける帯域が384Mbpsなのに対し、UVCデバイス1台が申告する最大値が196Mbps。1台で枠の半分を持っていくので、2台目でギリギリ、3台目は確実に弾かれます。実際に消費する量ではなく申告値で予約されるのが厄介なところです

まとめ

  • JLCPCBの在庫を1点ずつ確認して部品を選ぶと、発注時に止まることがありません
  • 以前作った基板のBOMと突き合わせたら、20種のうち13種が同じ部品番号で流用できました
  • データシートの応用回路は、一見ただの回路図ですが、ネット名の付け方(VDD12が1本、AVDD33とDVDD33が別)に設計意図が表れています
  • 初回通電はUSB充電器で。PCのポートを危険に晒す理由がありません
  • 映像のノイズは基板の不良ではなくMJPEG圧縮でした。画素値を測ると、輝度と色差のどちらが壊れているかで原因を切り分けられます

初めて作った4層基板が一発で動いたのは、データシートの§11「PCB設計説明」に素直に従ったからだと思います。差動インピーダンス、ビアの本数、GNDベタを分割しないこと。この3つを守れば、HDMIくらいの速度なら素人でも通せました。

参考リンク

MS2109でHDMIキャプチャボードを自作した記録 | ikko LABS