функция обратного вызова 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.
Комментарии
Чтобы позволить драйверу панели изготовителя оборудования взаимодействовать через частный интерфейс между графическим адаптером и аппаратным оборудованием панели, транзакции должны либо не иметь эффекта графического драйвера, кроме времени, занимающего шину, либо они должны быть полностью определены, чтобы графический драйвер был под контролем. Поскольку возможность взаимодействия с драйвером панели изготовителя оборудования заключается в предоставлении поддержки пользовательских функций панели, которые непрозрачны для графического драйвера, полностью определенные операции предназначены для транзакций, в которых драйвер панели должен выполнять стандартизованную операцию, которая не может быть выполнена без участия графического драйвера. Такие транзакции будут рассматриваться как исключения, перенаправленные явным образом, а не как передачи.
Каждый запрос на передачу DSI состоит из одного буфера, который заполняется драйвером панели OEM, передается по стеку монитора и возвращается с результатами передачи, если таковые есть. Буфер содержит общие сведения о передаче с полями ввода и вывода, за которым следует массив DXGK_DSI_PACKET структур с переменным размером. Пакеты описаны в терминах DSI, так что любой пакет DSI может быть описан, однако ОС будет анализировать пакеты и отклонять любую передачу, включающую пакеты, которые запрещены. Все пакеты, кроме последнего, являются, по определению DSI, пакетами записи, которые могут быть либо короткими(в этом случае Payload
буфер не используется), либо длинными, которые помещаются в Payload
буфер. Последний пакет в передаче, который может быть чтением или записью, может использовать расширенные полезные данные, выделяя и описывая больший буфер, который позволит свободное место для операций чтения или записи любого размера, вплоть до предельного размера данных длинного пакета DSI в 64 КБ-1 байт данных. Это позволяет помещать в очередь небольшие пакеты записи в драйвер в одном вызове, но требует, чтобы большие пакеты отправлялись по отдельности. Значение поля указывает, сколько дополнительных FinalPacketExtraPayload
байтов было выделено, но это также должно учитываться в TotalBufferSize
поле.
Драйвер панели oem отвечает за обеспечение того, чтобы запрашиваемые передачи не конфликтовли и не мешали другим передачам, которые графический драйвер использует для нормального взаимодействия с панелью из-за чрезмерных запросов или операций запроса, которые могут привести к задержкам при обработке других передач. Драйвер панели не должен изменять состояние, которое может вызвать последующие сбои в графическом драйвере, например изменение времени панели с помощью команд MCS. Аналогичным образом, если ОС запросила изменение дисплея, например с помощью графического драйвера, например при увеличении яркости, драйвер панели не должен использовать команды DSI для отмены этого изменения в ответ или в других целях.
IOCTL_MIPI_DSI_TRANSMISSION используется для запроса передачи на периферийное устройство, содержащее один или несколько пакетов DSI. Драйвер панели всегда должен инициализировать TotalBufferSize
и PacketCount
первые три БАЙТа каждого пакета. Драйвер панели может переопределить поведение по умолчанию, используя ненулевые значения для TransmissionMode
, ReportMipiErrors
, ClearMipiErrors
, SecondaryPort
и FinalCommandExtraPayload
ManufacturingMode
. Все неинициализированные значения должны иметь нулевое значение.
Операционная система гарантирует, что последовательность пакетов 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 | Общая короткая запись, 1 параметр |
0x23 | Общая короткая запись, 2 параметра |
0x04 | Универсальное чтение, без параметров |
0x14 | Универсальный параметр READ, 1 параметр |
0x24 | Универсальный параметр READ, 2 параметра |
0x05 | DCS Short WRITE, без параметров |
0x15 | DCS Short WRITE, 1 параметр |
0x06 | DCS READ, без параметров |
0x29 | Универсальная длинная запись |
0x39 | Запись и write_LUT dcs long |
Универсальные команды чтения и записи требуют понимания спецификации панели, поэтому предполагается, что эти команды могут свободно использоваться драйвером панели без проблем для графического драйвера, если шина не используется чрезмерно. Аналогичным образом команды DCS MCS явно определены для использования производителем, поэтому не должно возникать проблем с помехами между графическим драйвером и драйвером панели.
Для DCS UCS неопределенные команды не должны использоваться графическим драйвером, поэтому ОС позволит использовать их драйвером панели, хотя существует явный риск того, что будущие изменения спецификации MIPI-DCS определяют команду, поэтому предпочтительнее использовать команды MCS.
Стандартизированные команды DCS UCS будут использоваться графическим драйвером во время нормальной работы и потенциально могут использоваться драйвером панели, поэтому необходимо снизить риск того, что команды, отправленные драйвером панели изготовителя оборудования, вызывают проблемы с последующими командами графического драйвера. Для этого ОС будет анализировать команды 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, которые ос будет передавать графическому драйверу:
Hex | Get-Help |
---|---|
00h | Nop |
26 ч. | set_gamma_curve |
2Dh | write_LUT |
51 ч | set_display_brightness |
52 ч | 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 |
14 ч | get_image_checksum_rgb |
15 ч | get_image_checksum_ct |
3Fh | get_3D_control |
45 ч | get_scanline |
Команды UCS, которые ос будет отклонять:
Hex | Get-Help |
---|---|
01h | soft_reset (необходимо отправить через IOCTL_MIPI_DSI_RESET) |
10 ч | enter_sleep_mode |
11ч | exit_sleep_mode |
12 ч | enter_partial_mode |
13 ч. | enter_normal_mode |
20 ч | exit_invert_mode |
21 ч. | enter_invert_mode |
28 ч | set_display_off |
29h | set_display_on |
2Ah | set_column_address |
2Bh | set_page_address |
2Ch | write_memory_start |
2Eh | read_memory_start |
30 ч | set_partial_rows |
31h | set_partial_columns |
33 ч | set_scroll_area |
34 ч | set_tear_off |
35 ч | 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 |
40 ч | set_vsync_timing |
44 ч | 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
поле, описывающее передачу.
В некоторых случаях графический драйвер вынужден сбрасывать либо интерфейс связи на панель, либо на всю панель из-за ошибок, которые могут не быть связаны с драйвером панели изготовителя оборудования. Чтобы устранить эту проблему, драйвер должен сообщить о DXGK_HOST_DSI_INTERFACE_RESET или DXGK_HOST_DSI_DEVICE_RESET, заданных в HostErrors
поле при первой попытке передачи передачи после сброса, чтобы драйвер панели изготовителя оборудования смог обнаружить ситуацию и восстановиться. Драйвер не должен отправлять эту передачу на оборудование, но драйвер панели OEM может просто повторить ту же команду, если восстановление не требуется. В этом случае драйвер должен продолжить обработку передачи, как обычно.
Завершение передачи
После завершения IOCTL полезные FailedPacket
данные , ReadWordCount
, MipiErrors
HostErrors
и для считываемого (окончательного) пакета могут быть обновлены в зависимости от результата. Если при обработке передачи обнаружены ошибки, драйвер панели изготовителя оборудования должен использовать выходные MipiErrors
значения и HostErrors
, чтобы определить способ восстановления и продолжения.
Чтобы обеспечить возврат выходных данных вызывающей объекту для предоставления сведений о любых ошибках, вызовы IOCTL и DDI должны сообщать об успешном выполнении, даже если ошибки найдены. Успех не означает, что транзакция была успешной, а указывает на то, что вызовы для обработки транзакции были выполнены должным образом, и установлены флаги ошибок, если это необходимо. Сбои по-прежнему могут сообщаться для таких условий, как неподдерживаемый вызов DDI (предположительно из-за несоответствия драйвера), сбои выделения памяти или передача полностью плохих параметров, таких как передача буфера NULL. Если при успешном вызове не сообщается об ошибках, вызывающий объект должен предположить, что транзакция была успешной.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows 10 версии 2004 |
Верхняя часть | dispmprt.h |