class DSIDisplay – DSI 디스플레이 드라이버

DSIDisplay 클래스는 STM32 DSI 호스트 컨트롤러를 통해 MIPI-DSI 패널을 구동합니다. MIPI DSI는 하나의 클록 레인과 하나 이상의 데이터 레인을 차동 쌍으로 사용하는 패킷화된 직렬 디스플레이 프로토콜로, 24비트 병렬 RGB보다 훨씬 적은 배선으로 고해상도 콘텐츠(최대 1080p)를 전달할 수 있습니다. 픽셀은 선택한 재생률로 SDRAM 기반 프레임버퍼에서 직접 스트리밍되므로 CPU는 갱신에 관여하지 않습니다.

패널 해상도는 display 모듈의 상수(QVGA, VGA, HD, FHD 등)를 사용하여 framesize 로 선택합니다. 패널별 초기화 시퀀스는 controller 키워드 인자를 통해 연결됩니다 – ST7701 은 일반적인 ST7701 기반 480x800 DSI 패널을 다룹니다. DCS 명령은 bus_write() / bus_read() 를 통해 대역 외로 실행할 수 있습니다. 백라이트 밝기는 기본적으로 단순 GPIO로 구동되며, backlight 로 전달되면 DACBacklight / PWMBacklight 로 구동됩니다.

프레임은 image.Image 와 함께 write() 를 호출하여 표시됩니다. 드라이버는 RGB 변환, 스케일링, ROI, 팔레트 및 방향 변환을 내부적으로 처리합니다.

예제 – ST7701 기반 480x800 DSI 패널에 카메라 화면을 미러링합니다:

import csi
import display
import image

csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)

lcd = display.DSIDisplay(framesize=display.TFWVGA,
                         controller=display.ST7701())

while True:
    lcd.write(csi0.snapshot(), hint=image.SCALE_ASPECT_KEEP)

생성자

class display.DSIDisplay(framesize: int = FWVGA, *, refresh: int = 60, display_on: bool = True, triple_buffer: bool = True, portrait: bool = False, channel: int = 0, controller: Any | None = None, backlight: Any | None = None)

framesize 표준 지원 해상도 중 하나입니다(예: display.FWVGA).

refresh 화면 재생률을 헤르츠 단위로 설정합니다. 유효 범위는 30에서 120까지입니다. 이는 DSI LCD 클록을 제어합니다.

display_on 디스플레이를 활성화합니다.

triple_buffer 화면 갱신 시 테어링 없는 업데이트를 위해 세 개의 프레임버퍼를 할당합니다. write() 에서 수직 뒤집기를 사용하려면 필요합니다.

portrait framesize의 너비와 높이를 맞바꿉니다.

channel 디스플레이와 통신하는 데 사용할 가상 MIPI DSI 채널입니다.

controller 디스플레이와 함께 초기화할 컨트롤러 칩 클래스를 여기에 전달합니다. 예: MIPI DSI 디스플레이용 표준 디스플레이 컨트롤러인 display.ST7701().

backlight 사용할 백라이트 컨트롤러 모듈을 지정합니다. 기본적으로 백라이트는 GPIO 핀을 통해 제어됩니다.

deinit() None

이 클래스가 사용한 I/O 핀과 RAM을 해제합니다. 소멸 시 자동으로 호출됩니다.

width() int

화면의 너비를 반환합니다.

height() int

화면의 높이를 반환합니다.

triple_buffer() int

트리플 버퍼링이 활성화되어 있는지 여부를 반환합니다.

bgr() int

디스플레이가 BGR 순서의 픽셀을 기대하는지 여부를 반환합니다.

byte_swap() int

디스플레이가 바이트 스왑된 픽셀을 기대하는지 여부를 반환합니다.

framesize() int

디스플레이가 초기화된 framesize 상수를 반환합니다.

refresh() int

재생률을 헤르츠 단위로 반환합니다.

write(image: image.Image, x: int = 0, y: int = 0, x_scale: float = 1.0, y_scale: float = 1.0, roi: Tuple[int, int, int, int] | None = None, rgb_channel: int = -1, alpha: int = 255, color_palette: image.Image | None = None, alpha_palette: image.Image | None = None, hint: int = 0) None

왼쪽 상단 모서리가 위치 x, y 에서 시작하는 image 를 표시합니다.

image 는 디스크에서 이미지를 자동으로 불러오기 위해 이미지 객체 대신 경로 문자열일 수 있습니다. 예: write("test.jpg").

x_scale 은 표시되는 이미지가 x 방향으로 얼마나 스케일링되는지를 제어합니다(float). 이 값이 음수이면 이미지가 수평으로 뒤집힙니다. y_scale 이 지정되지 않으면 가로세로 비율을 유지하기 위해 x_scale 과 일치합니다.

