RaspberryPi-LOGO

Driver gráfico de saída HDMI RaspberryPi KMS

RaspberryPi-KMS-HDMI-Output-Graphics-Driver-PRODACT-IMG

Colofão

2020-2023 Raspberry Pi Ltd (anteriormente Raspberry Pi (Trading) Ltd.) Esta documentação está licenciada sob uma licença Creative Commons Atribuição-SemDerivações 4.0 Internacional (CC BY-ND 4.0). data de construção: 2023-02-10 versão de construção: githash: c65fe9c-clean

Aviso de isenção de responsabilidade legal

DADOS TÉCNICOS E DE CONFIABILIDADE DOS PRODUTOS RASPBERRY PI (INCLUINDO FICHAS DE DADOS), CONFORME MODIFICADOS DE TEMPO EM TEMPO (“RECURSOS”) SÃO FORNECIDOS PELA RASPBERRY PI LTD (“RPL”) “COMO ESTÃO” E QUAISQUER GARANTIAS EXPRESSAS OU IMPLÍCITAS, INCLUINDO, MAS NÃO LIMITADAS TO, AS GARANTIAS IMPLÍCITAS DE COMERCIABILIDADE E ADEQUAÇÃO PARA UM FIM ESPECÍFICO SÃO REJEITADAS. NA MÁXIMA EXTENSÃO PERMITIDA PELA LEI APLICÁVEL, EM NENHUM CASO A RPL SERÁ RESPONSÁVEL POR QUAISQUER DANOS DIRETOS, INDIRETOS, INCIDENTAIS, ESPECIAIS, EXEMPLARES OU CONSEQUENTES (INCLUINDO, ENTRE OUTROS, AQUISIÇÃO DE BENS OU SERVIÇOS SUBSTITUTOS; PERDA DE USO, DADOS , OU LUCROS; OU INTERRUPÇÃO DE NEGÓCIOS) DE QUALQUER CAUSA E EM QUALQUER TEORIA DE RESPONSABILIDADE, SEJA EM CONTRATO, RESPONSABILIDADE ESTRITA OU ILÍCITO (INCLUINDO NEGLIGÊNCIA OU DE OUTRA FORMA) DECORRENTE DE QUALQUER FORMA DO USO DOS RECURSOS, MESMO SE AVISADO DA POSSIBILIDADE DE TAIS DANOS. A RPL reserva-se o direito de fazer quaisquer aprimoramentos, melhorias, correções ou quaisquer outras modificações nos RECURSOS ou em quaisquer produtos descritos neles a qualquer momento e sem aviso prévio. Os RECURSOS destinam-se a usuários qualificados com níveis adequados de conhecimento de design. Os usuários são os únicos responsáveis ​​por sua seleção e uso dos RECURSOS e qualquer aplicação dos produtos neles descritos. O usuário concorda em indenizar e isentar a RPL de todas as responsabilidades, custos, danos ou outras perdas decorrentes do uso dos RECURSOS. A RPL concede aos usuários permissão para usar os RECURSOS exclusivamente em conjunto com os produtos Raspberry Pi. Qualquer outro uso dos RECURSOS é proibido. Nenhuma licença é concedida a qualquer outro RPL ou outro direito de propriedade intelectual de terceiros. ATIVIDADES DE ALTO RISCO. Os produtos Raspberry Pi não são projetados, fabricados ou destinados ao uso em ambientes perigosos que exigem desempenho à prova de falhas, como na operação de instalações nucleares, navegação de aeronaves ou sistemas de comunicação, controle de tráfego aéreo, sistemas de armas ou aplicações críticas de segurança (incluindo suporte à vida sistemas e outros dispositivos médicos), em que a falha dos produtos pode levar diretamente à morte, lesões corporais ou graves danos físicos ou ambientais (“Atividades de alto risco”). A RPL se isenta especificamente de qualquer garantia expressa ou implícita de adequação para atividades de alto risco e não aceita nenhuma responsabilidade pelo uso ou inclusão de produtos Raspberry Pi em atividades de alto risco. Os produtos Raspberry Pi são fornecidos sujeitos aos Termos Padrão da RPL. O fornecimento dos RECURSOS pela RPL não expande ou de outra forma modifica os Termos Padrão da RPL, incluindo, entre outros, as isenções de responsabilidade e garantias neles expressas.

