1. GPIO

https://learn.microsoft.com/ko-kr/windows/iot-core/learn-about-hardware/pinmappings/pinmappingsrpi

Rasberry pi 3보드를보면 그림과같이 PIN 존재한다.

GPIO PIN in,out 설정하고 값을 set해서 사용할 있다. 또한 GPIO PIN들은 그냥 입출력으로 사용되는 외에 인터럽트 사용목적이 정해진 PIN들이 존재한다. 해당 PIN들은 단순 입출력 외에도 기능에 맞춰 사용할 수도 있다.

 

 

2. Address

GPIO pin 제어하는 OS코드를 작성하기 위해서는 GPIO 어느 Address 연결되는지 알아야 한다.

Physical addresses range from 0x3F000000 to 0x3FFFFFFF for peripherals. The
bus addresses for peripherals are set up to map onto the peripheral bus address range
starting at 0x7E000000. Thus a peripheral advertised here at bus address 0x7Ennnnnn is
available at physical address 0x3Fnnnnnn.

내용을통해서

물리적 주소는 0x3F000000

가상 공간 주소는 0x7E000000

매칭되는 것을 있다.

 

우리는 OS개발을 진행하면서 physical memory 접근하므로 0x3F000000 Base 사용하면 된다.

 

 

3. Bit 연산

GPIO setup등을 진행하게되면 특정 address offset으로하여 bit값들을 셋업하게 된다.

근데 여기서 그냥 쉬프트연산을통한 OR, AND연산을 하게되면 당연히 기존 값들은 모두 날아가게된다.

예를들어 4byte = 32bit 데이터가 존재한다고 가정하자. 여기서 101이라는 값을 0~2bit에넣어주기위해

데이터 | 101 혹은 데이터 & 101 하게되면

0~2bit값을 제외한 3~31까지의 값들은 모두 0이나 1 되어버릴 것이다.

 

또한 기존에 0~2bit 값이 존재했다면 원하는 값을 얻어 없다.

그래서 이러한 부분을 효과적으로 처리하기 위한 bit연산의 이해와 구현이 필요하다.

 

우선은 mmio_read를통해 read

read & ~(111 << n) 하여 내가 바꾸고자하는 자리의 bit 0으로 먼저 초기화한 (

(read & ~(111 << n)) | (101 <<n)

를하여 값을 write진행하였다.

이렇게 진행하는 경우 기존의 값을 read 1회진행 bit연산 후에 write 진행하다보니 성능상 많이 좋지 않을 같다는 느낌이들었고

관련해서 해결방법이 있는지는 추가적으로 조사 고민을 해봐야 같다.

 

- ref

https://wiki.osdev.org/Raspberry_Pi_Bare_Bones

+ Recent posts