Category Archives: howto

Quick How-to: Automatically Enable Keyboard Wakeup From Suspend

If you like your power usage low, you probably put your computer to sleep (suspend) as much as possible when idle. If you want to wake up the machine by hitting a key on your keyboard you may need to break some sweat. Even in laptops where this feature is enabled by default, sometimes extra keyboards won’t work.

If you’re using a modern Linux kernel (3.2 and above) and have udev installed you can automatically enable wakeup upon connecting a keyboard by adding the following script to your system.
Simply put the following under your udev rules (e.g. /etc/udev/rules.d/90-keyboardwakeup.rules):

#Whenever a keyboard is connected to the machine, enable wakeup on its parent device
#Note: Conditions are *string* match, not numerical. Check your /sys files for the exact string 
#Enable wakeup on any keyboard connected. Keyboards are HID (class 3) protocol 1 devices.
SUBSYSTEM=="usb", ATTRS{bInterfaceClass}=="03", ATTRS{bInterfaceProtocol}=="01" RUN+="/bin/sh -c 'echo enabled > /sys$env{DEVPATH}/../power/wakeup'" 

The example is based on this post but instead of restricting to a single vendor/product the script should match any USB keyboard (I used a wireless Logitech to test it).

The above should work, but if you need to troubleshoot continue reading.

Note: Accessing device information in Linux (and especially USB devices) can be very confusing, proceed with patience and be ready to go reading around.

To test the script above, you can use udevadm (finding your sysfs /dev/bus/… file is a little tricky. You can go over all of them until you find your device).
Replace the /dev/bus index with the appropriate one:

sudo udevadm test /dev/bus/001/005

If the condition matches you should see in the command output something like (output truncated and highlighted):


run: ‘/bin/sh -c ‘echo enabled > /sys/devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5:1.0/../power/wakeup”
Unload module index
Unloaded link configuration context.

Another test is to restart the udev service, disconnect and reconnect the USB keyboard and run (again, replace device index with appropriate one):

cat /sys/bus/usb/devices/1-5/power/wakeup

Output of the last command should be enabled.

Note that the device itself is 1-5:1.0  but the test is for device 1-5. The reason is that power control is on USB hub rather than the device (keyboard) itself. In this case the ‘hub’ was actually the IR receiver but in wired keyboard it will be one of the computer’s USB hubs

Note that I did not find it necessary to enable wakeup on the parent USB hub as recommended here. You may need to do so.

To do the ultimate test put your computer to sleep (example below assumes you have system.d installed. It takes control over power events over HAL):

sudo dbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1 "org.freedesktop.login1.Manager.Suspend
" boolean:true

The computer should put itsef to sleep. Hit the keyboard and check it comes back online.

Leave a comment

Filed under howto, linux

Powering-Off Discrete Graphics on Switchable Graphics Laptops

Switchable graphics is gaining popularity as a solution to balance performance and power consumption. Linux support for this feature is still very much in development, and until it is the discrete graphics card may take resources even when you don’t use it.

The development of switchable graphics on Linux is being led by Hybrid graphics Linux group. They recently released a driver to turn off the external graphics card. On my system shutting down the card reduced power consumption by 5-10 watts.
Note: This is experimental stuff, your computer may hang or act unexpectedly. Please make sure the discrete graphics card is not being used before proceeding.

Here’s how to test it:
First, install and run poewrtop to get an idea for power consumption (the laptop needs to be disconnected from AC adapter):

sudo apt-get install powertop
sudo powertop

Second, it is recommended to rmmod any kernel modules that may be mapped to the device. For example if you have an Nvidia discrete graphics with the closed source driver running, you should:

sudo rmmod nvidia

Next, download and build the driver:

sudo apt-get install git linux-headers-`uname -r` build-essential
git clone
cd acpi_call
sudo insmod acpi_call.ko
sudo ./

The result of a run should look like (depending on your laptop’s hardware):

Trying \_SB.PCI0.P0P1.VGA._OFF: failed
Trying \_SB.PCI0.P0P2.VGA._OFF: failed
Trying \_SB_.PCI0.OVGA.ATPX: failed
Trying \_SB_.PCI0.OVGA.XTPX: failed
Trying \_SB.PCI0.P0P2.PEGP._OFF: failed
Trying \_SB.PCI0.MXR0.MXM0._OFF: failed
Trying \_SB.PCI0.PEG1.GFX0._OFF: failed
Trying \_SB.PCI0.PEG1.GFX0.DOFF: failed
Trying \_SB.PCI0.XVR0.Z01I.DGOF: failed
Trying \_SB.PCI0.PEGR.GFX0._OFF: failed
Trying \_SB.PCI0.PEG.VID._OFF: works!

Running powertop now should give you about 5-10 watts less.
To test the card is really off you can run the following command:

sudo lspci -vvx

Locate your external graphics card (look for VGA controller with the right make). The card’s PCI configuration space should not be accessible, so it should look something like:

01:00.0 VGA compatible controller: nVidia Corporation GT218 [NVS 3100M] (rev ff) (prog-if ff)
        !!! Unknown header type 7f
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff

To re-enable the card, reboot the machine.

Please consider joining the Hybrid graphics Linux mailing list to help the development effort.

1 Comment

Filed under howto, linux

Programming Arduino with Arduino

Arduino is a great development tool. It’s got an IDE, the community supplies code for almost any device imaginable and everything is completely open source. While it is easy to develop a project around Arduino, sometimes you want to give your new creation a life of its own. Using the method explained here you can create a standalone Ardiono and load sketches to any compatible ATmega chip.

The target chip can be ATmega 8/168/328 etc. (List of compatible IC’s listed here). The target chip is not required to be preloaded with bootloader.
Uploading code to the chip requires a programmer. One common type of programmer is an ISP (In System Programmer). Its advantages are that it requires only few connection pins and is easy to operate. There are many available dedicated ISP’s (for example one from Atmel). But, a programmer is a little more than a microcontroller with a serial connection to the computer. This means that you can easily program chips using Arduino itself with no need of an extra programmer!

As we’ll see, the target chip (the chip we want to program), requires little supporting circuitry, and can run any code that runs on Arduino. This allows designing your circuit around the chip directly, as you would with Arduino and load it with your favourite sketch.

The Circuit

Target chip connected connections to ArduinoISP

Eagle .sch file can be downloaded here. The center of the circuit is the target chip. Notice that the pins are numbered like Arduino, rather than vanilla ATMega. You’ll need this eagle part.
This makes the inclusion of this circuit a very easy reference as it mirrors the Arduino board. Note that the ‘meaning’ of the pins will be valid only after you program the chip with either a bootloader or and Arduino applet.

ATMega Supporting Circuitry

The circuit supporting the target chip is as simple as it can be. The reset pin is chained to a resistor and a 16Mhz crystal (with two 22pf capacitors) provides clock. We’ll discuss alternative clock sources later.

SPI Programmer

We will program our new Arduino using an existing Arduino. This novel idea of bootstrapping was presented here. The software used for the programmer is MegaISP (Recently integrated into the Arduino IDE). MegaISP is an open source Arduino applet that allows it to act as an ISP, with normal programming tools, including Arduino IDE.

To connect the circuit to the Arduino, let’s look at the documentation of ArduinoISP:
// this sketch turns the Arduino into a AVRISP
// using the following pins:
// 10: slave reset
// 11: MOSI
// 12: MISO
// 13: SCK


// Put an LED (with resistor) on the following pins:
// 9: Heartbeat - shows the programmer is running
// 8: Error - Lights up if something goes wrong (use red if that makes sense)
// 7: Programming - In communication with the slave

To summarize connections:

SPI Programming Interface
Status LEDs
(each connected to ground via a resistor)

Finally, here’s the circuit connected to the Arduino:

Arduino connected as an ISP to an ATmega168

In this setup the chip is placed in a ZIF socket. This is not mandatory, but ensures the chip is easily extracted.

The Method

    1. Make sure your version of Arduino IDE is at least 0018.
      From the IDE go to File → Examples → ArduinoISP.

      Click upload. If all went well the heartbeat LED should start winking
    2. Next up, setup the IDE to work on the target board. Click Tools → Board and choose the board according to the chip you want to program:
      ATmega8 – Arduino NG or older w/ ATmega8
      ATmega168   – Arduino Diecimila, Duemilanove, or Nano w/ ATmega168
      ATmega328 – Arduino Duemilanove or Nano w/ Atmega328
    3. If this is the first time you program the target chip, upload the Arduino bootloader. This will make sure the fuses are set properly (more on that later).
      Click Tools → Burn Bootloader → w/ Arduino as ISP

      This process can take some time! Give it a minute or two to complete.

⇒ You should now have a chip running the Arduino bootloader. If you want to program a sketch onto the new chip do the following:

  1. Close all Arduino IDE windows
  2. Find the preferences.txt file (a list of common places can be found here)
  3. Open preferences.txt and change:
    This is explained in details here
  4. Open the Arduino IDE, open your sketch
  5. Make sure Tools → Board is set to the target chip
  6. Compile and upload the sketch
  7. Your new chip should now be running the new sketch!
  8. Revert preferences.txt (remember to close all IDE windows first)

Using these steps you can upload any sketch that would normally work on Arduino. Remember that each target chip has different capacity and limitations.

An alternative to steps 4-11 would be to upload sketches to the target chip using a serial connection like you use on Arduino. This will be explained in details in the next section.

Communicating with the New Chip

While the method showed above in steps 4-11 is useful and stable, it is a bit cumbersome. The manual steps can be avoided with some additional hardware; The new chip can be transformed to a full fledged Arduino by adding it serial access. This will allow loading sketches directly from the IDE without jumping through programmer hoops. As a bonus, this can even be accomplished remotely! Here are a few ideas:

  1. Use an FTDI cable (available here or as a breakout). Once connected, it will register as a new serial port, which can be accessed normally from the Arduino IDE.
  2. Another possibility is to leverage the existing FTDI chip on the Arduino board. This requires removing the original chip from Arduino and use its TX/RX pins. Directions can be found here
    Note: extracting the chip from the Arduino board should be done with care to prevent damage. Also remember to store the chip in proper container to avoid static-discharge damage.
  3. And how about doing a remote-wipe Dollhouse style using an XBEE as a remote wireless uploader? Some links on this: Connections basics, forum discussion.

Additional Use Cases

  1. The simple circuit shown here can be used as a ‘skeleton’ for many projects. Just drop-in an ATmega suited for your needs with supporting circuitry and load it with your favourite sketch. We can also replace the IC with a low power version, like the one used in Arduino LilyPad. These IC’s excellent for projects with special space / power-usage / weight requirements.
  2. This method can be applied to upgrade your Arduino Duemilanove from ATmega168 to Atmega328. Get an ATmega 328 and follow steps 1-3 shown above to bootstrap it with a bootloader. Finally, replace the chip on your Arduino with the new one.

Alternative Clock Sources
Traditionally, Arduino uses an external 16MHZ crystal as a clock source and this is source we used above. The ATmega chip supports various other clock sources:

  1. Use an internal resonator inside the chip
  2. Use an external resonator
  3. Use a low frequency oscillator/crystal (frequency < 8MHZ, usually a watch 32KHZ cryatal)
  4. Use a high frequency oscillator/crystal (frequency >= 8MHZ) ← this is Arduino default

External crystals are more accurate than resonator and require no calibration. For an in-depth comparison see here.
If you decide to use a resonator, it is highly recommended that you run a calibration. Details can be found in the ATmega datassheet

For examples on how to use a resonator instead of a crystal, see some alternative designs: here, here and here.

When selecting a clock source, the ATmega chip in the circuit needs to be configured to be aware of that source. This is done by changing ‘fuse-bits’. We usually don’t need to do this manually, as the process of burning bootloader also sets the fuses for high frequency oscillator usage. If you plan to use a different clock source, see the next section for details.

About the Fuses

