제가 현재 at91sam9 계열 CPU를 사용하고 있습니다.

글런데 이 CPU는 특이하게도 아래와 같이 GPIO를 설정할 때 2개의 레지스터로 제어하게 되었습니다.

가령 PIN_D_20번을 HIGH로 설정하고 싶다면 PIO Set Output Data Register에 해당하는 번지에 1을 쓰면 되고

PIN_D_20번에 Low로 설정하고 싶다면 PIO Clear Output Data Register에 해당하는 번지에 1을 쓰면 되는데요..

아래는 PIN_D에 해당하는 레지스터 주소를 보면

아래 빨간 박스와 같이 PIO Set의 주소는 0xFFFFF830이고 PIO Clear의 주소는 0xFFFFF834입니다.

저는 ioremap을 통해 0xFFFFF840의 주소부터 8바이트 할당 받았습니다. ( ioremap(0xFFFFF830, 8) )

저는 단순하게 이런식으로 사용하면 PIO Set과 PIO Clear 레지스터를 사용할 수 있다고 생각했는데요

그래서 다음과 같은 코드를 만들었죠

LED_DATA = (unsigned int*)ioremap(LED_GPIO_DATA, 8);

*(LED_DATA) = 0x00000003; // PIO Set

*(LED_DATA + 4) = 0x00000003; // PIO Clear

그런데 이 코드는 동작하지 않더라구요.. 왜 그럴까요? ㅠㅠ?

그런데 혹시나 해서 개별적으로 PIO Set과 PIO Clear 각각을 ioremap을 통해 받아서 동작 시키면 되더라구요

음...그래서 ioremap은 하나의 레지스터의 주소마늘 커널에서 받아 오는 것인가? 라고 생각을 했지만,

좀 석연찮아서요..고수님들의 답변 바랍니다.

///////////////// ---- Datasheet 발췌 ---------------/////////////////////////////

log.jpg