도와주세요!!
제가 현재 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 발췌 ---------------/////////////////////////////
9g45(at91계열) 의 gpio를 제어하고싶으시군요.
저는 device driver에서 gpio제어함수를 사용하고
ioctl함수를 이용하여 application에서 제어합니다.
arch/arm/mach-at91/board-sam9m10g45ek.c 를 보시면 device driver에서 gpio제어하는것에 대한 모든것을 눈치(?) 챌 수 있습니다.
즐 삽이요~