ベア メタル 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 ピンを使用する最上位ロジックにエラーがありました。混乱させて申し訳ありません。