ブログ

Armadillo-640:USBマスストレージとして使用する

at_takuma.fukuda
2024年12月13日 16時41分

Armadillo-640にはUSB-Aコネクタが2ポート実装されており、USBホストとして各種USBデバイスを接続できるようになっています。
USBホスト同士を接続することは出来ないため、ArmadilloとPCや他のArmadilloなどの間に直接USBケーブルを接続しても、 ファイルのやり取りをおこなうことは出来ません。

ただし、OSを改造することでArmadilloをUSBホストではなくUSBデバイスとして使用することが出来ます。
この記事ではPC等の外部機器とArmadillo-640を直接USBケーブルで接続し、
Arrmadillo-640をUSBマスストレージとして使用します。

※注意事項※
ホスト・デバイスの関係性を意識せずに接続できる、USB OTGという規格がありますが、
Armadillo-640はUSB OTGに対応させることが出来ないため、この記事ではUSBデバイスとして動作させています。

※注意事項※
今回は、USB OTG2(上段)のみをUSBデバイスとして動作させるようにしています。
USB OTG1(下段)はUSBホストのままです。
USBホスト同士を接続すると故障などの原因となりますので、
PCなどから接続する際は十分にご注意ください。

手順

ドライバ有効化

マスストレージとして動作させるために必要なデバイスドライバを設定します。
USBガジェットドライバのマスストレージクラスを有効になっている必要があります。
2024/12/16現在、Armadillo-640向けのLinuxカーネル5.10ではデフォルトコンフィギュレーションでマスストレージクラスを有効にしているので、このための設定は不要です。

デバイスツリー改造

ハードウェア制御のための設定を変更します。
当該のUSBポートをUSBホストではなくUSBデバイスとして動作させる必要があります。
また、当該ポートのVBUSから電源供給が行われないようにする必要があります。
これらの設定については、デバイスツリーで行います。
Linuxカーネルソースコード中のarch/arm/boot/dts/armadillo-600-custmize.dtsを使って、
設定を上書きするdtboファイルを作成します。
以下のように書き換えてください。

// SPDX-License-Identifier: (GPL-2.0 OR MIT)
/*
 * Copyright (C) 2023 Atmark Techno, Inc. All Rights Reserved.
 */

/dts-v1/;
/plugin/;

#include <dt-bindings/clock/imx6ul-clock.h>
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>
#include <dt-bindings/interrupt-controller/arm-gic.h>

#include "imx6ul-pinfunc.h"
#include "imx6ull-pinfunc.h"
#include "imx6ull-pinfunc-snvs.h"


&reg_usbotg2_vbus {
        status = "broken";
};

&vbus_sel {
	vbus_sel {
		otg2-vbus-reg-supply = <&pinctrl_usbotg2_vbus>;
        };
};


&usbotg2 {
	pinctrl-names = "default";	
	dr_mode = "peripheral";
	disable_over_current;	
};

&gpio4 {
	/*
	 * Since you will be using OTG2 as a USB device, you need to
	 * disable VBUS.
	 */
	usbotg2-vbus {
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_usbotg2_vbus>;

		gpio-hog;
		gpios = <17 GPIO_ACTIVE_HIGH>;
		output-low;
		line-name = "usbotg2-vbus";
	};
};

このdtsをLinuxカーネルのソースコードのarch/arm/boot/dts/ディレクトリ下に置いて、Linuxカーネルごとビルドし、
arch/arm/boot/dts/armadillo-600-custmize.dtboを生成します。
Linuxカーネルのビルドについては、以下を参考にしてください。

ソースコードを適用したら、以下を参考にカーネルごとビルドして、arch/arm/boot/dts/armadillo-600-custmize.dtboを生成してください。 Armadillo-640製品マニュアル 6.21.2. Linux カーネルをビルドする

dtboファイルの適用

作成したdtboファイルをArmadillo-640で使用します。
USBメモリなどでファイルを移動させた上で以下のコマンドを実行してください。

armadillo:~# cp /mnt/armadillo-600-customize.dtbo /boot/armadillo-640-usbdevice.
dtbo
armadillo:~# persist_file /boot/armadillo-640-usbdevice.dtbo
armadillo:~# vi /boot/overlays.txt
fdt_overlays=armadillo-640-lcd70ext-l00.dtbo,armadillo-640-usbdevice.dtbo
armadillo:~# persist_file /boot/overlays.txt

u-bootの環境変数設定

u-bootの環境変数を設定しておく必要があります。

armadillo:~# cd /boot/uboot_env.d/
armadillo:~# vi 01_massstorage

optargs=quiet g_acm_ms.removable=1

armadillo:~# persist_file  01_massstorage
armadillo:/boot/uboot_env.d# fw_setenv -s 01_massstorage

コマンド実行

modprobeコマンドでg_mass_storageモジュールをロードしてUSBマスストレージ機能を有効にします。
この時、どのディスクをマスストレージとして見せるかを指定できます。

仮想ディスク作成

Armadillo Base OSのルートファイルシステム上で自由に読み書き可能な領域である/var/app/volumesディレクトリの直下にshareという名前の仮想ディスクを作成しておきます。

armadillo:~#  dd if=/dev/zero of=/var/app/volumes/share bs=1M count=100
armadillo:~#  mkfs.vfat -F 32 /var/app/volumes/share

カーネルモジュール読み込み

armadillo:~# modprobe g_mass_storage file=/var/app/volumes/share removable=1

これでカーネルモジュールが読み込まれてUSBマスストレージとして使用できるようになります。
実際に機器を接続して試してみましょう。

動作確認

Armadillo-640のUSBコネクタ上段(USB OTG2)とPCのUSBコネクタをUSB A to Aケーブルで接続します。
下段に接続しないよう気を付けてください。 Windows側でリムーバブルディスクとして表示されれば成功です。
Linux側でも仮想ディスクをマウントしておいて、それぞれからファイルの読み書きが出来るか確認してみてください。

Linux側でのマウント方法

マウント
armadillo:~# mount /var/app/volumes/share /mnt
アンマウント
armadillo:~# umount /var/app/volumes/share

※注意事項※
Linux上でマウントした後に、Windowsからファイルの書き込みや変更を行った後は、Linux側はアンマウント→マウントしなおさないと変更内容を確認出来ません。Windows側も同様です。
設定完了後もu-bootでUSBコマンドを実行するとVBUSがONになりUSBポート上段に電源が供給されてしまいますのでご注意ください。

マスストレージとしての仕様を止める場合は以下のようにコマンドを実行します。

armadillo:~# modprobe -r g_mass_storage