Armadilloフォーラム

CON9のGPI使用時のu-bootの保守モードについて

kima

2023年12月11日 17時38分

お世話になります。

Armadillo-640のCON9のpin1をGPIとして使用する想定をしていましたが、

GPI機器を接続した状態で起動すると、
保守モード(u-bootのプロンプトが表示される)で起動されてしまい、
u-bootのbootコマンドを実行しないと、OSが起動しません。
USBシリアル変換アダプタを1にした時と同じ状態になります。

これを、電源投入時に、OSがeMMCから自動で起動するように変更したいのですが、

たとえば、
・u-bootの環境変数の設定
・u-bootの変更

などによって、CON9の動作変更は可能でしょうか?

起動後は、CON9-1は、GPIとして正常に機能しています。

-----
u-bootは、 オフィシャルの「ブートローダー(UART3コンソール)」
を使用しています。
u-boot-a600-console-uart3-v2018.03-at13.imx
https://armadillo.atmark-techno.com/resources/software/armadillo-640/bo…

できれば、
u-bootへは、UART3にコンソール接続して、
キーを押した状態で電源投入すれば、
u-bootプロンプトが表示できればいいと考えています。

よろしくお願いいたします。

コメント

at_shinya.koga

2023年12月12日 11時36分

アットマークテクノの古賀です。

kimaさん:
>Armadillo-640のCON9のpin1をGPIとして使用する想定をしていましたが、
>
>GPI機器を接続した状態で起動すると、
>保守モード(u-bootのプロンプトが表示される)で起動されてしまい、
>u-bootのbootコマンドを実行しないと、OSが起動しません。
>USBシリアル変換アダプタを1にした時と同じ状態になります。
>
>これを、電源投入時に、OSがeMMCから自動で起動するように変更したいのですが、
>
>たとえば、
>・u-bootの環境変数の設定
>・u-bootの変更
>
>などによって、CON9の動作変更は可能でしょうか?
>
>起動後は、CON9-1は、GPIとして正常に機能しています。
>
>-----
>u-bootは、 オフィシャルの「ブートローダー(UART3コンソール)」
>を使用しています。
>u-boot-a600-console-uart3-v2018.03-at13.imx
>https://armadillo.atmark-techno.com/resources/software/armadillo-640/bo…

取り急ぎ一点確認させてください。「Armadillo Base OS対応 Armadillo-640 ブートローダー」ではなく、上記のページの u-boot を使用していらっしゃいますので、
Armadillo Base OS ではなく Debian をお使いだと思いますが、その認識で合っているでしょうか?

>できれば、
>u-bootへは、UART3にコンソール接続して、
>キーを押した状態で電源投入すれば、
>u-bootプロンプトが表示できればいいと考えています。

Debian をお使いの場合は、u-boot のカスタマイズが必要です。
CON9-1/SW1 押下による保守モード遷移を完全に無効にする場合は、u-boot のコンフィグレーションで CONFIG_SUPPORT_MAINTENANCE_MODE を無効にしてリビルドすることにより、お望みの動作にできます。

以上、取り急ぎ確認とコメントです。

kima

2023年12月12日 12時53分

回答ありがとうございます。

> 取り急ぎ一点確認させてください。「Armadillo Base OS対応 Armadillo-640 ブートローダー」ではなく、上記のページの u-boot を使用していらっしゃいますので、
> Armadillo Base OS ではなく Debian をお使いだと思いますが、その認識で合っているでしょうか?
【回答】
ご指摘のとおり、debian10(buster)を使用しています。

> >できれば、
> >u-bootへは、UART3にコンソール接続して、
> >キーを押した状態で電源投入すれば、
> >u-bootプロンプトが表示できればいいと考えています。
>
> Debian をお使いの場合は、u-boot のカスタマイズが必要です。
> CON9-1/SW1 押下による保守モード遷移を完全に無効にする場合は、
> u-boot のコンフィグレーションで CONFIG_SUPPORT_MAINTENANCE_MODE を無効にして
> リビルドすることにより、お望みの動作にできます。
【回答】
承知しました。ご指摘の方法を試してしてみます。

kima

2023年12月13日 15時42分

