Armadilloフォーラム

USB gadgetのUSB-CDC接続状況確認

kyas-t5

2020年12月14日 14時24分

お世話になります。

LinuxとArmadilloの初心者です。
Armadillo-x1のCOM8を利用してUSB-CDC/MSCのgadgetを使用し
USB-CDCはModbusRTUを実装してModbus通信を行います。
また、Ethernetを利用したModbusTCPの実装も進めています。
2つのModbusの通信調停を行うため、USB-CDC側の接続を
検知したらModbusTCP側の処理を停止したいと考えています。
ですのでUSB-CDCの抜き差しを検知する方法を教えて頂きたいです。

コメント

入江です。

> ですのでUSB-CDCの抜き差しを検知する方法を教えて頂きたいです。
udevルールを使用することで検知できます。
詳しい記述方法については udev のmanページをご確認ください。

[armadillo]# man udev

USB-CDCが挿された時に作成されるデバイスファイルがわかっていれば、下記
コマンドでudevルールの記述に必要な情報を取得できます。

[armadillo]# udevadm info -a -n /dev/[デバイスファイル名]

以上、よろしくお願いいたします。

ご返信ありがとうございます。

> udevルールを使用することで検知できます。
> 詳しい記述方法については udev のmanページをご確認ください。
>
>

> [armadillo]# man udev
> 

>
> USB-CDCが挿された時に作成されるデバイスファイルがわかっていれば、下記
> コマンドでudevルールの記述に必要な情報を取得できます。
>
>

> [armadillo]# udevadm info -a -n /dev/[デバイスファイル名]
> 

デバイスはttyGS0を使用していまして上記コマンドを打つと
looking at device `/devices/virtual/tty/ttyGS0`
KERNEL=="ttyGS0"
SUBSYSTEM=="tty"
DRIVER==""
と表示されます。

udevmonitor info /dev/ttyGS0で状態変化を確認してみましたが
なにもログが表示されませんでしたがその状態でUSB TypeAのところにUSBメモリを抜き差ししたところログが出ました。
(接続時はaddのログで抜いた時はremoveのログ)
今回、ArmadilloがUSBデバイスになり、Windowsがマスターとなり接続しています。
また、補足としてUSBを接続するとg_acm_ms gadget: high-speed config #1 Composite Gadget (ACM+MS)は表示されます。
何か設定が良くないのでしょうか?

入江です。

以下のコマンドを実行後、Armadilloと対向機間のUSB接続を抜き差しした時の
出力を送っていただけますでしょうか。

[armadillo]# udevadm monitor

以上、よろしくお願いいたします。

> 入江です。
>
> 以下のコマンドを実行後、Armadilloと対向機間のUSB接続を抜き差しした時の
> 出力を送っていただけますでしょうか。
>
>

> [armadillo]# udevadm monitor
> 

>
> 以上、よろしくお願いいたします。
>
>

返事が遅くなり申し訳ありません。
udevadm monitorを使用するとttyGS0のUSB抜き差しログはArmadilloボードのUSB端子の抜き差ししかログが出力されませんした。
そこでいろいろ調べた中で以下の場所でCOM8のUSB gadgetによる抜き差しで情報が変化することを確認できたのでその情報を見るようにしました。
/sys/devices/soc0/soc/30800000.aips-bus/30b20000.usb/ci_hdrc.2/pools
上記の監視に問題があるようであればご指摘ください。

at_akihito.irie

2021年1月27日 11時02分

入江です。

> そこでいろいろ調べた中で以下の場所でCOM8のUSB gadgetによる抜き差しで情報が変化することを確認できたのでその情報を見るようにしました。
> /sys/devices/soc0/soc/30800000.aips-bus/30b20000.usb/ci_hdrc.2/pools
> 上記の監視に問題があるようであればご指摘ください。

結果としてUSBの抜き差しが検知できる状態にはなっていると思われますが、
poolsは本質的にはUSBの抜き差しを検知するものではありません。

USBのVBUSを監視するのが良いかと思われます。
当方で試してみましたので、以下に手順をまとめます。

下記手順はArmadillo-X1 評価用拡張ボードセット向けのソフトウェアをベー
スに動作確認を行いましたので、適宜お使いの環境に読み替えてください。

まず、標準イメージからDTSの変更が必要になるので、下記ページからダウン
ロードしたLinuxカーネルソースコード(at17)の、
arch/arm/boot/dts/armadillo_x1-extboard-eva01-usbotg2-device.dtsi
を修正します。
https://armadillo.atmark-techno.com/resources/software/armadillo-x1/lin…

&usbotg2 {
        dr_mode = "peripheral";
        imx-usb-charger-detection;    <-この行を追加
        status = "okay";
};

修正後、カーネル(uImage)とDTB(armadillo_x1-extboard-eva01-usbdevice.dtb)
をビルドし、Armadillo-X1に書き込みます。

