通过I2C读取显示器的EDID信息
生活随笔
收集整理的這篇文章主要介紹了
通过I2C读取显示器的EDID信息
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一:什么是EDID?
?????? 顯示器中用來存儲顯示器信息的數據格式,包括尺寸、廠家、序列號等等。
?????? EDID數據有128個字節,0x15、0x16兩個字節對應顯示器的寬高。
二:如何獲取顯示器EDID?
?????? EDID存儲在顯示器中,本身是一個用來存儲信息的I2C設備(設備地規定0x50),其通過DDC通道(i2c總線)進行讀取。在服務器上,DDC信號和VGA其它信號從BMC芯片的DAC接出。
?????? 系統下,在加載i2c-dev驅動過后(modprobe i2c-dev),系統下會創建i2c設備節點,通過文件操作去進行i2c的讀取。
#include <fcntl.h> #include <unistd.h> #include <linux/i2c.h> #include <linux/i2c-dev.h> #include <stdio.h> #include <sys/ioctl.h>#define DDC_ADDR 0x50 // #define BASE_ADDR 0x00 #define BASE_ADDR 0x15 //0x15-width, 0x16-height #define DATA_LEN 2 // edid_lenght is 128int main(int argc, char** argv) {if(argc <= 1){fprintf(stderr, "param error, please input device\n");return -1;}char * i2c_dev = argv[1];int fd =open(i2c_dev, O_RDWR);if (fd < 0){fprintf(stderr, "open dev:%s failed/n", i2c_dev);close(fd);return -1;}ioctl(fd, I2C_TIMEOUT, 2);ioctl(fd, I2C_RETRIES, 1);unsigned char buf[DATA_LEN]={0}; unsigned start = BASE_ADDR;struct i2c_msg msgs[2] = {{.addr = DDC_ADDR,.flags = 0,.len = 1,.buf = (void *)&start,},{.addr = DDC_ADDR,.flags = I2C_M_RD,.len = DATA_LEN,.buf = buf,}};struct i2c_rdwr_ioctl_data rdwr;rdwr.msgs = msgs;rdwr.nmsgs = 2;if(ioctl(fd, I2C_RDWR, &rdwr)<0){fprintf(stderr, "ioctl:i2c_rdwr failed\n");close(fd);return -1;}fprintf(stdout, "Width: %dmm, Height: %dmm\n", buf[0]*10, buf[1]*10);close(fd);return 0; }對于i2c設備,讀取信息時,主設備需要向從設備發送兩個msg,第一個msg包含寫操作(0)、寫入的數據長度(BASE_ADDR長度)和需要讀取的寄存器地址(BASE_ADDR);第二個msg包含需要的讀操作(I2C_M_RD)、讀取數據的長度(等于buf的長度)和數據讀入的地址(buf)。
總結
以上是生活随笔為你收集整理的通过I2C读取显示器的EDID信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络计算机显示器接口,电脑显示器常见的4
- 下一篇: 电脑显示器接口