/*edid attr*/ static ssize_t show_edid(struct device *dev, struct device_attribute *attr, char *buf) { return hdmitx_edid_dump(&hdmitx_device, buf, PAGE_SIZE); }
int hdmitx_edid_parse(hdmitx_dev_t* hdmitx_device) { unsigned char CheckSum ; unsigned char BlockCount ; unsigned char* EDID_buf = hdmitx_device->EDID_buf; int i, j, ret_val ; hdmi_print(0, "EDID Parser:\n"); ret_val = Edid_DecodeHeader(&hdmitx_device->hdmi_info, &EDID_buf[0]); // if(ret_val == -1) // return -1; for( i = 0, CheckSum = 0 ; i < 128 ; i++ ) { CheckSum += EDID_buf[i] ; CheckSum &= 0xFF ; } if( CheckSum != 0 ) { hdmitx_device->hdmi_info.output_state = CABLE_PLUGIN_DVI_OUT; hdmi_print(0, "PLUGIN_DVI_OUT\n"); // return -1 ; } Edid_DecodeStandardTiming(&hdmitx_device->hdmi_info, &EDID_buf[26], 8); Edid_ParseCEADetailedTimingDescriptors(&hdmitx_device->hdmi_info, 4, 0x36, &EDID_buf[0]); BlockCount = EDID_buf[0x7E] ; if( BlockCount == 0 ){ hdmitx_device->hdmi_info.output_state = CABLE_PLUGIN_DVI_OUT; hdmi_print(0, "EDID BlockCount=0\n"); return 0 ; // do nothing. } else if ( BlockCount > EDID_MAX_BLOCK ) { BlockCount = EDID_MAX_BLOCK ; } for( i = 1 ; i <= BlockCount ; i++ ) { if((BlockCount > 1) && (i == 1)) { CheckSum = 0; //ignore the block1 data } else { if(((BlockCount == 1) && (i == 1)) || ((BlockCount > 1) && (i == 2))) Edid_Parse_check_HDMI_VSDB( &hdmitx_device->hdmi_info, &EDID_buf[i * 128]); for( j = 0, CheckSum = 0 ; j < 128 ; j++ ) { CheckSum += EDID_buf[i*128 + j] ; CheckSum &= 0xFF ; } if( CheckSum != 0 ) { hdmitx_device->hdmi_info.output_state = CABLE_PLUGIN_DVI_OUT; } else { Edid_MonitorCapable861(&hdmitx_device->hdmi_info, EDID_buf[i * 128 + 3]); ret_val = Edid_ParsingCEADataBlockCollection(&hdmitx_device->hdmi_info, &EDID_buf[i * 128]); Edid_ParseCEADetailedTimingDescriptors(&hdmitx_device->hdmi_info, 5, EDID_buf[i * 128 + 2], &EDID_buf[i * 128]); if(hdmitx_device->hdmi_info.output_state != CABLE_PLUGIN_DVI_OUT) hdmitx_device->hdmi_info.output_state = CABLE_PLUGIN_HDMI_OUT; } } if( EDID_buf[i*128+0] == 0x2 ) { if(hdmitx_edid_block_parse(hdmitx_device, &(EDID_buf[i*128]))>=0){ if(hdmitx_device->RXCap.IEEEOUI==0x0c03){ break; } } } } #if 1 i=hdmitx_edid_dump(hdmitx_device, hdmitx_device->tmp_buf, HDMI_TMP_BUF_SIZE); hdmitx_device->tmp_buf[i]=0; hdmi_print_buf(hdmitx_device->tmp_buf, strlen(hdmitx_device->tmp_buf)); hdmi_print(0,"\n"); #endif return 0; }