Histórico de versões do documento

RaspberryPi-KMS-HDMI-Output-Graphics-Driver-FIG-1

Escopo do documento

Este documento se aplica aos seguintes produtos Raspberry Pi

RaspberryPi-KMS-HDMI-Output-Graphics-Driver-FIG-2

Introdução

Com a introdução do driver gráfico KMS (Kernel Mode Setting), a Raspberry Pi Ltd está se afastando do controle de firmware herdado do sistema de saída de vídeo e adotando um sistema gráfico de código aberto. No entanto, isso veio com seu próprio conjunto de desafios. Este documento destina-se a ajudar com quaisquer problemas que possam surgir ao mudar para o novo sistema. Este whitepaper pressupõe que o Raspberry Pi está executando o Raspberry Pi OS e está totalmente atualizado com o firmware e os kernels mais recentes.

Terminologia

DRMs: Direct Rendering Manager, um subsistema do kernel Linux usado para se comunicar com unidades de processamento gráfico (GPUs). Usado em parceria com FKMS e KMS.
DVI: Um predecessor do HDMI, mas sem os recursos de áudio. Cabos e adaptadores HDMI para DVI estão disponíveis para conectar um dispositivo Raspberry Pi a um monitor equipado com DVI.
EDIÇÃO: Dados de identificação de exibição estendida. Um formato de metadados para dispositivos de exibição para descrever seus recursos para uma fonte de vídeo. A estrutura de dados EDID inclui nome do fabricante e número de série, tipo de produto, tamanho físico da tela e os tempos suportados pela tela, juntamente com alguns dados menos úteis. Alguns monitores podem ter blocos EDID defeituosos, o que pode causar problemas se esses defeitos não forem tratados pelo sistema de exibição.
FKMS (vc4-fkms-v3d): Configuração de modo de kernel falso. Embora o firmware ainda controle o hardware de baixo nível (por exemploample, as portas High-Definition Multimedia Interface (HDMI), a Display Serial Interface (DSI), etc), as bibliotecas padrão do Linux são usadas no próprio kernel. O FKMS é usado por padrão no Buster, mas agora está obsoleto em favor do KMS no Bullseye.
HDMI: A Interface Multimídia de Alta Definição é uma interface proprietária de áudio/vídeo para transmissão de dados de vídeo não compactados e dados de áudio digital compactados ou não.
HPD: Detecção de hotplug. Um fio físico que é declarado por um dispositivo de exibição conectado para mostrar que está presente.
KMS: Configuração do Modo Kernel; ver https://www.kernel.org/doc/html/latest/gpu/drm-kms.html para mais detalhes. No Raspberry Pi, vc4-kms-v3d é um driver que implementa o KMS e costuma ser chamado de “o driver KMS”. Pilha gráfica herdada: Uma pilha gráfica totalmente implementada no blob de firmware VideoCore exposto por um driver de framebuffer do Linux. A pilha de gráficos legados foi usada na maioria dos dispositivos Raspberry Pi Ltd até recentemente; agora está sendo gradualmente substituído por (F)KMS/DRM.

O sistema HDMI e os drivers gráficos

Os dispositivos Raspberry Pi usam o padrão HDMI, muito comum em monitores LCD e televisores modernos, para saída de vídeo. Raspberry Pi 3 (incluindo Raspberry Pi 3B+) e dispositivos anteriores têm uma única porta HDMI, que é capaz de saída de 1920 × 1200 @60Hz usando um conector HDMI de tamanho normal. O Raspberry Pi 4 possui duas portas micro HDMI e é capaz de saída 4K em ambas as portas. Dependendo da configuração, a porta HDMI 0 no Raspberry Pi 4 é capaz de até 4kp60, mas ao usar dois dispositivos de saída 4K, você fica limitado a p30 em ambos os dispositivos. A pilha de software gráfico, independentemente da versão, é responsável por interrogar os dispositivos HDMI conectados quanto às suas propriedades e configurar o sistema HDMI adequadamente. As pilhas Legacy e FKMS usam firmware no processador gráfico VideoCore para verificar a presença e as propriedades de HDMI. Por outro lado, o KMS usa uma implementação totalmente aberta do lado do ARM. Isso significa que as bases de código para os dois sistemas são totalmente diferentes e, em algumas circunstâncias, isso pode resultar em comportamento diferente entre as duas abordagens. Os dispositivos HDMI e DVI se identificam para o dispositivo de origem usando um pedaço de metadados chamado bloco EDID. Isso é lido pelo dispositivo de origem a partir do dispositivo de exibição por meio de uma conexão I2C e é totalmente transparente para o usuário final, pois é feito pela pilha de gráficos. O bloco EDID contém uma grande quantidade de informações, mas é usado principalmente para especificar quais resoluções o monitor suporta, para que o Raspberry Pi possa ser configurado para produzir uma resolução apropriada.

