HOME TIP & TECH

TIP & TECH

TIP & TECH More information
라즈베리파이 에 SPI LCD 를 통해 macintosh 에뮬레이터 사용하기

onionmixer 2025-04-29 14:32:47 106

 

* https://spotpear.com/index/product/detail/id/1216.html
* https://spotpear.com/index/study/detail/id/985.html

사용한 라즈베리파이 기종은 3b 입니다.

적용하는데 단계는 3단계 정도로 생각하면 됩니다.

첫번째로 SPI LCD 를 연결하고 SPI 출력을 통해 LCD 출력 자체를 확인합니다.

두번째로 fbcp (framebuffer copy) 를 이용해서 xorg(x11) 의 HDMI 화면을 SPI LCD 로 출력합니다.

세번째로 해당되는 환경에 적합한 minivmac 에뮬레이터를 세팅하고 부팅하면 바로 보일 수 있도록 처리합니다.

사용하는 라즈베리파이OS 는 구형OS(32bit) 를 사용해야 합니다. 일반적인 SPI LCD 정도로만 사용할거라면 상관없지만 fbcp 를 사용하려면 DispmanX 를 사용할 수 있어야 하는데, 신형OS 에서는 제약이 있습니다. 구형OS 32bit 사용을 권장합니다. (특히 라즈베리5 부터는 DispmanX 를 사용할 수 없으니 fpcb 를 사용하기 위해서는 라즈베리4 기종정도가 한도임을 주의해야 합니다)


1. SPI LCD 를 연결해보자.

위의 링크에 기본적인 사용방법이 나와있습니다만, 긴단하게 순서를 정리해보자면...

* "raspi-config" 에서 SPI 를 활성화합니다.
* /boot/config.txt 편집을 통해서 파라메터값을 확인합니다.
* "ls /dev/spi*" 를 통해서 장치가 사용가능한 상태인지를 확인합니다.


1.1 BCM2835 드라이버를 설치

다음의 과정을 통해 설치합니다.

wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.71.tar.gz
tar zxvf bcm2835-1.71.tar.gz 
cd bcm2835-1.71/
sudo ./configure && sudo make && sudo make check && sudo make install


1.2 WiringPi 를 설치

WiringPi 는 gpio 라는 프로그램을 제공합니다. 이는 라즈베리파이 에서 gpio pin 을 확인하는 기능을 제공합니다. 설치 방법은 다음과 같습니다.

sudo apt install git
git clone https://github.com/WiringPi/WiringPi.git
cd WiringPi

# build the package
./build debian
mv debian-template/wiringpi-3.0-1.deb .

# install it
sudo apt install ./wiringpi-3.0-1.deb


1.3 lgpio 를 설치

lgpio 는 라즈베리파이에서 gpio 의 데이터제처/처리를 위한 라이브러리 입니다. 다음과 과정을 통해 설치를 진행합니다.

#Open the Raspberry Pi terminal and run the following commands:
wget https://github.com/joan2937/lg/archive/master.zip
unzip master.zip
cd lg-master
sudo make install


1.4 SPI LCD 테스트를 위한 데모 프로그램 설치

데모프로그램은 C 버전과 python 버전이 있습니다. 일단 소스코드를 다운로드 받고 압축을 해제합니다.

sudo apt-get install unzip -y
sudo wget https://files.waveshare.com/upload/8/8d/LCD_Module_RPI_code.zip
sudo unzip LCD_Module_RPI_code.zip 
cd LCD_Module_RPI_code/RaspberryPi/


일단 C 버전부터 컴파일 하고 데모 테스트를 진행합니다. 1.69인치 LCD 테스트이기 때문에 인자를 "1.69" 로 준다는것에 주의해주세요.

cd c
sudo make clean
sudo make -j 3
sudo ./main 1.69

