当前位置:   article > 正文

通过I2C读取显示器的EDID信息_如何获取显示器edid信息读取

如何获取显示器edid信息读取

一:什么是EDID

       显示器中用来存储显示器信息的数据格式,包括尺寸、厂家、序列号等等。

       EDID数据有128个字节,0x15、0x16两个字节对应显示器的宽高。

二:如何获取显示器EDID?

       EDID存储在显示器中,本身是一个用来存储信息的I2C设备(设备地规定0x50),其通过DDC通道(i2c总线)进行读取。在服务器上,DDC信号和VGA其它信号从BMC芯片的DAC接出。

       系统下,在加载i2c-dev驱动过后(modprobe i2c-dev),系统下会创建i2c设备节点,通过文件操作去进行i2c的读取。

  1. #include <fcntl.h>
  2. #include <unistd.h>
  3. #include <linux/i2c.h>
  4. #include <linux/i2c-dev.h>
  5. #include <stdio.h>
  6. #include <sys/ioctl.h>
  7. #define DDC_ADDR 0x50
  8. // #define BASE_ADDR 0x00
  9. #define BASE_ADDR 0x15 //0x15-width, 0x16-height
  10. #define DATA_LEN 2 // edid_lenght is 128
  11. int main(int argc, char** argv)
  12. {
  13. if(argc <= 1){
  14. fprintf(stderr, "param error, please input device\n");
  15. return -1;
  16. }
  17. char * i2c_dev = argv[1];
  18. int fd =open(i2c_dev, O_RDWR);
  19. if (fd < 0){
  20. fprintf(stderr, "open dev:%s failed/n", i2c_dev);
  21. close(fd);
  22. return -1;
  23. }
  24. ioctl(fd, I2C_TIMEOUT, 2);
  25. ioctl(fd, I2C_RETRIES, 1);
  26. unsigned char buf[DATA_LEN]={0};
  27. unsigned start = BASE_ADDR;
  28. struct i2c_msg msgs[2] = {
  29. {
  30. .addr = DDC_ADDR,
  31. .flags = 0,
  32. .len = 1,
  33. .buf = (void *)&start,
  34. },{
  35. .addr = DDC_ADDR,
  36. .flags = I2C_M_RD,
  37. .len = DATA_LEN,
  38. .buf = buf,
  39. }
  40. };
  41. struct i2c_rdwr_ioctl_data rdwr;
  42. rdwr.msgs = msgs;
  43. rdwr.nmsgs = 2;
  44. if(ioctl(fd, I2C_RDWR, &rdwr)<0){
  45. fprintf(stderr, "ioctl:i2c_rdwr failed\n");
  46. close(fd);
  47. return -1;
  48. }
  49. fprintf(stdout, "Width: %dmm, Height: %dmm\n", buf[0]*10, buf[1]*10);
  50. close(fd);
  51. return 0;
  52. }

对于i2c设备,读取信息时,主设备需要向从设备发送两个msg,第一个msg包含写操作(0)、写入的数据长度(BASE_ADDR长度)和需要读取的寄存器地址(BASE_ADDR);第二个msg包含需要的读操作(I2C_M_RD)、读取数据的长度(等于buf的长度)和数据读入的地址(buf)。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/996872
推荐阅读
相关标签
  

闽ICP备14008679号