Поделиться через


функция обратного вызова 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 можно описать, однако ОС будет анализировать пакеты и отклонять любую передачу, содержащую пакеты, которые запрещены. Все пакеты, кроме последнего, по определению DSI, записывают пакеты, которые могут быть короткими записью, в этом случае буфер Payload не используется или длинные записи, которые помещаются в буфер Payload. Последний пакет передачи, который может быть чтением или записью, позволяет использовать расширенные полезные данные путем выделения и описания большего буфера, который позволяет пространству для операций чтения или записи любого размера до предельного предела данных пакета DSI 64K-1. Это позволяет последовательности небольших пакетов записи помещать в очередь драйверу в одном вызове, но требует, чтобы большие пакеты отправлялись по отдельности. Значение поля FinalPacketExtraPayload указывает, сколько дополнительных байтов было выделено, но это также должно быть указано в поле TotalBufferSize.

Драйвер панели OEM отвечает за обеспечение того, чтобы передачи, запрашиваемые им, не конфликтуют или не вмешивались в другие передачи, которые драйвер графики использует для нормального взаимодействия с панелью из-за чрезмерных запросов или запросов операций, которые могут привести к задержкам в обработке других передач. Драйвер панели не должен изменять состояние, которое приведет к последующим сбоям в графическом драйвере, например изменение времени на панели с помощью команд MCS. Аналогичным образом, если ОС запрашивает изменение отображения через графический драйвер, например увеличение яркости, драйвер панели не должен использовать команды DSI для отмены этого изменения либо в ответе, либо в других целях.

IOCTL_MIPI_DSI_TRANSMISSION используется для запроса передачи на периферийное устройство, содержащее один или несколько пакетов DSI. Драйвер панели всегда должен инициализировать TotalBufferSize, PacketCount и первые три БАЙТа каждого пакета. Драйвер панели может переопределить поведение по умолчанию с помощью ненулевых значений для TransmissionMode, ReportMipiErrors, ClearMipiErrors, SecondaryPort, ManufacturingMode и FinalCommandExtraPayload. Все неинициализированные значения должны иметь значение нулю.

ОС обеспечит правильность формирования последовательности пакетов DSI с допустимой информацией во всех определенных полях и правильных размерах буфера. ОС отвечает за инициализацию поля FailedPacket для DXGK_DSI_INVALID_PACKET_INDEX, чтобы дальнейшая проверка в ОС или драйвере должна быть задана только в том случае, если обнаружена проблема с определенным пакетом. Если DXGK_DSI_TRANSMISSION не хорошо сформирован, ОС установит флаг DXGK_HOST_DSI_INVALID_TRANSMISSION в поле HostErrors, чтобы отличить это от других недопустимых ошибок парам.

Чтобы считаться хорошо сформированным, все должно быть верным:

  • 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]

Проверка пакетов

Хотя ОС не будет пытаться полностью проверить содержимое всех пакетов, он отклонит передачу, содержащую любые команды DSI, отличные от следующих, завершив IOCTL без вызова графического драйвера:

Значение типа данных Описание
0x03 Универсальный короткий запись, без параметров
0x13 Универсальный параметр Short WRITE, 1 параметр
0x23 Универсальные параметры short WRITE, 2
0x04 Универсальный READ, нет параметров
0x14 Универсальный параметр READ, 1
0x24 Универсальные параметры READ, 2
0x05 DCS Short WRITE, нет параметров
0x15 DCS Short WRITE, 1 параметр
0x06 DCS READ, нет параметров
0x29 Универсальная длинная запись
0x39 DCS Long Write/write_LUT

Универсальные команды чтения и записи требуют понимания спецификации панели, поэтому ожидание заключается в том, что эти команды можно свободно использовать драйвером панели без возникновения проблем для графического драйвера, если шина не используется чрезмерно. Аналогичным образом команды DCS MCS явно определены для использования изготовителем, поэтому не должно быть проблем с помехой между графическим драйвером и драйвером панели.

Для DCS UCS неопределенные команды не должны использоваться графическим драйвером, поэтому ОС позволит использовать их драйвером панели, хотя существует явный риск того, что будущие изменения спецификации MIPI-DCS определяют команду, поэтому команды MCS предпочтительнее.