ありがとうございました。
以下の方法で、
・CON9にGPIデバイスを接続している状態でも、
 u-bootプロンプトで止まらず、自動でカーネルが起動するようになりました。
・起動時のキー入力でu-bootプロンプトに入れることを確認しました。
-----
https://armadillo.atmark-techno.com/resources/software/armadillo-640/bo…
$ tar xvzf u-boot-a600-v2018.03-at13.tar.gz
$ cd u-boot-a600-v2018.03-at13/
$ make ARCH=arm armadillo-640_console-uart3_defconfig
$ make ARCH=arm menuconfig
・Command line interface -> Autoboot options -> [ ]Stop auto boot whe maintenance mode
・[*]Enable boot arguments -> Boot arguments (optargs=console=ttymxc2,115200)

$ make CROSS_COMPILE=arm-linux-gnueabihf-

-----

恐れいりますが、追加で質問いたします。

以下の情報から、u-bootからGPIOを制御できると考えています。

https://armadillo.atmark-techno.com/blog/615/14947
→ u-bootのソースコードを修正して、GPIO制御

https://armadillo.atmark-techno.com/howto/u-boot-script
→ boot.srcの作製・実行方法

そこで、u-bootの boot.srcを使用して、
Armadillo-640の、CON9のGPOピン制御は可能でしょうか?

特定のGPO出力を起動時にLowにしたいと考えています。

at_shinya.koga

2023年12月13日 17時18分

アットマークテクノの古賀です。

kimaさん:
>ありがとうございました。
>以下の方法で、
>・CON9にGPIデバイスを接続している状態でも、
> u-bootプロンプトで止まらず、自動でカーネルが起動するようになりました。
>・起動時のキー入力でu-bootプロンプトに入れることを確認しました。
>-----
>https://armadillo.atmark-techno.com/resources/software/armadillo-640/bo…
>$ tar xvzf u-boot-a600-v2018.03-at13.tar.gz
>$ cd u-boot-a600-v2018.03-at13/
>$ make ARCH=arm armadillo-640_console-uart3_defconfig
>$ make ARCH=arm menuconfig
>・Command line interface ->Autoboot options ->[ ]Stop auto boot whe maintenance mode
>・[*]Enable boot arguments ->Boot arguments (optargs=console=ttymxc2,115200)
>
>$ make CROSS_COMPILE=arm-linux-gnueabihf-

それは良かったです。

>恐れいりますが、追加で質問いたします。
>
>以下の情報から、u-bootからGPIOを制御できると考えています。
>
>https://armadillo.atmark-techno.com/blog/615/14947
>→ u-bootのソースコードを修正して、GPIO制御
>
>https://armadillo.atmark-techno.com/howto/u-boot-script
>→ boot.srcの作製・実行方法
>
>そこで、u-bootの boot.srcを使用して、
>Armadillo-640の、CON9のGPOピン制御は可能でしょうか?
>
>特定のGPO出力を起動時にLowにしたいと考えています。

「特定のGPO出力を起動時にLowにしたい」というのは、対象の GPIO 出力が固定でしょうか?あるいは、対象を可変にしたい要望があり、 boot.scr の内容を変えることで、u-boot イメージは変更せずに動作を変えたい、ということでしょうか?

対象の GPIO 出力が固定なのであれば、

>https://armadillo.atmark-techno.com/blog/615/14947
>→ u-bootのソースコードを修正して、GPIO制御

のように、u-boot のボード固有初期化関数である board_init() から GPIO 設定動作を行うようにするのが簡単です。
boot.scr の内容を変えることで、GPIO 出力の制御内容を切り替えたい、という場合には、boot.scr で u-boot の gpio コマンドを使って制御すればよいでしょう:
 https://docs.u-boot.org/en/latest/usage/cmd/gpio.html
ただし、u-boot のボード固有初期化関数で、対象の I/O ピンが GPIO 以外に割り当てられている場合は、その設定を上書きするか無効にするかしないといけません。

以上、ひとまずのコメントです。不明な点がありましたら、お知らせください。

kima

2023年12月14日 13時25分

可能であれば、ソースコードを修正せずに対応したいと考えています。

そのため、
u-bootのビルド設定をするmenuconfigか、
boot.srcでの対応を考えていました。

具体的には、
Armadillo-640の、CON9-pin5をGPOとして使用しています。
通常のLinux起動時には、電源投入直後に数秒Highになり、
その後、DeviceTreeの設定によりLowになります。

しかし、u-bootで起動を止めると、このピン出力がHighのままになってしまうため、
これをLowに設定したいと考えています。

【追加質問1】
boot.scrの作成方法は、
https://armadillo.atmark-techno.com/howto/u-boot-script
の通りだと思いますが、
Armadillo-640の場合、boot.scrは、どこに書き込めばいいのでしょうか?
現状のlsblkコマンドの結果は以下のとおりです。
-----
atmark@armadillo:~$ sudo lsblk
[sudo] atmark のパスワード:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
mmcblk0 179:0 0 3.5G 0 disk
├─mmcblk0p1 179:1 0 30.6M 0 part
├─mmcblk0p2 179:2 0 3.4G 0 part /
└─mmcblk0p3 179:3 0 122.1M 0 part
mmcblk0boot0 179:8 0 31.5M 1 disk
mmcblk0boot1 179:16 0 31.5M 1 disk
mmcblk0gp0 179:24 0 8M 0 disk /opt/license
mmcblk0gp1 179:32 0 8M 0 disk
mmcblk0gp2 179:40 0 8M 0 disk
mmcblk0gp3 179:48 0 8M 0 disk
-----

【追加質問2】
また、boot.scrでの対応ができたとして、
これを、make-install-disk-imageで作成する
インストールイメージに組み込むことは可能でしょうか?

以上です。
お忙しいところ、恐縮ですが、よろしくお願いします。

at_shinya.koga

2023年12月14日 14時09分

アットマークテクノの古賀です。

kimaさん:
>可能であれば、ソースコードを修正せずに対応したいと考えています。

ひとまず、了解しました。

>【追加質問1】
>boot.scrの作成方法は、
>https://armadillo.atmark-techno.com/howto/u-boot-script
>の通りだと思いますが、
>Armadillo-640の場合、boot.scrは、どこに書き込めばいいのでしょうか?

このフォーラムの過去の質問スレッドのコメントのうち、以下のコメントと、それ以降のやり取りが参考になるかと思います:
 https://armadillo.atmark-techno.com/forum/armadillo/4365#comment-8115

ここで紹介している手順では、boot.scr を /boot/ に配置しています。

>【追加質問2】
>また、boot.scrでの対応ができたとして、
>これを、make-install-disk-imageで作成する
>インストールイメージに組み込むことは可能でしょうか?

そのままでは不可能で、make-install-disk-image の build.sh を改変しないといけません。
build.sh のコマンド引数に渡された .dtb ファイルやカーネルイメージファイルと同様、シェル関数の init_images() で $TEMP/p2/boot/ に boot.scr を配置するように追加実装すればよいでしょう。

いかがでしょうか?

kima

2023年12月14日 14時57分

迅速に対応いただき、ありがとうございます。

> >【追加質問1】
> >Armadillo-640の場合、boot.scrは、どこに書き込めばいいのでしょうか?
> このフォーラムの過去の質問スレッドのコメントのうち、以下のコメントと、それ以降のやり取りが参考になるかと思います:
>  https://armadillo.atmark-techno.com/forum/armadillo/4365#comment-8115
> ここで紹介している手順では、boot.scr を /boot/ に配置しています。

u-bootのビルド時に、指定の場所のboot.scrを使用するように設定する必要がある旨承知しました。

アドバイスいただいたフォーラム記事では、
> => setenv bootcmd "ext4load mmc 0:2 ${loadaddr} /boot/boot.scr; source;"
という環境変数を設定することになっていますが、

現状、u-bootの環境変数bootcmdには、以下のような記述があります。
-----
bootcmd=run setup_mmcargs;
ext4load mmc 0:2 ${loadaddr} /boot/uImage;
ext4load mmc 0:2 0x83000000 /boot/${fdt_file};
bootm ${loadaddr} - 0x83000000;
-----
/boot/uImageの代わりに、boot.scrをロードするのでしょうか?

また、この手順の場合、最初に、u-bootプロンプトを起動させ、
環境変数bootcmdを設定する必要があるのですが、
menuconfigなどで、事前にu-boot環境変数を設定した
u-bootイメージを作成できないでしょうか?