Como o HDMI é tratado durante a inicialização

Quando ligado pela primeira vez, o Raspberry Pi passa por uma série de stages, conhecido como boot stagé:

  1. os primeirostage, bootloader baseado em ROM inicia a GPU VideoCore.
  2. Segundostage bootloader (este é bootcode.bin no cartão SD em dispositivos anteriores ao Raspberry Pi 4 e em SPI EEPROM no Raspberry Pi 4):
    1. No Raspberry Pi 4, os segundostagO bootloader inicializará o sistema HDMI, interrogará a tela para modos possíveis e, em seguida, configurará a tela apropriadamente. Neste ponto, o visor é usado para fornecer dados básicos de diagnóstico.
    2. A tela de diagnóstico do carregador de inicialização (07 de dezembro de 2022 em diante) exibirá o status de todas as telas conectadas (se Hotplug Detect (HPD) estiver presente e se um bloco EDID foi recuperado da tela).
  3. O firmware VideoCore (start.elf) é carregado e executado. Isso assumirá o controle do sistema HDMI, lerá o bloco EDID de qualquer monitor conectado e mostrará a tela do arco-íris nesses monitores.
  4. O kernel do Linux inicializa
    1. Durante a inicialização do kernel, o KMS assumirá o controle do sistema HDMI a partir do firmware. Mais uma vez, o bloco EDID é lido de qualquer exibição anexada e essas informações são usadas para configurar o console e a área de trabalho do Linux.

Possíveis problemas e sintomas

O sintoma de falha mais comum experimentado ao mudar para o KMS é uma inicialização inicialmente boa, com a tela do carregador de inicialização e, em seguida, a tela do arco-íris aparecendo, seguida após alguns segundos pela tela ficando preta e não voltando. O ponto em que a tela fica preta é, na verdade, o ponto durante o processo de inicialização do kernel quando o driver KMS assume a execução da tela a partir do firmware. O Raspberry Pi está atualmente em execução em todos os aspectos, exceto na saída HDMI, portanto, se o SSH estiver ativado, você poderá fazer login no dispositivo por essa rota. O LED verde de acesso ao cartão SD normalmente piscará ocasionalmente. Também é possível que você não veja nenhuma saída HDMI; sem exibição de bootloader e sem tela de arco-íris. Isso geralmente pode ser atribuído a uma falha de hardware.

Diagnosticando a falha

Nenhuma saída HDMI em tudo
É possível que o dispositivo não tenha inicializado, mas isso está fora do escopo deste white paper. Supondo que o comportamento observado seja um problema de exibição, a falta de saída HDMI durante qualquer parte do processo de inicialização geralmente ocorre devido a uma falha de hardware. Existem várias opções possíveis:

  • Cabo HDMI com defeito
  • Tente um novo cabo. Alguns cabos, especialmente os muito baratos, podem não conter todas as linhas de comunicação necessárias (por exemplo, hotplug) para o Raspberry Pi detectar o monitor com sucesso.
  • Porta HDMI com defeito no Raspberry Pi
  • Se você estiver usando um Raspberry Pi 4, tente a outra porta HDMI.
  • Porta HDMI com defeito no monitor
  • Às vezes, a porta HDMI em um monitor ou TV pode se desgastar. Tente uma porta diferente se o dispositivo tiver uma.
  • Raramente, um dispositivo de exibição pode fornecer apenas dados EDID quando ativado ou quando a porta correta é selecionada. Para verificar, verifique se o dispositivo está ligado e se a porta de entrada correta está selecionada.
  • Dispositivo de exibição não afirmando a linha de detecção de hotplug

