ブログ

Armadillo-640:ブートローダーでGPIOを設定する方法

at_kazutaka.bito
2023年4月2日 13時14分

Armadillo-640で、ブートローダーでGPIOを設定する方法です。

ここでは例として、 Armadillo-640製品マニュアル「表6.9 CON9 ピンとGPIO番号の対応」 より

ピン番号ピン名GPIO番号
4GPIO1_IO3131

上記のCON9の4番ピンをGPIO:High出力に設定します。

備考)
下記手順にて、ブートローダーは「u-boot-a600-v2018.03-at13」の場合で記述しています。
異なるバージョンを使用する場合は、バージョンを読み替えてください。

以下、 Armadillo-640 製品マニュアル「10.1. ブートローダーをビルドする」 の手順をベースに、
カスタマイズしたブートローダーを作成します。

1.ソースコードの準備

atmark@atde8:~$ wget https://armadillo.atmark-techno.com/files/downloads/armadillo-640/source/u-boot-a600-v2018.03-at13.tar.gz
atmark@atde8:~$ tar zxvf u-boot-a600-v2018.03-at13.tar.gz

2.デフォルトコンフィギュレーションの適用

atmark@atde8:~$ cd u-boot-a600-v2018.03-at13
atmark@atde8:~/u-boot-a600-v2018.03-at13$ make ARCH=arm armadillo-640_defconfig

3.ブートローダーのカスタマイズ

CON9の4番ピンをGPIO:High出力に設定します。
u-boot-a600-v2018.03-at13内のソースコード
u-boot-a600-v2018.03-at13/board/atmark-techno/armadillo-640/board.c
を変更します。

board.cに、下記コメントで挟んだ2箇所を追加します。
/**** custom_gpio(番号/2): begin ****/
/**** custom_gpio(番号/2): end ****/

/**** custom_gpio(1/2): begin ****/
#define CUSTOM_GPIO_CON9_4 IMX_GPIO_NR(1, 31)

static iomux_v3_cfg_t custom_gpio_pads[] = {
	MX6_PAD_UART5_RX_DATA__GPIO1_IO31 | MUX_PAD_CTRL(PAD_CTL_DSE_240ohm),
};

static void setup_custom_gpio(void)
{
	imx_iomux_v3_setup_multiple_pads(custom_gpio_pads,
					 ARRAY_SIZE(custom_gpio_pads));
	gpio_direction_output(CUSTOM_GPIO_CON9_4, 1);
}
/**** custom_gpio(1/2): end ****/
int board_init(void)
{
	setup_maintenance_sw();
/**** custom_gpio(2/2): begin ****/
	setup_custom_gpio();
/**** custom_gpio(2/2): end ****/
	setup_fec();
	setup_usb();

	return 0;
}

参考)board.cに上記変更を施したもの
board_custom_gpio_20230331.c

解説)変更箇所について

#define CUSTOM_GPIO_CON9_4 IMX_GPIO_NR(1, 31)

CON9の4番ピン(GPIO1_IO31)の定義。ピン番号とピン名の相関については下記参照。
Armadillo-640製品マニュアル「表6.9 CON9 ピンとGPIO番号の対応」
Armadillo-640 マルチプレクス表

	MX6_PAD_UART5_RX_DATA__GPIO1_IO31 | MUX_PAD_CTRL(PAD_CTL_DSE_240ohm),

PADの設定。プルアップ/ダウン、ドライブ能力等、対向の回路に合わせた設定が必要。
上記の例はドライブ能力のみ設定を変更。詳細は下記マニュアルを参照。
「i.MX 6ULL Applications Processor Reference Manual」
i.MX 6ULL Single-Core Processor with Arm Cortex-A7 Coreよりダウンロード可能)
 32.6.178 SW_PAD_CTL_PAD_UART5_RX_DATA SW PAD Control Register
      (IOMUXC_SW_PAD_CTL_PAD_UART5_RX_DATA)

	gpio_direction_output(CUSTOM_GPIO_CON9_4, 1);

CON9の4番ピンのGPIOをHigh出力に設定。

4.ビルド

atmark@atde8:~/u-boot-a600-v2018.03-at13$ make CROSS_COMPILE=arm-linux-gnueabihf-
atmark@atde8:~/u-boot-a600-v2018.03-at13$ ls u-boot.imx
u-boot.imx

上記手順で生成されたu-boot.imxが、CON9の4番ピンをGPIO:High出力に設定したブートローダーです。
Armadillo-640 製品マニュアル「11.2.1. ブートローダーイメージの書き換え」 の手順で
Armadillo-640のブートローダーをこのu-boot.imxで書き換えます。

再起動すると、ブートローダー起動時にCON9の4番ピンはHigh出力になります。

備考)
この方法はブートローダーでの設定になります。
カーネル起動後もGPIOで使用する場合は、
Armadillo-640 製品マニュアル「20.3. Device Treeをカスタマイズする」
の方法で、該当の端子に「何の機能も割り当てない(=GPIO)」設定をしたデバイスツリーを使用する必要があります。
ユーザースペースからGPIOを制御する制御方法は、下記を参照ください。
Armadillo-640 製品マニュアル「6.7. GPIO」