다음을 통해 공유


DXGKDDI_DSITRANSMISSION 콜백 함수(dispmprt.h)

DxgkddiDsiTransmission 콜백 함수는 DSI(표시 직렬 인터페이스) 전송을 수행합니다.

통사론

DXGKDDI_DSITRANSMISSION DxgkddiDsitransmission;

NTSTATUS DxgkddiDsitransmission(
  [in]  HANDLE Context,
  [in]  D3DDDI_VIDEO_PRESENT_TARGET_ID TargetId,
  [out] PDXGK_DSI_TRANSMISSION pArgs
)
{...}

매개 변수

[in] Context

[in] TargetId

모니터의 대상 식별자입니다.

[out] pArgs

DXGI_DSI_TRANSMISSION 구조체에 대한 포인터입니다.

반환 값

DxgkddiDsiTransmission 성공하면 STATUS_SUCCESS 반환합니다. 그렇지 않으면 Ntstatus.h정의된 오류 코드 중 하나를 반환합니다.

발언

OEM 패널 드라이버가 그래픽 어댑터와 패널 하드웨어 간의 다른 프라이빗 인터페이스를 통해 상호 작용할 수 있도록 하려면 트랜잭션에 버스가 차지하는 시간 이외의 그래픽 드라이버 효과가 없거나 그래픽 드라이버가 제어되도록 완전히 정의되어야 합니다. OEM 패널 드라이버가 상호 작용할 수 있도록 하는 점은 그래픽 드라이버에 불투명한 사용자 지정 패널 기능을 지원하는 것이므로 완전히 정의된 작업은 패널 드라이버가 그래픽 드라이버의 개입 없이는 수행할 수 없는 표준화된 작업을 수행해야 하는 트랜잭션으로 제한됩니다. 이러한 트랜잭션은 전송이 아닌 명시적으로 라우팅되는 예외로 처리됩니다.

각 DSI 전송 요청은 OEM 패널 드라이버로 채워지고, 모니터 스택 아래로 전달되고, 전송 결과(있는 경우)와 함께 반환되는 단일 버퍼로 구성됩니다. 버퍼에는 입력 및 출력 필드와 DXGK_DSI_PACKET 구조의 변수 크기 배열이 포함된 전송에 대한 전체 정보가 포함됩니다. 패킷은 DSI 용어로 설명되므로 모든 DSI 패킷을 설명할 수 있지만 OS는 패킷을 구문 분석하고 허용되지 않는 패킷을 포함하는 모든 전송을 거부합니다. 마지막을 제외한 모든 패킷은 DSI 정의에 의해 짧은 쓰기일 수 있는 쓰기 패킷이며, 이 경우 Payload 버퍼는 사용되지 않거나 Payload 버퍼 내에 맞는 긴 쓰기입니다. 읽기 또는 쓰기일 수 있는 전송의 마지막 패킷은 64K-1 데이터 바이트의 DSI 긴 패킷 데이터 제한까지 모든 크기의 읽기 또는 쓰기 공간을 허용하는 더 큰 버퍼를 할당하고 설명하여 확장 페이로드를 사용할 수 있습니다. 이렇게 하면 작은 쓰기 패킷 시퀀스를 단일 호출로 드라이버에 큐에 대기할 수 있지만 더 큰 패킷을 개별적으로 전송해야 합니다. FinalPacketExtraPayload 필드의 값은 할당된 추가 바이트 수를 나타내지만 TotalBufferSize 필드에서도 고려해야 합니다.

OEM 패널 드라이버는 요청된 전송이 과도한 요청 또는 요청 작업으로 인해 다른 전송 처리가 지연될 수 있으므로 그래픽 드라이버가 패널과의 정상적인 상호 작용에 사용하는 다른 전송과 충돌하거나 방해하지 않도록 해야 합니다. 패널 드라이버는 예를 들어 MCS 명령을 통해 패널 타이밍을 변경하는 등 그래픽 드라이버에서 후속 오류를 발생시키는 상태를 변경해서는 안 됩니다. 마찬가지로 OS가 그래픽 드라이버를 통해 디스플레이 변경(예: 밝기 증가)을 요청한 경우 패널 드라이버는 DSI 명령을 사용하여 응답 또는 다른 용도로 해당 변경 내용을 실행 취소하지 않아야 합니다.

IOCTL_MIPI_DSI_TRANSMISSION 하나 이상의 DSI 패킷을 포함하는 주변 장치로 전송을 요청하는 데 사용됩니다. 패널 드라이버는 항상 각 패킷의 TotalBufferSize, PacketCount 및 처음 3바이트를 초기화해야 합니다. 패널 드라이버는 TransmissionMode, ReportMipiErrors, ClearMipiErrors, SecondaryPort, ManufacturingModeFinalCommandExtraPayload대해 0이 아닌 값을 사용하여 기본 동작을 재정의할 수 있습니다. 초기화되지 않은 모든 값은 0으로 설정해야 합니다.