Saída inicial, então a tela fica preta
Se a exibição aparecer, mas depois apagar durante a inicialização do kernel do Linux, há várias causas possíveis, e elas geralmente estão relacionadas a um problema na leitura do EDID do dispositivo de exibição. Como pode ser visto na seção acima que trata da sequência de inicialização, o EDID é lido em vários pontos diferentes durante o processo de inicialização, e cada uma dessas leituras é feita por um software diferente. A leitura final, quando o KMS assume, é realizada pelo código inalterado do kernel Linux upstream, e isso não lida com formatos EDID defeituosos, bem como com o software de firmware anterior. É por isso que o monitor pode parar de funcionar corretamente quando o KMS assume o controle. Existem várias maneiras de confirmar se o KMS está falhando ao ler o EDID e duas delas são as seguintes.
Verifique a tela de diagnóstico do bootloader (somente Raspberry Pi 4)

OBSERVAÇÃO
O diagnóstico do carregador de inicialização requer um gerenciador de inicialização recente. Você pode atualizar para a versão mais recente usando estas instruções: https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#updating-the-bootloader Remova o cartão SD e reinicie o Raspberry Pi. Pressione ESC na tela Instalar sistema operacional e a tela de diagnóstico deve aparecer no dispositivo de exibição. Deve haver uma linha no display que começa com display: — por exemploampem:

  • mostrar: DISP0: HDMI HPD=1 EDID=ok #2 DISP1: HPD=0 EDID=nenhum #0

Esta saída de um Raspberry Pi 4 mostra que o sistema detectou um monitor HDMI na porta HDMI 0, a detecção de hotplug foi confirmada e o EDID foi lido corretamente. Nada foi encontrado na porta HDMI 1.

Verifique se o sistema KMS detectou um EDID
Para verificar isso, você precisará fazer login no dispositivo Raspberry Pi por SSH de um computador diferente. O SSH pode ser ativado ao criar uma imagem de cartão SD com o Raspberry Pi Imager, usando as opções de Configurações avançadas. Ativar o SSH em um cartão SD que já foi digitalizado é um pouco mais complicado: você precisará usar outro computador para adicionar um file chamado ssh para a partição de inicialização. Substitua o cartão SD no Raspberry Pi original e ligue-o. Isso deve habilitar o SSH, com um endereço IP alocado pelo DHCP. Uma vez conectado, digite o seguinte no prompt do terminal para exibir o conteúdo de qualquer EDID detectado (talvez seja necessário alterar HDMI-A-1 para HDMI-A-2, dependendo de qual porta HDMI no Raspberry Pi o dispositivo de exibição está conectado para): cat /sys/class/drm/card?-HDMI-A-1/edid Se não houver pastas denominadas card?-HDMI-A-1 ou similar, é provável que nenhum EDID possa ser lido no visor dispositivo.

OBSERVAÇÃO
No caso em que o EDID é lido com sucesso, existe um recurso virtual útil file na mesma pasta, chamada modos, que, quando exibidos, mostram todos os modos possíveis que o EDID afirma que o dispositivo suporta.

Mitigações

Falha de detecção de hotplug Se o firmware e o KMS não conseguirem encontrar um monitor conectado, pode ser uma falha de detecção de hotplug - ou seja, o Raspberry Pi não sabe que um dispositivo foi conectado, então não verifica um EDID. Isso pode ser causado por um cabo ruim ou um dispositivo de exibição que não ativa o hotplug corretamente. Você pode forçar uma detecção de hotplug alterando a linha de comando do kernel file (cmdline.txt) armazenado na partição de inicialização de um cartão SD Raspberry Pi OS. Você pode editar isso file em outro sistema, usando o editor de sua preferência. Adicione o seguinte ao final do cmdline.txt file: video=HDMI-A-1:1280×720@60D Se estiver usando a segunda porta HDMI, substitua HDMI-A-1 por HDMI-A-2. Você também pode especificar uma resolução e uma taxa de quadros diferentes, mas certifique-se de escolher aquelas compatíveis com o dispositivo de exibição.

OBSERVAÇÃO
A documentação sobre as configurações de linha de comando do kernel para vídeo pode ser encontrada aqui: https://www.kernel.org/doc/Documentation/fb/modedb.txt