파이선 버전을 실행하기위해 필요한 라이브러리를 설치합니다. 원본문서는 spidev 를 pip 로 설치하지만 apt 로 설치할 수있다는 차이를 기억해주세요.

sudo apt-get install python3-pip
sudo apt-get install python3-pil
sudo apt-get install python3-numpy
sudo apt-get install python3-spidev

위처럼 기본 라이브러리를 설치했으면 python/example 디렉터리로 들어가서 demo 를 실행합니다. demo 는 spi 에 대한 권한문제로 sudo 를 통해 실행할 수 있다는걸 기억해야 합니다. 우리는 1.69 인치 LCD 를 사용하고, linux 는 python3 을 기준으로 사용하기 때문에 아래의 명령어대로 진행하면 됩니다.

sudo python3 1inch69_LCD_test.py

파이선 테스트로 출력되는 화면은 C 버전의 테스트와는 출력되는 내용(이미지)에 차이가 있기 때문에 쉽게 두개 버전간에 차이를 알 수 있습니다.


2. FBCP 설치하기

FBCP 는 위에도 적었습니다만.. framebuffer 의 내용을 gpio 를 통해 spi LCD 로 복사해주는 프로그램입니다. daemon 처럼 백그라운드에 떠 있어야 하는 프로그램입니다. 이 문서에서 사용하고 있는 LCD 는 fbcp-ili9341 기반으로 되어있는듯 하며, 최대 60fps 까지 지원됩니다.

일단 전용으로 만들어진 fbcp 를 컴파일 하기 위해 지금은 제공되지 않는 userland 를 받아옵니다.

sudo apt-get install cmake -y
git clone --recursive https://github.com/raspberrypi/userland.git
cd userland
mkdir build
cd build
cmake ..
make; make install

fbcp 에 필요한 라이브러리들을 설치하고 나면 fbcp 를 다운로드 받아와서 설치합니다.

