Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru
Партнеры:
otladka.com.ua - г.Киев

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:8
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:12
Форум » starterkit.ru » Embedded Linux
Кодек ALC203 путает каналы (SK-AT91SAM9G45)
Hoksmur
Добавлено 24.04.2014 12:33
0
Сообщение: 1
Hoksmur
0

Пункты: 2034
Регистрация: 20.05.2013
Плата SK-AT91SAM9G45/M10, кодек ALC203

Столкнулся со странным эффетком: при начале записи кодек рандомно переставляет правый и левый канал. Сталкивался ли кто-нибудь, и может подскажете, куда копать?
Вопрос в этом разделе, так как утилита arecord тоже путает от запуска к запуску.
Спуститься к концу Подняться к началу
Персональная информация
ADobrynin
Добавлено 24.04.2014 13:18 Сообщение: 2
ADobrynin
0

Пункты: 278
Регистрация: 23.08.2012
Насчет именно ALC203 не знаю, но вообще проблема известная: гуглить по "atmel channel swap". Я сталкивался на своей плате при работе кодека в I2S режиме.
Проистекает она из-за того, что атмеловский SSC в линуксе синхронизируется по перепаду FS, при этом момент старта может попасть как на левый, так и на правый канал.
Существует несколько методов лечения:
1. Синхронизироваться по спаду, читать сразу 32 бита и потом распихивать куда надо. Требует SCLK = 32*FS и перелопачивания драйвера.
2. Ждать нужной полярности FS при старте. Костыль, конечно, но работает.
3. Уйти на DSP режим, если кодек позволяет.
Спуститься к концу Подняться к началу
Персональная информация
Hoksmur
Добавлено 24.04.2014 13:36 Сообщение: 3
Hoksmur
0

Пункты: 2034
Регистрация: 20.05.2013
ADobrynin, а подробней можно? Буду признателен, так как на таком уровне не копал.
PS: попробовал обновить систему на плате - так пишет, что не находит /dev/null и ещё там же кучу. Понимаю, что дело в rootfs, но это всё, что понимаю. Пока только ядро обновил чудом...
Спуститься к концу Подняться к началу
Персональная информация
Hoksmur
Добавлено 24.04.2014 14:05 Редактировалось 24.04.2014 14:06 Сообщение: 4
Hoksmur
0

Пункты: 2034
Регистрация: 20.05.2013
Так... Нашёл такие материалы:
один
два
три
четыре
пять

Не могу понять, куда именно указанные строки вставить.
Что сейчас в исходниках функции:
Код
static int atmel_pcm_trigger(struct snd_pcm_substream *substream,
int cmd)
{
struct snd_pcm_runtime *rtd = substream->runtime;
struct atmel_runtime_data *prtd = rtd->private_data;
struct atmel_pcm_dma_params *params = prtd->params;
int ret = 0;

pr_debug("atmel-pcm:buffer_size = %ld,"
"dma_area = %p, dma_bytes = %u\n",
rtd->buffer_size, rtd->dma_area, rtd->dma_bytes);

switch (cmd) {
case SNDRV_PCM_TRIGGER_START:
prtd->period_ptr = prtd->dma_buffer;

ssc_writex(params->ssc->regs, params->pdc->xpr,
prtd->period_ptr);
ssc_writex(params->ssc->regs, params->pdc->xcr,
prtd->period_size / params->pdc_xfer_size);

prtd->period_ptr += prtd->period_size;
ssc_writex(params->ssc->regs, params->pdc->xnpr,
prtd->period_ptr);
ssc_writex(params->ssc->regs, params->pdc->xncr,
prtd->period_size / params->pdc_xfer_size);

pr_debug("atmel-pcm: trigger: "
"period_ptr=%lx, xpr=%u, "
"xcr=%u, xnpr=%u, xncr=%u\n",
(unsigned long)prtd->period_ptr,
ssc_readx(params->ssc->regs, params->pdc->xpr),
ssc_readx(params->ssc->regs, params->pdc->xcr),
ssc_readx(params->ssc->regs, params->pdc->xnpr),
ssc_readx(params->ssc->regs, params->pdc->xncr));

ssc_writex(params->ssc->regs, SSC_IER,
params->mask->ssc_endx | params->mask->ssc_endbuf);
ssc_writex(params->ssc->regs, SSC_PDC_PTCR,
params->mask->pdc_enable);

pr_debug("sr=%u imr=%u\n",
ssc_readx(params->ssc->regs, SSC_SR),
ssc_readx(params->ssc->regs, SSC_IER));
break; /* SNDRV_PCM_TRIGGER_START */

case SNDRV_PCM_TRIGGER_STOP:
case SNDRV_PCM_TRIGGER_SUSPEND:
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
ssc_writex(params->ssc->regs, ATMEL_PDC_PTCR,
params->mask->pdc_disable);
break;

case SNDRV_PCM_TRIGGER_RESUME:
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
ssc_writex(params->ssc->regs, ATMEL_PDC_PTCR,
params->mask->pdc_enable);
break;

default:
ret = -EINVAL;
}

return ret;
}
Спуститься к концу Подняться к началу
Персональная информация
ADobrynin
Добавлено 24.04.2014 14:14 Сообщение: 5
ADobrynin
0

Пункты: 278
Регистрация: 23.08.2012
Посмотрел на схему, оказывается, ALC203 подключен по AC97, не по SSC. Тогда все то, что я написал, неприменимо.
Не знаю, в чем может быть проблема.
Спуститься к концу Подняться к началу
Персональная информация
Hoksmur
Добавлено 24.04.2014 18:56 Редактировалось 24.04.2014 19:07 Сообщение: 6
Hoksmur
0

Пункты: 2034
Регистрация: 20.05.2013
Появилась идея. Если кто-нибудь подскажет, где и что поменять для смены кодека при сборке ядра, и какие поддерживаются в сборке софта для этой платы - я могу на другом полуубитом экземпляре поменять саму микросхему, и тогда будет однозначно известно, проблема железа кодека или ядра. Останется только неопределённость с железом Atmel.
Спуститься к концу Подняться к началу
Персональная информация
Hoksmur
Добавлено 25.04.2014 07:46 Сообщение: 7
Hoksmur
0

Пункты: 2034
Регистрация: 20.05.2013
дальше. На подопытном кролике поменял кодек на ALC850 - сама возможность подсмотрена в исходниках ядра.
aumix (миксер) его видит, но при попытке воспроизвести что-либо пишет:


aplay: set_params:1053: Unable to install hw params:
ACCESS: RW_INTERLEAVED
FORMAT: S16_LE
SUBFORMAT: STD
SAMPLE_BITS: 16
FRAME_BITS: 32
CHANNELS: 2
RATE: 44100
PERIOD_TIME: (23219 23220)
PERIOD_SIZE: 1024
PERIOD_BYTES: 4096
PERIODS: 6
BUFFER_TIME: (139319 139320)
BUFFER_SIZE: 6144
BUFFER_BYTES: 24576
TICK_TIME: 0



Как я понимаю, надо пересобрать ядро, но в меню конфигурации ядра тип кодека не задаётся, поэтому где и что менять - непонятно.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 25.04.2014 11:16 Редактировалось 25.04.2014 11:30 Сообщение: 8
sasamy
4.70

Пункты: 76988
Регистрация: 14.08.2009
Цитата

поменял кодек на ALC850 - сама возможность подсмотрена в исходниках ядра.


Не понял - что вы хотите поменять в ядре и что подсмотрели в исхониках ?

http://lxr.free-electrons.com/source/sound/atmel/Kconfig#L11

Цитата

the ALC850 is an AC'97 Rev 2.3 compatible multi-channel audio CODEC


это стандартный ac97 кодек

UPD чип-специфичная инициализация ?

http://lxr.free-electrons.com/source/sound/pci/ac97/ac97_patch.c
Спуститься к концу Подняться к началу
Персональная информация
Hoksmur
Добавлено 25.04.2014 13:13 Сообщение: 9
Hoksmur
0

Пункты: 2034
Регистрация: 20.05.2013
В ядре - если оно собрано специфично под ALC203, но вроде бы это не так. Потому что в этом же файле есть другие кодеки, и они не обрамлены условной компиляцией или комментариями.

"Подсмотрено" в файле linux-2.6.36-rc6/sound/pci/ac97/ac97_codec.c

Это не ваше случаем?
Спуститься к концу Подняться к началу
Персональная информация
Hoksmur
Добавлено 25.04.2014 19:36 Редактировалось 26.04.2014 05:45 Сообщение: 10
Hoksmur
0

Пункты: 2034
Регистрация: 20.05.2013
Народ, у кого есть платы с аудиокодеком на Атмеле, можете запустить скрипт шела?
Код
:
var=100
while [ $var -le 120 ]
do
arecord -f cd $var.wav -d 3
sleep 1
var=`expr $var + 1`
done

Скрипт создаст 20 wav-ок, их прослушать.
И отписать здесь, что на плате, и результат.
Я один такой везучий, или это проблемма, на которую не обратили внимание?

UPD 26-04-14
Включить источник записи и усиление. Для линейного входа так на моей плате:
Код

aumix -i 100 -l R -l 100 -q

-i 100 устанавливает максимальное усиление на запись,
-l R выбирает в качестве источника сигнала линейный вход
-l 100 максимальная громкость при прослушивании линейного входа
-q вывести, что получилось.
После этого даже без записи должны быть слышны наводки, если касаемся каналов линейного входа.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux