Как написать и подключить драйвер звука |
Предыдущая Содержание Следующая |
|
Ядро•Включить поддержку 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>; Проверка версии 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
Таким образом, значения делителя и основной частоты для получения точных значений:
КонфигурацияОбщесистемная конфигурация находится в файле /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. Каким образом происходит проигрывание на других системах? Смотри также Драйверы Драйверы для микросхем 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. Добавлено отключение аппаратного сброса. Gadget Audio http://docs.blackfin.uclinux.org/doku.php?id=linux-kernel:usb-gadget:audio
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Предыдущая Содержание Следующая |