wget https://files.waveshare.com/upload/1/18/Waveshare_fbcp.zip
unzip Waveshare_fbcp.zip
cd Waveshare_fbcp/
sudo chmod +x ./shell/*

일단 이 문서의 대상은 1.69인치 LCD 이기 때문에 사용해야할 스크립트는 "shell/waveshare-1inch69" 입니다. 다만! 이 쉘스크립트는 그 자체로 스크립트 안쪽에 절대경로가 잡혀 있습니다. 그래서 Waveshare_fbcp.zip 파일을 다른 경로에 풀었다면, 스크립트 내의 경로를 보다 알맞는 경로로 수정해 줘야 합니다.

스크립트 내의 경로수정이 끝났다면 다음의 명령어를 통해 초기 컴파일을 진행해 줍니다.

sudo ./shell/waveshare-1inch69

일단 컴파일이 진행되면 build 디렉터리에 fbcp 바이너리가 생성됩니다.

fbcp 는 컴파일 이전의 cmake 시점에서 DMA 의 사용여부를 결정할 수가 있습니다. build 디렉터리에서 안쪽의 파일을 모두 지운다음 다음의 commane line 을 참고해 주세요.

##DMA
cmake -DUSE_DMA_TRANSFERS=ON -DDMA_TX_CHANNEL=0 -DDMA_RX_CHANNEL=5 -DSPI_BUS_CLOCK_DIVISOR=20 -DSTATISTICS=0 -DWAVESHARE_1INCH69_LCD=ON -DBACKLIGHT_CONTROL=ON  ..

##NODMA
cmake -DUSE_DMA_TRANSFERS=OFF -DSPI_BUS_CLOCK_DIVISOR=20 -DSTATISTICS=0 -DWAVESHARE_1INCH69_LCD=ON -DBACKLIGHT_CONTROL=ON ..

첫번째 line 은 DMA 를 사용하는 경우를 의미합니다. DMA 를 사용하지 않는다고 해도 에뮬레이터정도를 돌리는데는 큰 성능차이가 없습니다. 다만 동영상 출력의 경우는 차이가 좀 있으니 향후 활용도를 생각하면 DMA 는 사용하는쪽이 좋습니다. -DSPI_BUS_CLOCK_DIVISOR 값은 느슨하게 가려면 30이상, 좀 타이트하게 가려면 20 정도를 사용하는게 좋다고 합니다...

-DSTATISTICS 값은 모니터링 용도로 LCD 에 overlay 에 내용출력되는 여부에 대한 값입니다. 0은 출력안함, 1은 출력함입니다.

일단 이런 기준으로 컴파일을 해두고 fbcp 를 실행하면 hdmi 로 출력되는 화면을 SPI LCD 에서 볼 수 있습니다.

SPI LCD 를 사용하기 위해서는 /boot/config.txt 파일에 수정해야 할 부분이 필요합니다.

edit::/boot/config.txt
==========================
#dtoverlay=vc4-fkms-v3d //주석처리
#max_framebuffers=2 //주석처리
...
[all]
gpu_mem=128
#dtparam=spi=on
hdmi_force_hotplug=1
max_usb_current=1
hdmi_group=2
hdmi_mode=1
hdmi_mode=87
#hdmi_cvt 640 480 60 6 0 0 0
hdmi_cvt 512 360 60 6 0 0 0
hdmi_drive=2
display_rotate=0
==========================

일단 이 정도를 입력하고 재부팅 한 다음에 fbcp 를 사용하면 됩니다.

위의 내용에서 참고할 부분이 읐습니다.

* hdmi_force_hotplug=1 : 무조건적으로 HDMI 가 꼽혀있는 것으로 처리합니다.
* #dtparam=spi=on : fbcp 를 사용할때는 spi 사용을 off 시켜둡니다.
* hdmi_cvt : 뒤부분에 적히는게 해상도와 refresh 입니다. 단 위의 예제처럼 512x360 등을 사용하면 에뮬레이터용으로는 충분히 쓸만하지만 정작 HDMI 모니터를 꼽았을때, 그쪽으로는 정상적으로 화면출력이 되지 않는다는걸 참고해야 합니다.


3. macintosh 를 위한 에뮬레이터. minivmac 사용

일반적으로는 picomac 이라는 프로그램의 경우 특정 LCD 에 맞는 SPI 출력을 기본으로 하고 있습니다. 다만 제가 프로그래머가 아닌지라 picomac 의 소스코드를 뜯어 알맞게 처리하기도 힘들뿐더러 fbcp 의 동작은 라즈베리파이의 framebuffer 를 spi 를 통해 고속복사를 하는게 핵심인데.. 그렇게 하려면 차라리 spi 를 제어하는것보다는 차라리 xorg 에서 동작하는 에뮬레이터가 필요했습니다. 차라리 minivmac 을 사용하는게 맞다고 생각합니다. (그리고 이 방식대로라면 macintosh 가 아닌 다른 에뮬레이터도 linux/xorg 에서 동작한다면 충분히 사용가능하다는 점이 장점이죠.

여튼! minivmac 은 gnu make 또는 cmake 등을 사용하지 않습니다. 자체적으로 별도의 독특한 빌드 시스템을 사용합니다.


일단 소스코드를 받고 압축을 해제합니다.

wget https://www.gryphel.com/d/minivmac/minivmac-36.04/minivmac-36.04.src.tgz
cd minivmac

디렉터리 안에서 컴파일을 위한 세팅툴을 컴파일하고. 세팅을 진행합니다. 컴파일 툴의 이름은 "setup_tool" 로 지정합니다. 컴파일툴을 컴파일하고 minivmac 을 컴파일하기 위한 설정값을 준비합니다.

gcc setup/tool.c -o setup_tool
echo "-t larm -m 512Ke -hres 620 -vres 465 -depth 0 -fullscreen 1 -sound 0 -mem 1M" > setup/CONFIGUR.i

echo 에서 사용되는 설정값에 대한 자세한 내용은 다음의 URL 에서 확인할 수 있습니다.

* https://www.gryphel.com/c/minivmac/options.html

이제 설정값을 적용하고 컴파일을 진행해 보겠습니다.

./setup_tool -t larm > setup.sh
bash setup.sh
make -j3

컴파일을 진행하면 결과물로 minivmac 이라는 실행가능한 바이너리가 만들어집니다. 여기서 잠깐의 작업을 해주시는 것이 좋습니다. raspi-config 에서 부팅시에 X 가 아닌 콘솔에 자동로그인이 되도록 설정해줍니다.

이렇게 설정한다음 라즈베리파이의 콘솔에서 다음과 같은 쉘스크립트를 하나 만들어줍니다.

edit::osrun.sh
#!/bin/sh
sudo fbcp &
sleep 5
sudo startx ./minivmac -r vMac.ROM DEMO.dsk

위의 스크립트에 보이는 ROM 파일과 dsk 파일은 인터넷에서 구해주도록 합니다. ROM 파일은 다음의 URL 에서 구하는게 조금 더 편합니다.

* https://github.com/nyteshade/mini-vmac-setup/tree/master

일단 다른 x-windows 가 뜨지 않고, minivmac 이 full screen 으로 동작하는걸 확인한 이후.. 저는 이렇게 처리했습니다. exit 0 위에 다음의 위의 script 를 넣어줍니다.

=============================
edit::/etc/rc.local

/root/minivmac/osrun.sh
=============================

자.. 이제 재부팅해서 바로 minivmac 의 화면으로 진입한다면 성공입니다. 단 fbcp 를 사용하면 한가지 단점이 있습니다. 일정 시간이 지나면 화면에 움직임이 없는데.. 이는 라즈베리파이의 gpu driver 가 hardware cursor 를 지원히지 않기 때문입니다. 이때 키보드등을 이용해서 alt+i(info) 등으로 화면에 일정 크기 이상의 큰 변화가 생기면 이후부터는 다시 마우스 커서를 볼 수 있습니다.

====================================

etc1. fbcp-ili9341 를 컴파일할때 사용할 cmake command line

정보 : https://github.com/juj/fbcp-ili9341/pull/242

cmake -DST7789VW=ON -DUSE_DMA_TRANSFERS=ON -DGPIO_TFT_DATA_CONTROL=25 -DGPIO_TFT_RESET_PIN=27 -DSPI_BUS_CLOCK_DIVISOR=40 -DBACKLIGHT_CONTROL=ON -DDMA_TX_CHANNEL=0 -DDMA_RX_CHANNEL=5 -DSTATISTICS=0 -DDISPLAY_ROTATE_180_DEGREES=ON -DDISPLAY_BREAK_ASPECT_RATIO_WHEN_SCALING=ON ..

cmake -DST7789VW=ON -DUSE_DMA_TRANSFERS=OFF -DGPIO_TFT_DATA_CONTROL=25 -DGPIO_TFT_RESET_PIN=27 -DSPI_BUS_CLOCK_DIVISOR=40 -DBACKLIGHT_CONTROL=ON -DSTATISTICS=0 -DDISPLAY_ROTATE_180_DEGREES=ON ..

아래는 1.69인치 LCD 를 gpio 에 꼽은 pin map 을 기반으로 한 fbcp-ili9341 의 cmake 컴파일시 사용할 값입니다. 단 fbcp-ili9341 로 컴파일한 경우 fbcp 의 출력이 LCD vender 에서 제공받은것과는 조금 다르게 동작합니다.

* GPIO_TFT_DATA_CONTROL=25
* GPIO_TFT_RESET_PIN=27
* SPI_BUS_CLOCK_DIVISOR=20

 

 

댓글 0개

Previous / Next
Next cisco cp-7821 전화기의 ssh 사용에 대한 몇가지 참고사항