Jump to content
Sign in to follow this  
Followers 0
Skvo

Рецепты по попытке запустить молчащий AppleHDA

10 posts in this topic

Recommended Posts

Писал для applelife.ru, в тему оживления AppleHDA для кодека AD1988... Но сайт опять полёг, и чтобы не пропала моя писанина выложу пока здесь. Может кому на выходных будет время поковырятся. Поехали:

 

 

На примере своего ноутбука накопил всякого опыта, теперь и с вами поделюсь...

 

Для начала идём на сайт интела и запасаемся спецификацией на High Definition Audio и одним из внесённых в неё исправлений.

В спецификации изучаем структуру команд по управлению кодеком, а в примечании расписано как правильно общаться с самим кодеком.

 

Команды управления кодеком имеют Вид ABBCCCDD или ABBCDDDD, где:

A - адрес кодека (обычно 0 или 2),

BB - номер ноды

ССС или С - код команды

DD или DDDD - отправляемые данные

 

Впринципе с этой структурой вы сталкивались при составлении PIN конфига. Это был частный случай использования четырёх команд 71С, 71D, 71E, 71F, но на самом деле их в спецификации более пятидесяти, для управления всевозможными функциями микшеров, селекторов, усилителей и т.д.

 

Во втором документе нам будут интересны исправления в спецификации, касательно обмена приложениями и самим кодеком. (текущая исправленная версия выделена сине-красным цветом). В этом документе даны адреса смещений памяти регистров управления кодека:

Offset 60h: Immediate Command Output Interface - интерфейс отправки команд

Offset 64h: Immediate Response Input Interface - интерфейс получения ответа

Offset 68h: Immediate Command Status - интерфейс запроса статуса выполнения команд.

И самое главное последний абзац, где указаны последовательные шаги по обмену с кодеком. По русски это звучит так:

(a) Команды управления загружаем в регистр ICW

(B) Отправляем "1" в регистр ICB (bit 0 of ICS)

© ждём выполнения команды кодеком, как только он её выполнит, то сбросит Регистр ICB (bit 0 of ICS) и взамен установит регистр IRV (bit 1 of ICS)

(d) как только мы видим, что регистр IRV (bit 1 of ICS) установлен, то можем читать ответ кодека из регистра IRR

(e) и на последок мы должны сбросить самостоятельно регистр IRV записью в него "1".

 

Ну а теперь переходим к практике, и возвращаемся к моему ноутбуку.

 

Как я тут раньше говорил - драйвер AppleHDA для моего ALC660 был настроен по всем правилам, но хоть и с виду в нём всё работало, но звука реального из динамиков не доносилось. В итоге оказалось, что к моему кодеку ALC660 подключен внешний усилитель, а уже в нему встроенные динамики и наушники. И чтобы появился звук кодек должен дать команду внешнему усилителю на включение. Но на практике драйвер AppleHDA сам это делать не умеет, и приходится ему помогать.

Вот кстати из Линуксового дампа кусок про ноду к которой подключен внешний усилитель.

Node 0x14 [Pin Complex] wcaps 0x40018d: Stereo Amp-Out

Amp-Out caps: ofs=0x00, nsteps=0x00, stepsize=0x00, mute=1

Amp-Out vals: [0x00 0x00]

Pincap 0x0001003c: IN OUT HP EAPD Detect

EAPD 0x2: EAPD

Pin Default 0x99130110: [Fixed] Speaker at Int ATAPI

Жирным выделил функцию ноды по управлению внешним усилителем - EAPD. Теперь переходим к самостоятельному её включению/отключению:

По спецификации смотрим код команды управления функцией EAPD - 70Ch, управление включением/выключением идёт через bit 1. Cоответственно получаем команду на включение EAPD на 14 ноде - 01470С02 и команду на выключение 01470С00.

 

Далее определяем базовый адрес ввода/вывода нашего кодека. Например через IORegistryExplorer:

http://img22.imageshack.us/img22/4862/memz.gif

Затем добавляем смещения, и в моём случае получаются адреса 0xfeaf8060, 0xfeaf8064, 0xfeaf8068 для отправки команд, получения ответа и статуса соответственно.

 

И последний шаг пишем парочку скриптов по прямому управления кодеком через эти адреса:

#!/bin/sh
   sudo reggie_se -D PhysAddr -w 0x01470c02 -a 0xfeaf8060 -B 32
   sudo reggie_se -D PhysAddr -w 1 -a 0xfeaf8068 -B 32

 

