メモリマップドI / Oアドレス指定はどのように機能しますか?
I2Sが提供するサンプルを理解しようとしています。誰もが実行していますか?。
クロックの構成:
#define BCM2708_PERI_BASE 0x20000000
#define CLOCK_BASE (BCM2708_PERI_BASE + 0x101000) /* Clocks */
最初に次のようにコードをマッピングします...
clk_map = (unsigned char *)mmap(
(caddr_t)clk_mem,
MAP_BLOCK_SIZE,
PROT_READ|PROT_WRITE,
MAP_SHARED|MAP_FIXED,
mem_fd,
CLOCK_BASE
);
それから何かをする...
// Always use volatile pointer!
clk = (volatile unsigned *)clk_map;
そして、それが参照されるとき、0x26と0x27のこれらの奇妙な追加があります、それはどうですか?
printf("Disabling I2S clock\n");
*(clk+0x26) = 0x5A000000;
*(clk+0x27) = 0x5A000000;
usleep(10);
printf("Confiure I2S clock\n");
*(clk+0x26) = 0x5A000001;
*(clk+0x27) = 0x5A000000 | 3<<12 | 1<<9; // divider: 3.125==0b11.001
usleep(10);
printf("Enabling I2S clock\n");
*(clk+0x26) = 0x5A000011;
データシートを見ると、ベースアドレスなど、これらの値の一部がどこにあるかがわかりますが、他の値を理解するのに苦労しています。それはどこでCLOCK_BASE
決定され、何が起こっていますか?