DXGKDDI_DSITRANSMISSION função de retorno de chamada (dispmprt.h)
A função de retorno de chamada DxgkddiDsiTransmission executa uma transmissão de DSI (Interface Serial de Exibição).
Sintaxe
DXGKDDI_DSITRANSMISSION DxgkddiDsitransmission;
NTSTATUS DxgkddiDsitransmission(
[in] HANDLE Context,
[in] D3DDDI_VIDEO_PRESENT_TARGET_ID TargetId,
[out] PDXGK_DSI_TRANSMISSION pArgs
)
{...}
Parâmetros
[in] Context
[in] TargetId
Identificador de destino do monitor.
[out] pArgs
Ponteiro para uma estrutura DXGI_DSI_TRANSMISSION .
Retornar valor
DxgkddiDsiTransmission retornará STATUS_SUCCESS se tiver êxito; caso contrário, retornará um dos códigos de erro definidos em Ntstatus.h.
Comentários
Para permitir que um driver de painel OEM interaja sobre a interface privada entre o adaptador gráfico e o hardware do painel, as transações não devem ter nenhum efeito de driver gráfico, além de tempo ocupando o barramento, ou devem ser totalmente definidas para que o driver gráfico esteja no controle. Como o ponto de permitir que um driver de painel OEM interaja é fornecer suporte para recursos de painel personalizados opacos para o driver gráfico, as operações totalmente definidas destinam-se a ser restritas a transações em que o driver de painel precisa executar uma operação padronizada que não pode ser executada sem o envolvimento do driver gráfico. Essas transações serão tratadas como exceções roteadas explicitamente e não como transmissões.
Cada solicitação de transmissão de DSI consiste em um único buffer que é preenchido pelo driver do painel OEM, passado para baixo na pilha do monitor e retornado com os resultados da transmissão, se houver. O buffer contém informações gerais sobre a transmissão, com campos de entrada e saída, seguidos por uma matriz de tamanho variável de estruturas DXGK_DSI_PACKET . Os pacotes são descritos em termos de DSI, de modo que qualquer pacote DSI possa ser descrito, no entanto, o sistema operacional analisará os pacotes e rejeitará qualquer transmissão que inclua pacotes que não são permitidos. Todos os pacotes, exceto o último, são, por definição de DSI, pacotes de gravação que podem ser gravações curtas, nesse caso, o Payload
buffer não é usado ou gravações longas que se encaixam dentro do Payload
buffer. O último pacote em uma transmissão, que pode ser uma leitura ou uma gravação, tem permissão para usar uma carga estendida alocando e descrevendo um buffer maior que permitirá espaço para leituras ou gravações de qualquer tamanho até o limite de dados de pacote longo de DSI de 64K-1 bytes de dados. Isso permite que sequências de pacotes de gravação pequenos sejam enfileiradas no driver em uma única chamada, mas exige que pacotes maiores sejam enviados individualmente. O valor do FinalPacketExtraPayload
campo indica quantos bytes extras foram alocados, mas isso também deve ser contabilizado no TotalBufferSize
campo .
O driver do painel OEM é responsável por garantir que as transmissões solicitadas não entrem em conflito ou interfiram com outras transmissões que o driver gráfico usa para interação normal com o painel devido a solicitações excessivas ou operações de solicitação que causariam atrasos no processamento de outras transmissões. O driver do painel não deve alterar nenhum estado que cause falhas subsequentes no driver gráfico, por exemplo, alterando o tempo do painel por meio de comandos MCS. Da mesma forma, se o sistema operacional solicitou uma alteração de exibição, por meio do driver gráfico, por exemplo, um aumento no brilho, o driver do painel não deve usar comandos DSI para desfazer essa alteração, seja em resposta ou para outras finalidades.
O IOCTL_MIPI_DSI_TRANSMISSION é usado para solicitar uma transmissão para o periférico que contém um ou mais pacotes DSI. O driver do painel sempre deve inicializar TotalBufferSize
e PacketCount
os três primeiros BYTES de cada pacote. O driver do painel pode substituir o comportamento padrão usando valores diferentes de zero para TransmissionMode
, ReportMipiErrors
, ClearMipiErrors
, SecondaryPort
ManufacturingMode
e FinalCommandExtraPayload
. Todos os valores não inicializados devem ser definidos como zero.
O sistema operacional garantirá que a sequência de pacotes DSI esteja bem formada, com informações válidas em todos os campos definidos e tamanhos de buffer corretos. O sistema operacional é responsável por inicializar o FailedPacket
campo para DXGK_DSI_INVALID_PACKET_INDEX para que a validação adicional no sistema operacional ou driver só precise definir o campo se um problema for encontrado com um pacote específico. Se o DXGK_DSI_TRANSMISSION não estiver bem formado, o sistema operacional definirá o sinalizador DXGK_HOST_DSI_INVALID_TRANSMISSION no HostErrors
campo para distingui-lo de outros erros de parâmetros inválidos.
Para ser considerado bem formado, todos os seguintes devem ser verdadeiros:
- 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
- Somente o último pacote tem permissão para ser lido
- Somente um pacote de gravação longa final pode ter um
LongWriteWordCount
valor maior que [DXGK_DSI_PACKET_EMBEDDED_PAYLOAD_SIZE]
Validação de pacote
Embora o sistema operacional não tente validar totalmente o conteúdo de todos os pacotes, ele rejeitará uma transmissão contendo comandos DSI diferentes dos seguintes, concluindo o IOCTL sem chamar o driver gráfico:
Valor do tipo de dados | Descrição |
---|---|
0x03 | GENERIC Short WRITE, sem parâmetros |
0x13 | Generic Short WRITE, 1 parâmetro |
0x23 | Generic Short WRITE, 2 parâmetros |
0x04 | READ genérico, sem parâmetros |
0x14 | Leia genérico, parâmetro 1 |
0x24 | LEIA genérico, 2 parâmetros |
0x05 | DCS Short WRITE, sem parâmetros |
0x15 | DCS Short WRITE, 1 parâmetro |
0x06 | LEITURA DO DCS, sem parâmetros |
0x29 | Gravação longa genérica |
0x39 | Gravação/write_LUT longa do DCS |
Comandos genéricos de leitura e gravação exigem a compreensão da especificação do painel, portanto, a expectativa é que esses comandos possam ser usados livremente pelo driver do painel sem causar problemas para o driver gráfico, desde que o barramento não seja usado excessivamente. Da mesma forma, os comandos MCS do DCS são definidos explicitamente para uso do fabricante, portanto, não deve haver nenhum problema com a interferência entre o driver gráfico e o driver do painel.
Para o DCS UCS, não se espera que comandos indefinidos sejam usados pelo driver gráfico, portanto, o sistema operacional permitirá que eles sejam usados pelo driver de painel, embora haja claramente um risco de que futuras alterações de especificação MIPI-DCS definam o comando para que os comandos MCS sejam preferenciais.
Os comandos DO DCS UCS padronizados serão usados pelo driver gráfico durante a operação normal e potencialmente utilizáveis pelo driver de painel, portanto, o risco de comandos enviados pelo driver do painel OEM causando problemas com comandos de driver de gráficos subsequentes precisa ser mitigado. Para fazer isso, o sistema operacional analisará comandos DCS e rejeitará pacotes que devem causar conflitos, a menos que o driver do painel OEM defina o ManufacturingMode
sinalizador e o sistema operacional confirme que o sistema está no modo de fabricação. Se o sinalizador estiver definido, mas o sistema não estiver no modo de fabricação, o IOCTL de transmissão será concluído com o sinalizador DXGK_HOST_DSI_INVALID_TRANSMISSION definido no HostErrors
campo sem chamar o driver gráfico.
As condições que exigiriam uma transação totalmente definida em vez de usar uma transmissão seriam as seguintes:
- Períodos ociosos cronometrado são necessários antes ou depois, como DCS soft_reset
- Alterando o ambiente operacional para saída de quadro, como set_vsync_timing DCS e enter_sleep_mode
- Usar transações com semântica de início/continuação em que o driver gráfico também pode precisar acessar os mesmos dados, como DCS write_memory_start/write_memory_continue
Além disso, há classes de comandos DCS que serão rejeitadas pelo sistema operacional quando enviadas como uma transmissão:
- Qualquer comando que precise ser totalmente definido, conforme descrito acima
- Leituras de dados de pixel que podem ser usados para extração de tela
- Gravações de dados de pixel
Comandos UCS que o sistema operacional passará para o driver gráfico:
Hex | Comando |
---|---|
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 |
Comandos UCS que o sistema operacional rejeitará:
Hex | Comando |
---|---|
01h | soft_reset (deve ser enviado por meio de um 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 |
Implementação do driver gráfico
Se a transmissão passar pela validação do sistema operacional, o sistema operacional passará o buffer para o driver gráfico chamando DxgkDsiTransmission DDI.
Adicionar transmissões OEM em uma interface que já está sendo usada para enviar dados de pixel e controle com base em solicitações do sistema operacional e nas necessidades de controle periférico, inevitavelmente significa que o driver gráfico precisará aprimorar seu sequenciamento interno para garantir que esse fluxo adicional de pacotes possa ser incorporado corretamente. O driver gráfico não deve reordenar pacotes dentro de uma transmissão do driver do painel OEM e deve enviar toda a sequência ininterrupta e sem intercalação de outros pacotes. O driver gráfico não é necessário para manter a ordem de seus próprios pacotes em relação ao momento da chegada da solicitação de transmissão do painel OEM, portanto, pode optar por enviar pacotes para configurar o quadro a seguir antes (ou depois) de enviar uma transmissão de painel OEM. Se a conclusão de uma transmissão iniciada do painel OEM ameaça fazer com que os pacotes críticos percam a janela de tempo, o driver deverá relatar a transmissão como cancelada. Se uma transmissão não tiver sido iniciada, mas o driver esperar que ela faça com que os pacotes críticos percam a janela de tempo, o driver deverá adiar a inicialização da transmissão até o próximo período de espaço em branco. Se adiar uma transmissão de painel OEM faria com que ela estivesse aguardando mais de dois quadros iniciar, o driver deverá relatar a transmissão como descartada.
Não é possível que um driver gráfico garanta que as transmissões enviadas em nome do driver do painel não entrem em conflito com as transmissões sobre as quais ele tem controle. O driver pode optar por inspecionar pacotes dentro de uma transmissão e rejeitar a transmissão se eles causarem problemas, mas quaisquer pacotes considerados não seguros devem ser sinalizados para rejeição no nível do sistema operacional, portanto, a rejeição no nível do driver deve ser ideal devido a preocupações específicas do fornecedor de gráficos. O driver não deve tentar armazenar em cache nem otimizar leituras ou gravações, mesmo que os pacotes pareçam ser comandos padronizados.
Se o driver gráfico rejeitar uma transmissão devido a um problema com um pacote, ele deverá atualizar o FailedPacket
campo com o índice do primeiro pacote, fazendo com que a transmissão seja rejeitada e definir o HostErrors
sinalizador DXGK_HOST_DSI_DRIVER_REJECTED_PACKET antes de retornar. Se uma substituição de modo de transmissão for fornecida, o driver deverá verificar se a substituição é compatível com suas restrições de hardware e, caso contrário, defina o HostErrors
sinalizador DXGK_HOST_DSI_BAD_TRANSMISSION_MODE antes de retornar.
Se ocorrer uma falha durante a comunicação, o driver gráfico deverá atualizar o FailedPacket
campo com o índice do pacote que falhou, no entanto, pode não ser possível, em todos os casos, que o driver identifique o pacote para que o driver deixe o valor padrão, DXGK_DSI_INVALID_PACKET_INDEX para esses casos.
O driver gráfico é responsável pela comunicação dos pacotes, portanto, deve garantir que todas as somas marcar sejam calculadas e verificadas. Qualquer transmissão que termine com uma leitura será um pacote curto, portanto, os campos Data0 e Data1 contêm parâmetros e a resposta pode ser um pacote curto ou longo. O driver gráfico pode não saber qual formulário e por quanto tempo os dados retornados ficarão, mas o tamanho máximo é o tamanho total do conteúdo do pacote final, incluindo o FinalPacketExtraPayload
. O sistema operacional validará que esse valor não é maior do que o TargetMaximumReturnPacketSize
relatado pelo driver em seus recursos para o destino, mas o driver deve garantir que esse buffer não seja invadido por um periférico relatando mais dados e que os dados do periférico não sejam truncados devido a serem maiores do que o MaximumReturnPacketSize atualmente aplicado ao periférico. O driver grava o número de bytes lidos no buffer no ReadWordCount
campo que descreve a transmissão.
Pode haver casos em que o driver gráfico é forçado a redefinir a interface de comunicação para o painel ou todo o painel devido a erros que podem não estar relacionados e podem não ser observados para o driver do painel OEM. Para lidar com isso, o driver deve relatar DXGK_HOST_DSI_INTERFACE_RESET ou DXGK_HOST_DSI_DEVICE_RESET definidos no HostErrors
campo na primeira tentativa de transmissão após a redefinição para que o driver do painel OEM possa detectar a situação e se recuperar. O driver não deve enviar essa transmissão para o hardware, mas o driver do painel OEM pode simplesmente repetir o mesmo comando se nenhuma recuperação for necessária, caso em que o driver deve prosseguir com o processamento da transmissão como de costume.
Concluindo uma transmissão
Quando o IOCTL conclui o FailedPacket
conteúdo , ReadWordCount
, MipiErrors
HostErrors
e para um pacote de leitura (final) pode ter sido atualizado dependendo do resultado. Se forem encontrados erros durante o processamento da transmissão, o driver do painel OEM precisará usar os MipiErrors
valores de saída e HostErrors
para determinar como recuperar e continuar.
Para garantir que a saída seja retornada ao chamador para fornecer detalhes de quaisquer erros, as chamadas IOCTL e DDI precisam relatar um êxito, mesmo se forem encontrados erros. Êxito não indica que a transação foi bem-sucedida, indica que as chamadas para lidar com a transação prosseguiram conforme o esperado e os sinalizadores de erro foram definidos, se apropriado. Falhas ainda podem ser relatadas para condições como uma chamada DDI sem suporte (presumivelmente devido a uma incompatibilidade de driver), falhas de alocação de memória ou passagem de parâmetros completamente inválidos, como passar um buffer NULL. Se nenhum erro for relatado para uma chamada bem-sucedida, o chamador deverá assumir que a transação foi bem-sucedida.
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Windows 10, versão 2004 |
Cabeçalho | dispmprt.h |