/* === ПАТЧ: ГЕНЕРАЦИЯ И ЗАПИСЬ AUDIO INFOFRAME === */
{
union hdmi_infoframe audio_frame;
u8 audio_buf[32];
ssize_t audio_len;
int i_frame;
// 1. Стандартная инициализация структуры (выставит правильный type, version и length)
ret = hdmi_audio_infoframe_init(&audio_frame.audio);
if (ret < 0) {
dev_err(dev, "LT9611: Failed to init audio infoframe: %d\n", ret);
} else {
// 2. Заполняем поля структуры вручную
audio_frame.audio.channels = 2; // Для SPDIF всегда 2 канала PCM
audio_frame.audio.coding_type = HDMI_AUDIO_CODING_TYPE_STREAM; // Поток (для SPDIF)
audio_frame.audio.sample_size = HDMI_AUDIO_SAMPLE_SIZE_STREAM; // Определяется потоком
// Маппинг числовой частоты дискретизации в перечисление ядра
switch (hparms->sample_rate) {
case 32000: audio_frame.audio.sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_32KHZ; break;
case 44100: audio_frame.audio.sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_44_1KHZ; break;
case 48000: audio_frame.audio.sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_48KHZ; break;
case 88200: audio_frame.audio.sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_88_2KHZ; break;
case 96000: audio_frame.audio.sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_96KHZ; break;
case 176400: audio_frame.audio.sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_176_4KHZ; break;
case 192000: audio_frame.audio.sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_192KHZ; break;
default: audio_frame.audio.sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_STREAM; break;
}
// 3. Упаковываем структуру в бинарный массив по спецификации HDMI
audio_len = hdmi_infoframe_pack(&audio_frame, audio_buf, sizeof(audio_buf));
if (audio_len < 0) {
dev_err(dev, "LT9611: Failed to pack audio infoframe: %ld\n", audio_len);
} else {
dev_info(dev, "LT9611: Writing Audio InfoFrame to 0x84b2 (%ld bytes)\n", audio_len);
// 4. Записываем байты инфофрейма в чип последовательно, начиная с адреса 0x84b2
for (i_frame = 0; i_frame < audio_len; i_frame++) {
regmap_write(lt9611->regmap, 0x84b2 + i_frame, audio_buf[i_frame]);
}
// 5. Разрешаем чипу транслировать Audio InfoFrame в HDMI поток (включаем BIT(4) -> 0x10)
regmap_update_bits(lt9611->regmap, 0x843d, 0x10, 0x10);
}
}
}
/* === КОНЕЦ ПАТЧА === */