Стандартизированные команды DCS UCS будут использоваться графическим драйвером во время нормальной работы и потенциально доступны драйверу панели, поэтому риск команд, отправленных драйвером панели OEM, вызывает проблемы с последующими командами графического драйвера необходимо устранить. Для этого ОС анализирует команды DCS и отклоняет пакеты, которые, как ожидается, вызывают конфликты, если драйвер панели OEM не устанавливает флаг ManufacturingMode, а ОС подтверждает, что система находится в производственном режиме. Если флаг установлен, но система не находится в производственном режиме, передача IOCTL будет завершена с флагом DXGK_HOST_DSI_INVALID_TRANSMISSION, установленным в поле HostErrors без вызова графического драйвера.

Условия, для которых требуется полностью определенная транзакция вместо использования передачи, будет где:

  • Период времени простоя требуется до или после, например dcS soft_reset
  • Изменение операционной среды для вывода кадров, таких как dcS set_vsync_timing и enter_sleep_mode
  • Использование транзакций с семантикой запуска и продолжения, в которой графический драйвер также может потребоваться получить доступ к тем же данным, например DCS write_memory_start/write_memory_continue

Кроме того, существуют классы команд DCS, которые будут отклонены ОС при отправке в виде передачи:

  • Любая команда, которая должна быть полностью определена, как описано выше
  • Считывает данные пикселей, которые можно использовать для очистки экрана
  • Записи данных пикселей

Команды UCS, которые ос будет передавать в графический драйвер:

Зачаровывать Команда
00h nop
26h set_gamma_curve
2Dh write_LUT
51h set_display_brightness
52h get_display_brightness
53h write_control_display
54h get_control_display
55h write_power_save
56h 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
14h get_image_checksum_rgb
15h get_image_checksum_ct
3Fh get_3D_control
45h get_scanline

Команды UCS, отклонив ос:

Зачаровывать Команда
01h soft_reset (необходимо отправить через IOCTL_MIPI_DSI_RESET)
10h enter_sleep_mode
11h exit_sleep_mode
12h enter_partial_mode
13h enter_normal_mode
20h exit_invert_mode
21h enter_invert_mode
28h set_display_off
29h set_display_on
2Ah set_column_address
2Bh set_page_address
2Ch write_memory_start
2Eh read_memory_start
30h set_partial_rows
31h set_partial_columns
33h set_scroll_area
34h set_tear_off
35h set_tear_on
36h set_address_mode
37h set_scroll_start
38h exit_idle_mode
39h enter_idle_mode
3Ah set_pixel_format
3Ch write_memory_continue
3Dh set_3D_control
3Eh read_memory_continue
40h set_vsync_timing
44h set_tear_scanline
A1h read_DDB_start
A2h read_PPS_start
A8h read_DDB_continue
A9h read_PPS_continue

Реализация графического драйвера

Если передача проходит проверку ОС, ОС передает буфер графическому драйверу путем вызова DxgkDsiTransmission DDI.

Добавление передач OEM в интерфейс, который уже используется для отправки данных пикселей и управления на основе запросов ОС и потребностей периферийного управления, неизбежно означает, что графический драйвер должен улучшить свою внутреннюю последовательность, чтобы обеспечить правильность включения этого дополнительного потока пакетов. Графический драйвер не должен переупорядочение пакетов в передаче от драйвера панели OEM и должен отправлять всю последовательность без переключения других пакетов. Графический драйвер не требуется для поддержания порядка собственных пакетов в отношении времени поступления запроса на передачу панели OEM, поэтому может выбрать для отправки пакетов для настройки следующего кадра до (или после) отправки передачи панели OEM. Если завершение запущенной передачи панели OEM угрожает привести к пропуску критических пакетов, драйвер должен сообщить о передаче как отмененной. Если передача не запущена, но драйвер ожидает, что он приведет к тому, что критически важные пакеты пропустят свое время, драйвер должен отложить передачу до следующего пустого периода. Если отсрочка передачи панели OEM приведет к тому, что она ожидает более двух кадров, водитель должен сообщить о передаче как удаленную.

