Frimware OS에서 입출력을 위해 uart에 대하여 보기전에 세상에는 수 많은 H/W가 존재하고 OS는 이러한 여러 H/W를 호환할 수 있어야한다.
때문에 라즈베리파이를 사용하는가, realviewPB를 사용하는가 등 다양한 H/W에 대한 입출력 코드를 작성해야 한다.
이는 H/W에 종속적인 부분으로 반드시 내가 사용하고자하는 H/W에 맞춰야한다.
보통의 경우 H/W chipset을 개발하는쪽에서 H/W chipset에 맞춰 구현을 하기는 하나 결과적으로 OS에서 모든 H/W를 호환하기 위해서는
공용으로 사용하는 java의 interface와 같은 역할이 필요하다.
이러한 H/W제어를 위한 공용 interface역할을 하는 것을 HAL이라고 한다. 각 H/W vendor사는 OS의 HAL에 호환되도록 각자 H/W고유의 입출력코드를 작성하고 OS와 매칭한다.
1. 라즈베리파이 입출력(UART) 레지스터
가장먼저 라즈베리파이 입출력을 제어하기위해서는 라즈베리파이의 Uart 레지스터에 대해서 알아야한다.
결국 입출력이란 레지스터들을 이용한 data의 이동이기 때문에 Uart(입출력)에 사용하는 라즈베리파이의 레지스터를 모두 메모리에 매핑시켜줘야 한다.
-> 간단히 정리하면 라즈베리파이 Uart가 사용하는 메모리 주소값, 레지스터들을 조사한 뒤 이전 동작 모드에 따른 메모리 맵핑을 해주었던것과 동일한 방식으로 각각의 Uart 레지스터를 라즈베리파이가 Uart로 사용하는 메모리주소에 맵핑해줘야 한다.
위는 라즈베리파이3 BCM2835 chipset에 대한 UART, SPI register map의 정보다 위와 같이 chipset 별로 spec을 보면 해당 레지스터가 존재하는 주소값을 나타내고있고 Firmware개발자 입장에서는 UART, Register를 사용하기위해 해당 주소값을 접근해서 입출력 및 데이터의 전달을 진행한다.
2. Hal 구현
라즈베리파이 메모리 주소 맵핑한 코드를 HAL 코드에 연결해주어야 한다.
결과적으로 입출력을 하기위한 함수는 HAL에 선언되어있으며 외부에서는 HAL에 존재하는 함수를 호출함으로써 입출력을 진행한다.
하지만 이 HAL에 선언된 함수들의 정의부분은 각 H/W vendor사에서 H/W에 맞춰 제작한 코드에 정의되어 있다.
예를들어 라즈베리파이의 경우라면 라즈베리파이의 UART 레지스터가 메모리에 맵핑된 값들을 바탕으로 입출력 기능을 정의하고 해당 기능을 HAL에서 선언함으로써 외부에서는 HAL 함수 호출만으로 라즈베리파이의 입출력을 진행할 수 있다.
<때문에 빌드 과정에서 H/W가 어떤것인지 판단하고 해당 H/W .c파일과 HAL파일을 연결해줘야 한다.>
- ref
임베디드 OS 만들기
'OS > Firmware Project' 카테고리의 다른 글
[OS] Firmware Project (7) - Task (0) | 2021.07.25 |
---|---|
[OS] Firmware Project (6) - Interrupt (0) | 2021.07.17 |
Firmware Project (4) - Memory Set (0) | 2021.06.20 |
[OS] Firmware Project (3) - ELF & SYS_ID (0) | 2021.06.13 |
[OS] Firmware Project (2) - ARM Exception & Mode (0) | 2021.06.13 |