起動後、 /etc/udev/rules.d/10-usb-cdc.rules を作成し以下のように編集し
て、ルールのリロードを行います。

[armadillo]# vi /etc/udev/rules.d/10-usb-cdc.rules 
[armadillo]# cat /etc/udev/rules.d/10-usb-cdc.rules 
SUBSYSTEM=="power_supply", KERNEL=="imx_usb_charger", ATTR{present}=="0", RUN="/usr/bin/logger disconnect"
SUBSYSTEM=="power_supply", KERNEL=="imx_usb_charger", ATTR{present}=="1", RUN="/usr/bin/logger connect"
[armadillo]# udevadm control --reload-rules

以下のコマンド実行後に、Armadillo-X1と対向機間のUSB接続を挿抜すると、
ログが出力されます。

[armadillo]# journalctl -f
-- Logs begin at Thu 2019-02-14 19:11:59 JST. --
Jan 27 10:18:04 armadillo root[2766]: disconnect
Jan 27 10:18:06 armadillo root[2768]: connect
Jan 27 10:18:07 armadillo kernel: g_cdc gadget: high-speed config #1: CDC Composite (ECM + ACM)

ここまで動作したならば、rulesファイルの RUN= を行いたい処理が記述され
たシェルスクリプトを実行するようにすると良いと思います。

以上、よろしくお願いいたします。

入江様

お世話になります

ご指示いただいた内容で無事に検出することができました。
ありがとうございました。
> 入江です。
>
> > そこでいろいろ調べた中で以下の場所でCOM8のUSB gadgetによる抜き差しで情報が変化することを確認できたのでその情報を見るようにしました。
> > /sys/devices/soc0/soc/30800000.aips-bus/30b20000.usb/ci_hdrc.2/pools
> > 上記の監視に問題があるようであればご指摘ください。
>
> 結果としてUSBの抜き差しが検知できる状態にはなっていると思われますが、
> poolsは本質的にはUSBの抜き差しを検知するものではありません。
>
> USBのVBUSを監視するのが良いかと思われます。
> 当方で試してみましたので、以下に手順をまとめます。
>
> 下記手順はArmadillo-X1 評価用拡張ボードセット向けのソフトウェアをベー
> スに動作確認を行いましたので、適宜お使いの環境に読み替えてください。
>
> まず、標準イメージからDTSの変更が必要になるので、下記ページからダウン
> ロードしたLinuxカーネルソースコード(at17)の、
> arch/arm/boot/dts/armadillo_x1-extboard-eva01-usbotg2-device.dtsi
> を修正します。
> https://armadillo.atmark-techno.com/resources/software/armadillo-x1/lin…
>
>

> &usbotg2 {
>         dr_mode = "peripheral";
>         imx-usb-charger-detection;    <-この行を追加
>         status = "okay";
> };
> 

>
> 修正後、カーネル(uImage)とDTB(armadillo_x1-extboard-eva01-usbdevice.dtb)
> をビルドし、Armadillo-X1に書き込みます。
>
> 起動後、 /etc/udev/rules.d/10-usb-cdc.rules を作成し以下のように編集し
> て、ルールのリロードを行います。
>
>

> [armadillo]# vi /etc/udev/rules.d/10-usb-cdc.rules 
> [armadillo]# cat /etc/udev/rules.d/10-usb-cdc.rules 
> SUBSYSTEM=="power_supply", KERNEL=="imx_usb_charger", ATTR{present}=="0", RUN="/usr/bin/logger disconnect"
> SUBSYSTEM=="power_supply", KERNEL=="imx_usb_charger", ATTR{present}=="1", RUN="/usr/bin/logger connect"
> [armadillo]# udevadm control --reload-rules
> 

>
> 以下のコマンド実行後に、Armadillo-X1と対向機間のUSB接続を挿抜すると、
> ログが出力されます。
>
>

> [armadillo]# journalctl -f
> -- Logs begin at Thu 2019-02-14 19:11:59 JST. --
> Jan 27 10:18:04 armadillo root[2766]: disconnect
> Jan 27 10:18:06 armadillo root[2768]: connect
> Jan 27 10:18:07 armadillo kernel: g_cdc gadget: high-speed config #1: CDC Composite (ECM + ACM)
> 

>
> ここまで動作したならば、rulesファイルの RUN= を行いたい処理が記述され
> たシェルスクリプトを実行するようにすると良いと思います。
>
> 以上、よろしくお願いいたします。
>

入江様

お世話になります。

USB抜き差しでご助力頂きたい内容が出てきましたのでお手数ですがご回答を頂きたく。
本項目でUSBの抜き差しした時にconnectとdisconnectの検出は出来るのですが
COM8を使用したUSB接続でPCとArmadilloをUSB接続しVBUSによる電源供給した場合、
connectにならない状況になっています。
これをCOM8によるUSB接続による電源供給で起動し、USB接続状態を検知する方法を教え頂けますでしょうか?

