0

ベア メタル AM1808 でピンの多重化を試みていますが、キック レジスタを書き込めないようです。より具体的には、書き込もうとした値を読み戻すことができないようです。

これが私のコードです:

#define SYSCFG_BASE ((void*volatile)0x01C14000)
#define SYSCFG_KICK0R (*((unsigned int*volatile)(SYSCFG_BASE + 0x38)))
#define SYSCFG_KICK1R (*((unsigned int*volatile)(SYSCFG_BASE + 0x3C)))

#define KICK0_UNLOCK  0x83E70B13
#define KICK1_UNLOCK  0x95A4F10
#define KICK0_LOCK    0x0
#define KICK1_LOCK    0x0

static void
gpio_init (int diode)
{
  int status = 0;
  asm volatile (
    "mrs %[ps],cpsr" : [ps]"=&r"(status)
  );
  printf("mode:  0x%x\n", status & 0x1F);

  printf("kick0: 0x%x", SYSCFG_KICK0R);
  SYSCFG_KICK0R = KICK0_UNLOCK;
  printf("   ->  0x%x\n", SYSCFG_KICK0R);

  printf("kick1: 0x%x", SYSCFG_KICK1R);
  SYSCFG_KICK1R = KICK1_UNLOCK;
  printf("   ->  0x%x\n", SYSCFG_KICK1R);

  /* pinmux stuff */

  SYSCFG_KICK0R = KICK0_LOCK;
  SYSCFG_KICK1R = KICK1_LOCK;
}

出力:

mode:  0x13
kick0: 0x0   ->  0x0
kick1: 0x0   ->  0x0

スーパーバイザー モードになっているのに、一般的にキック レジスタを読み取ることができませんか? その場合、syscfg を正しくロック解除したかどうかをテストするにはどうすればよいですか?

更新: 結局のところ、私が抱えていた問題は、ピンの多重化やキック レジスタとは関係ありませんでしたが、代わりに、正しく多重化された GPIO ピンを使用する最上位ロジックにエラーがありました。混乱させて申し訳ありません。

4

1 に答える 1

4

データシートによると、 の値は でKICK1ある必要が0x95A4F1E0あり、コードには0x95A4F10これが一致しません。2 番目の値が最初の値よりも短いことはコードで視覚的に明確にわかります。これは警告信号です。

また、コメントで指摘されているように、ハードウェアの Rev 2 にはキック レジスタがなくなっているので、それも確認してください。

printf()また、恐ろしい突っ込みのシーケンスでの呼び出しが安全であることを確認してください。

于 2013-12-16T08:55:36.697 に答える