OS는 정의된 모든 필드에 유효한 정보와 올바른 버퍼 크기를 사용하여 DSI 패킷의 시퀀스가 올바른 형식인지 확인합니다. OS는 DXGK_DSI_INVALID_PACKET_INDEX 위해 FailedPacket 필드를 초기화하여 OS 또는 드라이버의 추가 유효성 검사가 특정 패킷에 문제가 있는 경우에만 필드를 설정해야 합니다. DXGK_DSI_TRANSMISSION 잘 구성되지 않은 경우 OS는 HostErrors 필드에 DXGK_HOST_DSI_INVALID_TRANSMISSION 플래그를 설정하여 잘못된 다른 매개 변수 오류와 구분합니다.

올바른 형식으로 간주하려면 다음이 모두 true여야 합니다.

  • TotalBufferSize >= sizeof(DXGK_DSI_TRANSMISSION) + ((PacketCount - 1) * sizeof(DXGK_DSI_PACKET)) + FinalPacketExtraPayload
  • FinalPacketExtraPayload <= 64K-1-DXGK_DSI_PACKET_EMBEDDED_PAYLOAD_SIZE(0xFFF7)
  • TotalBufferSize <= ROUND_TO_PAGES( sizeof(DXGK_DSI_TRANSMISSION) + (0xFE * sizeof(DXGK_DSI_PACKET)) + 0xFFF7 )
  • PacketCount != 0
  • 마지막 패킷만 읽기가 허용됩니다.
  • 마지막 긴 쓰기 패킷만 [DXGK_DSI_PACKET_EMBEDDED_PAYLOAD_SIZE]보다 큰 LongWriteWordCount 값을 가질 수 있습니다.

패킷 유효성 검사

OS는 모든 패킷의 콘텐츠의 유효성을 완전히 검사하지는 않지만 다음 이외의 DSI 명령이 포함된 전송을 거부하고 그래픽 드라이버를 호출하지 않고 IOCTL을 완료합니다.

데이터 형식 값 묘사
0x03 제네릭 짧은 쓰기, 매개 변수 없음
0x13 제네릭 Short WRITE, 매개 변수 1개
0x23 제네릭 짧은 쓰기, 매개 변수 2개
0x04 제네릭 READ, 매개 변수 없음
0x14 일반 READ, 1개 매개 변수
0x24 제네릭 READ, 매개 변수 2개
0x05 DCS 짧은 쓰기, 매개 변수 없음
0x15 DCS Short WRITE, 1 매개 변수
0x06 DCS READ, 매개 변수 없음
0x29 제네릭 긴 쓰기
0x39 DCS 긴 쓰기/write_LUT

일반 읽기 및 쓰기 명령은 패널 사양을 이해해야 하므로 버스가 과도하게 사용되지 않는 한 그래픽 드라이버에 문제를 일으키지 않고 패널 드라이버에서 이러한 명령을 자유롭게 사용할 수 있습니다. 마찬가지로 DCS MCS 명령은 제조업체 사용을 위해 명시적으로 정의되므로 그래픽 드라이버와 패널 드라이버 간의 간섭에 문제가 없어야 합니다.

DCS UCS의 경우 정의되지 않은 명령은 그래픽 드라이버에서 사용할 것으로 예상되지 않으므로 OS는 향후 MIPI-DCS 사양 변경으로 인해 MCS 명령이 선호될 위험이 분명히 있지만 패널 드라이버에서 사용할 수 있습니다.

표준화된 DCS UCS 명령은 일반 작업 중에 그래픽 드라이버에서 사용되며 패널 드라이버에서 사용할 수 있으므로 OEM 패널 드라이버에서 보낸 명령의 위험으로 인해 후속 그래픽 드라이버 명령에 문제가 발생할 수 있습니다. 이를 위해 OS는 DCS 명령을 구문 분석하고 OEM 패널 드라이버가 ManufacturingMode 플래그를 설정하고 OS가 시스템이 제조 모드임을 확인하지 않는 한 충돌을 일으킬 것으로 예상되는 패킷을 거부합니다. 플래그가 설정되어 있지만 시스템이 제조 모드가 아닌 경우 그래픽 드라이버를 호출하지 않고 HostErrors 필드에 설정된 DXGK_HOST_DSI_INVALID_TRANSMISSION 플래그로 전송 IOCTL이 완료됩니다.

