3 октября 2007 г.

Решение проблемы с модулем snd-hda-intel

Поставил на ноутбук Linux. Возникла проблема: не грузится модуль звуковой карты. Эта проблема не зависит от дистрибутива!
При загрузке модуль snd-hda-intel на ноутбуке DELL inspiron выдает сообщение об ошибке:
hda-intel: no codecs initialized

Решение проблемы.

Прийдется руками внести изменения в исходные коды ядра. У меня ядро 2.6.22, но думаю, что это поможет и в более старых версиях.

Ищем файл: /usr/src/linux-2.6.22/sound/pci/hda/patch_sigmatel.c

Ищем строку:
spec->num_pins = 8;
Заменяем на:
spec->num_pins = ARRAY_SIZE(stac9200_pin_nids);

Ищем строку:
spec->num_pins = 8;
Заменяем на:
spec->num_pins = ARRAY_SIZE(stac925x_pin_nids);

Ищем строку:
spec->num_pins = 10;
Заменяем на:
spec->num_pins = ARRAY_SIZE(stac922x_pin_nids);

Ищем строку:
spec->num_pins = 14;
Заменяем на:
spec->num_pins = ARRAY_SIZE(stac927x_pin_nids);

Ищем строку:
spec->num_pins = 14;
Заменяем на:
spec->num_pins = ARRAY_SIZE(stac9205_pin_nids);

Или все тоже самое в формате diff:
--- a/pci/hda/patch_sigmatel.c Thu Jul 05 13:10:51 2007 +0200
+++ b/pci/hda/patch_sigmatel.c Fri Jul 06 11:30:50 2007 +0200
@@ -1958,7 +1958,7 @@ static int patch_stac9200(struct hda_cod
return -ENOMEM;

codec->spec = spec;
- spec->num_pins = 8;
+ spec->num_pins = ARRAY_SIZE(stac9200_pin_nids);
spec->pin_nids = stac9200_pin_nids;
spec->board_config = snd_hda_check_board_config(codec, STAC_9200_MODELS,
stac9200_models,
@@ -2008,7 +2008,7 @@ static int patch_stac925x(struct hda_cod
return -ENOMEM;

codec->spec = spec;
- spec->num_pins = 8;
+ spec->num_pins = ARRAY_SIZE(stac925x_pin_nids);
spec->pin_nids = stac925x_pin_nids;
spec->board_config = snd_hda_check_board_config(codec, STAC_925x_MODELS,
stac925x_models,
@@ -2080,7 +2080,7 @@ static int patch_stac922x(struct hda_cod
return -ENOMEM;

codec->spec = spec;
- spec->num_pins = 10;
+ spec->num_pins = ARRAY_SIZE(stac922x_pin_nids);
spec->pin_nids = stac922x_pin_nids;
spec->board_config = snd_hda_check_board_config(codec, STAC_922X_MODELS,
stac922x_models,
@@ -2181,7 +2181,7 @@ static int patch_stac927x(struct hda_cod
return -ENOMEM;

codec->spec = spec;
- spec->num_pins = 14;
+ spec->num_pins = ARRAY_SIZE(stac927x_pin_nids);
spec->pin_nids = stac927x_pin_nids;
spec->board_config = snd_hda_check_board_config(codec, STAC_927X_MODELS,
stac927x_models,
@@ -2259,7 +2259,7 @@ static int patch_stac9205(struct hda_cod
return -ENOMEM;

codec->spec = spec;
- spec->num_pins = 14;
+ spec->num_pins = ARRAY_SIZE(stac9205_pin_nids);
spec->pin_nids = stac9205_pin_nids;
spec->board_config = snd_hda_check_board_config(codec, STAC_9205_MODELS,
stac9205_models,
Пересобираем модуль. Звук работает.

2 комментария:

  1. Э-э-э... Скажите, это правда проще чем просто выключить и включить комп?

    цитата:

    "...с Вистой. Выключил комп, ... включил Висту и... она скотина работает как будто ничего не случилось...

    :)

    ОтветитьУдалить
  2. Иван :)

    "Она скотина работает..." и далее по тексту. Так вот, повторюсь. Перед этим она 2!!! часа не могла загрузиться!!! Виста!!! Помогла только загрузка в save mode и check disk. Сколько продолжается полная проверка 160Г диска мне рассказывать? И такое с Вистой, на моем ноутбуке происходило раз в 2-3 дня.

    По поводу Линукс. Очень новое оборудование Линукс поддерживает не очень. Это правда. Но это имеется в виду официальное ядро. Просто Линус Торвальдс не сразу ставит новые и не до конца проверенные драйвера в официальное ядро. Очень консервативный мужик. Зато я могу залезть в исходные коды ядра, поменять 4 строки и все заработает, навсегда заработает, а не на 3 дня, как это случилось с Вистой. А узнаю я эти 4 строки от других разработчиков ядра. Парадокс, весь процесс разработки открыт, все исходные коды доступны (ау... Виста... дайте мне возможность посмотреть, что там индусы накодили:) )

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

    Итак, что мне выбрать? Неработающий компьютер и светлое ожидание SP1, который МОЖЕТ БЫТЬ решит эту проблему.
    Или установить Linux, пару дней повозиться с ядром и настройками и в результате получить работающий комп?

    На данный момент у меня полнофункциональный компьютер. Линукс поддерживает все оборудование. И я работаю.

    ОтветитьУдалить