y_scale 은 표시되는 이미지가 y 방향으로 얼마나 스케일링되는지를 제어합니다(float). 이 값이 음수이면 이미지가 수직으로 뒤집힙니다. 수직 뒤집기에는 triple_buffer=True 가 필요합니다. x_scale 이 지정되지 않으면 y_scale 과 일치합니다.

roi 는 표시할 이미지의 관심 영역 사각형 튜플(x, y, w, h)입니다.

rgb_channel 은 RGB565 이미지에서 추출하여 그레이스케일로 디스플레이에 렌더링할 RGB 채널(0=R, 1=G, 2=B)입니다. -1 은 추출을 비활성화합니다. 유효 범위는 -1에서 2까지입니다.

alpha 는 이미지의 불투명도를 제어합니다. 255는 불투명한 이미지를 표시하고, 더 낮은 값은 검은색 쪽으로 블렌딩하며, 0은 완전히 검은 이미지를 생성합니다. 유효 범위는 0에서 255까지입니다.

color_palette 는 색상 팔레트 열거형이거나 입력 이미지의 그레이스케일 값에 대한 색상 룩업 테이블로 사용할 256 픽셀 RGB565 이미지일 수 있습니다. rgb_channel 추출 후에 적용됩니다.

alpha_palette 는 입력 픽셀의 그레이스케일 값마다 alpha 를 변조하는 알파 룩업 테이블로 사용되는 256 픽셀 그레이스케일 이미지일 수 있습니다. rgb_channel 추출 후에 적용됩니다.

hint 는 다음 플래그들의 논리 OR입니다:

  • image.AREA: 기본값인 최근접 이웃 대신 다운스케일링 시 영역 스케일링을 사용합니다.

  • image.BILINEAR: 기본값인 최근접 이웃 스케일링 대신 양선형 스케일링을 사용합니다.

  • image.BICUBIC: 기본값인 최근접 이웃 스케일링 대신 양3차 스케일링을 사용합니다.

  • image.CENTER: 디스플레이에 그려지는 이미지를 중앙에 배치합니다. 이는 스케일링 후에 적용됩니다.

  • image.HMIRROR: 이미지를 수평으로 미러링합니다.

  • image.VFLIP: 이미지를 수직으로 뒤집습니다.

  • image.TRANSPOSE: 이미지를 전치합니다(x/y 맞바꿈).

  • image.EXTRACT_RGB_CHANNEL_FIRST: 스케일링 전에 rgb_channel 추출을 수행합니다.

  • image.APPLY_COLOR_PALETTE_FIRST: 스케일링 전에 색상 팔레트를 적용합니다.

  • image.SCALE_ASPECT_KEEP: 그려지는 이미지를 디스플레이 안에 맞도록 스케일링합니다.

  • image.SCALE_ASPECT_EXPAND: 그려지는 이미지를 디스플레이를 채우도록 스케일링합니다(잘림 발생).

  • image.SCALE_ASPECT_IGNORE: 그려지는 이미지를 디스플레이를 채우도록 스케일링합니다(늘어남 발생).

  • image.ROTATE_90: 이미지를 90도 회전합니다(이는 VFLIP | TRANSPOSE와 동일).

  • image.ROTATE_180: 이미지를 180도 회전합니다(이는 HMIRROR | VFLIP와 동일).

  • image.ROTATE_270: 이미지를 270도 회전합니다(이는 HMIRROR | TRANSPOSE와 동일).

clear(display_off: bool = False) None

LCD 프레임버퍼를 검은색으로 지웁니다.

display_off 가 True이면 프레임버퍼를 지우는 대신 디스플레이 로직을 끕니다.

backlight(value: int | None = None) int

LCD 백라이트 디밍 값을 0(끔)에서 100(켬)까지 설정합니다. 인자를 전달하지 않으면 현재 백라이트 값을 가져옵니다.

DACBacklight 또는 PWMBacklight 컨트롤러가 생성자에 전달되지 않는 한, 백라이트는 GPIO 핀으로 제어되며 0(끔)에서 0이 아닌 값(켬)으로만 전환됩니다.

bus_write(cmd: int, args: int | bytes | None = None, *, dcs: bool = False) None

디스플레이에 DSI 명령 cmd 를 보냅니다.

args 는 명령 파라미터를 담은 선택적 정수 또는 버퍼입니다.

dcs 가 True이면 명령을 DCS(Display Command Set) 패킷으로 보냅니다.

bus_read(cmd: int, len: int, args: int | bytes | None = None, *, dcs: bool = False) bytes

DSI 명령 cmd 를 사용하여 디스플레이에서 len 바이트를 읽습니다.

args 는 명령 파라미터를 담은 선택적 정수 또는 버퍼입니다.

dcs 가 True이면 명령을 DCS(Display Command Set) 패킷으로 보냅니다.

ioctl(cmd: int, arg: Any | None = None) Any

선택적 arg 와 함께 드라이버별 ioctl cmd 를 디스플레이에 보냅니다. 디스플레이가 ioctl을 지원하지 않으면 ValueError 를 발생시킵니다.