IBM ThinkPad T41

Dostal jsem se k notebooku ThinkPad T41 a rozhodl jsem se na něj nainstalovat Slackware 9.1 jako hlavní operační systém. Nebyly s tím žádné větší problémy. Konfiguraci jednotlivých komponent notebooku popíšu v dalším textu.

Omluvte neaktuálnost textu, článek byl původně na webu t41.zdenda.com. V dnešních distribucích je všechen HW notebooku plně podporován a instalátory samy zvládají vše potřebné nastavit, proto si myslím, že nemá cenu článek aktualizovat. Jen pro informaci, na notebooku jsem provozoval kromě slackware i Debiana (testing/unstable) a teď na něm mám Fedoru Core 6.

  • Touchpad
  • USB
  • IrDA
  • WiFI
  • Modrý zub
  • PCMCIA
  • Síťová karta
  • Modem
  • ACPI
  • Základní informace o HW

    Informace o HW z webu IBM si určitě umí najít každý, proto sem přikládám pouze informace získané z výpisů přímo z počítače.

    Jádro

    Požil jsem jádro 2.6.5, jádro jsem si přeložil své. Jádro z distribuce (na notebooku jsem měl nainstalovaný Redhat 9, SUN JDS) mělo problémy s ACPI.

    /tmp

    Protože mám v notebooku 768MiB RAM, rozhodl jsem se pro využití tmpfs pro adresář /tmp. Velikost /tmp jsem omezil na 800MiB, trochu nepříjemné je, že když zaplním /tmp a RAMku, tak mi asi nezůstane moc místa pro suspend na disk. Tak veliký tmp jsem volil proto, že programy jako je mc a minimálně ještě můj skript na vypalování CDček využívají tmp dost agresivně (přeci jen je dost nepříjemné, když si nemůžete vypálit CDčko, z důvodu že došlo místo na disku kde je tmp).

    Pro to abyste mohli využíbvat tmpfs musíte zaponout podporu v jádře. Dále potřebujete záznam v souboru /etc/fstab:

    none   /tmp  tmpfs    size=800m    0   0

    Pozor na to, že se vám bude /tmp sá8m od sebe mazat při vypnutí počítače (vždyť je to namapovaná RAMka).

    Grafická karta

    V počítači je grafická karta ATI Radeon Mobility 7500, ATI nabází na svém webu ke stažení linuxové ovladače (fglrx), ale protože s nima nemám dobré zkušenosti na Radeon 9200 + jádro 2.6, tak jsem se je ani nesnažil zprovoznit a použil ovladače co jsou přímo v XFree.

    Framebuffer

    Často pracuji pouze v textové konzoli, má to své výhody, například šetřím baterku, také se mi v konzoli líp čte. Nastavení zobrazování v konzoli je jednoduché, stačí mít v jádře zakompilovanou podporu pro vesa framebuffer a jádru předa při bootu parametr (např.) vga=791.

    XFree

    Slackware 9.1 obsahuje XFree 4.3, s grafickou kartou si to poradilo bez problémů jak ve 2D tak i 3D. Driver ati i radeon fungují moc pěkně. Jediný problém na který jsem narazil u grafiky je neprobuzení se z suspendování (jedno jestli do RAM nebo na disk) v případě, že jsem nepřidal do XF86Config volbu Oprion "NoAccell" "true". Radeona 7500 s DRI akcelerací lze suspendovat pokud se použije upravený ovladač, který je dostupný na adrese http://cpbotha.net/dri_resume.html

    XF86Config

    Nastavení grafické karty:

    Section "Device"
        Identifier  "Card0"
            Driver      "radeon"
        Option      "NoAccel" "true"
        VendorName  "ATI Technologies Inc"
        BoardName   "Radeon Mobility M7 LW [Radeon Mobility 7500]"
        BusID       "PCI:1:0:0"
    EndSection

    Monitor:

    Section "Monitor"
        Identifier   "Monitor0"
        VendorName   "Monitor Vendor"
        ModelName    "Monitor Model"
    EndSection

    Screen:

    Section "Screen"
        Identifier "Screen0"
        Device     "Card0"
        Monitor    "Monitor0"
        DefaultDepth      24
        SubSection "Display"
            Depth     24
            Modes     "1024x768" "800x600"
        EndSubSection
    EndSection

    Touchpad

    Touchpad mi standardně fungoval pouze jako pohybovátko, nefungoval na něj poklep a podobné věci. V konzoli mi to nevadí, ale v Xkach ano. Vyřešilo to použití ovladače synaptics. Výhody ovladače synaptics jsou velké. Přímo na touchpadu je po celé levé straně místo pro scrollování svisle, na dolním okraji je proužek pro scrollování vodorovně. V pravém dolním rohu je místo které nahrazuje pravé myšítko (tlačítko na myši) a v pravém horním rohu je náhrada za prostřední tlačítko myši. Kdekoliv ve zbývajícím prostoru funguje touchpad naprosto normálně, pohyb muši, poklep který nahrazuje levé tlačítko myši.

    Nastavení touchpadu v konzoli:

    V konzoli požívám klasický gpm

    /usr/sbin/gpm -m /dev/mouse -t imps2

    Nastavení touchpadu v X:

    Section "InputDevice"
      Driver        "synaptics"
      Identifier    "Mouse0"
      Option        "Device"        "/dev/psaux"
      Option        "Protocol"      "auto-dev"
      Option        "LeftEdge"      "1700"
      Option        "RightEdge"     "5300"
      Option        "TopEdge"       "1700"
      Option        "BottomEdge"    "4200"
      Option        "FingerLow"     "25"
      Option        "FingerHigh"    "30"
      Option        "MaxTapTime"    "180"
      Option        "MaxTapMove"    "220"
      Option        "VertScrollDelta" "100"
      Option        "MinSpeed"      "0.06"
      Option        "MaxSpeed"      "0.12"
      Option        "AccelFactor" "0.0010"
      Option        "SHMConfig"     "on"
    EndSection

    USB

    Notebook má pouze dva USB porty. Potřebný modul je uhci_hcd pro USB1.1 a modul ehci_hcd pro USB2.0

    USB myš

    PS2 port je dnes přežitek 🙂 a tak ani T41 žádný nemá. Nijak mi to nevadí mám pouze USB myšky. v Jádře je potřeba nastavit potvory jako je HID a tak… no je to popsaný minimálně na www.abclinuxu.cz

    Nastavení v X(pro MS Intelli Mouse 1.1A):

    Section "InputDevice"
        Identifier  "Mouse1"
        Driver      "mouse"
        Option      "Protocol" "ExplorerPS/2"
        Option      "Device" "/dev/input/mice"
        Option      "Buttons" "5"
        Option      "ZAxisMapping" "4 5"
    EndSection
    Section "ServerLayout"
        Identifier     "XFree86 Configured"
        Screen      0  "Screen0" 0 0
        InputDevice    "Mouse1" "AlwaysCore"
            InputDevice    "Mouse0" "CorePointer"
        InputDevice    "Keyboard0" "CoreKeyboard"
    EndSection

    USB storage

    Jsem vlastník nějakého noname USB Flash disku, pro jeho zprovoznění stačí nahrát modul usb_storage a pak je dostupný jako /dev/sda

    K počítači jsem si pořídil externí DVD vypalovačku s rozhraním USB2.0, pro její rozeběhnutí a používání potřebujete moduly do jádra sg, sr_mod.

    USB to RS232

    Na stránce Linux jako konzole k RS232 jsem popsal jak to vypadá8 když použijete redukci USB to RS232.

    IrDA

    Pořídil jsem si Palma (Tungsten C) a tak mě napadlo, že bych na něm mohl vyzkoušet synchronizaci přez IrDA, kupodivu tu funguje lip než přez USB kabel. Postup sprovoznění IrDA portu v notebooku je relativně jednoduché. Do jádra je potřeba nahrát moduly irda, ircomm_tty, ircomm, irtty_sir a sir_dev, dál je potřeba nastavit seriový port pomocí setserial /dev/ttyS1 uart none a povolit na něm IrDA programem irattach, irattach /dev/ttyS1. Od této chvíle všude můžete požívat IR port jako zařízení /dev/ircomm0. V případě, že chcete na IR port přistupovat jako normální uživatel, nastavte správně práva (chown root:uucp /dev/ircomm0,chmod 664 /dev/ircomm0, přidejte daného uživatele do skupiny uucp). Pokud chcete vidět co vám například palm nebo mobil posílají přez IR, spusťte program irdadump, který vypisuje na obrazovku přijímaná data.

    WiFi

    Pro práci s WiFi kartou používám ovladač od Intelu ipw2100, připojuji se jako klient do sítě případně funguji v režimu Ad-Hoc když se připojuji z palma a jede to v pohodě.

    Modrý zub

    Modrý zub (Bluetooth) funguje dobře, používám myš Logitech MX900 přez BT a jsem velmi spokojeny. Pro správnou funkci BT jsou potřeba moduly bluetooth, bfusb, hci_usb

    PCMCIA

    <p>Bohužel nemám nic do PCMCIA slotu, ale podpora PCMCIA v linuxu je obecne velmi dobrá.</p>
    

    Síťová karta

    <p>Notebook má gigabitovou síťovou kartu od intelu, <code>e1000</code> je proto ten vhodný ovladač. Neměl jsem s ním žádné problémy ať už byl jako modul nebo přímo v jádře.</p>
    

    Modem

    Modem je klasický softmodem, v linuxu jsem ho nainstaloval hned napoprvé. Použil jsem ovladač slmodem verze 2.9.9

    ACPI

    <p>Jádro jsem si přeložil s podporou ACPI, běhá to moc pěkně. Funguje mi přez ACPI měření baterky, změna frekvence CPU, měření teploty. Dokonce jsem schopný zpracovávat eventy, které vznikají například při připojení/odpojení od napájení ze sítě.</p>
    

    Kontrola frekvence CPU

    Používám pouze maximální (1400MHz) nebo minimální (600MHz) frekvenci procesoru. Ovládání je jednoduché, stačí zapsat jedno slovíčko do /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor.

    Nastavení minimální frekvence procesoru:

    echo powersave > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

    Nastavení maximální frekvence procesoru:

    echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

    Throttling

    Tato funkce zařazuje do procesoru víc NOP operací, šetří to energii, ovládání přez ACPI je velmi jednoduché:

    Nastavení maximálního příkonu:

    echo 0 > /proc/acpi/processor/CPU/throttling

    Nastavení minimálního příkonu:

    echo 7 > /proc/acpi/processor/CPU/throttling

    jako optimum pro minimální spotřebu jsem si vybral po několika pokusech 4, je to kompromis mezi spotřebou a škubáním programů. Pro jednoduché ovládání jsem si napsal skriptík:

    
    $ cat /usr/local/bin/cpu
    
    #!/bin/sh
    
    hight () {
      echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor && \
      echo 0 > /proc/acpi/processor/CPU/throttling && \
      echo "Nastavuji na vyssi vykon"
    }
    low () {
      echo powersave > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor && \
      echo 4 > /proc/acpi/processor/CPU/throttling && \
      echo "Nastavuji na nizssi spotrebu"
    }
    
    [ "$1" == "s" ] && {
      FREQ=`egrep "cpu MHz" /proc/cpuinfo | gawk '{print $4}' | gawk -F . '{print $1}'`
      [ "${FREQ}" -le "1000" ] && hight || low
    }
    
    [ "$1" == "start" ] && {
      AC=`cat /proc/acpi/ac_adapter/AC/state | gawk '{print $2}'`
      [ "off-line" == "$AC" ]  && low || hight
    }
    
    echo "Aktualni frekvence procesoru: `egrep "cpu MHz" /proc/cpuinfo | gawk '{print $4}'`"
    
    

    Skript je opravdu jednoduchý, takže nečekejte zázraky. Pokud ho spustíte bez parametru, tak vypíše aktuální frekvenci procesoru. Když ho spustíte s parametrem s tak přepne do druhého režimu (pokud je nastavená max. frekvence, tak přepne na nižší a naopak). parametr start využívám k nastavení frekvence při startu notebooku, v /etc/rc.d/rc.local mám přidán řádeček /usr/local/bin/cpu start. parametr start způsobí, že si zjistím jestli je notebook napájený z baterky nebo z AC adaptéru a podle toho nastaví rychlost CPU.

    acpid

    Program acpid je na notebooku velmi důležitý, umožňuje zpracovávat eventy od ACPI. Slackware pro zpracování eventů používá velmi jednoduchý skript na spracování eventů, /etc/acpi/acpi_handler.sh, kam si můžete dopsat své události. Jediné co ted používám je připojení a odpojení od AC adaptáru. Skript jsem upravil takto:

    #!/bin/sh
    set $*
    
    case "$1" in
      button)
        case "$2" in
          power)    /sbin/init 0
                    ;;
          *)        logger "ACPI action $2 is not defined"
                    ;;
        esac
        ;;
      button/lid)
        case "$2" in
          LID)      logger "ACPI Byl zavren nebo otevren displej"
                    ;;
          *)        logger "ACPI akce $1 $2 nebyla definovana"
                    ;;
        esac
        ;;
      ac_adapter)
        case "$4" in
          00000001) logger "ACPI jsem napojen na sit"
                    /usr/local/bin/cpu_hi
                    ;;
          00000000) logger "ACPI jedu na baterku"
                    /usr/local/bin/cpu_low
                    ;;
          *)        logger "ACPI akce $1 $2 $3 $4 nebyla definovana"
                    ;;
        esac
        ;;
      *)
        logger "ACPI group $1 / action $2 is not defined"
        ;;
    esac

    Odkazované skripty /usr/local/bin/cpu_hi a cpu_low obshaují jen zvýšení a snížení frekvence případně nastavení throttlingu.

    Suspend to RAM

    Suspend to ram mi funguje moc pěkně ale nějaká ta muška se vždy najde, na problémy na které jsem narazil:

    • Xka se neprobudí pokud je zapnutá akcelerace
    • Před suspendem je potřeba provést rmmod ipw2100
    • Někdy se mi úplně dokonale neprobudí USB, stačí vyndat a zandat USB zařízení

    Pro suspend do ram jsem si naspal jednoduchý skriptík:

    #!/bin/bash
    ifconfig eth1 down 2>/dev/null
    rmmod ipw2100 2>/dev/null
    sync
    sync
    sync
    echo "Suspenduji do RAM"
    sleep 2
    echo 3 > /proc/acpi/sleep

    Suspend to disk

    Suspend na disk ma podobné problémy jako suspend do ram. Skriptík který jsem si na to napsal kontroluje velikost swapovacího oddílu. Sem tam vypínám swap (a třeba i logování a dalšívěci aby mi to dýl vydrželo na baterku) a když pak chci provéset suspend, tak jsem se divil proč nejde.

    #!/bin/bash
    SWAP=`free | tail -n 1 | gawk '{print $2}'`
    RAM=`free | head -n 2 | tail -n 1 | gawk '{print $2}'`
    if [ $SWAP -le $RAM ]; then
      echo "Pro suspend na disk neni misto na odkladacim oddilu :-("
      exit 1
    fi
    sync
    sync
    sync
    ifconfig eth1 down 2>/dev/null
    rmmod ipw2100 2>/dev/null
    sleep 2
    echo 4 > /proc/acpi/sleep

    Sledování stavu baterie v konzoli

    Protože jsem byl jednu chvíli offline a nemohl jsem si na internetu najít nějaký program, který by kontroloval stav baterky v konzoli, napsal jsem si svůj skript:

    #!/bin/bash
    
    AC_ADAPT=`gawk '{print $2}' < /proc/acpi/ac_adapter/AC/state`
    BAT_STAT=`grep charging /proc/acpi/battery/BAT0/state | gawk '{print $3}'`
    AKT_SPOTREBA=`grep rate /proc/acpi/battery/BAT0/state | gawk '{print $3}'` # mW
    ZBYV_KAPACITA=`grep "remaining capacity" /proc/acpi/battery/BAT0/state | gawk '{print $3}'` # mWh
    ALARM=`gawk '{print $2}' < /proc/acpi/battery/BAT0/alarm `
    TEMP=`gawk '{print $2}' < /proc/acpi/thermal_zone/THM0/temperature `
    CPU=`egrep "cpu MHz" /proc/cpuinfo | gawk '{print $4}' | gawk -F . '{print $1}'`
    ZBYV_H=`bc << EOF
    scale=2
    cas=$ZBYV_KAPACITA/$AKT_SPOTREBA
    scale=0
    cas/1
    EOF
    `
    ZBYV_M=`bc << EOF
    scale=2
    cas=$ZBYV_KAPACITA/$AKT_SPOTREBA
    scale=0
    ((cas%1)*60/1)
    EOF
    `
    
    echo "+-----------------------+------------------+"
    echo "| AC adapter            |    $AC_ADAPT"
    echo "| Baterie               |    $BAT_STAT"
    echo "| Aktualni spotreba     |    $AKT_SPOTREBA mWh"
    echo "| Zbyvajici energie     |    $ZBYV_KAPACITA mWh"
    echo "| Zbyvajici cas         |    $ZBYV_H:$ZBYV_M h"
    echo "| Alarm                 |    $ALARM mW"
    echo "| Teplota               |    $TEMP C"
    echo "| CPU                   |    $CPU MHz"
    echo "+-----------------------+------------------+"
    

    Bohužel jsem neměl k ruce žádnou dokumentaci když jsem to psal, tak tam bude asi pár chyb.

    $Id: index.html,v 1.14 2005/03/04 22:10:22 tsunami Exp $