Пример #1
0
/*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);
}
Пример #2
0
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;

}