AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 794249
Accepted
j0h
j0h
Asked: 2025-04-28 01:52:23 +0800 CST2025-04-28 01:52:23 +0800 CST 2025-04-28 01:52:23 +0800 CST

como faço para encontrar a velocidade atual do barramento i2c?

  • 772

Estou construindo controladores de jogos personalizados no Linux que usam o barramento i2c presente em portas de vídeo, como HDMI, DVI e VGA, em hardware de PC padrão (x86_64).

Gostaria de verificar minhas configurações atuais de velocidade do barramento i2c e talvez alterá-las. Pelo que entendi, essa seria uma configuração de um driver do kernel Linux, embora eu ainda não tenha descoberto, então talvez eu esteja muito enganado.

Então o que eu tentei foi:

lsmod | grep i2c
i2c_algo_bit           16384  1 i915
i2c_i801               36864  0
i2c_smbus              20480  1 i2c_i801

ok, o i2c_algo_bit é o dispositivo que estou usando (eu acho), dei uma olhada no i2c_smbus também.

modinfo i915
 modinfo i915  | grep -i "baud \| freq \| hz \| rate \| speed"

Tentei ler as informações dos módulos i2c-i801 e i915, mas não vejo nada que indique a velocidade de barramento definida atualmente. O I2c (DDC) tem várias configurações possíveis, de 50 kHz a 400 kHz. Gostaria de defini-lo para 400 kHz, caso ainda não esteja definido.

Como posso verificar a frequência do barramento i2c? e como posso alterá-la?

command-line
  • 2 2 respostas
  • 35 Views

