Armadilloフォーラム

起動時のGPIO制御

dev.sanko

2024年11月12日 17時33分

==========
製品型番:A6400-D00Z
ABOSバージョン:3.20.2-at.2
カーネルバージョン:5.10.224-0-at
その他:WLAN コンボオプションモジュール(OP-A600-AWLMOD-20)増設
==========

お世話になっております。

以前、下記のフォーラムにて起動時のGPIO制御についてご質問させていただきました。
https://armadillo.atmark-techno.com/forum/armadillo/14793

今回、WLANコンボモジュールの変更に伴いまして、ABOSへの移行が必要になったのですが、
ABOSにおいても起動時(boot loader)でGPIO制御を行うことは可能でしょうか。

試しに「/etc/local.d/」にGPIO制御のスクリプトを配置しましたが、電源を投入後、しばらくしてから実行されます。
「/etc/local.d/」よりも早く制御する方法をご教授いただけないでしょうか。

また、以前はユーザーLEDを制御していましたが、CON9のGPIOに変更しておりますので、
そこを考慮していただけますと助かります。

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

コメント

at_dominique.m…

2024年11月13日 10時37分

dev.sankoさん

お世話になっています、
マルティネです。

> 以前、下記のフォーラムにて起動時のGPIO制御についてご質問させていただきました。
> https://armadillo.atmark-techno.com/forum/armadillo/14793
>
> 今回、WLANコンボモジュールの変更に伴いまして、ABOSへの移行が必要になったのですが、
> ABOSにおいても起動時(boot loader)でGPIO制御を行うことは可能でしょうか。
>
> 試しに「/etc/local.d/」にGPIO制御のスクリプトを配置しましたが、電源を投入後、しばらくしてから実行されます。
> 「/etc/local.d/」よりも早く制御する方法をご教授いただけないでしょうか。

/etc/local.d は遅いですね。
順番としては早ければ早いほど対応が難しいですが、以下のところで操作可能です:
1/ boot loader
2/ 新しいサービスを作って sysinit の runlevel で起動させる
3/ 同じく、 boot runlevel で起動させる
4/ コンテナの設定ファイル (/etc/atmark/containers/xxx.conf) で操作する
5/ コンテナに gpiochip を渡してコンテナ内で操作する
6/ local.d で操作する (厳密では 5 と平行に実行されます)

コンテナの起動前だけでよろしければコンテナのコンフィグファイルだけでもいいと考えていますが、できるだけ早く設定したい場合は bootloader で制御するしかないと思います。

bootloader の変更手順はリンクしていただいたフォーラムとそれほど変わってない認識です。コードの変更以外に操作を対応してません。
ABOSでのブートローダーをダウンロードして、編集した上でビルドして swu 等でインストール可能です。ファイル名も上記のリンク同様に board/atmark-techno/armadillo-640/board.c です。

> また、以前はユーザーLEDを制御していましたが、CON9のGPIOに変更しておりますので、
> そこを考慮していただけますと助かります。

以前の問い合わせで LED4 の操作でしたが今回は別の gpio を操作したいですね。
uboot の変更の場合は gpio の名前以外は同じですので、必要でしたら具体的にどの gpio を制御したいかを教えていただければこちらで調べておきます。

よろしくお願いします。

マルティネ様
お世話になっています。

制御したいGPIOはCON9のピン番号25(GPIO4_IO06)となります。

at_dominique.m…

2024年11月14日 16時11分

dev.sankoさん

> 制御したいGPIOはCON9のピン番号25(GPIO4_IO06)となります。

GPIO4_IO06 の pad 設定は MX6_PAD_NAND_DATA04__GPIO4_IO06 です (arch/arm/include/asm/arch-mx6/mx6ull_pins.h 参照)

全く未確認ですがイメージとしては以下の形になると思います ( board/atmark-techno/armadillo-640/board.c )

