Armadilloフォーラム

ブートローダでのgpioのvalueチェックについて

doska444

2017年3月8日 23時57分

ブートローダでGPIOの値チェックを行いたいと思っております。
やりたいことは、GPIO_Cピンを参照し、FlashブートかSDブートを切り替えたいと思っています。
board.cに以下のように実装しましたが、GPIO_Cピンの状態が正しく取れません。
・テーブル追加
static struct iomux_info user_pins[] = {
{ MX25_PIN_GPIO_C, MUX_ALT0, MUX_ALT0, 0x00e0, 0x00e0 },
{ },
};

・armadillo4x0_setup_private_data関数に以下のコードを追加。
mx25_iomux_config(user_pins, 1);
val = read32(GPIO1_BASE_ADDR + GPIO(GDIR));
val &= ~0x00000004;
write32(GPIO1_BASE_ADDR + GPIO(GDIR), val);
val = read32(GPIO1_BASE_ADDR + GPIO(PSR));
userpinval = val & 0x00000004 ? 1 : 0;

期待する動作は、上記コードのuserpinvalにGPIO_CピンがHiのときは1、
Loのときは0になってほしいのですが、HiであろうがLoであろうが0のままです。
実際のuserpinvalの値は0x9になっています。
ハードとしては、確実にHi or Loが入力されています。
また、読み込むタイミングで、ハード的にHiになっていない可能性があることも考えられたので、
適当な時間Waitするように試しましたが、正確な値が読み込めませんでした。

正しく読めない原因として何が考えられるでしょうか?
ご教示いただければと思います。

コメント

izawa

2017年3月9日 15時03分

毎度お世話様。
えーとこれ、単に書いてあることだけから判断できそうな点があったので。

> userpinval = val & 0x00000004 ? 1 : 0;
>
> 期待する動作は、上記コードのuserpinvalにGPIO_CピンがHiのときは1、
> Loのときは0になってほしいのですが、HiであろうがLoであろうが0のままです。
> 実際のuserpinvalの値は0x9になっています。

この段階でvalが9だということであれば、4とのandをとったらそりゃ0ですねぇ。
ここから先はデータシートを見ないと分からないところになりますが、
見るビットはそのビットで正しいのでしょうか。
GDIRレジスタの読み書きとPSRレジスタの読み出しが関係すると思われますので、
その辺りを確認しては如何でしょう。

shkoga

2017年3月9日 16時00分

こんにちは。サムシングプレシャスの古賀です。

doska444さん:
>ブートローダでGPIOの値チェックを行いたいと思っております。
>やりたいことは、GPIO_Cピンを参照し、FlashブートかSDブートを切り替えたいと思っています。
>board.cに以下のように実装しましたが、GPIO_Cピンの状態が正しく取れません。
>・テーブル追加
>static struct iomux_info user_pins[] = {
> { MX25_PIN_GPIO_C, MUX_ALT0, MUX_ALT0, 0x00e0, 0x00e0 },
> { },
>};
>
>・armadillo4x0_setup_private_data関数に以下のコードを追加。
>mx25_iomux_config(user_pins, 1);
>val = read32(GPIO1_BASE_ADDR + GPIO(GDIR));
>val &= ~0x00000004;
>write32(GPIO1_BASE_ADDR + GPIO(GDIR), val);
>val = read32(GPIO1_BASE_ADDR + GPIO(PSR));
>userpinval = val & 0x00000004 ? 1 : 0;
>
>期待する動作は、上記コードのuserpinvalにGPIO_CピンがHiのときは1、
>Loのときは0になってほしいのですが、HiであろうがLoであろうが0のままです。
>実際のuserpinvalの値は0x9になっています。
>ハードとしては、確実にHi or Loが入力されています。
>また、読み込むタイミングで、ハード的にHiになっていない可能性があることも考えられたので、
>適当な時間Waitするように試しましたが、正確な値が読み込めませんでした。
>
>正しく読めない原因として何が考えられるでしょうか?
>ご教示いただければと思います。

確認ですが、PSR ではなく DR の値を読んだ場合は、どうなるでしょうか?