И так по пунктам.
1. Помните себя в первый раз или второй когда вы заглядываете в технический документ...уже не говорю про то что там по английски. Я стараюсь разобраться, но большая часть не понятна. вот поэтому я и говорю что понимание скоро придет. Именно этот документ мне сложно пока читать. Английский на 3-ку знаю)))
2. Madplay & aplay стал проигрывать файлы в imx-spdif, но я пока на слух не слышал и осциллограф на зло увезли.
3. Похоже я опять лапухнулся с SPDIF IN
![](images/smilies/16.gif)
БЕДАААА
В мануале следующее...
The Sony/Philips Digital Interface (SPDIF) module is a stereo that allows the processor
transmit digital audio over it using the IEC60958 standard, consumer format.
i.MX
6Solo/6DualLite provides one SPDIF transmitter with one output.
Может ошибся, надеюсь!!!
Я могу забыть про этот вход ?
4. Как все было...
Структура такая вышла. Предыдущая не полная.
static struct mxc_spdif_platform_data mxc_spdif_data = {
.spdif_tx = 1, /* enable tx */
.spdif_rx = 1, /* enable rx */
.spdif_clk_44100 = 1, /* tx clk from spdif0_clk_root */
.spdif_clk_48000 = 1, /* tx clk from spdif0_clk_root */
.spdif_div_44100 = 4, // sets spdif clock to 256 * FS
.spdif_div_48000 = 4, // sets spdif clock to 256 * FS
.spdif_div_32000 = 6, // sets spdif clock to 384 * FS
.spdif_rx_clk = 0, /* rx clk from spdif stream */
.spdif_clk_set_rate = _set_spdif_clk_rate,
.spdif_clk = NULL, /* spdif bus clk */
};
Функция _set_spdif_clk_rate
#define AUDIO_VIDEO_MIN_CLK_FREQ 650000000
ТУт не уверен
static int _set_spdif_clk_rate(struct clk *clk, unsigned long rate) {
struct clk *pll4_audio = clk_get_parent(clk);
int div;
unsigned long rate_actual;
if ( rate * 16 > AUDIO_VIDEO_MIN_CLK_FREQ) {
div = 16;
} else if (rate * 32 > AUDIO_VIDEO_MIN_CLK_FREQ) {
div = 32;
} else if (rate * 64 > AUDIO_VIDEO_MIN_CLK_FREQ) {
div = 64;
} else {
printk("error finding divider\n");
return 0;
}
// set pll4 first which alters the base frequency
clk_set_rate(pll4_audio, rate * div);
// then set spdif0 which only sets the divider
rate_actual = clk_round_rate(clk, rate);
clk_set_rate(clk, rate_actual);
printk("rate: %lu achieved: %lu div: %d\n", rate, rate_actual, div);
return 0;
}
и инициализация
// FIXME
struct clk *mxc_spdif0;
struct clk *pll4;
mxc_spdif0 = clk_get_sys("mxc_spdif.0", NULL);
pll4 = clk_get(NULL, "pll4");
if (IS_ERR(pll4))
printk("error SPDIF clk_get pll4\n");
clk_set_parent(mxc_spdif0, pll4);
mxc_spdif_data.spdif_core_clk = mxc_spdif0;
clk_put(mxc_spdif_data.spdif_core_clk);
imx6q_add_spdif(&mxc_spdif_data);
imx6q_add_spdif_dai();
imx6q_add_spdif_audio_device();
//
Это все на сегодня. Послушаю скажу что да как.
Знающие люди помогите с параметрами и значениями разобраться, нафтыкал что было))
Спасибо за помощь.