🤖

CH9350Lを使ってみる

2022/12/24に公開

これは?

沁恒微电子股份有限公司のCH9350Lを使用した電子工作のメモです。
WEB検索をすると、USBキーボードやUSBマウスなどのHIDプロトコルを使用した機器をマイコンに接続する、USB→UART変換として使用したものが多いですが、ここでは逆のUART→USB変換として使用し、Windows10が動作するPCを再起動するアプリケーションを作成した例です。
CH9350LのUARTは直接PCに接続できないため、RS232変換などを使用します。

このチップについて

秋月電子でお手軽に入手できますが、ハンダ付けをする必要があり、なかなかハードルの高い商品となっています。
https://akizukidenshi.com/catalog/g/gI-16308/

メーカーのホームページは以下になります。
https://www.wch.cn/products/CH9350.html
用途としてはKVM用で、USBキーボードやUSBマウス等の機器をシリアルデータに変換するようです。

UART→USB変換できるのか?

PDFの最初に概略図があります。
これを見ると、Upper Computerモードと、Lower Computerモードが選べるようになっていて、切り替えはSELピンを設定すればよさそうです。

SELピンは5章のピン番号45に説明があります。
デフォルトはLower Computerモードになっているようです。
今回はUpper Computerモードで使用するので、ここをGNDに接続すればよさそうです。

PDFにはUpper Computerモードの回路図が掲載されていますので、そのままを作ります。
他、UARTの通信速度は、デフォルトが115200bpsで、他の速度設定もできるようです。
300000bpsは使用しないことにします。

実験機器構成

Windows10が動作するPC 1台にUSB→RS232変換を接続して、実験基板のD-Subに接続します。
USB側もこのPCに接続します。

実験用の基板を作る

マイコンと接続する場合はチップからの出力をそのまま使う方がよいですが、PCのシリアル通信ポートやUSB→RS232変換ケーブルなどを使用する場合、電圧の変換をしなければいけません。
通信速度的には十分すぎますが、秋月電子の以下のチップを使いました。
https://akizukidenshi.com/catalog/g/gI-01279/

実験用の基板はこんな感じで作りました。
スイッチは通信速度変更用です。
PDFによるとUpper Computerモードにはstate 0~4があるようですが、実験基板は sate 4になるように作りました。
LEDの割り当ては表に記載しています。

LED0 LED1 LED2
緑色 黄色 赤色

通信プロトコルを調べる

アプリケーションを作る前に、通信プロトコルを調べます。
プロトコルの説明では、state 2/3/4の場合を書いてありますが、実験基板はstate 4固定にしたのでstate 4の場合の通信プロトコルを確認します。

キーボードのプロトコル

キーボードのスペースキーを押した時と離した時の例が記載されていました。

0x2Cがスペースキーの様ですが、他のキーを押したい場合は、次のPDFの「10 Keyboard/Keypad Page (0x07)」のUsage IDを参考に設定すればよさそうです。
https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf

マウスのプロトコル

以下のフォーマットでデータを作ります。

ID valueは1を設定します。
ボタンは、0bit目がマウスの左ボタン、1bit目がマウスの右ボタンの割り当てです。

XとYの座標ですが、state 3/4は絶対座標指定ですので画面上は以下の様な割り当てになります。
使用したPCの画面は1366×768で、操作データを作ったため、環境に合わせて、座標の調整が必要と考えています。
マウスというよりも、画面にタッチパネルを取り付けた感じの座標イメージに見えます。

制御用のアプリケーションを作る

Windows10が動作するPCに接続して再起動するアプリケーションをVisual Studio 2019で作成しました。
実験アプリなのでサクッと作れるC#のフォームアプリケーションです。

キーボード操作でWindows10を再起動するアプリケーション

実際にキーボードから再起動操作を行う場合は「Win」+X → U → R ですので、このキー入力をデータ化します。
キーデータは以下の組み合わせをシリアルポートから送信します。キーデータ送信ごとに数100ミリ秒のsleepを入れます。

「Win」キーは0xE7です。

ex
// Win key を押した状態
{ 0x57, 0xAB, 0x01, 0x00, 0x00, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x00 };

// Win + Xを押した状態
{ 0x57, 0xAB, 0x01, 0x00, 0x00, 0xE7, 0x1B, 0x00, 0x00, 0x00, 0x00 };