AVISO
Pilhas de gráficos mais antigas suportavam o uso de uma entrada config.txt para definir a detecção de hotplug, mas no momento da redação isso não funciona com o KMS. Pode ser suportado em versões futuras de firmware. A entrada config.txt é hdmi_force_hotplug e você pode especificar a porta HDMI específica à qual o hotplug se aplica usando hdmi_force_hotplug:0=1 ou hdmi_force_hotplug:1=1. Observe que a nomenclatura para KMS se refere às portas HDMI como 1 e 2, enquanto Raspberry Pi usa 0 e 1.

problemas EDID
Uma minoria de dispositivos de exibição são incapazes de retornar um EDID se forem desligados ou quando a entrada AV errada for selecionada. Isso pode ser um problema quando o Raspberry Pi e os dispositivos de exibição estão no mesmo filtro de linha e o dispositivo Raspberry Pi inicializa mais rápido que o monitor. Com dispositivos como este, pode ser necessário fornecer um EDID manualmente. Ainda mais incomum, alguns dispositivos de exibição têm blocos EDID mal formatados e não podem ser analisados ​​pelo sistema KMS EDID. Nessas circunstâncias, pode ser possível ler um EDID de um dispositivo com resolução semelhante e usá-lo. Em ambos os casos, as instruções a seguir definem como ler um EDID de um dispositivo de exibição e configurar o KMS para usá-lo, em vez de o KMS tentar interrogar o dispositivo diretamente.

Copiar um EDID para um file
Criando um file conter metadados EDID do zero geralmente não é viável e usar um já existente é muito mais fácil. Geralmente, é possível obter um EDID de um dispositivo de exibição e armazená-lo no cartão SD do Raspberry Pi para que possa ser usado pelo KMS em vez de obter um EDID do dispositivo de exibição. A opção mais fácil aqui é garantir que o dispositivo de exibição esteja funcionando e na entrada AV correta e que o Raspberry Pi tenha iniciado o sistema HDMI corretamente. A partir do terminal, agora você pode copiar o EDID para um file com o seguinte comando: sudo cp /sys/class/drm/card?-HDMI-A-1/edid /lib/firmware/myedid.dat Se por algum motivo o EDID não estiver presente, você pode inicializar o dispositivo em um não -Modo KMS que consegue inicializar no desktop ou console, então copie o EDID que o firmware irá (espero) ler com sucesso para um file.

  1. Inicialize no modo gráfico legado.
    1. Edite config.txt na partição de inicialização, certificando-se de executar seu editor usando sudo e altere a linha que diz dtoverlay=vc4-kms-v3d para #dtoverlay=vc4-kms-v3d.
    2. Reinício.
  2. A área de trabalho ou o console de login agora deve aparecer.
    1. Usando o terminal, copie o EDID do dispositivo de exibição conectado para um file com o seguinte comando:
  • tvservice -d meuedid.dat sudo mv meuedid.dat /lib/firmware/

Usando um fileEDID baseado em em vez de interrogar o dispositivo de exibição Edite /boot/cmdline.txt, certificando-se de executar seu editor usando sudo e adicione o seguinte à linha de comando do kernel: drm.edid_firmware=myedid.dat Você pode aplicar o EDID a um porta HDMI específica da seguinte forma: drm.edid_firmware=HDMI-A-1:myedid.dat Se necessário, reinicie no modo KMS fazendo o seguinte:

  1. Edite config.txt na partição de inicialização, certificando-se de executar seu editor usando sudo e altere a linha que diz #dtoverlay=vc4-kms-v3d para dtoverlay=vc4-kms-v3d.
  2. Reinício.

OBSERVAÇÃO
Se você usar um fileEDID baseado em hotplug, mas ainda tiver problemas com hotplug, você pode forçar a detecção de hotplug adicionando o seguinte à linha de comando do kernel: video=HDMI-A-1:D.

Documentos / Recursos

Driver gráfico de saída HDMI RaspberryPi KMS [pdf] Manual do Usuário
KMS, driver gráfico de saída HDMI, saída KMS HDMI, driver gráfico, driver gráfico de saída KMS HDMI, driver

Referências

Deixe um comentário

Seu endereço de e-mail não será publicado. Os campos obrigatórios estão marcados *