#!/bin/sh
   sudo reggie_se -D PhysAddr -w 0x01470c00 -a 0xfeaf8060 -B 32
   sudo reggie_se -D PhysAddr -w 1 -a 0xfeaf8068 -B 32

В итоге выполнив первый скрипт у меня на ноутбуке волшебным образом звук появляется, а по второму скрипту отключается...

 

Эти два примера используют только отправку команд, ответ кодека в данном случае нам не нужен, так-что достаточно только двух пунктов (a) и (B) из вышеприведённых правил общения с кодеком. Если захотите что-то читать из него, то придётся делать полностью все пять пунктов от (a) до (е). Рассмотрим это на примере чтения конфигурации нод из кодека. Те данные что загружается в кодек через четыре команды 71С, 71D, 71E, 71F, могут быть считаны обратно. Причём для чтения нужна всего одна команда - F1C. Скрипт для чтения (на примере всё тойже 14 ноды):

#!/bin/sh
   sudo reggie_se -D PhysAddr -w 0x014f1c00 -a 0xfeaf8060 -B 32
   sudo reggie_se -D PhysAddr -w 1 -a 0xfeaf8068 -B 32
   sudo reggie_se -D PhysAddr -r -a 0xfeaf8068 -B 32
   sudo reggie_se -D PhysAddr -r -a 0xfeaf8064 -B 32
   sudo reggie_se -D PhysAddr -w 2 -a 0xfeaf8068 -B 32

 

при выполнении скрипта получим:

. 4.6.1 (227)

Memory Address - 0x00000000feaf8060 (local)

Address 0xfeaf8060 0x014f1c00 |0 0 0 0|0 0 0 1|0 1 0 0|1 1 1 1|0 0 0 1|1 1 0 0|0 0 0 0|0 0 0 0|

. 4.6.1 (227)

Memory Address - 0x00000000feaf8068 (local)

Address 0xfeaf8068 0x00000001 |0 0 0 0|0 0 0 0|0 0 0 0|0 0 0 0|0 0 0 0|0 0 0 0|0 0 0 0|0 0 0 1|

. 4.6.1 (227)

Memory Address - 0x00000000feaf8068 (local)

Address 0xfeaf8068 0x00000002 |0 0 0 0|0 0 0 0|0 0 0 0|0 0 0 0|0 0 0 0|0 0 0 0|0 0 0 0|0 0 1 0|

. 4.6.1 (227)

Memory Address - 0x00000000feaf8064 (local)

Address 0xfeaf8064 0x90130010 |1 0 0 1|0 0 0 0|0 0 0 1|0 0 1 1|0 0 0 0|0 0 0 0|0 0 0 1|0 0 0 0|

. 4.6.1 (227)

Memory Address - 0x00000000feaf8068 (local)

Address 0xfeaf8068 0x00000002 |0 0 0 0|0 0 0 0|0 0 0 0|0 0 0 0|0 0 0 0|0 0 0 0|0 0 0 0|0 0 1 0|

Где выделено: вначале запрос статуса - получили значение 2, что означает что данные готовы и можно их брать, и в следующем запросе получили сам конфиг 14 ноды.

 

Примечание. Напрямую читать информацию из кодека можно не обязательно при работающем AppleHDA, работать чтение будет абсолютно с любым драйвером. Так что можите при работающей Azalia снять со всех Нод конфиги и посмотреть на них. Также можите читать настройки Микшеров, усилителей и т.д...

 

Ну и на последок для закрепления материала ещё один пример.

На моём кодеке один АЦП (нода 9h), к нему подсоединён селектор (нода 22h), а к селектору ведут два микрофона: один встроен в крышку ноутбука (нода 19h), а второй для внешнего подключения (нода 18h). Так вот получаются в итоге две цепи 9h - 22h -19h и 9h - 22h -18h с двумя общими звеньями. Но сколько я не бился заставить работать переключение с одного микрофона на другой средствами AppleHDA, так ничего и не вышло. Получается или только внешний, или только внутренний.

В итоге в конфигурации драйвера AppleHDA прописал только один путь 9h - 22h -18h, а перекоммутацию с одного микрофона на другой повесил на внешний скрипт:

