/* * decode_audio_data_block() */ static void decode_audio_data_block(unsigned char *e, int n, edid_info_t *edid) { int ne = n / SAD_SIZE; void *sad_offset; otm_hdmi_audio_cap_t *adb = (otm_hdmi_audio_cap_t *) &edid->audio_caps; VERIFY_QUICK(ne > 0, exit); LOG_PRINT(LOG_LEVEL_DETAIL, "[audio data block... %d entries]\n", ne); /* Do we have enough space in SAD table? */ if (edid->short_audio_descriptor_count + ne > MAX_CAPS) { LOG_PRINT(LOG_LEVEL_ERROR, "Too many SADs in EDID. Not adding %d SADs\n", ne); return; } sad_offset = edid->short_audio_descriptor_data + edid->short_audio_descriptor_count * SAD_SIZE; memcpy(sad_offset, e, n); edid->short_audio_descriptor_count += ne; while (ne-- > 0) { /* Do we have room for another capability? */ if (edid->num_caps < MAX_CAPS) { adb[edid->num_caps].format = (*e & 0x78) >> 3; adb[edid->num_caps].max_channels = (*e & 0x07) + 1; adb[edid->num_caps].fs = *(e + 1) & 0x7F; adb[edid->num_caps].ss_bitrate = *(e + 2); print_audio_capability(&adb[edid->num_caps]); edid->num_caps++; } /* Go to the next entry of the block */ e += SAD_SIZE; }
/** * This function called by edid_print tool internally * @ctx : hdmi context handle * @edid : edid information * * Returns nothing. Called by edid_print tool to print * edid information to dmesg for debugging purposes */ static void __hdmi_report_edid(hdmi_context_t *ctx, edid_info_t *edid) { int i = 0; LOG_PRINT(LOG_LEVEL_HIGH, "----------------------\n"); LOG_PRINT(LOG_LEVEL_HIGH, "Name : %s\n", edid->product_name); LOG_PRINT(LOG_LEVEL_HIGH, "Year : %d\n", edid->product_year); LOG_PRINT(LOG_LEVEL_HIGH, "SN : %d\n", edid->product_sn); LOG_PRINT(LOG_LEVEL_HIGH, "Type : %s\n", edid->hdmi ? "HDMI" : "DVI"); LOG_PRINT(LOG_LEVEL_HIGH, "YCbCr444 : %s\n", edid->ycbcr444 ? "Y" : "N"); LOG_PRINT(LOG_LEVEL_HIGH, "YCbCr422 : %s\n", edid->ycbcr422 ? "Y" : "N"); LOG_PRINT(LOG_LEVEL_HIGH, "30 bpp : %s\n", edid->dc_30 ? "Y" : "N"); LOG_PRINT(LOG_LEVEL_HIGH, "36 bpp : %s\n", edid->dc_36 ? "Y" : "N"); LOG_PRINT(LOG_LEVEL_HIGH, "48 bpp : %s\n", edid->dc_48 ? "Y" : "N"); LOG_PRINT(LOG_LEVEL_HIGH, "DC_YUV : %s\n", edid->dc_y444 ? "Y" : "N"); LOG_PRINT(LOG_LEVEL_HIGH, "Max CLK : %d\n", edid->max_tmds_clock); LOG_PRINT(LOG_LEVEL_HIGH, "Lip sync : %s\n", edid->latency_present ? "Y" : "N"); LOG_PRINT(LOG_LEVEL_HIGH, "ILip sync: %s\n", edid->latency_int_present ? "Y" : "N"); LOG_PRINT(LOG_LEVEL_HIGH, "Vid lat : %d\n", edid->latency_video); LOG_PRINT(LOG_LEVEL_HIGH, "Aud lat : %d\n", edid->latency_audio); LOG_PRINT(LOG_LEVEL_HIGH, "IVid lat : %d\n", edid->latency_video_interlaced); LOG_PRINT(LOG_LEVEL_HIGH, "IAud lat : %d\n", edid->latency_audio_interlaced); LOG_PRINT(LOG_LEVEL_HIGH, "HDMI VID : %s\n", edid->hdmi_video_present ? "Y" : "N"); LOG_PRINT(LOG_LEVEL_HIGH, "HDMI 3D : %s\n", edid->enabled_3d ? "Y" : "N"); LOG_PRINT(LOG_LEVEL_HIGH, "SPA : %d.%d.%d.%d\n", (edid->spa & 0xF000) >> 12, (edid->spa & 0x0F00) >> 8, (edid->spa & 0x00F0) >> 4, (edid->spa & 0x000F) >> 0); LOG_PRINT(LOG_LEVEL_HIGH, "Supported timings [%d]:\n", edid->num_timings); for (i = 0; i < edid->num_timings; i++) print_pd_timing(&edid->timings[i], edid->order[i]); LOG_PRINT(LOG_LEVEL_HIGH, "Audio capabilities:\n"); for (i = 0; i < edid->num_caps; i++) print_audio_capability(&edid->audio_caps[i]); print_speaker_layout(edid->speaker_map); LOG_PRINT(LOG_LEVEL_HIGH, "----------------------\n"); }
/* * decode_audio_data_block() */ static void decode_audio_data_block(unsigned char *e, int n, edid_info_t *edid) { int ne = n / 3; otm_hdmi_audio_cap_t *adb = (otm_hdmi_audio_cap_t *) &edid->audio_caps; LOG_PRINT(LOG_LEVEL_DETAIL, "[audio data block... %d entries]\n", ne); while (ne-- > 0) { /* Do we have room for another capability? */ if (edid->num_caps < MAX_CAPS) { adb[edid->num_caps].format = (*e & 0x78) >> 3; adb[edid->num_caps].max_channels = (*e & 0x07) + 1; adb[edid->num_caps].fs = *(e + 1) & 0x7F; adb[edid->num_caps].ss_bitrate = *(e + 2); print_audio_capability(&adb[edid->num_caps]); edid->num_caps++; } /* Go to the next entry of the block */ e += 3; }