Board.KolibriOS.org

Official KolibriOS board
It is currently Sat Oct 24, 2020 4:22 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 983 posts ]  Go to page Previous 128 29 30 31 3266 Next
Author Message
PostPosted: Sat Jan 05, 2008 12:47 pm 
Offline
Just Flooding

Joined: Sat Jan 06, 2007 2:30 pm
Posts: 269
В общем, сел я 31декабря писать драйвер для SB16, благо готовых для DOS достаточно, документация тоже есть. Почти закончил на бумаге(в голове, до блокнота лень тянутся), уже почти готов был реализовывать, но упёрся в очень обидную лажу:How to hook an interrupt in KOS? Not an IRQ, but INT? Для непрерывного воспроизведения нужно hook прерывание по следующеву правилу: (SB IRQ)+8, то есть, например, если SB на IRQ2, то нужно int 0xA. А текущая реализация об этом не подозревает, поэтому имеем щелчки, гудение, и прочий хлам. Если интересно, то прочитанные мной доки ныне здесь: http://www.febr7.narod.ru/sbc_prog.7z


Top
   
PostPosted: Sat Jan 05, 2008 10:44 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Такого правила нет. В ДОС контроллер прерываний настроен так, что IRQ_0 соответствует INT_8, а IRQ_2 - INT_0x0A. В Колибри IRQ_0 = INT_0x20. Если надо установить обработчик IRQ есть импортируемая AttachIntHandler или attach_int_handler если драйвер в ядре.
P.S. Часть irq уже занята так что доступны 5,7,9,0xA,0xB.


Top
   
PostPosted: Wed Jan 09, 2008 2:17 pm 
Offline
Just Flooding

Joined: Sat Jan 06, 2007 2:30 pm
Posts: 269
to Serge
То есть на самом деле для своевременной подгрузки данных нужно ждать поступления соответствующего IRQ? Я об этом подозревал, но недостаток опыта сказался. Однако что делать, если мой PNP BIOS выделяет для SB карточки IRQ_2?
В каком формате и как передаёт AC97WAV проигрыватель данные драйверу? В существующих драйверах я разобрался, но недостаточно, остались неясными вышеописанные моменты.


Top
   
PostPosted: Fri Jan 11, 2008 6:34 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Плеер не работает непосредственно с драйвером железа. Это делает infinity - системный ресемплер/микшер. При каждом прерывании драйвер вызывает callback функцию которая записывает смикшированный звук в первичный буфер в формате 16 бит стерео 48КГц. Это не очень совместимо с SB потому что у него максимум 44100, но ресемплеры можно настроить на этот формат. За каждое прерывание записывается 16 Кб. Этого достаточно для равномерного проигрывания.
Irq_2 довольно нестандартный вариант. Стоит посмотреть распределение прерываний в системе. Попробуй назначить прерываение вручную или отключить ненужные порты, особенно usb. В крайнем случае можно и ядро поправить. Это совсем не сложно.


Top
   
PostPosted: Fri Jan 11, 2008 10:50 am 
Offline
Just Flooding

Joined: Sat Jan 06, 2007 2:30 pm
Posts: 269
to Serge
Спасибо за информацию. Буду копаться, если не разберусь спрошу ещё.


Top
   
PostPosted: Fri Jan 11, 2008 12:56 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Надо учесть ещё один момент.
AC97 DMA работает со списками буферов (BDL) аналогично IDE. Первичный буфер в 64 Кб разбит на четыре части по 16 Кб которые проигрываются по-кругу без остановок.
Когда происходит прерывание данные для буфера который должен воспроизводиться уже полностью готовы и выбираются ДМА немедленно, а микшер производит запись в следующий сегмент. При такой схеме нет щелчков если прерывания надолго замаскированы, а в Колибри такое бывает.


Top
   
PostPosted: Mon Jan 14, 2008 11:23 am 
Offline
Just Flooding

Joined: Sat Jan 06, 2007 2:30 pm
Posts: 269
to Serge
У SB это называется auto-init DMA mode. Буфер какого-либо размера разбит на два (в документации это называется наоборот - создан буфер двойного размера), он заполнен данными, которые в цикле проигрываются, пока не сбросят карту или не прервут этот режим соответствующей командой, когда доходит до середины буфера, генерится прерывание, хэндлер которого заполняет первую половину буфера новыми данными, пока воспроизводится вторая. Когда она закончится снова идёт переход к первой половине, генерится прерывание, оповещающие о необходимости записать новые данные в неё, далее процесс повторяется, пока не произойдёт нечто прерывающее этот процесс (смотри выше). Т.е. как я понимаю у AC97 то же, что и у SB, только вместо 2 частей - 4.


