static void lt9611_hdmi_audio_infoframe(struct device *dev, void *data, struct hdmi_codec_params *hparms)
{
struct lt9611 *lt9611 = data;
union hdmi_infoframe audio_frame;
u8 audio_buf[32];
ssize_t audio_len;
int ret,i_frame;
printk("%s(%d) \n",__FUNCTION__,__LINE__);
// 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_PCM;//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_32000; break;
case 44100: audio_frame.audio.sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_44100; break;
case 48000: audio_frame.audio.sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_48000; break;
case 88200: audio_frame.audio.sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_88200; break;
case 96000: audio_frame.audio.sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_96000; break;
case 176400: audio_frame.audio.sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_176400; break;
case 192000: audio_frame.audio.sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_192000; 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]);
printk("0x%X=0x%X\n",0x84b2 + i_frame, audio_buf[i_frame]);
}
// 5. Разрешаем чипу транслировать Audio InfoFrame в HDMI поток (включаем BIT(4) -> 0x10)
regmap_update_bits(lt9611->regmap, 0x843d, 0x10, 0x10);
}
}
}