// 全キーを離した状態
{ 0x57, 0xAB, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

// U キーを押した状態
{ 0x57, 0xAB, 0x01, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00 };

// R キーを押した状態
{ 0x57, 0xAB, 0x01, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00 };

実行ボタンを押すと以下のようにデータを送ります。(Sleepは500ミリ秒としました)
「Win key を押した状態」
0x57, 0xAB, 0x01, 0x00, 0x00, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x00
Sleep 500ミリ秒

「Win + Xを押した状態」
0x57, 0xAB, 0x01, 0x00, 0x00, 0xE7, 0x1B, 0x00, 0x00, 0x00, 0x00
Sleep 500ミリ秒

「全キーを離した状態」
0x57, 0xAB, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
Sleep 500ミリ秒

「U キーを押した状態」
0x57, 0xAB, 0x01, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00
Sleep 500ミリ秒

「全キーを離した状態」
0x57, 0xAB, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
Sleep 500ミリ秒

「R キーを押した状態」
0x57, 0xAB, 0x01, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00
Sleep 500ミリ秒

「全キーを離した状態」
0x57, 0xAB, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00

マウス操作でWindows10を再起動するアプリケーション

実際にマウスから再起動操作を行う場合は左下の「Win」アイコンで右クリック → シャットダウンまたはサインアウト → 再起動 の順で操作するデータを作成します。
座標部分はリトルエンディアンになります。

ex
// 画面OFF時にONするために、座標0,0にマウスカーソル移動
{ 0x57, 0xAB, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

// 左下の「Win」アイコンに移動
{ 0x57, 0xAB, 0x04, 0x01, 0x00, 0x10, 0x00, 0xF0, 0x03, 0x00 };
 
// 左下の「Win」アイコンでマウスの右ボタンを押す
{ 0x57, 0xAB, 0x04, 0x01, 0x02, 0x10, 0x00, 0xF0, 0x03, 0x00 };
 
// マウスの右ボタンを離す
{ 0x57, 0xAB, 0x04, 0x01, 0x00, 0x10, 0x00, 0xF0, 0x03, 0x00 };

// シャットダウンまたはサインアウト の選択肢に移動
{ 0x57, 0xAB, 0x04, 0x01, 0x00, 0x30, 0x00, 0xA0, 0x03, 0x00 };

// シャットダウンまたはサインアウト の選択肢でマウスの左ボタンを押す
{ 0x57, 0xAB, 0x04, 0x01, 0x01, 0x30, 0x00, 0xA0, 0x03, 0x00 };

// マウスの左ボタンを離す
{ 0x57, 0xAB, 0x04, 0x01, 0x00, 0x30, 0x00, 0xA0, 0x03, 0x00 };

// 再起動 の選択肢に移動
{ 0x57, 0xAB, 0x04, 0x01, 0x00, 0x00, 0x01, 0xA0, 0x03, 0x00 };

// 再起動 の選択肢でマウスの左ボタンを押す
{ 0x57, 0xAB, 0x04, 0x01, 0x01, 0x00, 0x01, 0xA0, 0x03, 0x00 };

// マウスの左ボタンを離す
{ 0x57, 0xAB, 0x04, 0x01, 0x00, 0x00, 0x01, 0xA0, 0x03, 0x00 };

実行ボタンを押すと以下のようにデータを送ります。(Sleepは操作ごとに違います)
「座標0,0に移動する。画面OFF時の対策。画面OFF時は操作は無視される」
0x57, 0xAB, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
Sleep 2000ミリ秒(画面が表示されるまで待つ)

「左下のWinアイコンに移動」
0x57, 0xAB, 0x04, 0x01, 0x00, 0x10, 0x00, 0xF0, 0x03, 0x00
Sleep 300ミリ秒

「左下のWinアイコンを右クリック」
0x57, 0xAB, 0x04, 0x01, 0x02, 0x10, 0x00, 0xF0, 0x03, 0x00
Sleep 20ミリ秒(クリックを表現するために短め)

「マウスのボタンを離す
0x57, 0xAB, 0x04, 0x01, 0x00, 0x10, 0x00, 0xF0, 0x03, 0x00
Sleep 2000ミリ秒(ボタンを離した後に選択肢が表示されるまで待つ)

「シャットダウンまたはサインアウト の選択肢に移動」
0x57, 0xAB, 0x04, 0x01, 0x00, 0x30, 0x00, 0xA0, 0x03, 0x00
Sleep 2000ミリ秒(選択肢が反転するまで待つ)

「シャットダウンまたはサインアウト の選択肢でクリック」
0x57, 0xAB, 0x04, 0x01, 0x01, 0x30, 0x00, 0xA0, 0x03, 0x00
Sleep 20ミリ秒(クリックを表現するために短め)

「マウスのボタンを離す
0x57, 0xAB, 0x04, 0x01, 0x00, 0x30, 0x00, 0xA0, 0x03, 0x00
Sleep 2000ミリ秒(ボタンを離した後に選択肢が表示されるまで待つ)

「再起動 の選択肢に移動」
0x57, 0xAB, 0x04, 0x01, 0x00, 0x00, 0x01, 0xA0, 0x03, 0x00
Sleep 900ミリ秒(選択肢が反転するまで待つ)

「再起動 の選択肢をクリック」
0x57, 0xAB, 0x04, 0x01, 0x01, 0x00, 0x01, 0xA0, 0x03, 0x00
Sleep 20ミリ秒(クリックを表現するために短め)

「マウスのボタンを離す
0x57, 0xAB, 0x04, 0x01, 0x00, 0x00, 0x01, 0xA0, 0x03, 0x00
Sleep 300ミリ秒

動作しない場合がある

Windowsが起動して間もない状態だと、キー入力を受け付けないことがありました。
スリープや画面をOFFにする電源設定も影響しているようですので、別途復帰方法を検討するか、スリープや画面OFFしない設定で動作させたほうがよさそうです。
もしかすると、正常に動作しないPCがあるかもしれません。

Discussion