#!/bin/sh
   sudo reggie_se -D PhysAddr -w 0x01970724 -a 0xfeaf8060 -B 32
   sudo reggie_se -D PhysAddr -w 1 -a 0xfeaf8068 -B 32
   sudo reggie_se -D PhysAddr -w 0x01937080 -a 0xfeaf8060 -B 32
   sudo reggie_se -D PhysAddr -w 1 -a 0xfeaf8068 -B 32
   sudo reggie_se -D PhysAddr -w 0x02237000 -a 0xfeaf8060 -B 32
   sudo reggie_se -D PhysAddr -w 1 -a 0xfeaf8068 -B 32
   sudo reggie_se -D PhysAddr -w 0x02237180 -a 0xfeaf8060 -B 32
   sudo reggie_se -D PhysAddr -w 1 -a 0xfeaf8068 -B 32

 

В котором по порядку: у 19h ноды, которая является двойным устройством умеющим работать и на вход и на выход, вначале отключаю функцию выхода, затем для этой же ноды включаю режим входа в режиме VREF80. Далее в селекторе 22h отключаю цепь идущую к 18h, и следующей командой в селекторе включаю цепь к ноде 19h.

 

В итоге запуск этого скрипта достаточен чтобы микрофоны поменялись местами, а если нужно вернуть их обратно, то у меня в запасе лежит аналогичный скрипт. Так-что можно рулить и таким способом, если штатный драйвер AppleHDA не получается этому научить...

 

 

Так что для тех, у кого вродебы AppleHDA полностью настроен, а в итоге звука всётаки нет, пишите скрипты по инициализации всей цепочки от ЦАПа до выхода на колонки. Это вам должно помочь обнаружить проблемное звено. Проверяете чтобы все усилители были включены, селекторы стояли в нужных положениях, нигде небыло режима Mute и т.д. Особенно хорошо взглянуть в Линуксовые исходники звука на свой кодек и посмотреть там секцию инициализации кодека: там будет перечислен весь список устройств которые нужно подкрутить и какими командами...

 

 

P.S. Утилита reggie_se которая используется для прямого обращения к памяти идёт в составе XCODE, на чистой системе её нет...

Share this post


Link to post
Share on other sites
Advertisement

Изумительная статья! Давно ничего подобного не читал! Обязательно перенесите на Applelife в ветку про ХДА своими руками и про 1988. Если можно - расширьте описательную часть по командам, т. к. не все хорошё владеют английским.

Огромное спасибо!

Share this post


Link to post
Share on other sites

неужели у Квада и сотоварищей по мамке звук заведется???

Share this post


Link to post
Share on other sites

Skvo браво!

Так держать, ждем продолжения.

Если возможно, помочь конкретно получить звук на AD1988B.

Уже руки опустились. ;)

 

Собственно утилита:

reggie_se.zip

Share this post


Link to post
Share on other sites
BIM167, что за манеры?

Когда вижу такое цитирование, считаю это неуважением автору.

Простите, но что Вы имели ввиду? Какое цитирование? Какое неуважение? Я в восторге от статьи - и в мыслях не было кого-либо обижать или не уважать! Если допустил где какую промашку - поправьте. Но я ума не приложу что я написал не так!

Share this post


Link to post
Share on other sites

ох BIM167 :unsure: уже поправился :D я думаю ты понял что Квад хотел сказать :)

Share this post


Link to post
Share on other sites
ох BIM167 :unsure: уже поправился :D я думаю ты понял что Квад хотел сказать :)
Да я, дурень, не заметил, что писал с Quote а не с Ad reply! И только просмотрев своё сообщение повторно понял что к чему. Ужасно напрягает то, что ветка представлена не как последовательность сообщений, а как дерево сообщений. По-этому подобные ошибки плохо ловятся.

Share this post


Link to post
Share on other sites
... Ужасно напрягает то, что ветка представлена не как последовательность сообщений, а как дерево сообщений. ...

Рядом с названием ветки, в этой же строке , нажми на кнопочку "Оптшонз" и выбери "Свитч ту Стандарт", и будет тебе счастье :unsure:

Share this post


Link to post
Share on other sites
Рядом с названием ветки, в этой же строке , нажми на кнопочку "Оптшонз" и выбери "Свитч ту Стандарт", и будет тебе счастье :unsure:
Спасибо - плохо не знать англицкого!

Share this post


Link to post
Share on other sites
Да я, дурень, не заметил, что писал с Quote а не с Ad reply! И только просмотрев своё сообщение повторно понял что к чему. Ужасно напрягает то, что ветка представлена не как последовательность сообщений, а как дерево сообщений. По-этому подобные ошибки плохо ловятся.

Я использую всегда режим: "Linear+", шапка всегда будет видна сверху.

Также можно сделать и на applelife.ru (если заработает), и на других форумах.

IMHO это лучший режим.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  
Followers 0

  • Recently Browsing   0 members

    No registered users viewing this page.

×