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 패킷을 포함하는 주변 장치로 전송을 요청하는 데 사용됩니다. 패널 드라이버는 항상 를 PacketCount 초기화하고 각 패킷의 처음 세 바이트를 초기화TotalBufferSize해야 합니다. 패널 드라이버는 , , ReportMipiErrors, ManufacturingModeClearMipiErrorsSecondaryPortFinalCommandExtraPayload에 대해 0이 아닌 값을 사용하여 기본 동작을 TransmissionMode재정의할 수 있습니다. 초기화되지 않은 모든 값은 0으로 설정해야 합니다.

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

올바른 형식으로 간주하려면 다음이 모두 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을 완료합니다.

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

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

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

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

Hex 명령
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
03시간 get_compression_mode
05시간 get_error_count_on_DSI
06시간 get_red_channel
07시간 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 명령:

Hex 명령
01h soft_reset( IOCTL_MIPI_DSI_RESET 통해 보내야 합니다.)
10h enter_sleep_mode
11시간 exit_sleep_mode
12h enter_partial_mode
13시간 enter_normal_mode
20h exit_invert_mode
21시간 enter_invert_mode
28h 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
34h 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는 DxgkDsiTransmission DDI 를 호출하여 버퍼를 그래픽 드라이버에 전달합니다.

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

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

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

통신 중에 오류가 발생하는 경우 그래픽 드라이버는 실패한 패킷의 인덱스로 필드를 업데이트 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대한 , ReadWordCount, MipiErrorsHostErrors 페이로드를 완료하면 결과에 따라 업데이트되었을 수 있습니다. 전송을 처리하는 동안 오류가 발견되면 OEM 패널 드라이버는 및 HostErrors 출력 값을 사용하여 MipiErrors 복구 및 진행 방법을 결정해야 합니다.

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

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 10, 버전 2004
머리글 dispmprt.h

추가 정보

DXGI_DSI_TRANSMISSION