## Memory Mapped I/O (MMIO)
Memory Mapped I/O는 I/O 디바이스와 메모리가 같은 주소 공간을 공유하는 체계를 말합니다. 이 방식에서는 I/O 디바이스에 접근하는 것이 메모리에 접근하는 것과 동일한 방식으로 이루어집니다. 이는 명령어의 개수를 줄이며, 이로 인해 코드의 복잡성을 감소시키는 장점이 있습니다. 이 체계는 주로 RISC(Reduced Instruction Set Computer) 시스템에서 사용됩니다.
## Isolated I/O
Isolated I/O는 메모리와 I/O 디바이스가 서로 분리된 주소 공간을 사용하는 체계를 말합니다. 이 체계에서는 메모리 접근 명령어와 I/O 접근 명령어가 분리되어 있습니다. 이 때문에 MMIO에 비해 더 많은 명령어가 필요하게 되는데, 이는 코드의 복잡성을 증가시킬 수 있습니다. 이 체계는 주로 CISC(Complex Instruction Set Computer) 시스템에서 사용됩니다.
Isolated I/O와 MMIO는 각각의 장단점이 있습니다. 예를 들어, Isolated I/O는 메모리 주소 공간을 I/O에 할당하지 않으므로 더 많은 메모리를 사용할 수 있는 반면, MMIO는 프로그래밍이 더 간단하고 명령어의 수를 줄일 수 있다는 장점이 있습니다. 따라서, 특정 시스템에서 어떤 방식을 선택할 것인지는 해당 시스템의 요구사항과 제약사항에 따라 결정됩니다.
led_map=ioremap(GPIO_BASE,GPIO_SIZE);
이 코드는 물리 메모리 영역을 커널의 가상 주소 공간에 매핑하는 작업을 수행합니다.
`ioremap()` 함수는 커널이 장치의 물리 메모리를 직접 접근할 수 있게 가상 주소를 제공하는 기능을 합니다. 이 함수는 물리 주소와 그 크기를 인자로 받아, 해당 물리 주소 범위를 커널의 가상 주소 공간에 매핑하고, 매핑된 가상 주소를 반환합니다.
여기서 `GPIO_BASE`는 GPIO (General Purpose Input/Output) 레지스터의 물리 주소를, `GPIO_SIZE`는 레지스터의 크기(바이트 단위)를 나타냅니다. `led_map`은 매핑된 가상 주소를 저장하는 변수입니다.
따라서 이 코드는 GPIO 레지스터의 물리 주소 영역을 가상 주소 공간에 매핑하고, 그 가상 주소를 `led_map`에 저장하는 작업을 수행하는 것을 볼 수 있습니다. 이렇게 하면 커널은 `led_map`를 통해 GPIO 레지스터를 직접 조작할 수 있게 됩니다.
led = (volatile unsigned int *)led_map;
led_map을 volatile 타입으로 변환한다. 코드 최적화로 인한 정보의 손실을 막기 위해 사용한다.
*(led+1)&=~(0x07 << (3*7));
위 코드는 GPIO17번 핀을 초기화한다.
*(led+1) |= (0x01 << (3*7));
위 코드는 GPIO17 위치에 1값을 쓴다.
result=copy_from_user(&tmp_buf,gdata,length)
위 코드는 사용자로부터 데이터를 받아와서 tmp_buf에 저장한다.
static int led_release(...){
...
if(led) iounmap(led);
...
}
디바이스 드라이버 사용이 끝나면 iounmap을 해준다.
'2023-1 > IoT와 임베디드 소프트웨어' 카테고리의 다른 글
Threads (0) | 2023.06.13 |
---|---|
Device Driver Concept (0) | 2023.06.13 |
CrossDevEnv, Kernel, BootLoader (0) | 2023.04.25 |
Embedded Linux (0) | 2023.04.25 |
IoT and Embedded Software (0) | 2023.03.11 |
댓글