Как написать и подключить драйвер звука

Предыдущая  Содержание  Следующая  V*D*V

Внимание!

Информацию, приведённую на Alsa-sound-mini-HOWTO (http://tldp.org/HOWTO/Alsa-sound-6.html) следует тщательно проверять по другим источникам.

Ядро

Включить поддержку Device Drivers -> Sound card support -> Advanced Linux Sound Architecture для поддержки вывода звука через интерфейс ALSA;

Включить поддержку Device Drivers -> Sound card support -> Advanced Linux Sound Architecture -> OSS PCM (digital audio) API чтобы при сборке модуля звуковой карты были доступны функции из заголовка <sound/pcm.h>;
судя по всему, в конфигураторе ядра имеется ошибка, потому что при отключенной опции эмуляции OSS одновременно отключаются опции CONFIG_SND_TIMER и CONFIG_SND_PCM, необходимые для сборки модулей ALSA.

Проверка версии ALSA

В исходниках ядра: посмотреть include/sound/version.h.

На работающей системе:

 

cat /proc/asound/version

Файловая система

Создать узлы для устройства в каталоге /dev/snd:

 

cd /dev

mkdir snd

chmod 755 snd

cd snd

mknod controlC0 c 116 0

mknod pcmC0D0p c 116 16

mknod pcmC0D0c c 116 24

mknod timer c 116 33

mknod seq c 116 1

chmod 660 /dev/snd/*

ls -l

crw-rw----    1 root     root      116,   0 Aug 19 16:02 controlC0

crw-rw----    1 root     root      116,  24 Aug 19 16:02 pcmC0D0c

crw-rw----    1 root     root      116,  16 Aug 19 16:02 pcmC0D0p

crw-rw----    1 root     root      116,   1 Aug 19 16:01 seq

crw-rw----    1 root     root      116,  33 Aug 19 16:01 timer

 

Если используется эмуляция OSS, создать узлы устройств OSS:

 

cd /dev

mknod -m 660 mixer c 14 0

mknod -m 660 sequencer c 14 1

mknod -m 660 midi c 14 2

mknod -m 660 dsp c 14 3

mknod -m 660 audio c 14 4

mknod -m 660 sndstat c 14 6

mknod -m 660 music c 14 8

mknod -m 660 dmmidi c 14 9

mknod -m 660 dmfm c 14 10

mknod -m 660 amixer c 14 11

mknod -m 660 adsp c 14 12

mknod -m 660 amidi c 14 13

mknod -m 660 admmidi c 14 14

ln -sf /dev/mixer /dev/mixer0

ln -sf /dev/midi /dev/midi0

ln -sf /dev/dsp /dev/dsp0

ln -sf /dev/audio /dev/audio0

ln -sf /dev/adsp /dev/adsp0

ln -sf /dev/amidi /dev/amidi0

 

Шаблон

При подключении микросхем ЦАП и АЦП или кодека через интерфейс SSC проще всего использовать как шаблон драйвер /sound/spi/at73c213.c. Общим шаблоном является /sound/drivers/dummy.c. Интересна также реализация работы с памятью в rme32.c и rme96.c.

 

Информация, опубликованная на сайтах ALSA, часто не соответствует действительности, поэтому лучше всего смотреть реализацию в драйверах, находящихся в ядре.

 

Драйвер для неуправляемого ЦАП TDA1543 или TDA1541: sound.zip.

Как проверить

Проверка, предложенная на http://tldp.org/HOWTO/Alsa-sound-6.html в п.6.3 не работает.

 

Если ALSA собрана с поддержкой OSS, проверить можно так:

 

# cat pcm-48000-16-stereo.wav > /dev/dsp

 

Музыки ожидать не стоит, будет просто цифровой шум.

 

Либо сыграть что-нибудь через aplay или speaker-test.

Для первого теста параметры проигрываемого звукового файла должны точно соответствовать параметрам звука, поддерживаемых драйвером.

Например, если SSC работает на частоте 47348:

 

# speaker-test -r 47348 -f 1000 -c 2

 

Другие параметры можно использовать только при наличии библиотек-конвертеров. Хороший набор в libasound2 для Debian.

 

При проигрывании звукового PCM файла с помощью aplay загрузка процессора 1% ... 6%.

При проигрывании звукового mp3 файла 44100, 192кбит/сек с помощью madplayer загрузка процессора 25% ... 30%, прерывающая при интенсивной работе через ftp.

Для проигрывания через mplayer мощности процессора не хватает.

 

Для сравнения ARM11 S3C6410, 532 Мгц: madplayer загрузка процессора около 10%, mpalyer - около 40%.

Базовые частоты

SSC использует частоту шины процессора и делитель в диапазоне от 2 до 8190. Для звука обычно используют фиксированные частоты: 5512Hz, 8000Hz, 11025Hz, 16000Hz, 22050Hz, 32000Hz, 44100Hz, 48000Hz, 64000Hz, 88200Hz, 96000Hz, 176400Hz, 192000Hz. Однако, точные значения этих частот можно получить только при определённых значениях основной частоты.

Расчёт делителя:

DIV = clock / (bitrate * stereo * 16-bit)

Теперь округляем делитель до чётного значения.

DIV = (DIV + 1) & 0xFFFE

Получившаяся частота:

BITRATE = clock / (DIV * stereo * 16-bit)

 

Например:

DIV = 100000000 / (48000 * 2 * 16) = 65

DIV = (65 + 1) & 0xFFFE = 66

BITRATE = 100000000 / (66 * 2 * 16) = 47348,48

 

Таким образом, значения делителя и основной частоты для получения точных значений:

 

Частота

Делитель

Частота шины

PLLA для 12 MHz

PLLA для 18.432 MHz

5512

566

99.833.344

нет

нет

8000

384

98.304.000

0x27FFBF7D

0x201FBF03

11025

282

99.489.600

нет

нет

16000

192

98.304.000

0x27FFBF7D

0x201FBF03

22050

141

99.489.600

нет

нет

32000

96

98.304.000

0x27FFBF7D

0x201FBF03

44100

70

98.784.000

нет

нет

48000

64

98.304.000

0x27FFBF7D

0x201FBF03

64000

48

98.304.000

0x27FFBF7D

0x201FBF03

88200

34

95.961.600

нет

0x2340BF50

96000

32

98.304.000

0x27FFBF7D

0x201FBF03

176400

16

90.316.800

нет

0x2030BF05

192000

16

98.304.000

0x27FFBF7D

0x201FBF03

Конфигурация

Общесистемная конфигурация находится в файле /etc/asound.conf.

Конфигурация для пользователя в файле $HOME/.asoundrc.

 

Конфигурация подключаемых модулей библиотеки alsa-lib находится в файле /usr/share/alsa/alsa.conf.

Параметры подключаемых модулей можно посмотреть на странице

http://www.alsa-project.org/alsa-doc/alsa-lib/pcm_plugins.html

Поиск и решение проблем

Посмотреть список карт, которые видит ALSA:

 

# cat /proc/asound/cards

 

Посмотреть /sys/class/sound и проверить соответствующие устройства:

 

# ls -l /sys/class/sound/

lrwxrwxrwx    1 root     root             0 Aug 25 12:50 audio -> ../../devices/virtual/sound/card0/audio

lrwxrwxrwx    1 root     root             0 Aug 25 12:50 card0 -> ../../devices/virtual/sound/card0

lrwxrwxrwx    1 root     root             0 Aug 25 12:50 controlC0 -> ../../devices/virtual/sound/card0/controlC0

lrwxrwxrwx    1 root     root             0 Aug 25 12:50 dsp -> ../../devices/virtual/sound/card0/dsp

lrwxrwxrwx    1 root     root             0 Aug 25 12:50 mixer -> ../../devices/virtual/sound/card0/mixer

lrwxrwxrwx    1 root     root             0 Aug 25 12:50 pcmC0D0p -> ../../devices/virtual/sound/card0/pcmC0D0p

lrwxrwxrwx    1 root     root             0 Aug 25 12:50 timer -> ../../devices/virtual/sound/timer

 

Проверить младшие номера устройств и сравнить их со списком в /proc/asound/devices:

 

# cat /proc/asound/devices

  0: [ 0]   : control

 16: [ 0- 0]: digital audio playback

 33:        : timer

 

Устройство с Linux как звуковая карта для компьютера

К сожалению, не работает. Причина непонятна. На ПК с Windows устройство не стартует, при подключении к ПК с Linux плата виснет.

 

Gadget Audio имеет класс USB Audio, воспринимаемый базовым компьютером как звуковая карта. Он принимает с компьютера через USB PCM поток и посылает его в звуковой кодек на плате для проигрывания. Для записи аналогично выполняется обратная работа.

 

Исходник: drivers/usb/gadget/audio.c.

Конфигурирование Audio Gadget в ядре

Перед включением данной функции убедитесь, что аудиокодек на вашей плате работает нормально.

 

[Linux Kernel Configuration] → [Device Drivers] → [USB support] → [USB Gadget Support]

<M> Support for USB Gadgets 

<M>     Audio Gadget (EXPERIMENTAL) 

 

Сначала на плате загружается драйвер аудио кодека.

Затем загружается драйвер Audio Gadget.

 

# insmod g_audio

 

Если всё нормально, появится сообщение, похожее на это:

 

g_audio gadget: Hardware params: access 3, format 2, channels 2, rate 48000     

g_audio gadget: audio_buf_size 48000, req_buf_size 200, req_count 256           

g_audio gadget: Linux USB Audio Gadget, version: Dec 18, 2008                   

g_audio gadget: g_audio ready                                                   

# g_audio gadget: high speed config #1: Linux USB Audio Gadget

 

На стороне ПК с Linux:

 

# cat /proc/asound/cards

 

 0 [Intel          ]: HDA-Intel - HDA Intel

                      HDA Intel at 0xdfdfc000 irq 16

 1 [Gadget         ]: USB-Audio - Linux USB Audio Gadget

                      Linux 2.6.31.6-ADI-2010R1-pre-svn7883 with musb_h Linux USB Audio Gadget at usb

here,audio gadget device is shown up as sound card 1.

 

На стороне ПК с Windows появится новое устройство.

Тестирование

Проигрывание музыки на ПК под Linux через новое устройство, как показано выше, это звуковая карта 1:

 

# aplay -D plug:hw:1 a.wav

Playing WAVE 'a.wav' : Signed 16 bit Little Endian, Rate 22050 Hz, Stereo

 

Непонятные моменты:

1.Где брать корректную информацию. Ссылки с сайта проекта либо не открываются, либо содержат устаревшую или некорректную информацию. Попытки получить ответы по указанным электронным адресам и на IRC канале также успехом не увенчались.

2.Как можно сделать простейшую проверку драйвера?

3.Почему при отключении эмуляции OSS в ядре отключаются интерфейсы timer и PCM и невозможно скомпилировать драйвер?

4.Можно ли проигрывать звук не пользуясь интерфейсом PCM. Например, если кодек поддерживает аппаратное кодирование/декодирование данных?

5.Как расчитывать параметры драйвера period_bytes_min, period_bytes_max, periods_min, periods_max для получения требуемой задержки?

6.При трассировке плеера aplay видны запросы библиотеки libasound_module_rate_speexrate.so. Однако, это библиотека входит в набор для Debian. Каким образом происходит проигрывание на других системах?

Смотри также

Драйверы

http://opensource.wolfsonmicro.com/cgi-bin/gitweb.cgi?p=linux-2.6-asoc.git;a=tree;f=sound/soc/codecs;hb=dev

Драйверы для микросхем Analog Devices

http://docs.blackfin.uclinux.org/doku.php?id=linux-kernel:drivers#alsa_system_on_a_chip_codecs

ЧаВо

http://alsa.opensrc.org/index.php/FAQ

libasound2

http://packages.debian.org/source/lenny/alsa-lib

Ben Collins. Writing an ALSA driver

http://ben-collins.blogspot.com/2010/04/writing-alsa-driver.html

A close look at ALSA

http://www.volkerschatz.com/noise/alsa.html

Introduction to Sound Programming with ALSA

http://www.linuxjournal.com/article/6735

Audio in embedded Linux systems

http://free-electrons.com/docs/audio/

A Guide Through The Linux Sound API Jungle

http://0pointer.de/blog/projects/guide-to-sound-apis

Драйвер под Linux (не ALSA) для звукового кодека vs1053 с примером под плату MMnet1002

http://sourceforge.net/projects/vs10xx/

Доработанный драйвер vs1053 для работы в виде модуля. Для описания используется board.h. Добавлено отключение аппаратного сброса.

vs10xx.zip

Gadget Audio

http://docs.blackfin.uclinux.org/doku.php?id=linux-kernel:usb-gadget:audio

 

Предыдущая  Содержание  Следующая