강좌 & 팁
안녕하세요 판다 이우영입니다.
오늘은 arm에서 클럭을 어떤식으로 설정하는지 알아보려 합니다.
그럼 바로 들어가겠습니다.
1. 클럭 설정 어렵지 않아요~
조금 오래된 arm core의 경우에는 1개의 메인 클럭을 가지고 여러 장치들이 사용할 수 있도록
분할을 해서 사용했습니다.
예를들어 cpu에 들어가는 클럭은 400MHz, USB는 48MHz 등으로 나누어서 각 장치에 클럭을 공급했습니다.
이것이 기본이기도 합니다.
최근 arm core도 이런 방식을 따릅니다 다만 달라진 점이 있다면 제어하는 장치가 많아짐에 따라
조금더 효율적이고 다양한 클럭을 만들어 주기위해 여러개의 메인클럭을 사용합니다.
그럼 최근 cpu중 하나인 c100의 클럭 설정부분을 한번 확인해 보겠습니다.
음... 이게모지? 하실껍니다.
저 또한 그랬습니다.
간단하게 설명하면 왼쪽에서 나오는것이 공급 클럭이고
오른쪽에 있는것들이 각 장치로 공급되는 부분으로 보실 수 있습니다.
장치에 공급되는 클럭이 아주 많죠?
그렇기 때문에 어떤식으로 클럭을 만들어 갈지 설계하는 부분이 중요해 졌습니다.
설명할것이 많아서 어디서 부터 해야이해가 쉬울지 조금 고민이내요 ㅎㅎ.
일단 중요한 것들을 하나씩 찝어보자면
1. APLL, MPLL, EPLL, HPLL
- 요것들이 메인이 되는 클럭 4가지 입니다.
2. MUX
- 중간중간에 MUX들이 있습니다. 이것을 통해 상위에서 오늘 2개이상의 클락중
어떤 클럭을 사용할 것인지 결정하게 됩니다.
3. DIV
- 상위에서 넘어온 클럭을 분주합니다.
조금 더 자세히 설명하면 메인 클럭이 되는 4개의 PLL 을 먼저 설정을 해야합니다.
다음은 PLL을 설정하는 레지스터 입니다.
SDIV, PDIV, MDIV의 조합에 의해서 클럭이 결정됩니다.
공식은 다음과 같습니다.
입력 클럭이 12MHz일 경우 디폴트 값은 133MHz라고 합니다.
266MHz 를 만들기 위해서는 P=3, M=133, S=1 으로 설정해야 한다고 예시가 나와 있습니다.
(제가 수학은 못해서 자세한 설명은 패스하겠습니다 ㅎㅎㅎ)
APLL 또한 이런식으로 설정을 하고 디폴트 값은 12MHz일 경우 디폴트 값은 400MHz 입니다.
이런식으로 4개의 다른 클럭들을 설정해서 사용하게 됩니다.
다음으로 MUX를 설정하는 레지스터도 존재 하고 있습니다.
레지스터는 CLK_SRC0~3 이 있습니다. (SRC는 Select Clock Source 입니다)
레지스터를 살펴보면
각 레지스터에 값을 통해서 어떤 클락을 이용할지 선택할 수 있게 구성 되어 있습니다.
마지막으로 DIV입니다.
위에서 400MHz, 133MHz 는 저속장치들이 사용하기에는 너무 빠르죠?
그래서 있는것이 DIV입니다.
이 DIV에 설정한 값으로 클럭을 분주하여 낮은 클럭을 만들어 냅니다.
레지스터는 다음과 같이 구성되어 있습니다.
(CLK_DIV0~4 )
이것도 간단하게 구성되어 있습니다.
입력된 클럭을 설정한 값+1 로 나누어 줍니다.
(0으로는 나눌수 없기것과 오류를 방지하기위해 만든거 같습니다.)
이값을 0으로 설정하면 입력된 클럭이 그대로 사용되고
1이라면 입력된 클럭의 절반의 클럭이 출력됩니다.
보신거와 같이 많은 장치에 다양한 클럭을 공급해야 하기 때문에 설계를 주의해서 해야합니다.
먼저 어떤 값으로 PLL들을 설정해야하는지정해야하고
같은 클럭을 사용하는 장치끼리 묶어서 사용할 수 있도록 클럭의 라인을 잘 설정해 주어야 합니다.
또한 arm core 마다 클럭 설정하는 부분이나 레지스터의 수가 다를수 있습니다.
따라서 datasheet는 꼭 보면서 작업을 해야 합니다.
보통 리눅스에서 클럭을 건드리는 경우는 디바이스 드라이버를 올리면서
디바이스에 맞는 클럭을 공급하기위해서 많이 사용된니다.
메인 클럭까지 건드리는 경우는 거의 없습니다.
(건드리면 다른 장치에 공급되는 클럭이 모두 틀어지기 때문입니다.
뭐 다른 장치의 클럭도 모두 변경하실꺼라면 변경해도 상관은 없습니다 ㅎㅎ)
그럼 오늘은 이만 마치도록 하겠습니다.
이글이 도움이 되었으면 좋겠습니다.
궁금하신점은 리플을 달아주세요.
그럼 다음에 만나요~