naito
2025年7月11日 10時15分
==========
製品型番:Armadillo-900
Debian/ABOSバージョン:ABOS 3.21.3-at.14
カーネルバージョン:5.10.238-at0
その他:ATDE9使用
==========
お世話になっております。
内藤です。
Armadillo-900のUSBデバイスとしての機能について質問です。
Armadillo-900(USBデバイス)をWindowsPC(USBホスト)にUSB接続して下記機能の実装を検討しています。
・WindowsPCにArmadillo-900をマスストレージとして認識させる
・ログ出力やコンソール操作などを行う仮想COMポートとしてWindowsPCに認識させる
上記を一つのUSB Type-C端子から行いたいのですが、デバイス機能の切り替えは可能でしょうか。
可能な場合、イメージを書き換えないといけないのか、動的に(ユーザープログラムから)切り替え可能かもご教示ください。
以上、よろしくお願いいたします。
at_kojiro.yamada
2025年7月14日 18時07分
> Armadillo-900(USBデバイス)をWindowsPC(USBホスト)にUSB接続して下記機能の実装を検討しています。
> ・WindowsPCにArmadillo-900をマスストレージとして認識させる
> ・ログ出力やコンソール操作などを行う仮想COMポートとしてWindowsPCに認識させる
>
> 上記を一つのUSB Type-C端子から行いたいのですが、デバイス機能の切り替えは可能でしょうか。
可能です。
大きく分けて、以下の 2つ の方法があります。
方法A. Linuxの機能だけで実現する。
方法B. 2つ の USB 入力から 1つ を選んで出力する機能を持つIC を採用する。
方法A. は、Linux のUSB ガジェットの機能を使います。USBマスストレージとUSBシリアルポートの 2つ が複合された 1つUSBデバイス として振る舞わせることができます。
2つを切り替えるのではなく、同時に利用できるようになります。
ただ、この方法には気をつけるべき点があります。
USBガジェットは Linux によって提供されているので、Linuxの起動前(U-Boot)やLinux起動途中のログ確認やデバッグは難しくなります。
問題が起きた時にコンソールを使ったデバッグができない可能性があることは、リスクとなり得るため、特に注意が必要です。
方法B. は、2つ の USB 入力から 1つ を選んで出力する機能を持つIC (要するに USB のマルチプレクサ) を採用して、 GPIO や スライドスイッチで切り替えられるようにする、というものです。
USBマスストレージの方には 方法A. と同じで USB ガジェットを利用し、USBシリアルポートの方には Armadillo-900が標準でバッグコンソールとして使っているUSBシリアルポート を使います。
ICの選定や回路の設計が必要になりますが、実際のコンソールを使えるので 方法A. に書いたリスクを心配せずに済みます。
> 可能な場合、イメージを書き換えないといけないのか、...
「イメージを書き換えないといけない」 = ブートローダーやカーネルのビルドと書き換えが必要、
というようなニュアンスで良いでしょうか? (yes の前提で話を進めます)
USBガジェットの機能は、
Armadillo-900 のカーネルでは標準でカーネルモジュールとしてビルドされているので、
armadillo_900-customize.dtbo で usbotg1(またはusbotg2) の dr_mode を "peripheral" に設定すると、
/sys/kernel/config/usb_gadget/ から設定可能になります。
USBガジェットの設定方法については https://docs.kernel.org/usb/gadget_configfs.html で説明されています。
あとはこちらのページ(日本語) https://arch.jpn.org/archives/767 も参考になると思います。
(ちょうど本件と同じく、ストレージとシリアルポートの設定が行われています。)
なので、カーネル全体は必要ないのですが、dtbo のためにビルドが必要になります。
> ...、動的に(ユーザープログラムから)切り替え可能かもご教示ください。
上述のとおりですが、可能です。
方法A. であればストレージとシリアルポートは同時に利用でき、
方法B. であれば Armadillo-900 の GPIO で制御できるように回路を設計すれば、動的に切り替えることは実現できます。
P.S.
Armadillo-900 開発セットで試す際には、USB VBUS が Armadilloの相手側のものと衝突しないよう、
Armadillo側の VBUS 出力を止めてから USB の接続をするようにしてください。
echo disabled > /sys/devices/platform/usb0-vbus/state
echo disabled > /sys/devices/platform/usb1-vbus/state
で、 USB VBUSの出力を止めることができます。