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
, ManufacturingMode
ClearMipiErrors
SecondaryPort
및 FinalCommandExtraPayload
에 대해 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
, MipiErrors
및 HostErrors
페이로드를 완료하면 결과에 따라 업데이트되었을 수 있습니다. 전송을 처리하는 동안 오류가 발견되면 OEM 패널 드라이버는 및 HostErrors
출력 값을 사용하여 MipiErrors
복구 및 진행 방법을 결정해야 합니다.
오류에 대한 세부 정보를 제공하기 위해 출력이 호출자에게 반환되도록 하려면 오류가 발견되더라도 IOCTL 및 DDI 호출에서 성공을 보고해야 합니다. 성공 은 트랜잭션이 성공했음을 나타내지 않으며 트랜잭션을 처리하는 호출이 예상대로 진행되었으며 적절한 경우 오류 플래그가 설정되었음을 나타냅니다. 지원되지 않는 DDI 호출(아마도 드라이버 불일치로 인한 것), 메모리 할당 오류 또는 NULL 버퍼 전달과 같은 완전히 잘못된 매개 변수 전달과 같은 조건에 대한 오류는 여전히 보고될 수 있습니다. 성공적인 호출에 대해 오류가 보고되지 않은 경우 호출자는 트랜잭션이 성공했다고 가정해야 합니다.
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows 10, 버전 2004 |
머리글 | dispmprt.h |