전송을 사용하는 대신 완전히 정의된 트랜잭션이 필요한 조건은 다음과 같습니다.

  • 시간 제한 유휴 기간은 DCS soft_reset 같은 전후에 필요합니다.
  • DCS set_vsync_timing 및 enter_sleep_mode 같은 프레임 출력에 대한 운영 환경 변경
  • 그래픽 드라이버가 DCS write_memory_start/write_memory_continue 같은 데이터에 액세스해야 할 수도 있는 시작/계속 의미 체계가 있는 트랜잭션 사용

또한 전송으로 전송될 때 OS에서 거부되는 DCS 명령 클래스가 있습니다.

  • 위에서 설명한 대로 완전히 정의해야 하는 모든 명령
  • 화면 스크래핑에 사용할 수 있는 픽셀 데이터 읽기
  • 픽셀 데이터 쓰기

OS가 그래픽 드라이버에 전달할 UCS 명령:

16 진수 명령
00h nop
26시간 set_gamma_curve
2Dh write_LUT
51시간 set_display_brightness
52시간 get_display_brightness
53시간 write_control_display
54시간 get_control_display
55시간 write_power_save
56시간 get_power_save
5Eh set_CABC_min_brightness
5Fh get_CABC_min_brightness
03h get_compression_mode
05h get_error_count_on_DSI
06h get_red_channel
07h get_green_channel
08h get_blue_channel
0Ah get_power_mode
0Bh get_address_mode
0Ch get_pixel_format
0Dh get_display_mode
0Eh get_signal_mode
0Fh get_diagnostic_result
14시간 get_image_checksum_rgb
15시간 get_image_checksum_ct
3Fh get_3D_control
45시간 get_scanline

OS에서 거부할 UCS 명령:

16 진수 명령
01시간 soft_reset(IOCTL_MIPI_DSI_RESET통해 전송해야 합니다.)
10시간 enter_sleep_mode
11시간 exit_sleep_mode
12시간 enter_partial_mode
13시간 enter_normal_mode
20h exit_invert_mode
21시간 enter_invert_mode
28시간 set_display_off
29시간 set_display_on
2Ah set_column_address
2Bh set_page_address
2Ch write_memory_start
2Eh read_memory_start
30h set_partial_rows
31시간 set_partial_columns
33시간 set_scroll_area
34시간 set_tear_off
35시간 set_tear_on
36시간 set_address_mode
37시간 set_scroll_start
38시간 exit_idle_mode
39시간 enter_idle_mode
3Ah set_pixel_format
3Ch write_memory_continue
3Dh set_3D_control
3Eh read_memory_continue
40h set_vsync_timing
44시간 set_tear_scanline
A1h read_DDB_start
A2h read_PPS_start
A8h read_DDB_continue
A9h read_PPS_continue

그래픽 드라이버 구현

전송이 OS 유효성 검사를 통과하면 OS는 DDI를DxgkDsiTransmission을 호출하여 버퍼를 그래픽 드라이버에 전달합니다.

OS 요청 및 주변 장치 제어 요구 사항에 따라 픽셀 및 제어 데이터를 전송하는 데 이미 사용되는 인터페이스에 OEM 전송을 추가하면 그래픽 드라이버가 내부 시퀀스를 향상시켜 패킷의 추가 스트림을 올바르게 통합할 수 있도록 해야 합니다. 그래픽 드라이버는 OEM 패널 드라이버에서 전송 내에서 패킷의 순서를 다시 지정하지 않아야 하며, 다른 패킷을 인터리빙하지 않고 중단 없이 전체 시퀀스를 보내야 합니다. 그래픽 드라이버는 OEM 패널 전송 요청 도착 시간과 관련하여 자체 패킷의 순서를 유지할 필요가 없으므로 OEM 패널 전송을 보내기 전(또는 이후) 다음 프레임을 설정하기 위해 패킷을 보내도록 선택할 수 있습니다. 시작된 OEM 패널 전송이 완료되어 중요한 패킷이 시간 범위를 놓칠 수 있는 경우 드라이버는 전송을 취소된 것으로 보고해야 합니다. 전송이 시작되지 않았지만 드라이버에서 중요한 패킷이 시간 창을 놓칠 것으로 예상하는 경우 드라이버는 다음 공백 기간까지 전송 시작을 연기해야 합니다. OEM 패널 전송을 지연하면 두 개 이상의 프레임이 시작되기를 기다리는 경우 드라이버는 전송을 삭제된 것으로 보고해야 합니다.

그래픽 드라이버가 패널 드라이버를 대신하여 전송하는 전송이 제어권을 가진 전송과 충돌하지 않도록 하는 것은 불가능합니다. 드라이버는 전송 내에서 패킷을 검사하고 문제가 발생할 경우 전송을 거부하도록 선택할 수 있지만 안전하지 않은 것으로 간주되는 모든 패킷은 OS 수준 거부에 플래그를 지정해야 하므로 드라이버 수준 거부는 그래픽 공급업체의 특정 문제 때문이어야 합니다. 드라이버는 패킷이 표준화된 명령으로 보이는 경우에도 읽기 또는 쓰기를 캐시하거나 최적화하려고 시도해서는 안 됩니다.