例えば以下は接続有無として見ることは可能ですか?
/sys/devices/soc0/soc/30800000.aips-bus/30b20000.usb/power_supply/imx_usb_charger/uevent
----ここから中身----
POWER_SUPPLY_NAME=imx_usb_charger
POWER_SUPPLY_PRESENT=0    
POWER_SUPPLY_ONLINE=1 ← これ
POWER_SUPPLY_CURRENT_MAX=0
----ここまで----

POWER_SUPPLY_PRESENTは電源供給中のUSB抜き差しで1=接続、0=未接続は検出出来ますがUSB電源供給の無操作では0のままになっています。
POWER_SUPPLY_ONLINEは電源供給中のUSB抜き差しは上記と同じく1=接続、0=未接続で検出出来、USB電源供給でも1になっています。

> 入江様
>
> お世話になります
>
> ご指示いただいた内容で無事に検出することができました。
> ありがとうございました。
> > 入江です。
> >
> > > そこでいろいろ調べた中で以下の場所でCOM8のUSB gadgetによる抜き差しで情報が変化することを確認できたのでその情報を見るようにしました。
> > > /sys/devices/soc0/soc/30800000.aips-bus/30b20000.usb/ci_hdrc.2/pools
> > > 上記の監視に問題があるようであればご指摘ください。
> >
> > 結果としてUSBの抜き差しが検知できる状態にはなっていると思われますが、
> > poolsは本質的にはUSBの抜き差しを検知するものではありません。
> >
> > USBのVBUSを監視するのが良いかと思われます。
> > 当方で試してみましたので、以下に手順をまとめます。
> >
> > 下記手順はArmadillo-X1 評価用拡張ボードセット向けのソフトウェアをベー
> > スに動作確認を行いましたので、適宜お使いの環境に読み替えてください。
> >
> > まず、標準イメージからDTSの変更が必要になるので、下記ページからダウン
> > ロードしたLinuxカーネルソースコード(at17)の、
> > arch/arm/boot/dts/armadillo_x1-extboard-eva01-usbotg2-device.dtsi
> > を修正します。
> > https://armadillo.atmark-techno.com/resources/software/armadillo-x1/lin…
> >
> >

> > &usbotg2 {
> >         dr_mode = "peripheral";
> >         imx-usb-charger-detection;    <-この行を追加
> >         status = "okay";
> > };
> > 

> >
> > 修正後、カーネル(uImage)とDTB(armadillo_x1-extboard-eva01-usbdevice.dtb)
> > をビルドし、Armadillo-X1に書き込みます。
> >
> > 起動後、 /etc/udev/rules.d/10-usb-cdc.rules を作成し以下のように編集し
> > て、ルールのリロードを行います。
> >
> >

> > [armadillo]# vi /etc/udev/rules.d/10-usb-cdc.rules 
> > [armadillo]# cat /etc/udev/rules.d/10-usb-cdc.rules 
> > SUBSYSTEM=="power_supply", KERNEL=="imx_usb_charger", ATTR{present}=="0", RUN="/usr/bin/logger disconnect"
> > SUBSYSTEM=="power_supply", KERNEL=="imx_usb_charger", ATTR{present}=="1", RUN="/usr/bin/logger connect"
> > [armadillo]# udevadm control --reload-rules
> > 

> >
> > 以下のコマンド実行後に、Armadillo-X1と対向機間のUSB接続を挿抜すると、
> > ログが出力されます。
> >
> >

> > [armadillo]# journalctl -f
> > -- Logs begin at Thu 2019-02-14 19:11:59 JST. --
> > Jan 27 10:18:04 armadillo root[2766]: disconnect
> > Jan 27 10:18:06 armadillo root[2768]: connect
> > Jan 27 10:18:07 armadillo kernel: g_cdc gadget: high-speed config #1: CDC Composite (ECM + ACM)
> > 

> >
> > ここまで動作したならば、rulesファイルの RUN= を行いたい処理が記述され
> > たシェルスクリプトを実行するようにすると良いと思います。
> >
> > 以上、よろしくお願いいたします。
> >

at_akihito.irie

2021年9月10日 16時23分

入江です。

"POWER_SUPPLY_ONLINE=1"は、「VBUSの電圧がBセッションのしきい値を越えて
いる」ことを示します。

つまり、VBUSにUSBとして動作可能である電圧が与えられている状態なので、
ケーブルの挿抜状態の検出に使うのであれば妥当だと考えられます。

入江様

お世話になります。

早速のご回答ありがとうございます。
ご回答頂いた内容によりUSB挿抜の検出で使用いたします。

> 入江です。
>
> "POWER_SUPPLY_ONLINE=1"は、「VBUSの電圧がBセッションのしきい値を越えて
> いる」ことを示します。
>
> つまり、VBUSにUSBとして動作可能である電圧が与えられている状態なので、
> ケーブルの挿抜状態の検出に使うのであれば妥当だと考えられます。
>
>