#define GPIO_CON9_25 IMX_GPIO_NR(4, 6)
static iomux_v3_cfg_t con9_25_pads[] = {
        MX6_PAD_NAND_DATA04__GPIO4_IO06 | MUX_PAD_CTRL(PAD_CTL_DSE_240ohm),
};
 
int board_init(void)
{                                        
        setup_maintenance_sw();
        setup_fec();
        setup_rtc_disarm_alarm();
 
        imx_iomux_v3_setup_multiple_pads(con9_25_pads, ARRAY_SIZE(con9_25_pads));
        gpio_request(GPIO_CON9_25, "con9 25");
        gpio_direction_output(GPIO_CON9_25, 1);
 
        return 0;
}       

前回の LED と違ってこちらの設定は linux で全く操作されていない状態になっていると思いますのでそれだけでいいと思いますが、念のため linux でも dtb で対応した方がいいと思いますので linux の arch/arm/boot/dts/armadillo-600-customize.dts に以下の内容をいれて,「 make dtbs」で armadillo-600-customize.dtbo をビルドした後に armadillo の /boot にコピーして /boot/overlays.txt に追加する形を推奨しています:
https://manual.atmark-techno.com/armadillo-640/armadillo-640_product_ma…

&gpio4 {
        con9_pin25 {
                pinctrl-names = "default";
                pinctrl-0 = <&pinctrl_con9_pin25>;
 
                gpio-hog;
                gpios = <6 GPIO_ACTIVE_HIGH>;
                line-name = "con9 pin25";
                output-high;
        };
};
 
&pinctrl_customize {
        fsl,pin = <
                MX6UL_PAD_NAND_DATA04__GPIO4_IO06       0x08 // CON9_25
        >;
};

こちらの方法ではカーネルや u-boot をビルド・更新する必要がありませんので、タイミング的に linux 起動の際でよろしければこちらだけでいいかもしれません。

よろしくお願いします。

マルティネ様
お世話になっています。

「 board/atmark-techno/armadillo-640/board.c」を変更することでbootloaderでGPIOを制御できました。

ただし、ビルドしたarmadillo-600-customize.dtboを加えた後に再起動すると、

ERROR: Did not find a cmdline Flattened Device Tree
   Loading Kernel Image

と出てしまい、起動に失敗します。

bootloaderを変更すれば、GPIOはHIGH状態を継続するので問題はないのですが、
一応確認していただけますと助かります。

at_dominique.m…

2024年11月15日 16時38分

dev.sankoさん

マルティネです。

> 「 board/atmark-techno/armadillo-640/board.c」を変更することでbootloaderでGPIOを制御できました。

こちらはよかったです。

> ただし、ビルドしたarmadillo-600-customize.dtboを加えた後に再起動すると、
>

> ERROR: Did not find a cmdline Flattened Device Tree
>    Loading Kernel Image
> 

> と出てしまい、起動に失敗します。
>
> bootloaderを変更すれば、GPIOはHIGH状態を継続するので問題はないのですが、

このエラーはなにかの手順の問題の可能性が高いと思いますので、案内不足で申し訳ございません。マニュアルにも customize.dtbo の使い方についての情報は少ないのでビルドしてからの想定を説明しなおします:
* armadillo-600-customize.dtbo を armadillo の /boot にコピーします
* /boot/overlays.txt にその dtbo を追加します。ファイルが存在しなかった場合は「fdt_overlays=armadillo-600-customize.dtbo」、存在していた場合はスペースで区切って追加する形です:「fdt_overlays=armadillo-640-lcd70ext-l00.dtbo armadillo-600-customize.dtbo
* debian版と違って、armadillo.dtb (または armadillo-640.dtb) を変更しません

今のエラーは dtbo ファイルをそのまま dtb として使ったように見えますので、u-boot のコンソールで fdt_file を設定すれば復帰できると思います。
どのファイルを上書きしましたか?
また、swu をインストールしたことがある場合は B面のデーターもありますので、復帰は必ずできますので状況が分かりましたら説明します。

よろしくお願いします。