【问题标题】:Reading EDID from EEPROM从 EEPROM 读取 EDID
【发布时间】:2011-02-21 11:03:29
【问题描述】:

来自链接:http://en.wikipedia.org/wiki/Extended_display_identification_data

“EDID 通常存储在监视器中称为串行 PROM(可编程只读存储器)或 EEPROM(电可擦除 PROM)的存储设备中,可通过地址 0x50 的 I²C 总线访问。[1] EDID即使显示器本身已关闭,主机 PC 也经常可以读取 PROM。"。

但我不知道,如何阅读这些信息。

有人在这方面帮助我吗?

萨蒂什

【问题讨论】:

    标签: linux embedded


    【解决方案1】:

    使用Linux包monitor-edid,可以读取edid数据。

    这不是默认安装的,也没有包含在我的标准存储库中(CentOS 6)。安装 repo(如果不是你的发行版 repos 的一部分)

    wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
    rpm -Uvh epel-release*rpm
    

    然后你可以安装monitor-edid

    yum install monitor-edid
    

    使用该命令的典型方式是通过解析器管道化原始 edid 数据

    monitor-get-edid | monitor-parse-edid
    

    您的输出将如下所示:

    Name: SyncMaster
    EISA ID: SAM049b
    EDID version: 1.3
    EDID extension blocks: 0
    Screen size: 47.7 cm x 26.8 cm (21.54 inches, aspect ratio 16/9 = 1.78)
    Gamma: 2.2
    Digital signal
    Max video bandwidth: 170 MHz
    
            HorizSync 30-75
            VertRefresh 56-61
    
            # Monitor preferred modeline (59.9 Hz vsync, 66.6 kHz hsync, ratio 16/9, 102 dpi)
            ModeLine "1920x1080" 138.5 1920 1968 2000 2080 1080 1083 1088 1111 -hsync +vsync
    

    【讨论】:

      【解决方案2】:

      如果这个问题仍然相关,请尝试使用以下程序read-edid-i2c。它扫描 i2c 总线并从中读取 EDID 数据。您可以选择给它一个总线号来检查,因为它在找到的第一个 EDID 处停止(在多显示器设置的情况下)。您可能想要修改相关的 i2c 驱动程序,例如 i2c-dev。

      【讨论】:

        【解决方案3】:

        与您所引用的内容完全匹配如下 - Linux 内核源代码使用 i2c 接口实现读取 EDID(0x80 字节)。

        drivers/gpu/drm/drm_edid.c:

        /**
         * drm_get_edid - get EDID data, if available
         * @connector: connector we're probing
         * @adapter: i2c adapter to use for DDC
         *
         * Poke the given i2c channel to grab EDID data if possible.  If found,
         * attach it to the connector.
         *
         * Return edid data or NULL if we couldn't find any.
         */
        struct edid *drm_get_edid(struct drm_connector *connector,
                                  struct i2c_adapter *adapter)
        {
            struct edid *edid = NULL;
        
            if (drm_probe_ddc(adapter))
                    edid = (struct edid *)drm_do_get_edid(connector, adapter);
        
            connector->display_info.raw_edid = (char *)edid;
        
            return edid;
        }     
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多