Драйвер графики не может гарантировать, что передачи, которые он отправляет от имени драйвера панели, не конфликтуют с передачами, над которыми он управляет. Драйвер может выбрать проверку пакетов в пределах передачи и отклонить передачу, если они вызовут проблемы, но любые пакеты, которые считаются небезопасными, должны быть помечены для отклонения уровня ОС, поэтому отклонение уровня драйвера в идеале должно быть связано с конкретными проблемами поставщика графики. Драйвер не должен пытаться кэшировать или оптимизировать операции чтения или записи, даже если пакеты, как представляется, являются стандартизированными командами.

Если графический драйвер отклоняет передачу из-за проблемы с пакетом, он должен обновить поле FailedPacket с индексом первого пакета, вызывающего отклонение передачи и задать флаг HostErrors DXGK_HOST_DSI_DRIVER_REJECTED_PACKET перед возвратом. Если предоставляется переопределение режима передачи, драйвер должен убедиться, что переопределение совместимо с ограничениями оборудования и, если нет, задайте флаг HostErrors DXGK_HOST_DSI_BAD_TRANSMISSION_MODE перед возвратом.

Если во время обмена данными произошел сбой, графический драйвер должен обновить поле FailedPacket с индексом пакета, который завершился ошибкой, однако в всех случаях драйверу не удастся определить пакет, чтобы драйвер должен оставить значение по умолчанию, DXGK_DSI_INVALID_PACKET_INDEX для таких случаев.

Графический драйвер отвечает за обмен данными пакетов, поэтому необходимо убедиться, что все суммы проверки вычисляются и проверяются. Любая передача, которая заканчивается чтением, будет коротким пакетом, поэтому поля Data0 и Data1 содержат любые параметры, и ответ может быть коротким или длинным пакетом. Графический драйвер может не знать, какая форма и как долго возвращаемые данные будут, но максимальный размер — это полный размер полезных данных для окончательного пакета, включая FinalPacketExtraPayload. ОС проверяет, что это значение не превышает TargetMaximumReturnPacketSize, сообщаемых драйвером в его возможностях для целевого объекта, но драйвер должен убедиться, что этот буфер не переполнен периферийным отчетом больше данных, и что данные из периферийного устройства не усечены из-за того, что больше, чем MaximumReturnPacketSize в настоящее время применяется к периферийным устройствам. Драйвер записывает количество байтов, считываемых в буфер, в поле ReadWordCount, описывающее передачу.

Могут возникнуть случаи, когда графический драйвер вынужден сбрасывать интерфейс связи с панелью или всю панель из-за ошибок, которые могут не быть связаны с драйвером панели OEM и могут не наблюдаться. Чтобы справиться с этим, драйвер должен сообщить либо DXGK_HOST_DSI_INTERFACE_RESET, либо DXGK_HOST_DSI_DEVICE_RESET установить в поле HostErrors на первой попытке передачи после сброса, чтобы драйвер панели OEM смог обнаружить ситуацию и восстановиться. Драйвер не должен отправлять эту передачу на оборудование, но драйвер панели OEM может просто повторить ту же команду, если восстановление не требуется, в этом случае драйвер должен продолжать обработку передачи как обычно.

Завершение передачи

Когда IOCTL завершает FailedPacket, ReadWordCount, MipiErrors, HostErrors и полезные данные для пакета чтения (окончательного) могут быть обновлены в зависимости от результата. Если при обработке передачи обнаружены ошибки, драйвер панели OEM должен использовать MipiErrors и HostErrors выходные значения, чтобы определить, как восстановить и продолжить.

Чтобы убедиться, что выходные данные возвращаются вызывающей функции для предоставления сведений об ошибках, вызовы IOCTL и DDI должны сообщать об успешном выполнении, даже если обнаружены ошибки. Успех не указывает, что транзакция была успешной, она указывает, что вызовы для обработки транзакции продолжались должным образом и флаги ошибок были заданы при необходимости. Ошибки по-прежнему могут быть сообщены для таких условий, как неподдерживаемый вызов DDI (предположительно из-за несоответствия драйвера), сбоев выделения памяти или передачи полностью плохих параметров, таких как передача буфера NULL. Если для успешного вызова не сообщается об ошибках, вызывающий объект должен предположить, что транзакция выполнена успешно.

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows 10 версии 2004
заголовка dispmprt.h

См. также

DXGI_DSI_TRANSMISSION