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番号 | 備考 |
|---|---|---|---|
| キャプチャSoC | MS2109 | C961325 | QFN-48-EP 7×7mm |
| ファーム格納 | AT24C16 | C561263 | SOP-8のI2C EEPROM |
| 降圧DC-DC ×2 | SY8089A1AAC | C479074 | 3.3Vと1.2Vを生成 |
| ESDアレイ ×2 | TPD4E05U06DQAR | C138714 | 0.5pF 4ch、TMDS用 |
| HDMIコネクタ | HDMI-019S | C111617 | Type-Aレセプタクル |
| 水晶 | X322524MOB4SI | C70590 | 24MHz CL=12pF |
| インダクタ ×2 | WPN4020H2R2MT | C98361 | 2.2µH / 4.3A |
| フェライトビーズ ×2 | BLM18PG121SN1D | C14709 | 120Ω@100MHz |
| USB接続 | 2.54mm 1×4ピンヘッダ | C5116483 | VBUS / D− / D+ / GND |
全20種・51点、部品代は1枚あたり約$5.5でした。
基板
4層基板、板厚1.6mm、JLCPCBの標準スタックアップJLC04161H-7628を指定しています。
| レイヤ | 用途 |
|---|---|
| L1 | 部品面。TMDSとUSBの差動をここに集約 |
| L2 | GNDベタ。分割しない |
| L3 | 電源(3V3 / A3V3 / V33USB / 1V2) |
| L4 | 低速信号 + GNDベタ |
なぜMS2109にしたか
候補を並べて在庫を見た
JLCPCBの実装用在庫を実際に確認して、候補を絞りました。
| 型番 | 入出力 | パッケージ | 在庫 | 単価 |
|---|---|---|---|---|
| MS2109 | HDMI → USB2.0 | QFN-48-EP 7×7 | 776個 | $2.26〜3.65 |
| MS2130 | HDMI → USB3.0 | QFN-64-EP 9×9 | 663個 | $3.08〜4.73 |
| MS2131 | HDMI → USB3.0 | LQFP-100 14×14 | 41個 | $4.31〜6.15 |
| MS2106E | アナログ → USB2.0 | LQFP-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) です。
| レール | RH | RL | 計算値 | MS2109の許容 |
|---|---|---|---|---|
| 3.3V | 10kΩ | 2.2kΩ | 3.327V | 3.15〜3.55V |
| 1.2V | 10kΩ | 10kΩ | 1.200V | 1.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 |
|---|---|---|---|
| V33USB | 6, 7, 8 | 左のみ | 1(連続ピンで実質1ノード) |
| DVDD33 | 16, 23, 44 | 下・下・上 | 3 |
| AVDD33 | 24, 30, 47 | 下・右・上 | 3 |
| DVDD12 | 19, 41 | 下・上 | 2 |
| AVDD12 | 27, 33 | 右・右 | 2 |

1.2Vは単一レールですが、pin 19が下辺、pin 41が上辺とパッケージの反対側にあるので、2個では足りず4個必要です。
AVDD33も3辺に散っているので3個要ります。最初に書いた回路図ではここが1個になっていて、見直しで気づきました。
HDMI入力部
| HDMI | 接続 |
|---|---|
| 1, 3, 4, 6, 7, 9, 10, 12 | TMDS 4ペア → ESD → MS2109 |
| 2, 5, 8, 11, 17 | GND |
| 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, U18 | ESDアレイ | TPD4E05U06DQAR |
| L1, L2 | インダクタ | 2.2µH / 4.3A / 48mΩ |
| C11等 | 100nF ×15 | Murata GRM155 |
| C66等 | 10µF 0805 ×4 | |
| C3等 | 22µF 0805 ×3 | |
| C70 | 270pF ×2 | SY8089のCff |
| C38等 | 12pF ×2 | 水晶負荷容量 |
| D5 | LED | 赤に変更 |
| 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 mm | 0.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.6mm | 0.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があればできるので、データ線が繋がらない充電器で十分です。万一短絡していても壊れるのは充電器だけで済みます。
電圧はこうなりました。
| 測定点 | 設計値 | 許容範囲 |
|---|---|---|
| 3V3 | 3.327 V | 3.20 〜 3.45 V |
| A3V3 | 3.32 V | 3V3 −10mV以内 |
| V33USB | 3.32 V | 3V3 −10mV以内 |
| 1V2 | 1.200 V | 1.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 : 0x2109Manufacturer String : "MACROSILICON"Product String : ---USB Version : 2.0 (480 Mbit/s)Device Connection Speed : High-SpeedVideo : UVC Version 1.00 -------- Default Video Modes --------1920 x 1080 @ 30 fps : MJPEG1920 x 1080 @ 5 fps : YUY21600 x 1200 @ 30 fps : MJPEG1600 x 1200 @ 5 fps : YUY21280 x 1024 @ 30 fps : MJPEG1280 x 1024 @ 8 fps : YUY21280 x 960 @ 30 fps : MJPEG1280 x 960 @ 8 fps : YUY21360 x 768 @ 30 fps : MJPEG1360 x 768 @ 8 fps : YUY21280 x 720 @ 30 fps : MJPEG1280 x 720 @ 10 fps : YUY21024 x 768 @ 30 fps : MJPEG1024 x 768 @ 10 fps : YUY2800 x 600 @ 30 fps : MJPEG800 x 600 @ 20 fps : YUY2720 x 576 @ 30 fps : MJPEG720 x 576 @ 25 fps : YUY2720 x 480 @ 30 fps : MJPEG, YUY2640 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 YUY2 | 20.7 MB/s |
| 1280×720 @10 YUY2 | 18.4 MB/s |
| 640×480 @30 YUY2 | 18.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くらいの速度なら素人でも通せました。
参考リンク
- MacroSilicon MS2109 データシート
- YuzukiHD/YuzukiHCC ─ MS2109のオープンソース設計
- BertoldVdb/ms-tools ─ MS2106/MS2109/MS2130の解析とEEPROM書き込み
- TPD4E05U06 データシート (TI)
- Controlled Impedance PCB Layer Stackup (JLCPCB)
- PCB Capabilities (JLCPCB)
- Multiple UVC cameras on Linux: an unexpected challenge
- USB Device Tree Viewer