Показ дописів із міткою ядро. Показати всі дописи
Показ дописів із міткою ядро. Показати всі дописи

пʼятниця, 31 жовтня 2008 р.

Давач температури

Нарешті випала невелика нагода добратися до блогу та внести останні нотатки.
Останнім часом ноутбук почав вимикатися при температурі ~90 градусів по Цельсію.
Спершу грішив на кулер, думав може з ним щось, однак після розбирання виявилося, що вся проблема з термопастою, а точніше з її біс зна яким нанесенням (на процесорі її майже не було, взагалі дивно, як воно умудрилося не згоріти). Однак про це далі.
Наразі мова піде про те, як то спало мені на думку і вдалося прикрутити давач температури.

Насправді то зовсім нескладно. Для цього досить трішки полазити по тенетах і почитати чи хтось вже таке робив.

Проблема полягає в кривому БІОСі від HP (Hewlet Packard), а точніше в параметрах ACPI. Для того, щоб полагодити помилку слід списати оте саме ACPI, дизасемблювати, поправити помилку і після того змусити ядро читати поправлену версію.

Найскладніше в цій операції саме процес перезборки ядра, при комп'ютері, який вимикається ;)

Отже, виглядає то всьо таким чином:
  1. Записуємо до теки поточну конфігурацію ACPI (під адміністратором).
  2. sudo cat /proc/acpi/dsdt > /tmp/DSDT
  3. Дизасемблюємо отримане чудо:
  4. cd /tmp;iasl -d /tmp/DSDT
  5. Редагуємо файл отриманий файл
  6. vim DSDT.dsl
  7. З методу Method (_HOT, 0, Serialized) забираємо умовності. Їх треба видалити. Яким чином закоментувати - не маю уявлення; Сішний коментар "//" не спрацював (видно руки криві) :(.
  8. Аналогічну річ слід зробити для методу Method (_CRT, 0, Serialized).
  9. В мене після редагування вони набули наступного вигляду:
  10. Method (_HOT, 0, Serialized)
    {
    Return (Add (0x0AAC, Multiply (TPC, 0x0A)))
    }

    Method (_CRT, 0, Serialized)
    {
    Return (Add (0x0AAC, Multiply (TPC, 0x0A)))
    }
  11. Після цього треба скомпілювати отриманий код:
  12. iasl -tc DSDT.dsl
  13. Отриманий файл DSDT.hex слід скопіювати до підтеки include теки джерельного коду Вашого ядра. В моєму випадку то виглядає таким чином:
  14. sudo cp DSDT.hex /usr/src/dv5temp/linux-2.6.27.3/include
  15. Тепер треба перезібрати ядро, додавши наступні параметри (я зазвичай користуюся make menuconfig, тому вказую для даного методу налаштування).
    1. Device Drivers -> Generic Driver Options -> Select only drivers that don't need compile-time external hardware (тут зняти опцію)
    2. Power Management Options -> ACPI (Advanced Configuration and Power Interface) Support -> Custom DSDT Table file to include (вписати без лапок "DSDT.hex")


  16. Далі компілюємо ядро і встановлюємо:

    • make
    • make install

  17. Перезавантажуємося з новим ядром і вмикаємо давачі температури.
Начебто все.
Для особливо лінивих та початківців - можу порекомендувати ядро 2.6.27.3 зібране мною.
Серед особливостей ядра - підтримка майже всього обладнання ноутбука (окрім пульту дистанційного керування).
Зібрано все в deb пакетах для улюбленої системи.

Ядро
Заголовки
Документація
Джерельний код
Довідник

Всі матеріали почерпнуто з проекту Lesswatts та Google.

вівторок, 26 серпня 2008 р.

Драйвери Asus NX1001

В ніч з суботи на неділю була сильна гроза, внаслідок чого "накрилася" мережева плата, яка давала інет на локальну мережу. Після недовгих роздумів та пошуку грошей, вирішено купити мережеву плату Asus NX1001. Рішення прийшло в магазині, тим паче, що на упаковці гордо значилося, що мережева підтримується Лінаксом.
Завести з рідних драйверів мені цей чудо-агрегат не вдалося, компілятор мабуть був не в настрої, і відправив мене думати:

nx1001_main.c:228: error: expected ‘)’ before string constant
nx1001_main.c:229: error: expected ‘)’ before string constant
nx1001_main.c:230: error: expected ‘)’ before string constant
nx1001_main.c:231: error: expected ‘)’ before string constant
nx1001_main.c: In function ‘netdev_open’:
nx1001_main.c:924: warning: ‘deprecated_irq_flag’ is deprecated (declared at include/linux/interrupt.h:66)
nx1001_main.c:924: warning: passing argument 2 of ‘request_irq’ from incompatible pointer type
nx1001_main.c: In function ‘sundance_init’:
nx1001_main.c:1928: warning: implicit declaration of function ‘pci_module_init’
make[2]: *** [/home/distr/Drivers/Asus_Net/nx1001_main.o] Error 1


Швидкий пошук у гуглі показав, що мережева підтримується лише для ядер серії 2.4.x. Для ядер серії 2.6.х виробник рекомендував самому допиляти драйвер (от Вам і Асус).
Власне помилка, яку довелося виправляти є досить банальною. Дана мережева (якщо я правильно зрозумів опис у файлі) підтримується на рівні ядра модулем sundance. Однак перезбирувати ядро самому було ліньки, а тому я вирішив поправити таки модуль, взявши за основу модуль ядра 2.6.х (яке використовую на сервері).
Загалом невелика правка дозволила запустити драйвер у ролі модуля.
Завантажити правлену версію драйвера (працює з ядром 2.6.22) можна звідси.

Процес встановлення полягає в наступному (працює для Debian)
make all
sudo cp nx1001.ko /lib/modules/$(uname -r)/kernel/drivers/net
sudo modprobe nx1001

Далі прописуємо у /etc/modules рядок
nx1001
і насолоджуємося з'єднанням.

А можна просто перезібрати ядро (якщо у Вас нестандартне), включивши туди підтримку мережевої плати sundance.