2 respostas

  • Voted
  1. Best Answer
    Chester Gillon
    2025-04-28T03:51:44+08:002025-04-28T03:51:44+08:00

    Pesquisei sobre isso para um Kernel da série 6.8.0, pois é o que temos atualmente em um sistema Ubuntu 24.04.2 LTS.

    O sistema usou uma placa de vídeo Quadro K4200 que expõe um barramento I2C que pode ler a identidade do monitor conectado:

    $ sudo i2cdump -y -r 0-0x7f 1 0x50 c | tail -8 | cut -b 5-51 | edid-decode 
    edid-decode (hex):
    
    00 ff ff ff ff ff ff 00 22 f0 6a 28 01 01 01 01
    02 15 01 03 80 36 23 78 2e fc 81 a4 55 4d 9d 25
    12 50 54 21 08 00 81 40 81 80 95 00 a9 40 b3 00
    d1 c0 01 01 01 01 28 3c 80 a0 70 b0 23 40 30 20
    36 00 22 60 21 00 00 1a 00 00 00 fd 00 3b 3d 18
    50 11 00 0a 20 20 20 20 20 20 00 00 00 fc 00 48
    50 20 5a 52 32 34 77 0a 20 20 20 20 00 00 00 ff
    00 43 4e 54 31 30 32 31 34 30 36 0a 20 20 00 83
    
    ----------------
    
    Block 0, Base EDID:
      EDID Structure Version & Revision: 1.3
      Vendor & Product Identification:
        Manufacturer: HWP
        Model: 10346
        Serial Number: 16843009
        Made in: week 2 of 2011
      Basic Display Parameters & Features:
        Digital display
        Maximum image size: 54 cm x 35 cm
        Gamma: 2.20
        DPMS levels: Off
        RGB color display
        Default (sRGB) color space is primary color space
        First detailed timing is the preferred timing
      Color Characteristics:
        Red  : 0.6435, 0.3349
        Green: 0.3037, 0.6132
        Blue : 0.1464, 0.0703
        White: 0.3125, 0.3291
      Established Timings I & II:
        DMT 0x04:   640x480    59.940476 Hz   4:3     31.469 kHz     25.175000 MHz
        DMT 0x09:   800x600    60.316541 Hz   4:3     37.879 kHz     40.000000 MHz
        DMT 0x10:  1024x768    60.003840 Hz   4:3     48.363 kHz     65.000000 MHz
      Standard Timings:
        DMT 0x20:  1280x960    60.000000 Hz   4:3     60.000 kHz    108.000000 MHz
        DMT 0x23:  1280x1024   60.019740 Hz   5:4     63.981 kHz    108.000000 MHz
        DMT 0x2f:  1440x900    59.887445 Hz  16:10    55.935 kHz    106.500000 MHz
        DMT 0x33:  1600x1200   60.000000 Hz   4:3     75.000 kHz    162.000000 MHz
        DMT 0x3a:  1680x1050   59.954250 Hz  16:10    65.290 kHz    146.250000 MHz
        DMT 0x52:  1920x1080   60.000000 Hz  16:9     67.500 kHz    148.500000 MHz
      Detailed Timing Descriptors:
        DTD 1:  1920x1200   59.950171 Hz   8:5     74.038 kHz    154.000000 MHz (546 mm x 352 mm)
                     Hfront   48 Hsync  32 Hback   80 Hpol P
                     Vfront    3 Vsync   6 Vback   26 Vpol N
        Display Range Limits:
          Monitor ranges (GTF): 59-61 Hz V, 24-80 kHz H, max dotclock 170 MHz
        Display Product Name: 'HP ZR24w'
        Display Product Serial Number: 'CNT1021406'
    Checksum: 0x83
    

    A Quadro K4200 usa o nouveaudriver, que também tem uma dependência do i2c-algo-bitmódulo, assim como o i915driver da pergunta.

    Olhando abaixo /sys/class/i2c-adapterpara os barramentos I2C fornecidos pela Quadro K4200, não consigo ver nenhum arquivo disponível no espaço do usuário que defina a velocidade do barramento I2C.

    O código fonte i2c-algo-bit.c mostra um driver bit-banged de software onde o software controla o indivíduo SCLe SDAos sinais no barramento I2C com software usado para inserir atrasos mínimos entre a alternância dos sinais no barramento I2C.

    struct i2c_algo_bit_data tem o seguinte campo que é usado para controlar o tempo do software:

        int udelay;     /* half clock cycle time in us,
                       minimum 2 us for fast-mode I2C,
                       minimum 5 us for standard-mode I2C and SMBus,
                       maximum 50 us for SMBus */
    

    As funções em i2c-algo-bit.c têm chamadas para udelay(), às vezes atrasando for adap->udelaye outras vezes (adap->udelay + 1) / 2.

    O driver i915/display/intel_gmbus.c usado na questão codifica a velocidade do barramento I2C com a seguinte macro:

    #define I2C_RISEFALL_TIME 10
    

    Que é usado na intel_gpio_setupfunção para inicializar o i2c_algo_bit_data udelay:

        algo->udelay = I2C_RISEFALL_TIME;
    

    Portanto, a velocidade do barramento I2C usada pelo i915 será de no máximo 50 kHz (já que o tempo de meio ciclo de clock é codificado como 10 microssegundos). A velocidade real do barramento provavelmente será menor, devido aos atrasos de software usados ​​para controlar a temporização.

    O nouveaudriver usado para o Quadro K4200 também codifica o mesmo udelayvalor para o módulo i2c-algo-bit, na nvkm_i2c_bus_ctorfunção em nouveau/nvkm/subdev/i2c/bus.c

    • 1
  2. Marcus Müller
    2025-04-28T04:33:52+08:002025-04-28T04:33:52+08:00

    O padrão DDC determina que o hardware deve suportar uma taxa de clock de 100 kHz e que somente a placa gráfica pode ser o mestre (de clock) do barramento I²C. Portanto, seu dispositivo precisa ser capaz de operar em qualquer velocidade de 100 kHz ou menos, incluindo funções I²C complexas, como o alongamento de clock. (Nunca implemente I²C em software. Se o seu microcontrolador não tiver periféricos I²C, use um microcontrolador diferente ou um barramento diferente.)

    Se me permite um conselho:

    Não .

    Eu costumava dar suporte técnico para um dispositivo embarcado que tinha suas próprias EEPROMs no mesmo barramento I²C que também era usado para o cabeçalho mini-HDMI que ele tinha na frente.

    Às vezes (como em: vários clientes independentes meus) usar a interface gráfica do usuário enquanto o backend de hardware estava consultando propriedades de hardware das EEPROMs internas fazia com que as EEPROMs interpretassem incorretamente as respostas da memória de tela contendo EDID como comandos de gravação, devido à colisão de tempo das interações de barramento.

    E isso acontecia com dispositivos especializados, onde essas transações de barramento não aconteciam mais de uma vez por minuto, talvez. Extrapole para quantas transações seu controlador gerará e qual a probabilidade de você entrar em conflito com a função real do DDC e fazer com que o usuário tenha um dia realmente ruim.

    Os drivers de placas de vídeo geralmente apenas bitbang os barramentos I²C e não conseguem reconhecer transações de múltiplas transferências no barramento I²C.

    Não tente pendurar um controle de jogo fora da interface da tela. Isso só vai acabar em lágrimas, requer privilégios muito questionáveis ​​para qualquer software que precise interagir com o controle, e adaptadores I²C para USB custam menos de 2€, mesmo nos distribuidores de eletrônicos mais caros, porém confiáveis ; de jeito nenhum o seu "compro um conector de vídeo, encontro uma porta de placa de vídeo não utilizada ou monto um dispositivo de passagem que ainda funciona, embora os sinais de vídeo sejam extremamente sensíveis e tenham largura de banda extremamente alta" chega perto do custo disso.

    Se você estiver construindo um controle de jogo para um console dos anos 1980, talvez considere os barramentos específicos que esses consoles tinham – de qualquer forma, você estaria escrevendo um software de baixo nível muito personalizado para eles.

    Mais realisticamente, basta fazer o microcontrolador do seu controle de jogo personalizado falar diretamente com USB. A classe Dispositivo de Interface Humana é praticamente a coisa mais simples que você pode implementar em USB. Todas as famílias de microcontroladores relevantes que você usaria para qualquer coisa que não seja produzida aos milhões ou que precise persistir em microwatts contêm membros com hardware USB integrado. Literalmente, qualquer microcontrolador tem uma interface UART; se precisar de algo, você pode conectá-lo à parte traseira do seu PC IBM original.

    • 1

relate perguntas

  • O comando ip suporta curingas?

  • Qual é a interface recomendada para um utilitário que requer muitos parâmetros? [fechado]

  • Execute o aplicativo X remotamente, execute a GUI no host remoto [fechado]

  • Fazendo mysql CLI me pedir uma senha interativamente

  • Pub / sub de linha de comando sem um servidor?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve