Загрузка данных


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);
		}
	}
}