Armadilloフォーラム

USBデバイス機能の切り替え

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の出力を止めることができます。