AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 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

如何找到当前的 i2c 总线速度?

  • 772

我正在 Linux 上构建自定义游戏控制器,使用标准 PC 硬件(x86_64)上 HDMI、dvi 和 VGA 等视频端口中的 i2c 总线。

我想验证一下我当前的 i2c 总线速度设置,并尝试进行一些修改。我的理解是,这应该是一个 Linux 内核驱动程序的设置,不过我还没搞清楚,所以可能我的理解还不够准确。

所以我尝试的是:

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

好的,i2c_algo_bit 是我正在使用的设备(我认为),也看了 i2c_smbus。

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

我尝试读取 i2c-i801 和 i915 的模块信息,但没有看到任何关于当前总线速度的信息。I2c (DDC) 有几种可能的设置,从 50kHz 到 400kHz。如果尚未设置为 400kHz,我想将其设置为 400kHz。

如何验证 i2c 总线的频率?以及如何更改它?

command-line
  • 2 2 个回答
  • 35 Views

2 个回答

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

    我研究了 6.8.0 系列内核,因为这是 Ubuntu 24.04.2 LTS 系统上目前所拥有的。

    该系统使用了 Quadro K4200 显卡,该显卡公开了 I2C 总线,可以读取所连接显示器的身份:

    $ 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
    

    Quadro K4200 使用该nouveau驱动程序,该驱动程序也依赖于该模块,问题中的驱动程序i2c-algo-bit也是如此。i915

    查看/sys/class/i2c-adapterQuadro K4200 提供的 I2C 总线,我看不到任何可用于定义 I2C 总线速度的用户空间文件。

    i2c-algo-bit.c源代码显示这是一个软件位驱动,其中软件控制I2C 总线上的单个SCL信号,并使用软件在 I2C 总线上信号的切换之间SDA插入最小延迟。

    struct i2c_algo_bit_data具有以下字段,用于控制软件时序:

        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 */
    

    i2c-algo-bit.c 中的函数调用了udelay(),有时会延迟,adap->udelay有时会延迟(adap->udelay + 1) / 2。

    问题中使用的i915/display/intel_gmbus.c驱动程序使用以下宏对 I2C 总线速度进行硬编码:

    #define I2C_RISEFALL_TIME 10
    

    在函数中使用它intel_gpio_setup来初始化i2c_algo_bit_data udelay:

        algo->udelay = I2C_RISEFALL_TIME;
    

    因此,i915 使用的 I2C 总线速度最高为 50 kHz(因为半时钟周期时间被硬编码为 10 微秒)。由于用于控制时序的软件延迟,实际总线速度可能会更低。

    nouveauQuadro K4200 使用的驱动程序也在 nouveau/nvkm/subdev/i2c/bus.c 中的函数中为 i2c-algo-bit 模块硬编码相同的udelay值nvkm_i2c_bus_ctor

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

    DDC标准规定硬件必须支持 100 kHz 的时钟频率,并且只有图形适配器才能作为 I²C 总线的(时钟)主控。因此,您的设备需要能够在 100 kHz 及以下的任何速度下工作,包括时钟拉伸等 I²C 相关的功能。(切勿自行在软件中实现 I²C 功能。如果您的微控制器没有 I²C 外设,请使用其他微控制器或使用其他总线。)

    如果我可以给你一个建议的话:

    不。

    我曾经为一款嵌入式设备做过技术支持,该设备在同一个 I²C 总线上有自己的 EEPROM,并且还用于其前面的 mini-HDMI 接头。

    有时(例如:我的多个独立客户端)在硬件后端从内部 EEPROM 查询硬件属性时使用图形用户界面,会导致 EEPROM 将来自包含 EDID 的屏幕内存的回复误解为写入命令,这是由于总线交互的时间冲突造成的。

    以上提到的设备都是专用设备,这类总线事务每分钟可能不会超过一次。您可以推断一下您的控制器会引发多少次事务,以及与 DDC 的实际功能发生冲突并给用户带来严重困扰的可能性有多大。

    显卡驱动程序通常只是对 I²C 总线进行位操作,并且它们无法意识到 I²C 总线上的多传输事务。

    不要试图把游戏控制器挂在屏幕接口之外。那样只会适得其反,任何需要与控制器交互的软件都需要非常可疑的权限,而且即使在最昂贵但值得信赖的电子产品经销商那里,I²C 转 USB 适配器的价格也低于 2 欧元;你“买个显示器连接器,找个闲置的显卡接口,或者搭建一个能正常工作的直通设备(尽管视频信号是极高带宽且敏感的信号)”的成本绝对比这高。

    如果您正在为 20 世纪 80 年代的游戏机构建游戏控制器,也许会考虑这些游戏机所具有的特定总线 - 无论如何您都会为它们编写非常定制的低级软件。

    更实际的做法是,让你的自定义游戏控制器的微控制器直接支持 USB 接口。人机接口设备 (HID) 类几乎是你能用 USB 实现的最简单的东西。所有相关的微控制器系列,无论你用在什么场合,比如那些不需要百万量级生产或需要微瓦功耗的设备,都包含内置 USB 硬件的成员。实际上,任何微控制器都有一个 UART 接口,如果你需要,可以把它插到你原来的 IBM PC 背面。

    • 1

相关问题

  • ip 命令是否支持通配符?

  • 需要许多参数的实用程序的推荐界面是什么?[关闭]

  • 远程运行 X 应用程序,在远程主机上运行 GUI [关闭]

  • 使 mysql CLI 以交互方式向我询问密码

  • 没有服务器的命令行 pub/sub?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

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

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve