Armadilloフォーラム

U1モデルのCON4コンソール停止時、GPIO1が意図しない動作になる

csd_mii

2022年11月8日 13時51分

お世話になります、三井と申します。

Armadillo-IoT A6のU1モデルを使用しており、
コンソール出力を停止にした状態でGPIOを利用しようと検討しておりますが、
一部GPIOが意図しない動作をしており、質問させて頂きます。

https://armadillo.atmark-techno.com/blog/10899/9867
上記ブログの手順に従い、CON4の標準コンソールを停止させた時、
CON4のコンソールは出力されなくなりますが、GPIO1_IO16とGPIO1_IO17(以降、対象GPIOと呼称)が意図しない動作となります。
対象GPIOの意図しない動作とは、製品マニュアル6.起動方法_6.7.GPIOの手順に従い、
対象GPIOを入力方向に設定した場合でも3.3Vを出力し続け、
出力方向に設定後LOW出力設定にした場合でも同様に3.3Vを出力する動作です。
この時、他GPIO(GPIO4_IO06~09)は正常に動作しており、
通常のu-bootで起動した場合はGPIO1_IO16~17が正常動作すること(H/Wは正常であること)は確認しております。

公式より配布されているu-bootから保守モードで起動した場合、対象GPIOは3.3V出力しておりませんが、
ブログ手順を実施したu-bootから保守モードで起動した場合、対象GPIOは3.3V出力している状態です。
(ブログ手順のu-bootはコンソールが確認できないため、標準搭載LED及びLINUX起動していないことからu-boot保守モードに入っていると判断)
そのため、u-bootが原因と判断しております。

予想ですが、ブログで紹介されている手順の内、
ブートローダーのコンフィギュレーションで指定する"armadillo-640_defconfig"では
コンソール出力がUART1になっているため、
UART1とマルチプレクスが重複しているGPIO1_IO16(UART1_TX)とGPIO1_IO17(UART1_RX)が
GPIOとして設定出来ていない状態になっているのではないか、と考えております。
UART1がコンソール出力になっているかは環境がなく確認できておりません。

試しに、ブログ手順にあるデフォルトコンフィグの指定を
"armadillo-640_console-uart3_defconfig"や"armadillo-iotg-a6_defconfig" の
コンソール出力がUART3の設定を適用して、その他はブログと同様の手順で試みましたところ、対象GPIOは正常に動作しました。
ただし、u-bootの起動ログがCON4に出力され、ブートローダーのコンソール停止が出来ていない動作になります。
また、メニューコンフィグで設定した通りに、u-boot環境変数に"silent"を設定した時、u-bootのログが一部なくなりますが、
u-boot起動時の一部ログは出力される状態です。(u-boot起動時のログを添付致します)

前提が異なる場合やブログの内容に追加で必要な手順がある場合はご教授頂ければと思います。
もしくはコンソール出力をUART3に設定して、u-bootソースのenv/env.c等のprint出力している箇所を削除する必要がある場合、
変更対象のソースをご教授頂ければと思います。

CON4のコンソール出力を完全に停止させて外部機器との通信に利用し、
GPIO1_IO16~17,GPIO4_IO06~09をGPIOとして利用することを目標としています。

u-bootのソースファイルは下記よりダウンロードした"v2018.03-at13"バージョンを使用しております。
https://armadillo.atmark-techno.com/resources/software/armadillo-iot-a6…

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

ファイル ファイルの説明
u-boot_modif_env_silent_disable.log "armadiilo-iotg-a6_defconfig"適用後、menuconfgでコンソール停止を行い、環境変数にsilentが無い時のu-bootログ
u-boot_modif_env_silent_enable.log "armadiilo-iotg-a6_defconfig"適用後、menuconfgでコンソール停止を行い、環境変数に"silent=1"がある時のu-bootログ
コメント

at_dominique.m…

2022年11月11日 15時30分

三井様、

アットマークテクノのマルティネです。
お世話になっています。

ちょっと内容が多いですので、順番を変えて返事させていただきます。

