1. GPIO 핀
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
'OS > Firmware Project' 카테고리의 다른 글
[MOON OS] Moon OS Project Check point (0) | 2022.01.01 |
---|---|
[MOON OS] Moon OS Project (3) - Interrupt 1 (0) | 2021.09.26 |
[MOON OS] Moon OS Project (2) - GPIO (0) | 2021.09.20 |
[MOON OS] Moon OS Project (1) - Barebone code (0) | 2021.08.21 |
[OS] Firmware Project (8) - Event (0) | 2021.08.02 |