问题描述
RK获取EDID是通过命令,将EDID保存为.bin文件。
cat /sys/class/drm/card0-DP-1/edid > /data/edid.bin
cat /sys/class/drm/card0-HDMI-A-1/edid > /data/edid.bin
而直接cat DP或者HDMI的edid节点,收到的数据是乱码。
如果想获取EDID原始数据需要将数据由二进制转化为十六进制。如下:
console:/ # cat /sys/class/drm/card0-HDMI-A-1/edid
0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x63, 0x18, 0x1a, 0x00, 0x01, 0x00, 0x00, 0x00,
0x12, 0x17, 0x01, 0x03, 0x80, 0x21, 0x15, 0x78, 0x0a, 0x43, 0xd5, 0x98, 0x57, 0x52, 0x8c, 0x27,
0x21, 0x50, 0x54, 0xaf, 0xce, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x66, 0x21, 0x50, 0xb0, 0x51, 0x00, 0x1b, 0x30, 0x40, 0x70,
0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x37,
0x4d, 0x0f, 0x46, 0x0f, 0x00, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0xfc,
0x00, 0x4d, 0x53, 0x38, 0x32, 0x50, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x68,
0x02, 0x03, 0x22, 0x71, 0x50, 0x90, 0x05, 0x04, 0x03, 0x07, 0x02, 0x06, 0x01, 0x1f, 0x14, 0x13,
0x12, 0x16, 0x11, 0x15, 0x20, 0x23, 0x09, 0x07, 0x07, 0x68, 0x03, 0x0c, 0x00, 0x10, 0x00, 0xb8,
0x2d, 0xc0, 0x01, 0x1d, 0x00, 0x72, 0x51, 0xd0, 0x1e, 0x20, 0x6e, 0x28, 0x55, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1e, 0x8c, 0x0a, 0xd0, 0x8a, 0x20, 0xe0, 0x2d, 0x10, 0x10, 0x3e, 0x96, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x01, 0x1d, 0x80, 0xd0, 0x72, 0x1c, 0x16, 0x20, 0x10, 0x2c,
0x25, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0x01, 0x1d, 0x00, 0xbc, 0x52, 0xd0, 0x1e, 0x20,
0xb8, 0x28, 0x55, 0x40, 0xc4, 0x8e, 0x21, 0x00, 0x00, 0x1e, 0x8c, 0x0a, 0xd0, 0x90, 0x20, 0x40,
0x31, 0x20, 0x0c, 0x40, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0xe0,
console:/ #
解决方案:
kernel-5.10\drivers\gpu\drm\drm_sysfs.c中找到edid_show函数,该函数为DP和HDMI获取EDID是返回的值,加入以下修改。
static ssize_t edid_show(struct file *filp, struct kobject *kobj,
struct bin_attribute *attr, char *buf, loff_t off,
size_t count)
{
struct device *connector_dev = kobj_to_dev(kobj);
struct drm_connector *connector = to_drm_connector(connector_dev);
unsigned char *edid;
size_t size;
//ssize_t ret = 0;
int j, len = 0;
mutex_lock(&connector->dev->mode_config.mutex);
if (!connector->edid_blob_ptr)
goto unlock;
edid = connector->edid_blob_ptr->data;
size = connector->edid_blob_ptr->length;
if (!edid)
goto unlock;
if (off >= size)
goto unlock;
if (off + count > size)
count = size - off;
// memcpy(buf, edid + off, count);
// ret = count;
/********************************************************************************/
if (off >= size){
return 0;
}
//len += snprintf(buf + len, size, "Edid Raw Data:");
for (j = 0; j < size; j++) {
if(j % 16 == 0 && j > 0){
len += snprintf(buf + len, size, "\n");
}
len += snprintf(buf + len, size, "0x%02x, ",edid[j]);
}
len += snprintf(buf + len, size, "\n");
//return len;
/********************************************************************************/
unlock:
mutex_unlock(&connector->dev->mode_config.mutex);
//return ret;
return len;
}