1. GPIO
raspi3 chpset에는 많은 pin이 존재하고 각각의 pin은 다른 H/W와 연결되어 Input, Output 혹은 pin마다 정해진 고유의 function을 동작할 수 있다. 그리고 이러한 pin들을 직접적으로 s/w를 통해서 직접적으로 제어할 수 있는데 이것이 바로 GPIO이다.
GPIO(general-purpose input/output) 개발은 즉 H/W를 직접적으로 컨트롤하는 S/W의 개발 즉 일종의 펌웨어 개발이다.
기본적으로 raspi3는 0x3F000000을 base로 받고 여기서 GPIO base가 0x00200000이다.
즉 raspi3 GPIO base address는 0x3F200000 이 된다.
2. 레지스터
GPIO 레지스터는 위와 같으며 Datasheet을 통해서 쉽게 확인할 수 있다. 위 datasheet는 raspi3가아닌 raspi 1 기반이기 때문에 주솟값이 0x3F20 0000으로 base가 잡히지 않고 다른 값으로 잡혀있다. raspi3에서는 GPIO Base Address 즉 GPIO Function Select0 register의 주소가 0x3F20 0000이다.
1) GPIO Select Register
GPIO select register는 GPIO Pin (raspi3의 경우 총 약 40개의 pin이존재하는 것 으로 앎)을 어떻게 사용하는지 결정하기 위한 레지스터이다.
일종의 GPIO setup register로 해당 register를통해 임의의 pin x를 input으로 사용할지, output으로 사용할지, 혹은 특정 Function(UART, Interrupt 등)으로 사용할지를 결정한다.
위와 같이 register값을 설정해서 pin을 고를 수 있으며 코드로 구현하면 아래와 같이 된다.
2) GPSET, GPCLR
해당 레지스터는 GPIO pin의 data값을 1, 0으로 set하는 레지스터이다.
해당 레지스터를 on 해줌으로써 각 PIN의 값을 1로 혹은 0 으로 셋업할 수 있다.
3) GPLEV
해당 값은 GPIO pin값을 read하는 역할을 수행한다.
4) Event
GPIO pin을 통해서 input, output, 특정 Function역할을 수행한다고 했는데 특정상황에서 input이 발생했고 output이발생했고 혹은 Function을 수행하기 위한 설계를 하는 기본이자 핵심이 바로 voltage의 인가이다.
예를들어 임의의 GPIO PIN x를 clock으로 사용하고자 한다면 clock발생에 따른 인터럽트, 타이머, SPI동작 등을 수행하기위해 clock 발생 시점을 정해야한다.
정리하면 clock pulse가 지속적으로 들어올때 HIGH인 순간에 data를 읽을건지, LOW일 때 읽을건지 아니면 Rising edge, Falling edge등 어느 시점에 데이터를 읽고 쓸건지를 통신하고자 하는 주체와 약속하고 그 방식에 맞게 data를 구분하고 정의한다.
이러한 것을 Event라고하고 GPIO pin setup에서는 위에서 언급한내용과 같이 Event관련된 레지스터를 바탕으로 어느시점에 받을지를 결정해야한다. 예를들어 HIGH일 때 Event를 받을 것인지 LOW, R Egde, F Edge 각각의 순간에 대해서 Event를받을지 말지를 가장 먼저 정해야한다. 해당역할을 하는 레지스터가 각각 GPHEN, GPLEN, GPREN, GPFEN이다 각각의 레지스터 bit값을 설정해줌으로써 해당 PIN은 해당 시점에 Event를 받게된다.
그리고 GPEDS 레지스터를 통해서 우리는 레지스터를 받았는지 여부를 알 수 있다.
코드로 정리해서 다시 설명하면 먼저 위와 같이 HIGH 모드인 경우 즉 voltage값이 들어오고있을 때 데이터를 처리한다고하면 해당 시점에 Event를 받도록 GPIO pin을 설정한다. GPHEN만 값을 1로 셋하고 나머지는 0으로 셋해줌으로써 HIGH인 경우에만 Event를 받도록 설정한다.
그리고 위와같이 GPEDS 값을 while문을 통해서 지속적으로 확인함으로써 Event가 발생하는지 체크한다.
만약 PIN에 voltage가 인가되고 HIGH이된다면 Event가 발생 GPEDS 해당 pin의 bit값이 1로 set되고 우리는 반복문에서 빠져나와 Event가 발생했을때의 Handler fucnction을 수행하도록 구현하면 된다.
- 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 (1) - Barebone code (0) | 2021.08.21 |
[OS] Firmware Project (8) - Event (0) | 2021.08.02 |
[OS] Firmware Project (7) - Task (0) | 2021.07.25 |