메모리 매핑 된 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
결정되고 무엇이 진행되고 있습니까?