Armadilloフォーラム

ブートローダでのgpio制御

huehara

2017年2月19日 15時28分

お世話になります

ブートローダでGPIOの制御を行いたいと思っております。

GPIO_1_10にLEDを接続し、ブート時に点灯させたいのです。

以前の書込みを参考にboot.Sに下記のように処理を追加しました。
起動直後に点灯するのですが、すぐに消えてしまします。

どこかで初期化されてしまっているようなのですが、どこで初期化されているのでしょうか?
ご教示いただければと思います。

/*********************************************************************
* LED_ON (GREEN & RED)
*********************************************************************/
ldr r0, =0x43fac000 /* r0 = IOMUXC_BASE */
mov r2, #0x05
str r2, [r0, #0x78] /* MUX_CTL_PAD_NFALE */
str r2, [r0, #0x7c] /* MUX_CTL_PAD_NFCLE */
ldr r1, =GPIO3_BASE_ADDR
ldr r2, [r1, #0x04]
orr r2, r2, #0x30000000
str r2, [r1, #0x04]
ldr r2, [r1, #0x00]
orr r2, r2, #0x30000000
str r2, [r1, #0x00]
/* 以下追加処理 */
mov r2, #0x05
str r2, [r0, #0x148]
ldr r1, =GPIO1_BASE_ADDR
ldr r2, [r1, #0x04]
orr r2, r2, #0x00000400
str r2, [r1, #0x04]
ldr r2, [r1, #0x00]
orr r2, r2, #0x00000400
str r2, [r1, #0x00]

よろしくお願いします。

コメント

at_takashi.sasayama

2017年2月20日 14時16分

笹山です。

> GPIO_1_10にLEDを接続し、ブート時に点灯させたいのです。

GPIO_1_10 (CON9_23) はデフォルトでは High に初期化されていますので、
LED は Low の時に点灯する回路になっていると解釈したのですが、
合っていますでしょうか?

その場合でしたら、以下の様にソースコードを変更すれば、LED の点灯が確認できると思います。

■Hermit-2.2.0

本修正を行うと、保守モードの間 LED が点灯します。

src/target/armadillo4x0/board.c

83         { MX25_PIN_CSI_HSYNC, MUX_ALT5, MUX_ALT5, 0x00c0, 0x00c0 }, #0x00e0 を 0x00c0 に変更

■linux-2.6.26-at27

本修正は、Linux起動中~起動後もLEDを点灯させたい場合のみ行ってください。

arch/arm/mach-mx25/armadillo400_gpio.c

159 #if defined(CONFIG_ARMADILLO400_CON9_23_GPIO1_10) || defined(CONFIG_ARMADILLO410_CON2_71_GPIO1_10)
160         MX25_PAD_CSI_HSYNC__GPIO_1_10(PAD_CTL_PKE | PAD_CTL_PUE | PAD_CTL_PUS_100K_DOWN), 
                               # ↑ PAD_CTL_PUS_100K_UP を PAD_CTL_PUS_100K_DOWN へ変更

笹山様

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

LEDはLowで点灯で合ってます。
下記のソースですが、linux3.14ですとどこになりますでしょうか?

arch/arm/mach-imx/armadillo4x0_extif.cかと思い、少しいじってみたのですが
うまくいきませんでした。

よろしくお願いします。

> 笹山です。
>
> > GPIO_1_10にLEDを接続し、ブート時に点灯させたいのです。
>
> GPIO_1_10 (CON9_23) はデフォルトでは High に初期化されていますので、
> LED は Low の時に点灯する回路になっていると解釈したのですが、
> 合っていますでしょうか?
>
> その場合でしたら、以下の様にソースコードを変更すれば、LED の点灯が確認できると思います。
>
> ■Hermit-2.2.0
>
> 本修正を行うと、保守モードの間 LED が点灯します。
>
> src/target/armadillo4x0/board.c
>

> 83         { MX25_PIN_CSI_HSYNC, MUX_ALT5, MUX_ALT5, 0x00c0, 0x00c0 }, #0x00e0 を 0x00c0 に変更
> 

>
>
> ■linux-2.6.26-at27
>
> 本修正は、Linux起動中~起動後もLEDを点灯させたい場合のみ行ってください。
>
> arch/arm/mach-mx25/armadillo400_gpio.c
>

> 159 #if defined(CONFIG_ARMADILLO400_CON9_23_GPIO1_10) || defined(CONFIG_ARMADILLO410_CON2_71_GPIO1_10)
> 160         MX25_PAD_CSI_HSYNC__GPIO_1_10(PAD_CTL_PKE | PAD_CTL_PUE | PAD_CTL_PUS_100K_DOWN), 
>                                # ↑ PAD_CTL_PUS_100K_UP を PAD_CTL_PUS_100K_DOWN へ変更
> 

at_takashi.sasayama

2017年2月21日 10時04分

笹山です。

> 下記のソースですが、linux3.14ですとどこになりますでしょうか?

linux-3.14 環境の場合は以下の修正を行ってみてください。

■hermit-3.8.1

本修正を行うと、保守モードの間 LED が点灯します。

src/target/armadillo4x0/board.c

75         { MX25_PIN_CSI_HSYNC, MUX_ALT5, MUX_ALT5, 0x00c0, 0x00c0 }, #0x00e0 を 0x00c0 に変更

■linux-3.14

本修正は、Linux起動中~起動後もLEDを点灯させたい場合のみ行ってください。

arch/arm/mach-imx/armadillo4x0_extif.c

 455 #if defined(CONFIG_ARMADILLO4X0_CON9_23_GPIO1_10)
 456         PIN_MAP_MUX_GROUP_HOG_DEFAULT("imx25-pinctrl.0",
 457                                       "csi_hsync__gpio_1_10", "gpio1"),
 458         PIN_MAP_CONFIGS_PIN_HOG_DEFAULT("imx25-pinctrl.0",
 459                                         "MX25_PAD_CSI_HSYNC", pin_cfgs_100kdown_sre_fast), 
 460 #endif                             # ↑ pin_cfgs_100kup を pin_cfgs_100kdown_sre_fast に変更
 

笹山様

お返事が大変遅くなって申し訳ございません。

試してみたのですが、うまく制御できておりません。

ハードを確認した所、LED は Highの時に点灯する回路になっているようです。
そうした場合はkernelの設定はそのままでいいのかなと思いましたがやはり消灯してしまいます。
ハード的にポートをpullupして試した所、ブートローダからkernelまでは点灯しているのですが、kernelが起動した瞬間に消灯してしまいます。
何か、ここの定義のほかに修正する箇所があるのでしょうか?

よろしくお願いします。
> 笹山です。
>
> > 下記のソースですが、linux3.14ですとどこになりますでしょうか?
>
> linux-3.14 環境の場合は以下の修正を行ってみてください。
>
> ■hermit-3.8.1
>
> 本修正を行うと、保守モードの間 LED が点灯します。
>
> src/target/armadillo4x0/board.c
>

> 75         { MX25_PIN_CSI_HSYNC, MUX_ALT5, MUX_ALT5, 0x00c0, 0x00c0 }, #0x00e0 を 0x00c0 に変更
> 

>
> ■linux-3.14
>
> 本修正は、Linux起動中~起動後もLEDを点灯させたい場合のみ行ってください。
>
> arch/arm/mach-imx/armadillo4x0_extif.c
>

>  455 #if defined(CONFIG_ARMADILLO4X0_CON9_23_GPIO1_10)
>  456         PIN_MAP_MUX_GROUP_HOG_DEFAULT("imx25-pinctrl.0",
>  457                                       "csi_hsync__gpio_1_10", "gpio1"),
>  458         PIN_MAP_CONFIGS_PIN_HOG_DEFAULT("imx25-pinctrl.0",
>  459                                         "MX25_PAD_CSI_HSYNC", pin_cfgs_100kdown_sre_fast), 
>  460 #endif                             # ↑ pin_cfgs_100kup を pin_cfgs_100kdown_sre_fast に変更
>  

at_takashi.sasayama

2017年3月24日 13時09分

笹山です。

> ハードを確認した所、LED は Highの時に点灯する回路になっているようです。
> そうした場合はkernelの設定はそのままでいいのかなと思いましたがやはり消灯してしまいます。

kernelの設定はデフォルトでは High 設定なので、そのままで大丈夫のはずです。
間違えて、Low 設定にしたイメージで起動していないか等をご確認いただければと思います。

オシロスコープなどで、GPIO_1_10 (CON9_23) が常に High になっているかを確認してみるのも良いかと思います。

> 笹山です。
>
> > ハードを確認した所、LED は Highの時に点灯する回路になっているようです。
> > そうした場合はkernelの設定はそのままでいいのかなと思いましたがやはり消灯してしまいます。
>
> kernelの設定はデフォルトでは High 設定なので、そのままで大丈夫のはずです。
> 間違えて、Low 設定にしたイメージで起動していないか等をご確認いただければと思います。
>
> オシロスコープなどで、GPIO_1_10 (CON9_23) が常に High になっているかを確認してみるのも良いかと思います。

笹山様
返事が遅くなりました
やはり、だめなのですが何か分かりますでしょうか?
オシロスコープでポートをあたったのですが、やはりカーネルの起動とともにLOWになってしまいます。

フォーラムで下記テーブルでLEDを制御してみるとの記載があったので試してみたりしたのですが、やはりだめでした。

static struct gpio_led armadillo4x0_led_pins[] = {
{"green", "default-on", IMX_GPIO_NR(3, 29), 0},
{"red", "default-on", IMX_GPIO_NR(3, 28), 0},
{"yellow", NULL, IMX_GPIO_NR(4, 30), 0},
};

ハード自体は問題ないようなのですが。

お手数をお掛けしますが、何かございましたらご教示の程
よろしくお願いします。

at_kojiro.yamada

2017年4月4日 11時45分

横から失礼します。

> ■linux-3.14
>
> 本修正は、Linux起動中~起動後もLEDを点灯させたい場合のみ行ってください。> arch/arm/mach-imx/armadillo4x0_extif.c
>
>

>  455 #if defined(CONFIG_ARMADILLO4X0_CON9_23_GPIO1_10)
>  456         PIN_MAP_MUX_GROUP_HOG_DEFAULT("imx25-pinctrl.0",
>  457                                       "csi_hsync__gpio_1_10", "gpio1"),
>  458         PIN_MAP_CONFIGS_PIN_HOG_DEFAULT("imx25-pinctrl.0",
>  459                                         "MX25_PAD_CSI_HSYNC", pin_cfgs_100kdown_sre_fast), 
>  460 #endif                             # ↑ pin_cfgs_100kup を pin_cfgs_100kdown_sre_fast に変更
>  

上記、pin_cfgs_100kup を pin_cfgs_22kup に変更すると
点灯するのではないでしょうか?

pin_cfgs_22kupなら、修正前のhermit-3.8.1で行っている設定(下記)と同じなので
Linux起動中もそのまま点灯し続けるはずです。

 75         { MX25_PIN_CSI_HSYNC, MUX_ALT5, MUX_ALT5, 0x00e0, 0x00e0 },

> 横から失礼します。
>
> > ■linux-3.14
> >
> > 本修正は、Linux起動中~起動後もLEDを点灯させたい場合のみ行ってください。> arch/arm/mach-imx/armadillo4x0_extif.c
> >
> >

> >  455 #if defined(CONFIG_ARMADILLO4X0_CON9_23_GPIO1_10)
> >  456         PIN_MAP_MUX_GROUP_HOG_DEFAULT("imx25-pinctrl.0",
> >  457                                       "csi_hsync__gpio_1_10", "gpio1"),
> >  458         PIN_MAP_CONFIGS_PIN_HOG_DEFAULT("imx25-pinctrl.0",
> >  459                                         "MX25_PAD_CSI_HSYNC", pin_cfgs_100kdown_sre_fast), 
> >  460 #endif                             # ↑ pin_cfgs_100kup を pin_cfgs_100kdown_sre_fast に変更
> >  

>
> 上記、pin_cfgs_100kup を pin_cfgs_22kup に変更すると
> 点灯するのではないでしょうか?
>
> pin_cfgs_22kupなら、修正前のhermit-3.8.1で行っている設定(下記)と同じなので
> Linux起動中もそのまま点灯し続けるはずです。
>

>  75         { MX25_PIN_CSI_HSYNC, MUX_ALT5, MUX_ALT5, 0x00e0, 0x00e0 },
> 

>

at_kojiro.yamada様ありがとうございます。
結果からすとpin_cfgs_100kupでも点灯しました。
私が勘違いしてたようで、GPIOのポートの設定が入力(デフォルト)時に教えていただいた設定を行うとLEDが点灯するということなのですね。
理解できてませんでした。

GPIOのポートの設定を出力にし、カーネル側でLEDを点灯させるにはどうすればいいでしょうか?
出力データの定義等あるのでしょうか

よろしくお願いします。

at_kojiro.yamada

2017年4月5日 10時43分

> GPIOのポートの設定を出力にし、カーネル側でLEDを点灯させるにはどうすればいいでしょうか?
> 出力データの定義等あるのでしょうか

linux-3.14-at[version]/arch/arm/mach-imx/armadillo4x0_extif.c の
armadillo4x0_con9_con14_gpios で
CON9 および CON14 の各信号ピンの初期状態を定義しています。

GPIO_1_10 (CON9_23) を Output の High にするには以下のように修正します。

linux-3.14-at[version]/arch/arm/mach-imx/armadillo4x0_extif.c

898 static const struct armadillo4x0_extif_gpio armadillo4x0_con9_con14_gpios[] = {
 :
963         /* CON9_23 */
964 #if defined(CONFIG_ARMADILLO4X0_CON9_23_GPIO1_10)
965         { IMX_GPIO_NR(1, 10), "CON9_23", EXTIF_GPIO_DIRECTION_OUTPUT, 1 },
966 #endif                                      ↑ EXTIF_GPIO_DIRECTION_INPUT を EXTIF_GPIO_DIRECTION_OUTPUT, 1 に変更

at_kojiro.yamada様

返信が遅くなりましたが、教えていただいた設定でLEDを点灯させることができました。

ありがとうございました。

> > GPIOのポートの設定を出力にし、カーネル側でLEDを点灯させるにはどうすればいいでしょうか?
> > 出力データの定義等あるのでしょうか
>
> linux-3.14-at[version]/arch/arm/mach-imx/armadillo4x0_extif.c の
> armadillo4x0_con9_con14_gpios で
> CON9 および CON14 の各信号ピンの初期状態を定義しています。
>
> GPIO_1_10 (CON9_23) を Output の High にするには以下のように修正します。
>
> linux-3.14-at[version]/arch/arm/mach-imx/armadillo4x0_extif.c
>

> 898 static const struct armadillo4x0_extif_gpio armadillo4x0_con9_con14_gpios[] = {
>  :
> 963         /* CON9_23 */
> 964 #if defined(CONFIG_ARMADILLO4X0_CON9_23_GPIO1_10)
> 965         { IMX_GPIO_NR(1, 10), "CON9_23", EXTIF_GPIO_DIRECTION_OUTPUT, 1 },
> 966 #endif                                      ↑ EXTIF_GPIO_DIRECTION_INPUT を EXTIF_GPIO_DIRECTION_OUTPUT, 1 に変更
> 

>