Top
   
PostPosted: Mon Jan 14, 2008 12:42 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
В общем похоже, только интелловские контроллеры не умеют гонять буферы по кругу. Они работают со списком буферов (BDL) и когда доходят до конца списка останавливаются. Максимум в списке 32 элемента и номер последнего элемента записывается в регистр lvi(last valid index). Чтобы не мудрить с BDL я заполнил его последовательно адресами сегментов 0 1 2 3 0 1 2 3... и после каждого прерывания по кругу обновляю lvi. В принципе можно обойтись и двумя сегментами. Раньше я писал в буфер с запасом, потом выяснил что система успевает обработать прерывания, но схему менять не стал.


Top
   
 Post subject: В тему
PostPosted: Sat Feb 02, 2008 4:01 pm 
Offline

Joined: Mon Aug 13, 2007 6:47 pm
Posts: 62
Ура, товарищи! Материнка ASUS P4P800-E Deluxe, чипсет Intel 865PE, интегрированный звук Realtek ALC850 - Ac97-плеер РАБОТАЕТ!

С большим удовольствием послушал "Аквариум" под Колибри.

Всем, всем - ОГРОМНОЕ СПАСИБО!

Image

Offtopic: Входя на форум, в поле "Логин", я ввёл "root"... Но потом, призадумавшись, стёр и ввёл-таки своё имя пользователя. :D :D :D


Top
   
PostPosted: Sat Feb 02, 2008 11:19 pm 
Offline
User avatar

Joined: Fri May 18, 2007 11:11 pm
Posts: 125
Версия драйвера sis.obj на svn не рабочая (по крайней мере у меня), в дистре 0710 (вродебы) и в Колибри AZ от Diamonda также, а в 0700 вполне работоспособная.
Для последнего драйвера доска выдает чтото типа:

detect hardvare
Silicon Integrated Systems
7012 AC97 controller
PCI command 00000005
PCI status 00000290
codec io base 0000E001
controller io base 0000E401
codec mmio base 00000000
controller mmio base 00000000
global control 00000002
global status 00300100
device not found
Sound service not loaded
Sound service not installed

А для драйвера из 0700:

detect hardvare
Silicon Integrated Systems
7012 AC97 controller
init codec
global control 00000002
global status 00300100
unknown manufacturer
unknown chip
create primary buffer
service installed

У меня встроенная звуковуха SiS7012 на материнке SIS 651-M (Чипсеты: SIS650GX B0 Northbridge и SIS962L Southbridge (так в книжке написано))

_________________
Заглянул на огонёк


Top
   
PostPosted: Sun Feb 03, 2008 1:01 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Alver
Проверь последний SVN и напиши работает или нет. Там какая-то фигня непонятная с кодеком.


Top
   
PostPosted: Sun Feb 03, 2008 5:01 pm 
Offline
User avatar

Joined: Fri May 18, 2007 11:11 pm
Posts: 125
Serge

Проверил, теперь работает.

_________________
Заглянул на огонёк


Top
   
PostPosted: Sun Feb 03, 2008 11:51 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Alver

А что пишет ? Чип кодека определяется ?


Top
   
PostPosted: Tue Feb 05, 2008 9:29 pm 
Offline
User avatar

Joined: Fri May 18, 2007 11:11 pm
Posts: 125
Serge
Пишет типа этого:
detect hardvare
Silicon Integrated Systems
7012 AC97 controller
PCI command 00000005
PCI status 00000290
codec io base 0000E001
controller io base 0000E401
codec mmio base 00000000
controller mmio base 00000000
global control 00000002
global status 00300100
unknown codec id 00004961
create primary buffer ...done
start play

_________________
Заглянул на огонёк


Top
   
PostPosted: Tue Feb 05, 2008 11:53 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Alver
Похоже это CMedia 9739, только id чипа читается не полностью. А в Win или другим программами удаётся определить чип ?


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 983 posts ]  Go to page Previous 128 29 30 31 3266 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 3 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited