Posts mit dem Label maverick werden angezeigt. Alle Posts anzeigen
Posts mit dem Label maverick werden angezeigt. Alle Posts anzeigen

11.03.2011

Trouble with chromium and an easy-to-install PDF reader plugin (ambiguity inteded)

I recently switched from Firefox to Chromium due to it's speed. I was really happy with my choice until today, when Chromium stopped working out of the blue.
I installed some updates in the background, was working on a project where I had a website opened and when I closed and reopened Chromium... nothing!
Chromium couldn't load any web site. My first thought was of course "there must be something wrong with the network connection or settings". There wasn't. The really nasty thing was that Chromium did not only stop loading web pages - it couldn't even display its own preferences, downloads and the bookmark manager!
My second thought - Google's Your friend! There were a lot of people complaining about issues just similar to the one I saw. The problem was, they all used windows. Their best solution ("run an anti-virus-scan") was kind of the wrong approach for me and the debug log neither told me anything useful. All seemed lost and I had already accepted my fate of having to use Firefox until a new update for Chromium came out, when suddenly a miracle happened.
I could have sworn this would never happen, yet it did. A crash saved the day! Now here's something off topic: Ever since I started using Ubuntu's home directory encryption feature, it broke from time to time. Nothing big, though. While using the system just normally, the encrypted file system would somehow be unmounted, leaving me with an empty home directory. My desktop background disappeared, my shells started taking me to the root directory and I had to log out and back in. This time, I wanted to know what went wrong, so I called dmesg with a surprising result...
Code:
chromium-browse[<PID>]: segfault at 4 ip 00000004 sp bfa74c2c error 14 in libpdf.so[b1e85000+118a000]
Turns out, my PDF reader plugin was incompatible with my new chromium version. Deleting the libpdf.so from /usr/lib/chromium-browser/ solved the problem.

And this is part 2 of the article.
One of Chromium's disadvantages with Google Chrome is the lack of a PDF plugin. Luckily, both programs are easily available for linux. And more luckily, it's pretty easy to steal Chrome's PDF plugin and install it for Chromium. Here's how You do it (make sure to update the plugin every time You update Chromium to avoid the mess I wrote about above!):
  1. Get the latest version of Chrome for Your architecture as a Debian package from http://www.google.com/chrome (make sure to open the site with Linux!).
  2. Open the package with the archive program (example for i386):
    Code:
    $ file-roller google-chrome-stable_current_i386.deb
  3. Extract the file opt/google/chrome/libpdf.so to some location
  4. Put the file into the chromium directory
    Code:
    $ sudo mv libpdf.so /usr/lib/chromium-browser/
    $ sudo chown root:root /usr/lib/chromium-browser/libpdf.so
That's it! You're done!

19.02.2011

Release Party!

I proudly present: video-swicher, a tool to switch betweeen the integrated and the dedicated video card on laptops that have switchable graphics cards. As far as I know, this the the first and (up to now) only tool for this job!
The package is easy to use. It comes with an upstart job that can disable the unused video card on system boot (configurable via a configuration file in /etc/default) and a binary to change the active card. It can only be run by root (or via sudo) since it needs to write into a file on /sys which is owned by root and it needs to shutdown any running display manager.
Up to now there's only one available package, video-switcher which provides the upstart job and the binary. A second package providing a GUI will follow within the next days.
Grab the package by the usual means (available in my PPA) and tell me what You think!
  1. Install
    Code:
    $ sudo apt-get install video-switcher
  2. Use
    Code:
    $ sudo video-switcher [int|ded]
That's it! You're done!

P.S.: You might ask Yourself: How come there's version 1.0.3 available if this is the release announcement? Well, I uploaded the package, found some bugs, deleted it and fixed them. When I tried to upload the fixed version as 1.0.0 again, the system rejected the code claiming that there was already a version 1.0.0 that differed. So I had to make it version 1.0.3.

17.02.2011

The end is near!

I'm about to finish work on latest package called video-switcher! I managed to write a command-line application that is able to change the video card. It has to restart the X server (closing Your session), but as far as I know, there's no getting around that.
There's only one problem left to fix. When switching back to the on-board Intel video card on my tm2-1090eg, the display often gets into a weird state where it's either showing just garbage or nothing at all. I was able to circumvent this by turning the screen off and on again. However, vbetool, the program I use for doing so, sometimes hangs up using 100% of the processor. At that point, my program hangs, too, and never gets to restart the X server. Apparently this is a known bug which hasn't been fixed yet. I'm still working on this and I hope to have a fix ready in the next few days. If You have any idea that might help, I'd be glad to hear about it!
I'll keep You posted!

P.S.: After fixing the problem it might still take some time to write a graphical user interface for the command line application. This shouldn't take more than a day, though.

14.02.2011

Yet another bugfix release (for tablet-mode)

I'm sorry! I broke it again! Shame on me!
As You might have noticed, upon upgrading from an older version of tablet-mode the upstart job disappears magically and the automatic screen rotation stops working. I failed to notice the postrm script during the last bugfix. This nasty little thing (which I wrote myself, shame even more!) deletes the upstart job when the package is removed. This is neither necessary nor useful, as it is also called when the package is upgraded, effectively breaking the automatic screen rotation.
You problably won't be surprised when I tell You what You need to do. Remove and reinstall. Just as in the last article. Make sure to grab the newest version (1.5.3), upgrading from there should finally work as expected.
I'm really sorry.

08.02.2011

Bugfix for tablet-mode

As usual, there's a bugfix for tablet-mode shortly after there was a new version with a new feature. I'm sorry, but I messed up some things again. If You find Yourself with a broken package (something's not working), You might want to purge the package and re-install the latest version (this should be 1.5.1 or higher!). Unfortunately, a simple update from an earlier version might not fix everything, as the configuration files (in /etc) are not re-installed correctly. In order to purge and reinstall the package, do the following (as root).
Code:
$ apt-get purge tablet-mode
$ apt-get update
$ apt-get install tablet-mode
You should check Your /etc/tablet-mode/tablet-mode.conf to make sure that all entries are correct.

That's it! You're done!

07.02.2011

New feature for tablet-mode!

As You might have notices (or if not, I'm gonna tell You now anyway), there are 2 updates for tablet-mode. Version 1.5.1 ist out. Version 1.5.0 fixed some package-internal things (particularly with the config file and the postinst script) and introduced a new feature. Thanks to Nicolò's comment, the new tablet-mode package gives You the possibility to turn off Your laptop's touchpad (that mouse-replacement, not the touchscreen) when entering tablet mode (e.g. when putting Your screen onto Your keyboard). According to him, this should fix the crazy pointer movements some people might have experienced when not turning it off. After updating the package, You should have a look at the configuration file /etc/tablet-mode/tablet-mode.conf and check if the options are set they way You want them to be.
So that was the first update. What about the second? Turned out I messed up a script (again) so the postinst script would not insert the right values into tablet-mode.conf upon updating. I corrected that and everything should be working again.
Just update by the usual means.

That's it! You're done!

06.02.2011

Yet another cpufreq update

The title says it all. I've found another bug in my cpufreq package broke the ACPI handler. The script tried to execute /usr/local/bin/cpufreq which of course doesn't exist if You installed my packge. I've changed it to execute cpufreq which gives You the possibility to put a custom version of the cpufreq script into /usr/local/bin and which is then executed instead of the package version. If you stay with the packaged version, it will of course execute that.
I recommend You install the update as soon as it's available. As always, report any bugs You might find!

02.02.2011

cpufreq update

I've released version 1.1.0 of my cpufreq package. It fixes numerous bugs, including the one that made the upstart job not work at all. Unfortunately, version 1.0.0 is so broken that You can't just update to 1.1.0. The old version will break the update and You'll end up with essential files missing. Due to this, I've made it impossible to upgrade from 1.0.0 to any other version. In order to get the new version, You will have to remove (or purge) the old version first, e.g. with apt-get:
Code:
$ apt-get purge cpufreq

After that, You are safe to install the new version (make sure to update Your package list, first!):
Code:
$ apt-get update
$ apt-get upgrade cpufreq

I'm sorry for the troubles this may have caused You (or will cause You during the update). As far as I can judge, it will not happen again with this package. I fixed the control files to prevent deleting files that are being installed by a newer version of the same package (in fact, they don't delete anything anymore).

In addition to the bugfixes, I've included a configuration file: /etc/default/powersave. Using that file, You are able to control the behavior of the ACPI handler and the upstart job. You can specify which CPU governors to install and You can disable each of them completely. I hope this compensates You for the pain the bugs caused :)

A side note here: The package will not remove any files in /etc when being removed normally (not purged). The upstart job and the ACPI handler will stay, but they won't do anything, since the cpufreq executable is not present. If You want to delete those files, purge the package (called "Mark for Complete Removal" in Synaptic) or delete them manually.

Another side note: When future upgrades are being installed, You might be asked if You want to keep some configuration files or install the "package maintainer's" (that's me) version. If You haven't changed the file in question and are unsure, it's best to install the new version, since it may contain bugfixes or new features (although You shouldn't be asked if You didn't change the file).

Since this problem seems to be fixed (report any bugs that persist or came up, please!), I will focus on the package to switch the graphics card now. Stay tuned for more!

That's it! You're done!

24.01.2011

Power saving for the win!

Update 2: I've released a new version of the package that fixes numerous bugs and brings new features. Since updating requires some special care, it's best to check out the new article on this before trying to do anything manually.

Update: Apparently the startup script doesn't work correctly yet. Upon system boot, the governor is set to performance, probably after my script set it to ondemand or powersave. I'm currently looking into this and will release an update as soon as possible. Until then, You can either set the governor manually after logging in, You can remove my package, or You can turn the ondemand init-script back on:
Code:
update-rc.d ondemand enable
The latter method will set the governor to ondemand on system startup. This is not as good as powersave if You're running on battery, but it's still better than performance.


I'm happy to announce the second package in my PPA! cpufreq has joined the ranks of tablet-mode and is ready to be downloaded!

It's basically nothing else than a packaged version of my article on CPU governors and the power supply status. It has a few more checks (if certain nodes on the sys filesystem exist) and now also displays a list of available frequencies. If You want to increase the running time of Your laptop on battery, I recommend You get it while it's hot!

As of now, the package requires absolutely no configuration (as long as some things on Your system work the same way they do on mine) and if You should encounter any problems, just drop by, leave a comment or write me a mail. I'll try to fix it as soon as possible.

To install it, add the PPA to Your APT sources and update Your package list (as described here). After that, install it via synaptic or the console:
Code:
apt-get install cpufreq

Congratulations! You can now pull the plug and Your system automatically changes to the powersave governor! In addition, You can use cpufreq to change the governor manually on the command line (see the man page for details).

That's it! You're done!

17.01.2011

2 new packages to come!

Here's a small announcement:
I will probably create a package for automatic CPU frequency scaling based on my article here. From what I read in the forums where this blog was posted, there are many people (especially those new to Ubuntu) who have problems or difficulties setting up and installing scripts. The package will thus contain the script, the ACPI handler and the upstart job. This is nothing more and nothing less than I already posted in the article, but will of course be much easier to install and update. I hope the package will be useful for many people and I would be very happy about any feedback on this topic (there are visitor statistics available for me concerning the blog, but unfortunately there's no download counter for my PPA).
Another package I'm currently working on is based on the post about switchable graphics. It will contain a small graphical (also usable without a GUI) program which is able to switch the graphics card between the integrated (less power consuming) Intel card and the discrete (more powerful) ATI card. It will of course still restart the X server upon changing the card as there is currently no way to circumvent this. Personally I have little use for such a program (as I don't really need the graphical power of the ATI card in Linux), but I think it might be come in handy once in a while and may be even more useful for other people. As for the first announced package, I would be very happy about any feedback concerning this.

09.12.2010

Update to tablet-mode

Update: I've released yet another version of the package. It fixes the same bug as described below again (but now it really works! ;) ). The problem was a variable substitution in the Tcl "switch" statement (and some other flaws that I somehow didn't notice before). Version 1.4.0 is available via my Launchpad PPA and can be downloaded by the usual means.


I've released a new version of my tablet-mode package (see my article on my PPA if You don't know what I'm talking about).
Yesterday I wanted to use my notebook as a tablet and noticed that the touch function was not turned off as it was supposed to be. It turned out that the IDs of my Wacom devices (finger, stylus, eraser) had changed and were no longer the ones I had in my /etc/tablet-mode/tablet-mode.conf. Today I checked again and they were back to normal. Now to not have You change the values in the configuration file every now and then (and then have You change them back again shortly after), I changed the behavior of the script so that it does no longer require numeric IDs in the configuration but rather requires string identifiers like "Wacom ISDv4 E3 Pen stylus". It then looks up the corresponding numeric IDs by itself every time it is run.
Another problem that I fixed was that the script didn't even use the values from the configuration file at all. Due to a wrong variable name, the finger device always had the same numeric ID, no matter what You had in Your config file. The result was that when the device had another ID than 11 on Your system, the touch function was not turned off when entering tablet mode and the touch device was not rotated when rotating Your screen.
So, if You have the package installed, just update to the latest version and if not, You can safely install it :)

05.12.2010

Screen brightness

Changing the screen brightness can extend the battery life by a considerable amount, so this a quite important thing concerning laptops. Unfortunately, that functionality is broken. On my laptop with Ubuntu, I am unable to change the display brightness by the usual means. The buttons do create a reaction, but that reactions merely consists of the GNOME Power Manager displaying a notification with a bar that changes. Nothing happens to my display.
Additionally, every time I press one of the keys, that bar increases or decreases by two steps instead of one. So when I keep the button pressed for about 4-5 seconds, that notification keeps blinking for about 10-15 seconds before finally disappearing.
And now the good part: I found a solution :)
I managed to get the brightness keys working. I am able to change the brightness by an arbitrary amount upon a key press, yet so far I was unable to make that annoying notification disappear.
Thanks to some post in some forum (unfortunately I remember neither the author nor the forum), I got to know the location of a node on the /sys filesystem where the brightness can be changed by echoing numbers into it.
(Note: You need root access to write files in /etc/acpi/).
  1. Create a script to be executed upon pressing one of the brightness keys. Mine is named brightness.sh and is placed in /etc/acpi/.
    Code:
    #! /bin/bash

    # pressing the buttons generates 2 events, so we need to ignore one
    if [ "$2" != "LCD" ]
    then
        exit 0
    fi
    # get brightness
    CURRENT_BRIGHTNESS="$(sudo setpci -s 00:02.0 F4.B | tr "[a-z]" "[A-Z]")"
    # to upper case
    CURRENT_BRIGHTNESS="$(echo "$CURRENT_BRIGHTNESS" | tr "[a-z]" "[A-Z]")"
    # add/substract 16
    case "$3" in
        "00000086")
            OP="+"
            ;;
        "00000087")
            OP="-"
            ;;
        *)
            exit 0
    esac
    NEW_BRIGHTNESS="$(echo "obase=16;ibase=16;$CURRENT_BRIGHTNESS $OP 10" | bc)"
    # check boundaries
    if [ "$(echo "ibase=16; $NEW_BRIGHTNESS < F" | bc)" -eq 1 ] then     NEW_BRIGHTNESS="F" elif [ "$(echo "ibase=16; $NEW_BRIGHTNESS > FF" | bc)" -eq 1 ]
    then
        NEW_BRIGHTNESS="FF"
    fi
    # set brightness
    setpci -s 00:02.0 F4.B=$NEW_BRIGHTNESS
    The script changes the brightness in steps of 10. You can change this amount by changing the number in line 23 (NEW_BRIGHTNESS=...). The brightness is a number between 0 and 255 and is read and saved as a hexadecimal number (0 to FF).
  2. Make the script executable.
    Code:
    $ chmod +x /etc/acpi/brightness.sh
  3. Create an ACPI event handler to execute the script upon pressing one of the brightness keys. I called it brightness and placed it in /etc/acpi/events/.
    Code:
    # /etc/acpi/events/brightness
    # Calls /etc/acpi/brightness.sh to change screen brightness upon key press
    # Author: Frederik Möllers

    event=video
    action=/etc/acpi/brightness.sh %e
  4. Make acpid reload its configuration for the changes to take effect.
    Code:
    $ reload acpid

When pressing Your brightness keys, You display brightness should change now. The bar will still appear and display something wrong and will probably annoy You, but I haven't found out yet how to kill that thing. If it's not working, You can try to check wether the ACPI events are the correct ones (the script reacts on video LCD 00000086 00000000 and video LCD 00000087 00000000 - acpi_listen can tell You what events are generated by Your keys) and wether the call to setpci does the operation on the right card (lspci is Your friend, Your intel onBoard graphics card should have ID 00:02.0). If Your system has different values, just change them in the script and feel free to tell me so I can generalize the script and put a note on that here.

Warning: Never set Your brightness to 0! This is not only useless (You can't see anything because a value of 0 really means to completely turn off the light panel), but it will also kill Your system, forcing You to do a hard reset. You will be unable to change the brightness back to a positive number, even if You enter the correct command blindly. My script will not do this, but if You want to tinker around for Yourself, always keep this in mind!

That's it! You're done!

29.11.2010

Switchable graphics and power consumption

Update: The switch seems to work reliably for me now. I switched to the ATI card, restarted X, used it, switched back and restarted X again. The procedure worked without problems. If I find time I will probably write a small program to switch the graphics card similar to the one I wrote for screen rotation.

It is completed! Switchable graphics are supported by the Linux kernel!
The usage is pretty simple. You have 2 graphics cards installed in the system. Thus, You need drivers for both of them. For the tm2-1090eg this means You need to make sure that both the radeon and the intel module are loaded after You booted up Your laptop. If one of them does not appear in the output of lsmod, there's something wrong or You blacklisted is. How to cope with that is not covered in this guide.
Starting with some-kernel-version, there is a node in the sysfs, specifically in /sys/kernel/debug/, which is called vgaswitcheroo. This neat little thing gives us the possibility to switch the graphics adapter at runtime and also to turn off the idle one.
(As root) You can write different 3 values into the switch at /sys/kernel/debug/vgaswitcheroo/switch using:
Code:
$ echo <value> > /sys/kernel/debug/vgaswitcheroo/switch
The values are:
  1. OFF - This one is simple. It turns off the video adapter which is currently unused. It is of high value, though. I noticed that upon turning off my ATI card, the battery lifetime actually increased by a factor of 5! Before using this, I could use my laptop for about an hour before the batteries went dry and now I am able to hack on it for around 5 hours without a break. At the end of this article I will present an upstart script to automatically turn off the ATI card on startup (I can't think of a reason to use the ATI card on Linux. According to other people, the drivers don't work well and there is no need for 3D acceleration at all.).
  2. DDIS - Switch to the discrete graphics card (the ATI one). This requires a restart of the X server to take effect and the whole switching is buggy on my system. Every one or two switches, the system completely crashes and I need to hard-reboot my laptop. However, it may work for some people and may work for everyone in the near future, so I included it here as well.
  3. DIGD - Switch to the integrated graphics card (the Intel one). The same restrictions and errors apply as for the previous value.
You can also read the state of the switch:
Code:
$ cat /sys/kernel/debug/vgaswitcheroo/switch
So far so good. Now as I mentioned, the ATI card is practically useless unless You want to play games (and even then I heard it's not really making things look good). If You want to turn it off, You may copy the following script (name it ati-disable.conf and place it in /etc/init as root, of course).
Code:
# ati-disable - Disable ATI graphics card
#
# Disable the dedicated ATI graphics card to save power.

description "Disable ATI graphics card"
author "Frederik Möllers"

start on started gdm

script
    if [ -w /sys/kernel/debug/vgaswitcheroo/switch ]
    then
        echo "OFF" > /sys/kernel/debug/vgaswitcheroo/switch
    fi
end script
Upon reboot, Your ATI card should be turned off. You can check if it is by using the cat command from above.

That's it! You're done!

13.11.2010

Fred.deb

Update: There is a note on bugs at the end of the article.

Yay, I forged my first package! And I got my own PPA (personal package archive) at Launchpad!
The first package I made is based on my article on screen rotation. It contains the script itself (an improved version), the upstart script to map the keycodes and a configuration file (/etc/tablet-mode/tablet-mode.conf) to centrally configure the needed values.
Here's what You need to do if You want to use it (You need root access for most of the tasks):
  1. Add the PPA to Your sources:
    Code:
    add-apt-repository ppa:fredfredfred/ppa
  2. Refresh Your package list:
    Code:
    apt-get update
  3. Install the package:
    Code:
    apt-get install tablet-mode
  4. As told in the message during installation, You need to take a look at the configuration file, /etc/tablet-mode/tablet-mode.conf. Either use the comments from the file or have a look at my first article on this subject to find out the values You need. The values provided in the sample should work on an HP TouchSmart tm2-1090eg notebook, You only have to uncomment the last 2 lines to enable the keycode:scancode mapping upon system start.
  5. Bind the scan codes to rotatescreen tableton and rotatescreen tabletoff, as described in the other article.
That's it! You're done!

Bugs: If You turn the screen, put it down and then hibernate Your laptop, turn the screen back and power it back on, the screen is upside down as is the tablet orientation. I will not fix this, since I cannot. Upon resuming from suspend, there is no way for me to check which position the display is in. Use the console commands rotatescreen tableton and rotatescreen tabletoff to switch between the modes manually (or use the GUI).

07.11.2010

CPU governors and power supply status

Update: As announced, this script collection has been incorporated into my PPA as a package. Check it out here.

As promised, here's an article on CPU governors. As You might know by now, I use Ubuntu on my laptop. Unfortunately, it was kind of useless (until now) if I didn't plug in the power supply, since the battery was drained in less than an our of work (using nothing more than a text editor, kile). The problem source: The system doesn't change the cpu governor when the power cord is plugged out. Thus, the ondemand governor is used instead of the powersave one.
Luckily, there's an easy way to cope with this. The ACPI daemon acpid can be taught to execute arbitrary code upon any ACPI event. That means You can use it to automatically change the CPU governor depending on Your power supply status. Here's how it works:
  1. Create a script to change the CPU governor. You can use mine, too:
    Code:
    #! /bin/bash

    # Note: AC connection is in:
    # /sys/devices/LNXSYSTM:00/LNXSYBUS:00/ACPI0003:00/power_supply/AC/online
    # 0 is disconnected, 1 is connected

    # If no arguments are passed, print governors
    if [ -z "$1" ]
    then
       for MYCPU in /sys/devices/system/cpu/cpu[0-9]*
       do :
          echo "$(basename $MYCPU): $(cat ${MYCPU}/cpufreq/scaling_governor)"
       done
       echo "Available (on cpu0): $(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors)"
       exit 0
    fi

    # Bring governor in control
    if [ "$UID" -ne "0" ]
    then
       echo "Error: Must be run as root!"
       exit 1
    fi
    echo -n "Handling over control to $1 governor... "
    if [ "$1" == "conservative" -o "$1" == "powersave" -o "$1" == "performance" -o "$1" == "ondemand" ]
    then
       for MYCPU in /sys/devices/system/cpu/cpu[0-9]*
       do :
          echo "$1" > ${MYCPU}/cpufreq/scaling_governor
       done
    # userspace governor needs speed argument
    elif [ "$1" == "userspace" ]
    then
       if [ "$2" -gt "0" ]
       then
          for MYCPU in /sys/devices/system/cpu/cpu[0-9]*
          do :
             echo "$1" > ${MYCPU}/cpufreq/scaling_governor
             echo "$(expr $2 \* 1000)" > ${MYCPU}/cpufreq/scaling_setspeed
          done
       else
          echo "userspace governor needs speed argument > 0!"
       fi
    else
       echo "Unknown governor: '$1'"
       exit 1
    fi
    echo "done"
    Make the script executable and place it somewhere, e.g. in /usr/local/bin. You can also use the script manually from the command line, e.g. with sudo cpufreq performance if You feel like You need everything Your computer got.
  2. Create a script for the acpid and place it in /etc/acpi (the script must be executable). Mine is called powersave.sh and looks like this:
    Code:
    #! /bin/bash

    # Called by /etc/acpi/events/powersave
    # Calls cpufreq script to set cpu governor
    # Author: Frederik Möllers

    if [ "$4" -eq 0 ]
    then
       /usr/local/bin/cpufreq powersave
    else
       /usr/local/bin/cpufreq ondemand
    fi
  3. Create a rule for the acpid and place it in /etc/acpi/events. Mine is called powersave and looks like this:
    Code:
    # /etc/acpi/events/powersave
    # Calls /etc/acpi/powersave to set cpu governor when ac adapter status changes
    # Author: Frederik Möllers

    event=ac_adapter
    action=/etc/acpi/powersave.sh %e
  4. Make acpid reload its configuration (as root):
    Code:
    $ reload acpid
  5. You might think You're done now, but actually You've only finished half of the job yet. When the system boots up, there will be no ACPI event telling acpid the status of Your power supply. Thus, if You boot with the power cord plugged out, Your system will still use the ondemand governor. To deal with that, You can create an upstart script which sets the CPU governor depending on the status of the power supply. Create a file /etc/init/cpufreq.conf (or with any other filename, but keep the .conf extension!) and fill it with something like the following.
    Code:
    # cpufreq
    #
    # Sets CPU governor to ondemand if AC is plugged in and powersave if not
    # Default is performance which is kind of overkill.

    description "CPU frequency scaling"
    author "Frederik Möllers"

    start on (virtual-filesystems and local-filesystems)

    script
       if [ "$(cat /sys/devices/LNXSYSTM:00/LNXSYBUS:00/ACPI0003:00/power_supply/AC/online)" -eq 0 ]
       then
          sudo /usr/local/bin/cpufreq powersave
       else
          sudo /usr/local/bin/cpufreq ondemand
       fi
    end script
    WARNING: Depending on Your system, the path (/sys/devices/LNXSYSTM:00/LNXSYBUS:00/ACPI0003:00/) on the /sys filesystem where the status of Your power supply can be found, may differ from the one I use. It shouldn't be miles away, but especially the number following ACPI may be another one on other laptop. You might need to search for the power_supply directory manually and change the path.
  6. You're almost done! Since the default CPU governor is performance which, as I said in my script, is kind of overkill, Ubuntu ships with an init-script to set the governor to ondemand upon startup. This, however, collides with the upstart script You just created, so You need to disable that init-script (as root):
    Code:
    $ update-rc.d ondemand disable
    This will safely disable the ondemand script but will still offer You the chance to turn it back on if You ever want to revert the changes You made.
That's it! You're done!

05.11.2010

Automatic screen rotation on HP touchsmart notebooks

Update 3: Apparently the python script which is advertised on some sites got more attention than it had when I first read about it and has even been set up as a Launchpad project. The huge CPU overhead has been taken care of (it's now event-based) and it supports more than just one laptop model. I haven't tried a new version of the script, but I guess it does the job just as fine as my script does (I can't tell which script is better). Feel free to test out both ways, I'd be happy to hear of some comparisons!

Update 2: There's a new article on this topic. I've managed to build a package out of the stuff I wrote here and made it available in my Launchpad PPA. It should be much easier to just install and configure it than to follow this whole guide. Here's the direct link to the article:
http://linuxquirks.blogspot.com/2010/11/freddeb.html

Update: According to feedback, this solution is not yet guaranteed to work, even for similar laptops. Feel free to test it and report any errors (helps me a lot), though. I will try to create an installable package out of all this, but this will take some time.

As I wrote in an earlier article, I possess an HP touchsmart tm2-1090eg notebook whichcan be turned into a tablet PC. Since the automatic screen rotation is not working out-of-the-box on Ubuntu and since I couldn't get the rotate-screen-button on the right side of the display to work yet, I've been getting by with a hand-written script. I wrote a Tcl/Tk program which uses xrandr and xsetwacom to rotate the screen according to my wishes.
By request of Felix, the first person to write a comment to this blog :), I looked into possibilities to automatically rotate the screen upon turning the display. I thought that since I managed to write an ACPI handler for CPU frequency scaling depending on the status of the power supply (there will be a post on this, too), I might give it a try. And guess what? I did it!
Unfortunately, my first guess was wrong. Turning around the display and putting it on top of the keyboard didn't create any ACPI events. However, I noticed some strange noise on dmesg:
atkbd serio0: Use 'setkeycodes e058 ' to make it known
atkbd serio0: Unknown key pressed (translated set 2, code 0xd9 on isa0060/serio0).
atkbd serio0: Use 'setkeycodes e059 ' to make it known.
atkbd serio0: Unknown key released (translated set 2, code 0xd9 on isa0060/serio0).

Hell yes, dmesg even told me what to do! Here's what I did:
  1. Find out the scan code - turn the display, put it down, pull it back up and inspect the messages:
    Code:
    $ dmesg
    There should be some messages like the ones I received. The first one is the key code from putting down the display, the second one is the code from pulling it back up.
    Note: If You don't get any messages like those, chances are that Your kernel already knows the keys. Try to bind something to them using the GNOME "Keyboard Shortcuts" or see if they generate key events by using xev.
  2. Find out which key code is available for mapping. There's no patented way for doing this. I just tried out some codes and looked what the GNOME "Keyboard Shortcuts" called the code. For me, the codes 220 and 221 worked well, since there is no button issuing these codes.
  3. Create an upstart script to set the keycodes on system startup. Setting the codes is not persistens, so You have to do it after each reboot. Use an upstart script to accomplish the job. As root, create a file /etc/init/tablet-mode.conf and put something like this inside:
    Code:
    # tablet-mode
    #
    # Map key codes to the scan codes emitted by the display when putting it down on
    # the keyboard.

    description "Tablet PC mode"
    author "Frederik Möllers"

    start on local-filesystems

    script
        setkeycodes e058 220
        setkeycodes e059 221
    end script
  4. Create a program to rotate the screen. Basically You just need to use xrandr to rotate the screen and xsetwacom to turn the tablet orientation. You can also use my Tcl/Tk program (requires wish to run, install the package if You want to use it) which also offers a GUI to use manually. Put the following code in a file (e.g. /usr/local/bin/rotatescreen, make it executable and You can call it with rotatescreen tableton and rotatescreen tabletoff. It not only turns the display and the tablet orientation but also disables the touch mode. This prevents the cursor from jumping around when You write with the stylus and touch the display with Your hand. Of course, You can customize the Tcl/Tk program to fit Your wishes. Even if You're not experienced in Tcl or Tk, the syntax should be quite easy. So here's the code:
    Code:
    #! /bin/bash
    #\
    exec wish "$0" "$@"

    proc rotate_0 {} {
       exec xrandr --output LVDS1 --rotate normal
       exec xsetwacom --set 11 rotate NONE
       exec xsetwacom --set 12 rotate NONE
       exec xsetwacom --set 13 rotate NONE
    }

    proc rotate_90 {} {
       exec xrandr --output LVDS1 --rotate left
       exec xsetwacom --set 11 rotate CCW
       exec xsetwacom --set 12 rotate CCW
       exec xsetwacom --set 13 rotate CCW
    }

    proc rotate_180 {} {
       exec xrandr --output LVDS1 --rotate inverted
       exec xsetwacom --set 11 rotate HALF
       exec xsetwacom --set 12 rotate HALF
       exec xsetwacom --set 13 rotate HALF
    }

    proc rotate_270 {} {
       exec xrandr --output LVDS1 --rotate right
       exec xsetwacom --set 11 rotate CW
       exec xsetwacom --set 12 rotate CW
       exec xsetwacom --set 13 rotate CW
    }

    proc touch_on {} {
       exec xsetwacom --set 11 Touch on
    }

    proc touch_off {} {
       exec xsetwacom --set 11 Touch off
    }

    proc quit {} {
       destroy .
       exit
    }

    if {$argc > 0} {
       switch "[lindex $argv 0]" {
          "0" {
             rotate_0
          }
          "90" {
             rotate_90
          }
          "180" {
             rotate_180
          }
          "270" {
             rotate_270
          }
          "tableton" {
             rotate_180
             touch_off
          }
          "tabletoff" {
             rotate_0
             touch_on
          }
          default {
             puts "Cannot rotate [lindex $argv 0] degrees!"
          }
       }
       exit
    }

    wm title . "Screen rotation"
    wm geometry . +605+300
    frame .deg
    button .deg.0 -text "0°" -command "rotate_0; quit"
    button .deg.90 -text "90°" -command "rotate_90; quit"
    button .deg.180 -text "180°" -command "rotate_180; quit"
    button .deg.270 -text "270°" -command "rotate_270; quit"
    pack .deg.0 .deg.90 .deg.180 .deg.270 -in .deg -pady 3 -side top
    frame .touch
    button .touch.ton -text "Touch on" -command "touch_on; quit"
    button .touch.toff -text "Touch off" -command "touch_off; quit"
    pack .touch.ton .touch.toff -in .touch -pady 3 -side top
    button .cancel -text "Cancel" -command "quit"
    pack .deg .touch .cancel -pady 6 -side top
    bind . "rotate_0; quit"
    bind . "rotate_90; quit"
    bind . "rotate_180; quit"
    bind . "rotate_270; quit"
    bind . "quit"
    bind . "quit"
    bind . "quit"
  5. Bind the keys to the program using GNOME "Keyboard Shortcuts" (or the equivalent for Your desktop manager). Create a binding with the command rotatescreen tableton and one with the command rotatescreen tabletoff and set the bindings by turning Your display, putting it down and pulling it back up.

Thanks again to Felix who told me to search for a way. I had already given up on this and didn't think I would find a way to get the screen rotation to work automatically.

That's it! You're done!

30.10.2010

HP touchsmart notebook, Intel Centrino Wireless N-1000 and no wifi

I recently tried to use my wifi card the first time on Ubuntu 10.10. I noticed that I couldn't connect to any wifi network, no matter what mode the network was (a/b/g/n) or what encryption it used. I looked around and found Ubuntu Bug #630748 and the related Kernel bug #16691 which I thought had something to do with my issue.
I couldn't be more wrong.
It turned out I couldn't get a wifi connection, because bluetooth was disabled using that small GNOME Bluetooth indicator. While bluetooth was disabled, my wifi card was able to list networks and NetworkManager could try connecting to one, however, it never succeeded. dmesg spit out some messages like "direct probe to (access point MAC address) timed out" and after some time even "iwlagn 0000:03:00.0: Microcode SW error detected. Restarting 0x2000000.".
Thanks to Zander Hill's comment in my bug report #663298, I found out that by enabling bluetooth, I could connect to wifi networks again with no problems.

So if You ever run into connectivity problems, feel free to try out everything completely unrelated to Your wifi card just to be sure.

"Modern" touchpads V2

Ubuntu 10.10 came out about 2 weeks ago. There were no big changes, at least no visibly remarkable ones. However, some things that worked in 10.04 stopped working in Maverick. One example are the new Synaptic ClickPads integrated into many of the newer notebooks such as my HP TouchSmart tm2-1090eg. According to the comments in Bug #582809, the psmouse driver module does not correctly recognize the ClickPad and treats it as a "regular" Synaptics Touchpad. Fortunately, someone going by the name of "pauls" uploaded a patched source archive for the psmouse module and posted a detailed guide how to install the new module.
I tried it and it works™!
Here's how (copied from pauls' comment in the linked bug report):
Note: You need root privileges to do most of the things
  1. Download the patched source archive
    Code:
    $ wget https://bugs.launchpad.net/ubuntu/+source/linux/+bug/582809/+attachment/1675262/+files/psmouse-2.6.35-22-generic-patched.tar.bz2
  2. Unpack the source to /usr/src/
    Code:
    $ tar -xjv -C /usr/src/ -f psmouse-2.6.35-22-generic-patched.tar.bz2
  3. Install dkms
    Code:
    $ apt-get install dkms
  4. Add the source to dkms, build it and install the module
    Code:
    $ dkms add -m psmouse -v 2.6.35-22-generic
    $ dkms build -m psmouse -v 2.6.35-22-generic
    $ dkms install -m psmouse -v 2.6.35-22-generic
  5. Reboot.
You can always check wether the module is installed using
Code:
$ dkms status -m psmouse -v 2.6.35-22-generic
If the module is not installed, You can use the steps again to rebuild and reinstall it.
You can also remove the module when a fixed kernel has been released:
Code:
$ sudo dkms uninstall -m psmouse -v 2.6.35-22-generic
$ sudo dkms remove -m psmouse -v 2.6.35-22-generic --all
For more information, updates and troubleshooting, consult the bug report and its comments.
That's it! You're done!

17.04.2010

No asterisks for passwords in gdm login window!

The GNOME Display Manager was extensively customisable - until it got rewritten. Now it's a pain the arse to change anything about the login mask. There are 2 things that I wanted to change and I finally managed to do so.
  1. Disable the user album. One disadvantage of this is that everyone can see which users exist on the computer - this might be a security concern. Another issue is that it's impossible to log in as root.
    As this setting is saved in the gconf-tree, You need to edit that. The graphical gconf-editor didn't work for me, but using the command line is faster anyway (if you know what to enter, of course):
    Code:
    $ sudo -u gdm gconftool -t bool -s /apps/gdm/simple-greeter/disable_user_list true
    If You're asked for gdm's password, try executing the command as root (still with sudo -u gdm, of course).
  2. The other issue is related to the password entry in the gdm login window. When entering the password, a black circle is displayed for every letter. This makes it possible for everyone looking to observe Your password length. To change it, You need to edit the .ui file of the simple-greeter application. Its location is:
    Code:
    /usr/share/gdm/gdm-greeter-login-window.ui
    Search for the line
    Code:
    <object class="GtkEntry" id="auth-prompt-entry">
    This seems to be some GTK data describing the user/password entry field in the login window. Following that line there's a list of <property> entries. At the end of the list, insert the following line:
    Code:
    <property name="invisible_char">&#x200B;</property>
    This sets the character which is displayed instead of the typed letters to the unicode letter 200B, which is the zero-width space character, effectively hiding anything You type into the password field. You can also set the character to anything else you like - at least any unicode letter. Using non-existant letters like 0000, however, will break Your gdm, as the gdm-greeter-login-window will fail and will not be displayed, disabling the ability to log in via gdm.
That's it! You're done!