> また、メニューコンフィグで設定した通りに、u-boot環境変数に"silent"を設定した時、u-bootのログが一部なくなりますが、
> u-boot起動時の一部ログは出力される状態です。(u-boot起動時のログを添付致します)

env を読み取る前にはデフォルトの環境変数を使っていますので、デフォルトの値に silent=1 を追加していただければ出力が完全になくなります。
そこはブログの足りない説明で申し訳ありません。
手元に Armadillo 640 で確認したところ、u-boot v2018.03-at13 の上でブログの案内どおりに armadillo-640_defconfig + config を変更して、以下の変更を足してサイレントになりました:

diff --git a/include/configs/armadillo-640.h b/include/configs/armadillo-640.h
index 87df653945da..662d63ecd923 100644
--- a/include/configs/armadillo-640.h
+++ b/include/configs/armadillo-640.h
@@ -130,7 +130,8 @@ int wlan_rtc_i2c_read(void);
 	BOOTCOMMAND_USB\
 	"tftpboot=tftpboot uImage; tftpboot 0x83000000 ${fdt_file}; bootm ${loadaddr} - 0x83000000;\0"\
 	STOP_NR3225SA_ALARM_ENV_NAME "=" STOP_NR3225SA_ALARM_DEFAULT ";\0"\
-	ENABLE_PF3000_LPM_ENV_NAME "=" ENABLE_PF3000_LPM_DEFAULT "\0"
+	ENABLE_PF3000_LPM_ENV_NAME "=" ENABLE_PF3000_LPM_DEFAULT "\0" \
+	"silent=1\0"
 
 #define CONFIG_BOARD_LATE_INIT
 

ですが、コンソールの出力をなくしたところで u-boot の gpio の初期化に変更はありません。
コンソールがまだ起動していて、出力が見えないだけで入力をまだ読んでいますし、出力の gpio も uart に切り替えています。
(入力が効いて、対象機によって起動時に gpio の変更で文字として認識されてちょうど "hit any key to stop autoboot" で起動を中止することもありえますので、 bootdelay も -2 に設定してそれも無効化した方がいいかもしれません… この u-boot では残念ながらコンソールを簡単に無効化できません)

u-boot の初期化をなくせば動くということは、u-boot が悪いと言うことではなく、linux 側で初期化を行っていないということだけです。
(実は、linux も stdout-path の変更だけでコンソールがなくなることもないですが、使わない限りは gpio の設定を変更しないかもしれません…)

arch/arm/boot/dts/armadillo-640-default-console.dtsi で、 uart1 {} の status = "okay" を消しましょう。それを消したことで、tty のドライバがこのポートを使えなくなりますので、間違って使うリスクもなくなります。(at-dtweb を使えばその変更が不要です。uart1 をそちらで消した場合は正しく無効化されます)
arch/arm/boot/dts/armadillo-640.dts に正しい gpio の設定を行います。

diff --git a/arch/arm/boot/dts/armadillo-640.dts b/arch/arm/boot/dts/armadillo-640.dts
index 6890e2701042..a776ee111f27 100644
--- a/arch/arm/boot/dts/armadillo-640.dts
+++ b/arch/arm/boot/dts/armadillo-640.dts
@@ -148,7 +148,14 @@
 #ifdef ARMADILLO_IOTG_A6_AT_DTWEB
 			&pinctrl_expansion_interfacehog
 #endif
+			&pinctrl_con4
 		    >;
+	pinctrl_con4: con4grp {
+		fsl,pins = <
+			MX6UL_PAD_UART1_TX_DATA__GPIO1_IO16 0x9
+			MX6UL_PAD_UART1_RX_DATA__GPIO1_IO17 0x9
+		>;
+	};
 
 	pinctrl_uart3: uart3grp {
 		fsl,pins = <

この二つの変更で dtb を再作成して試していただけないでしょうか。
最後まで確認してませんが、恐らくこの変更でピンを使えるようになります。

これで無事に動作できたら、at-dtweb で uart1 を外した場合に pinctrl の設定を追加したいと思います。ADCなどにした場合は設定していますが、何も設定しない場合は gpio になりませんので、分かりにくいですね。

よろしくお願いします。