> >【追加質問2】
> >また、boot.scrでの対応ができたとして、
> >これを、make-install-disk-imageで作成する
> >インストールイメージに組み込むことは可能でしょうか?
>
> そのままでは不可能で、make-install-disk-image の build.sh を改変しないといけません。
> build.sh のコマンド引数に渡された .dtb ファイルやカーネルイメージファイルと同様、シェル関数の init_images() で $TEMP/p2/boot/ に boot.scr を配置するように追加実装すればよいでしょう。

→ /boot/にコピーするだけなら、
 現状、最初の起動時に、特定のファイル(初期化完了済みフラグファイル)がない場合、
 初回起動とみなし、/etc/rc.localで、初期化処理をするようなしくみにしてあるのですが、
 そこで、/boot/boot.scrをコピーするようにすれば、
 2回目以降は、boot.scrを反映した起動をさせることが期待できますか?

at_shinya.koga

2023年12月14日 18時29分

アットマークテクノの古賀です。

kimaさん:
>>>【追加質問1】
>>>Armadillo-640の場合、boot.scrは、どこに書き込めばいいのでしょうか?
>>このフォーラムの過去の質問スレッドのコメントのうち、以下のコメントと、それ以降のやり取りが参考になるかと思います:
>> https://armadillo.atmark-techno.com/forum/armadillo/4365#comment-8115
>>ここで紹介している手順では、boot.scr を /boot/ に配置しています。
>
>u-bootのビルド時に、指定の場所のboot.scrを使用するように設定する必要がある旨承知しました。
>
>アドバイスいただいたフォーラム記事では、
>>=>setenv bootcmd "ext4load mmc 0:2 ${loadaddr} /boot/boot.scr; source;"
>という環境変数を設定することになっていますが、
>
>現状、u-bootの環境変数bootcmdには、以下のような記述があります。
>-----
>bootcmd=run setup_mmcargs;
>ext4load mmc 0:2 ${loadaddr} /boot/uImage;
>ext4load mmc 0:2 0x83000000 /boot/${fdt_file};
>bootm ${loadaddr} - 0x83000000;
>-----
>/boot/uImageの代わりに、boot.scrをロードするのでしょうか?

そうですね。環境変数 bootcmd には、boot.scr のロードと実行(source)を設定して、boot.scr に書くスクリプトで、上記内容のカーネルイメージや fdt_file のロード、およびカーネルの起動も行うようにする、という方策です。
カーネルイメージをロードする前に GPIO 設定を行うようにすればよいでしょう・・・と思いましたが、保守モードに遷移する場合、bootcmd の内容を実行する前に遷移すると思うので、 boot.scr 方式は使えないかも知れません。
その場合は、u-boot のソースを改変するしかないですね。

>また、この手順の場合、最初に、u-bootプロンプトを起動させ、
>環境変数bootcmdを設定する必要があるのですが、
>menuconfigなどで、事前にu-boot環境変数を設定した
>u-bootイメージを作成できないでしょうか?

このあたりが、参考になりそうです:
 https://docs.u-boot.org/en/latest/usage/environment.html

>>>【追加質問2】
>>>また、boot.scrでの対応ができたとして、
>>>これを、make-install-disk-imageで作成する
>>>インストールイメージに組み込むことは可能でしょうか?
>>
>>そのままでは不可能で、make-install-disk-image の build.sh を改変しないといけません。
>>build.sh のコマンド引数に渡された .dtb ファイルやカーネルイメージファイルと同様、シェル関数の init_images() で $TEMP/p2/boot/ に boot.scr を配置するように追加実装すればよいでしょう。
>
>→ /boot/にコピーするだけなら、
> 現状、最初の起動時に、特定のファイル(初期化完了済みフラグファイル)がない場合、
> 初回起動とみなし、/etc/rc.localで、初期化処理をするようなしくみにしてあるのですが、
> そこで、/boot/boot.scrをコピーするようにすれば、
> 2回目以降は、boot.scrを反映した起動をさせることが期待できますか?

そうですね。できるのではないかと思います。
あるいは、u-boot-tools パッケージの fw_setenv を使う、という方策もありそうです:
 https://armadillo.atmark-techno.com/blog/53/3323