본문 바로가기

전자공학을 즐겁게/누구나 취미전자공학

라즈베리 파이의 Device Tree Overlay와 UART 하드웨어 흐름제어 사용하기

728x90
반응형

라즈베리 파이에 대하여 조금이라도 공부한 사람들은 40핀 헤더가 GPIO를 모아 놓은 것이라는 것을 모르는 사람은 없습니다. GPIO는 앞선 포스트에서 다룬 것과 같이 HIGH나 LOW의 디지털 논리 신호를 입출력하는 임베디드 프로세서의 단자입니다. 

라즈베리 파이 40핀 헤더의 GPIO 배치도

 
이들 GPIO 단자를 단순한 디지털 논리 신호의 입출력 이외의 기능으로 사용하기도 하는데, 원래 가지고 있던 입출력 신호 대신 다른 기능들로 사용할 수 있도록 하는 것을 GPIO의 Alternate Function이라고 합니다.
 

GPIO Alternate Function

임베디드 프로세서의 데이터 시트나 사용자 매뉴얼을 보면 보통 GPIO에 대하여 하나의 장에 걸쳐 설명하면서 Alternate Function에 대하여 설명하는 표 또는 섹션이 있습니다. 라즈베리 파이 4 모델 B에 사용된 BCM2711의 데이터 시트를 보아도 이 Alternate Function에 대하여 기술하는 부분을 찾을 수 있습니다.

BCM2711 데이터시트의 GPIO Alternate Function Assignments 표

 
위 표에서 보는 것과 같이 GPIO0는 본연의 GPIO 기능 외에 5가지의 기능으로 사용될 수 있습니다. 만약 이 GPIO0가 ALT4의 기능으로 사용되도록 설정이 된다면, GPIO0는 그때부터 GPIO0가 아닌 TXD2, 즉 UART2의 TXD로 사용이 된다는 의미이고, 이 단자는 임베디드 프로세서의 내부적으로는 UART 페리패럴로 연결이 됩니다. 이것은 임베디드 프로세서에서 GPIO를 제어하는 레지스터들에 의하여 설정이 되는 부분이고, 보통의 경우에는 커널에 설정되는 부분이지만, 라즈베리 파이 OS의 경우에는 Device Tree Overlay라는 것을 사용하여 설정할 수 있습니다.
 

Device Tree Overlay

라즈베리 파이에서는 하드웨어 자원을 기술하는 방법으로 Device Tree라는 것을 사용합니다. 커널에 포함되어 있는 하드웨어 드라이버들에 대하여 기술하고 있는 것이라고 볼 수 있을 것 같은데, 이 Device Tree가 어떤 드라이버가 필요한지를 결정하게 됩니다. 이 Device Tree를 필요에 따라 동적으로 설정을 변경할 수 있도록 해 주는 것이 Device Tree Overlay입니다.
라즈베리 파이에서 제공되는 여러 Device Tree Overlay에 관련한 파일이 /boot/firmware/overlays에 모여 있습니다.

ls /boot/firmware/overlays

 
각각의 overlay가 어떤 역할을 하는 것인지는 dtoverlay라는 커맨드를 사용하여 확인할 수 있습니다.

dtoverlay -h <overlay 이름>

 
다음 스크린 샷은 disable-bt라는 overlay가 하는 역할을 알아보기 위한 명령입니다.

disable-bt overlay의 help 메시지. 블루투스를 비활성화하고 UART0를 GPIO14와 GPIO15에 할당한다고 되어 있습니다.

 
이 overlay를 적용하기 위해서는 /boot/firmware/config.txt를 수정하여 다음 명령을 추가하고 재부팅을 하면 됩니다.

dtoverlay=disable-bt

 
/boot/firmware/config.txt를 수정할 때에는 vi, vim, nano 등의 원하는 텍스트 편집기를 사용하면 되는데, 대신 sudo를 사용하여야 합니다.

sudo nano /boot/firmware/config.txt

 
다음 스크린 샷처럼 될 것입니다.

마지막 줄에 "dtoverlay=disable-bt"를 추가합니다.

 
/boot/firmware/config.txt를 수정했으면 반드시 라즈베리 파이를 재부팅하여 수정한 내용이 적용되도록 해 주어야 합니다.
 

Device Tree Overlay를 이용하여 UART2 활성화하기

라즈베리 파이에는 기본적으로 Primary UART와 Secondary UART를 정의하고 있고, 사용자가 raspi-config 또는 Raspberry Pi Configuration GUI를 사용하여 Primary UART를 활성화 또는 비활성화할 수 있도록 하고 있습니다. 바로 이전 포스트가 이것에 대한 내용이었죠.
하지만, 라즈베리 파이는 여러 UART를 가지고 있습니다. 라즈베리 파이 4 모델 B에 사용된 BCM2711의 데이터 시트를 보아도 총 6개의 UART를 사용할 수 있다는 것을 알 수 있습니다.
 

 
raspi-config를 통해서는 하나의 UART만을 활성화/비활성화할 수 있지만, 라즈베리 파이 OS는 이미 커널에 나머지 UART의 하드웨어 드라이버를 포함하고 있고, Device Tree Overlay를 사용하여 활성화/비활성화 가능하도록 되어 있습니다.
/boot/firmware/overlays 디렉터리에 uart로 시작하는 overlay를 살펴보세요.

ls /boot/firmware/overlays/uart*

 
그리고, 각각이 어떤 역할인지 도움말을 확인해 보세요.

dtoverlay -h uart2

 

uart2 overlay의 help. UART2를 활성화하고, 하드웨어 흐름제어도 사용할 수 있습니다.

 
uart2 overlay는 라즈베리 파이 OS에서 Primary UART와 Secondary UART에는 바로 설정할 수 없는 하드웨어 흐름제어까지 설정할 수 있도록 되어 있습니다. 만약 하드웨어 흐름제어를 필요로 하는 어플리케이션을 하고자 한다면 UART2를 활성화하여 사용하는 것이 좋은 생각일 것 같습니다.
 
uart2는 GPIO Alternate Function 표에 나와 있는 것과 같이 GPIO0, GPIO1, GPIO2, GPIO3을 사용하게 됩니다. 

UART2는 GPIO0-3를 통하여 사용할 수 있습니다.

 
/boot/firmware/config.txt의 마지막에 다음 명령을 추가하면, 하드웨어 흐름제어를 사용하는 UART2를 활성화시킬 수 있습니다.

dtoverlay=uart2,ctsrts

 

 
일련의 과정은 동영상으로 만들어 보았습니다.
https://youtu.be/NeSj-wzDDzQ

 
다른 하드웨어에 대해서도 Device Tree Overlay를 살펴보고, 활용해 보세요.
 
[참고] https://www.raspberrypi.com/documentation/computers/configuration.html#device-trees-overlays-and-parameters

728x90
반응형