그래픽 드라이버가 패킷 문제로 인해 전송을 거부하는 경우 FailedPacket 필드를 첫 번째 패킷의 인덱스로 업데이트하여 전송이 거부되고 반환하기 전에 HostErrors DXGK_HOST_DSI_DRIVER_REJECTED_PACKET 플래그를 설정해야 합니다. 전송 모드 재정의가 제공된 경우 드라이버는 재정의가 하드웨어 제약 조건과 호환되는지 확인하고 그렇지 않은 경우 반환하기 전에 HostErrors DXGK_HOST_DSI_BAD_TRANSMISSION_MODE 플래그를 설정해야 합니다.

통신 중에 오류가 발생하는 경우 그래픽 드라이버는 FailedPacket 필드를 실패한 패킷의 인덱스로 업데이트해야 하지만, 드라이버가 패킷을 식별하는 모든 경우에 가능하지 않을 수 있으므로 드라이버가 기본값인 DXGK_DSI_INVALID_PACKET_INDEX 유지해야 합니다.

그래픽 드라이버는 패킷의 통신을 담당하므로 확인 합계가 계산되고 확인되어야 합니다. 읽기로 끝나는 모든 전송은 짧은 패킷이므로 Data0 및 Data1 필드에는 매개 변수가 포함되고 응답은 짧거나 긴 패킷일 수 있습니다. 그래픽 드라이버는 반환되는 데이터의 형태와 기간을 알 수 없지만 최대 크기는 FinalPacketExtraPayload포함하여 최종 패킷에 대한 페이로드의 전체 크기입니다. OS는 이 값이 대상에 대한 기능에서 드라이버가 보고한 TargetMaximumReturnPacketSize보다 크지 않은지 확인하지만, 드라이버는 이 버퍼가 주변 장치 보고에 의해 오버런되지 않고 주변 장치에서 데이터가 현재 주변 디바이스에 적용되는 MaximumReturnPacketSize보다 크기 때문에 잘리지 않도록 해야 합니다. 드라이버는 전송을 설명하는 ReadWordCount 필드에 버퍼에 읽은 바이트 수를 씁니다.

OEM 패널 드라이버와 관련이 없고 관찰할 수 없는 오류로 인해 그래픽 드라이버가 통신 인터페이스를 패널 또는 전체 패널로 다시 설정해야 하는 경우가 있을 수 있습니다. 이 문제를 해결하려면 드라이버는 OEM 패널 드라이버가 상황을 감지하고 복구할 수 있도록 재설정 후 첫 번째 전송 시도에서 HostErrors 필드에 설정된 DXGK_HOST_DSI_INTERFACE_RESET 또는 DXGK_HOST_DSI_DEVICE_RESET 보고해야 합니다. 드라이버는 이 전송을 하드웨어로 보내지 않아야 하지만 복구가 필요하지 않은 경우 OEM 패널 드라이버가 동일한 명령을 다시 시도할 수 있습니다. 이 경우 드라이버는 평소와 같이 전송 처리를 진행해야 합니다.

전송 완료

IOCTL이 FailedPacket완료하면 결과에 따라 읽기(최종) 패킷에 대한 FailedPacket, ReadWordCount, MipiErrors, HostErrors 및 페이로드가 업데이트되었을 수 있습니다. 전송을 처리하는 동안 오류가 발견되면 OEM 패널 드라이버는 MipiErrors 사용하고 출력 값을 HostErrors 복구 및 진행 방법을 결정해야 합니다.

오류에 대한 세부 정보를 제공하기 위해 출력이 호출자에게 반환되도록 하려면 오류가 발견되더라도 IOCTL 및 DDI 호출에서 성공을 보고해야 합니다. 성공이 트랜잭션이 성공했음을 나타내지 않으며, 트랜잭션을 처리하기 위한 호출이 예상대로 진행되었으며 적절한 경우 오류 플래그가 설정되었음을 나타냅니다. 지원되지 않는 DDI 호출(아마도 드라이버 불일치로 인한 것), 메모리 할당 오류 또는 NULL 버퍼 전달과 같은 완전히 잘못된 매개 변수 전달과 같은 조건에 대한 오류는 계속 보고될 수 있습니다. 호출 성공에 대한 오류가 보고되지 않은 경우 호출자는 트랜잭션이 성공했다고 가정해야 합니다.

요구 사항

요구
지원되는 최소 클라이언트 Windows 10 버전 2004
헤더 dispmprt.h

참고 항목

DXGI_DSI_TRANSMISSION