본문 바로가기

Programming/Linux_Kernel

linux 레지스터 맵핑주소 찾기

간혹 virtual address 로 register 를 setting 하는 코드 들이 있다.
일반적으로
linux버전 \ arch \ arm \ plat-칩명 \ plat \ map.h
에 보면 cpu 각 모듈에 대한 register mapping table 이 있다.

예를들면

#define S3C_ADDR_BASE (0xF4000000)

#ifndef __ASSEMBLY__
#define S3C_ADDR(x) ((void __iomem __force *)S3C_ADDR_BASE + (x))
#else
#define S3C_ADDR(x) (S3C_ADDR_BASE + (x))
#endif

#define S3C_VA_IRQ S3C_ADDR(0x00000000) /* irq controller(s) */
#define S3C_VA_SYS S3C_ADDR(0x00100000) /* system control */
#define S3C_VA_MEM S3C_ADDR(0x00200000) /* system control */
#define S3C_VA_TIMER S3C_ADDR(0x00300000) /* timer block */
#define S3C_VA_WATCHDOG S3C_ADDR(0x00400000) /* watchdog */
#define S3C_VA_UART S3C_ADDR(0x01000000) /* UART */

이렇게 되어 있을때
0xF4300018 을 셋팅한다면
메뉴얼에서 TIMER 단을 찾아서 보면 된다.


Timer1 Counter Register (TCNTB1, R/W, Address = 0xE250_0018)