IOCTL_MIPI_DSI_TRANSMISSION IOCTL(ntddvdeo.h)
주 코드: IRP_MJ_DEVICE_CONTROL
IOCTL_MIPI_DSI_TRANSMISSION 일련의 MIPI DSI 패킷을 주변 장치로 보내기 위해 발급됩니다.
주 코드
입력 버퍼
해당 없음
입력 버퍼 길이
해당 없음
출력 버퍼
해당 없음
출력 버퍼 길이
해당 없음
입력/출력 버퍼
DXGK_DSI_TRANSMISSION 구조 뒤에 패킷을 포함하는 DXGK_DSI_PACKET 구조체가 뒤따릅니다.
입력/출력 버퍼 길이
적어도 sizeof(DXGK_DSI_TRANSMISSION) + ((PacketCount - 1) * sizeof(DXGK_DSI_PACKET)) + FinalPacketExtraPayload
입니다. 자세한 내용은 설명을 참조하세요.
상태 블록
Irp->요청이 성공하면 IoStatus.Status 가 STATUS_SUCCESS 설정됩니다. 그렇지 않으면 상태가 NTSTATUS 코드로 적절한 오류 조건으로 설정됩니다. 자세한 내용은 NTSTATUS 값을 참조하세요.
설명
모니터, oem 패널 및 디스플레이 포트/미니포트 드라이버는 MIPI(모바일 산업 프로세서 인터페이스) DSI(디지털 직렬 인터페이스) IOCTL을 처리해야 합니다.
전송 수행
패널 드라이버가 그래픽 어댑터와 패널 하드웨어 간에 이 개인 인터페이스를 상호 작용할 수 있도록 하려면 트랜잭션에 버스가 차지하는 시간 외에 그래픽 드라이버 효과가 없거나 그래픽 드라이버가 제어되도록 완전히 정의되어야 합니다. 패널 드라이버가 상호 작용할 수 있도록 하는 점은 그래픽 드라이버에 불투명한 사용자 지정 패널 기능을 지원하는 것이므로 완전히 정의된 작업은 패널 드라이버가 그래픽 드라이버의 개입 없이는 수행할 수 없는 표준화된 작업을 수행해야 하는 트랜잭션으로 제한됩니다. 이러한 트랜잭션은 전송이 아닌 명시적으로 라우팅된 예외로 처리됩니다.
각 전송 요청은 OEM 패널 드라이버에 의해 채워지고, 모니터 스택을 전달하고, 전송 결과(있는 경우)와 함께 반환되는 단일 버퍼로 구성됩니다. 버퍼에는 입력 및 출력 필드와 DXGK_DSI_PACKET 구조의 변수 크기 배열이 포함된 전송에 대한 전체 정보가 포함됩니다. 패킷은 DSI 용어로 설명되므로 모든 DSI 패킷을 설명할 수 있지만 OS는 패킷을 구문 분석하고 허용되지 않는 패킷을 포함하는 모든 전송을 거부합니다. 마지막을 제외한 모든 패킷은 DSI 정의에 따라 짧은 쓰기, 이 경우 페이로드 버퍼가 사용되지 않거나 페이로드 버퍼 내에 맞는 긴 쓰기일 수 있는 쓰기 패킷입니다. 읽기 또는 쓰기일 수 있는 전송의 마지막 패킷은 더 큰 버퍼를 할당하고 설명하여 확장 페이로드를 사용할 수 있으며, 이를 통해 DSI 긴 패킷 데이터 제한인 64K-1 데이터 바이트까지 모든 크기의 읽기 또는 쓰기 공간을 허용합니다. 이렇게 하면 작은 쓰기 패킷 시퀀스를 단일 호출에서 드라이버에 큐에 대기할 수 있지만 더 큰 패킷을 개별적으로 보내야 합니다. FinalPacketExtraPayload 필드의 값은 할당된 추가 바이트 수를 나타내지만 TotalBufferSize 필드에서도 고려해야 합니다.
OEM 패널 드라이버는 요청된 전송이 과도한 요청 또는 요청 작업으로 인해 다른 전송 처리가 지연되는 이유로 그래픽 드라이버가 패널과의 정상적인 상호 작용에 사용하는 다른 전송과 충돌하거나 방해하지 않도록 할 책임이 있습니다. 패널 드라이버는 그래픽 드라이버에서 후속 오류를 발생시키는 상태를 변경해서는 안 됩니다(예: MCS 명령을 통해 패널 타이밍 변경). 마찬가지로 OS가 그래픽 드라이버를 통해 디스플레이 변경(예: 밝기 증가)을 요청한 경우 패널 드라이버는 DSI 명령을 사용하여 응답 또는 다른 목적으로 해당 변경 내용을 실행 취소하지 않아야 합니다.
IOCTL_MIPI_DSI_TRANSMISSION 하나 이상의 DSI 패킷을 포함하는 주변 장치로 전송을 요청하는 데 사용됩니다. 패널 드라이버는 항상 TotalBufferSize, PacketCount 및 각 패킷의 처음 세 바이트를 초기화해야 합니다. 패널 드라이버는 TransmissionMode, ReportMipiErrors, ClearMipiErrors, SecondaryPort, ManufacturingMode 및 FinalCommandExtraPayload에 대해 0이 아닌 값을 사용하여 기본 동작을 재정의할 수 있습니다. 초기화되지 않은 모든 값은 0으로 설정해야 합니다.
OS는 정의된 모든 필드와 올바른 버퍼 크기에서 유효한 정보를 사용하여 DSI 패킷 시퀀스가 올바른 형식인지 확인합니다. OS는 장애 조치( FailedPacket) 필드를 DXGK_DSI_INVALID_PACKET_INDEX 초기화하여 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
- 마지막 패킷만 읽을 수 있습니다.
- 최종 긴 쓰기 패킷만 LongWriteWordCount 값이 DXGK_DSI_PACKET_EMBEDDED_PAYLOAD_SIZE
패킷 유효성 검사
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 |
03h | get_compression_mode |
05h | 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 유효성 검사를 통과하면 OS는 DsiTransmission을 사용하여 버퍼를 그래픽 드라이버에 전달합니다.
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 |
머리글 | ntddvdeo.h |