Fuse-bits control behaviour of the ATmega chip that usually you wouldn’t change. The most widely used feature is the clock-source. As explained above, there are several possibilities on how to supply clock signal to the chip. To get started on the topic, here’s a recommended reading list:

  1. Introduction and some do’s and don’ts: here
  2. Article focusing on clock sources: here
  3. In depth guide to fuse-bits: here
  4. Walkthrough with the AVR toolchain: here

Finally, a very handy fuse-bit calculator can be found here.

WARNING! Misconfiguration of the HIGH bits can cause ISP’s to stop working. Just in case you bricked your chip, it’s always good to know there’s a little piece of hardware to unbrick it: Fusebit Doctor.

Manual Method to Upload Sketches

The steps described to upload sketches can be done manually. The manual method uses the same tools as Arduio IDE uses in its underlying process. Rather than using the Arduino IDE configuration and buttons, these tools are called directly from the command-line interface. For guides see: an Instructable and this blog entry.

Please note that this method requires manual setting of fuses. This process should be done with care, as it can brick the chip.

Update (18/09/2010): For an extended usage example see the standalone coffee machine post.


Filed under howto, production, prototype

Skype on Debian Testing (Squeeze) 64-bit (Workaround)

Short Version

  1. Install 32-bit libs:
    apt-get install ia32-libs ia32-libs-gtk
  2. Download 64-bit version for Ubuntu from, install the deb:
    dpkg -i skype-ubuntu-intrepid_2.1.0.81-1_amd64.deb
    apt-get install -f
  3. Get skype-wrapper from here
    (You need two files skype_wrapper.c and Makefile)
  4. Install a compiler and 32-bit headers:
    apt-get install gcc libc6-dev-i386
  5. Compile the shared library:
  6. Run Skype with the wrapper:
    LD_PRELOAD=./ skype

    Note: If you want to add LD_PRELOAD to a script or Skype shortcut remember to use its absolute path (i.e: LD_PRELOAD=/home/user/src/skype-wrapper/

Long Version

Although not free software, Skype is found on many Linux installations. A couple of bugs in Debian testing prevents it from running properly. This guide supplies a workaround to get it working.

Skype for Linux 64-bit is actually a 32-bit application packed in a 64-bit package. Since it’s a dynamically linked application, you’ll need all the 32-bit libraries it uses:
apt-get install ia32-libs ia32-libs-gtk

Note that we installed ia32-libs-gtk, even though Skype is a Qt application. There’s an open Debian bug for this.

After installing the  dependencies, you can download Skype for Linux from Note that there is no Debian 64-bit version, only Ubuntu. It will install fine anyway:
dpkg -i skype-ubuntu-intrepid_2.1.0.81-1_amd64.deb
And update dependencies by running:
apt-get install -f

Now if you’ll try running Skype, the main interface will load, but once you sign in you’ll get the following error:
Inconsistency detected by dl-open.c: 611: _dl_open: Assertion `_dl_debug_initialize (0, args.nsid)->r_state == RT_CONSISTENT' failed!
This is caused by another bug in Debian. When Skype tries to open (the library for PulseAudio), it crashes. Running ldd /usr/lib32/ shows why: => (0xf7700000) => /usr/lib32/ (0xf7666000) => /usr/lib32/ (0xf754a000) => /usr/lib32/ (0xf7531000) => /usr/lib32/ (0xf7529000) => /usr/lib32/ (0xf7524000) => not found => /usr/lib32/ (0xf751f000) => /lib32/ (0xf74e5000) => /lib32/ (0xf74cc000) => /lib32/ (0xf74c8000) => not found => /lib32/ (0xf74bf000) => /lib32/ (0xf74ba000) => /lib32/ (0xf7494000) => /lib32/ (0xf734d000) => not found => not found => /usr/lib32/ (0xf7333000) => /lib32/ (0xf732f000) => /usr/lib32/ (0xf7321000) => /lib32/ (0xf730d000) => /lib32/ (0xf72f6000)
/lib/ (0xf7701000) => /usr/lib32/ (0xf72f2000) => /usr/lib32/ (0xf72ed000)

See the ‘not found’ entries? That means the library is linked with those libraries, but they do not exist in the system. That’s a packaging bug.
To prevent Skype from ever running into the bug, we need to prevent it from loading the library. That would be easy enough with an open source application, where we have access to the code, which is not the case here. Fortunately Skype can fail-over to libalsa, which works like a charm. Instead of removing the file from our system, we’ll trick Skype to think it’s not there.
The code can be found at here (You need two files skype_wrapper.c and Makefile). This little piece of code wraps the running application and prevents it from loading That’s a very brute-force way, but non-destructive to the rest of the systems.
Since Skype is a 32-bit application, we’ll need to compile our wrapper as such. Install a compiler and 32-bit headers:
apt-get install gcc libc6-dev-i386
Compile the shared library:
Finally, run Skype with the wrapper:
LD_PRELOAD=./ skype

You can now run Skype this way safely from scripts or shortcuts, just remember to point the absolute path of in LD_PRELOAD

Extra credit – Changing microphone volume in alsamizer:
If you run the test call and no one is able to hear you, your microphone may be mute. Run alsamixer and hit (you’ll see it points to ‘Capture’ in the View menu on top). Now you can unmute it by hitting m and setting the volume with the arrow keys.


Filed under howto, linux

Linux on Lenovo t410s #4: Kernel 2.6.34 and a Permanent Solution for Audio

This is an updated post to the workaround posted here. It provides a permanent solution for the sound problems, as well as provide better ACPI support.

Short Version

  1. Remove pcspkr (if you hadn’t done so already), as described here
  2. Install latest Alsa (1.0.32 and higher):
    sudo apt-get update && sudo apt-get dist-upgrade
  3. Install kernel build dependencies:
    apt-get install kernel-package libncurses5-dev fakeroot wget bzip2 build-essential
  4. Get and unpack the kernel sources:
    mkdir -p ~/src/

    cd ~/src/


    tar xvfj linux-2.6.34.tar.bz2

    cd linux-2.6.34

  5. Config your kernel based on the system’s existing configuration:
    cp /boot/config-`uname -r` .config
    make silentoldconfig

    (Enter your way throught the several dozen new options)
  6. Build and install the kernel:
    make-kpkg -j6 --rootcmd fakeroot --append_to_version -custom-1-`dpkg --print-architecture` --initrd kernel_image kernel_headers

    sudo dpkg -i ../linux-headers-2.6.34-custom-1-amd64_2.6.34-custom-1-amd64-10.00.Custom_amd64.deb ../linux-image-2.6.34-custom-1-amd64_2.6.34-custom-1-amd64-10.00.Custom_amd64.deb

    sudo update-grub

  7. Reboot to your new kernel

Long Version
We’ll install a newer version of Alsa provides support of the soundcard in the t410s. We’ll also go through installing a new kernel version ‘the debian way’. This means we’ll compile a fresh kernel and create .deb packages for the image and headers. In addition this solves the ACPI buttons issues, so screen brightness can be controlled from the keyboard.

  1. If you still have pcspkr enabled, remove it as described here
  2. Alsa 1.0.32 was migrated to testing earlier today (see here). This version has initial official support of the HDA-Intel soundcard on the t410s. To get it, make sure you have ‘testing’ in your /etc/apt/sources.list, and run:
    sudo apt-get update && sudo apt-get dist-upgrade
    Once upgrade completed, check you have the latest version by running:
    dpkg -l | grep alsa-utils
    Check the installed package version >= 1.0.32-2
  3. The kernel requires several packages to build properly. For more information about kernel building in Debian see the The Debian GNU/Linux FAQ. Install the packages by running:
    apt-get install kernel-package libncurses5-dev fakeroot wget bzip2 build-essential
  4. Next up we’ll get the kernel sources and unpack them:
    mkdir -p ~/src/
    cd ~/src/
    tar xvfj linux-2.6.34.tar.bz2
    cd linux-2.6.34

    Do not use /usr/src for custom kernel sources. Kernel headers will be installed there via a debian kernel headers package. For more information on the matter see Linux’s README.
    If you still choose to install the sources to /usr/src, it is highly recommended to build the kernel out-of-tree. For more information consult the README again, search for a reference to “make O=output/dir”
  5. Now we’ll configure the new kernel, based on the current running system configuration:
    cp /boot/config-`uname -r` .config
    make silentoldconfig

    A few dozen new options were added between 2.6.32 and 2.6.34, so you will be prompted to make a choice. From a quick look, the defaults seem perfectly fine, so just hit enter until you get the prompt back.
  6. Compiling the kernel will be done with debian’s make-kpkg tool, that will also build appropriate headers:
    make-kpkg -j6 --rootcmd fakeroot --append_to_version -custom-1-`dpkg --print-architecture` --initrd kernel_image kernel_headers
    The –append_to_version string is used to distinguish our version from the official ones. The resulting kernel image name will look like vmlinuz-2.6.34-custom-1-amd64
    Next up, installing the new package, with dpkg:
    sudo dpkg -i ../linux-headers-2.6.34-custom-1-amd64_2.6.34-custom-1-amd64-10.00.Custom_amd64.deb ../linux-image-2.6.34-custom-1-amd64_2.6.34-custom-1-amd64-10.00.Custom_amd64.deb
    Finally, update grub to append the new kernel to the boot image:
    sudo update-grub
  7. Now the system can be rebooted into the new kernel

In addition to sound working out-of-the-box, the new kernel also provides much better support for ACPI functions. Special keys like screen brightness and audio control now work. For some reason grub lost its VGA mode setting during boot (perhaps because AGP_INTEL is now loadable module and not compiled in).

Leave a comment

Filed under devenv, howto, linux

Linux on Lenovo t410s #3: Installing a Browser

Short Version

  1. Install ffmpeg:
    apt-get install ffmpeg
  2. Download all latest amd64 debs from:
  3. Install by running (change to match the downloaded version):
    dpkg -i chromium-browser_5.0.375.55~r47796-1_amd64.deb chromium-browser-inspector_5.0.375.55~r47796-1_all.deb chromium-browser-l10n_5.0.375.55~r47796-1_all.deb chromium-codecs-ffmpeg_0.5+svn20091210r34297+34315+35016-0ubuntu1~ucd1~0.1_amd64.deb
    You’ll get an error for missing packages, that’s OK.
  4. Install missing packages by running:
    apt-get install -f
  5. Get flashplayer:
    apt-get install falshplugin-nonfree

Long Version

Although KDE’s supplied Konquerer is not bad, and its engine was the foundation to today’s modern WebKit, it is outdated. The rekonq browser which is in development is showing good signs of development, it will take some time to reach stability.

If you like Firefox, you’ll have to install it manually from Mozilla, use a daily non-stable repository (not recommended). You can also get the official Debian version without the branding a.ka Iceweasel (apt-get install iceweasel), but this is quite an old version of Firefox (3.5.9).
Mozilla and Linux have a long history of partial cooperation, for a very justified gripe see this post.

On the upside of things, chromium browser can be installed. Chromium is an open-source browser released by Google, and is the base to Google Chrome. At the moment it is can only be found in the unstable repository. This is only because it is not considered for the upcoming squeeze release, not due to stability issues. For more information see here.

  1. Install ffmpeg, the media player  used by chromium:
    apt-get install ffmpeg
  2. The latest version of chromium-browser can be found at the main unstable repository, here:
  3. After downloading, install all the packages in one shot, with one dpkg -i command, for example:
    dpkg -i chromium-browser_5.0.375.55~r47796-1_amd64.deb chromium-browser-inspector_5.0.375.55~r47796-1_all.deb chromium-browser-l10n_5.0.375.55~r47796-1_all.deb chromium-codecs-ffmpeg_0.5+svn20091210r34297+34315+35016-0ubuntu1~ucd1~0.1_amd64.deb
    The system needs a few more packages, so we’ll use the automagic of apt-get to satisfy them. This is why we get the error message.
  4. Allow apt-get to download and install missing packages by running:
    apt-get install -f
  5. You’ll probably want Adobe’s Flash player, although there are several open-source replacements, they are still incomplete in terms of full support. To install, use Debian’s wrapper that gets the latest 64-bit native version of Flash player from Adobe:
    apt-get install falshplugin-nonfree
    Note: Sound will not work until we fix it permanently with new version of Alsa and a new Kernel. Update on this matter will be posted soon.

Chromium give most of the capabilities of the commercial version, including extensions, bookmarks sync and skins. Visit Google’s page for extensions like AdBlock.

Leave a comment

Filed under devenv, howto, linux

Linux on Lenovo t410s #2: Temporary Workaround for Sound Card

Short Version

  1. Blacklist PC-speaker:
    bash -c 'echo "blacklist pcspkr" >> /etc/modprobe.d/blacklist.conf'
    Reboot after this
  2. Get basic sound working by running:
    sudo modprobe snd-hda-intel && pushd "/sys/bus/pci/drivers/HDA Intel/" && sudo bash -c "echo '8086 3b57' > new_id" && popd
  3. You will need to run this after every boot! You can add to /etc/rc.local before the line ‘exit 0’ the following:
    modprobe snd-hda-intel
    echo '8086 3b57' > "/sys/bus/pci/drivers/HDA Intel/new_id"
  4. Wait one more week until alsa 1.0.23 gets to testing and updgrade to 3.6.34 (updates will be posted here). See updated post here
  5. Sound doesn’t work everywhere, and only basic volume is supported. Patience is appreciated

Edit (15/06/2010): Aside from step #1 (removing pcspkr), please see the updated post, with a permanent solution

Long Version
Sound is a sorry affair in Linux. If you want to get some background, start here. Expect more howtos in this area in the future, but for now let’s just get some sound out.

  1. Abolish PC speaker. After initial installation you may have noticed some humming from your speakers. That was your <em>pcspkr</em> module. If you’d run the <em>powertop</em> application, you would see <em>pcspkr</em> is firing interrupts like crazy. Plus, when hitting the wrong key in the terminal you get a sound appropriate for a Pavlovian-response experiment, but terribly annoying otherwise. For these reasons and more, most distributions blacklist the pcspkr module, forcing it never to load. To do this:
    bash -c 'echo "blacklist pcspkr" >> /etc/modprobe.d/blacklist.conf'
  2. Reboot is required since the module wouldn’t unload voluntarily.

  3. Get basic sound working. To get sound fully working we’ll need system-wide cooperation, in the meantime find out what’s the PCI ID of your sound device by running:
    lspci -nn | grep -i audio
    I’ve got:
    00:1b.0 Audio device [0403]: Intel Corporation Device [8086:3b57] (rev 06)
    01:00.1 Audio device [0403]: nVidia Corporation High Definition Audio Controller [10de:0be3] (rev a1)

    The first is the integrated sound-card, which is HDA Intel type. The second is sound over HDMI/DisplayPort from the discrete graphics card (I’d sure like to this one works in the future).
    Next, we’ll take the ID and put it in a file where HDA Intel sound driver can find it:
    pushd "/sys/bus/pci/drivers/HDA Intel/" && sudo bash -c "echo '8086 3b57' > new_id" && popd
    Finally we can manually load the driver by running:
    sudo modprobe snd-hda-intel
  4. Current status and next steps. At this point Phonon recognizes the card, but gives only the basic master sound volume control. This means no microphone, no fancy 5.1 audio, and at some applications no sound at all. This is since Alsa, another brick in the sound system stack, doesn’t know how to work this card yet. Fortunately, a new version of Alsa with initial support for this card (see changelog) has been released. Moreover, it has been accepted to Debian unstable just a couple days ago see here. This means that if all goes well, in another week it will arrive to testing. Yes, you can install it from unstable now, but I really recommend to wait just a bit longer.
    Also, Linux 2.6.34 is required to solve the card identification problem. More on that on later post (probably when Alsa 1.0.23 reaches testing).

Leave a comment

Filed under devenv, howto, linux