Thinkpad X240 and Debian Linux

This post is being updates as we go… check back later for more

So, Lenovo have finally made another laptop that has specs I can live with: The new Thinkpad X240.
The Lenovo web-shop is a steaming pile of crap, and trying to customize/configure the laptop will take many attempts, with various differences between the different locales. However, in the end I ended up with the laptop configured the way I wanted it:


  • Full HD, non-touch, non-glare 12.5″ screen (1920×1080)
  • Intel Dual-Core i5-4300U
  • 500G Harddisk (swapped with a SAMSUNG 840 SSD, 250GB immediately after arrival)
  • 8GB DDR3 Ram
  • Intel 802.11ac dual-band wifi and Bluetooth
  • Intel Gigabit Ethernet
  • USB 3.0 (2 ports, 1 left, 1 right)
  • Smartcard reader
  • SD-Card reader
  • 3-Cell (internal, 23Whr) + 6-Cell-High-Capacity backside battery (72Whr, total ~95Whr)
  • Backlit US-international keyboard
  • Clickpad and clit-mouse
  • VGA and Mini-DisplayPort
  • Docking port (though I didn’t buy a dock)
  • WWAN antenna’s (WWAN modem optional)

I also bought a set of adapter cables to convert from the old-style 7.9MM round thinkpad adapter to the new flat/square connector on the X240 (and X1-Carbon). These can be found on aliexpress or ebay so I could re-use my 4+ existing Thinkpad Adapters.


By default, the Thinkpad X240 comes with Windows 8… which is not very user-friendly, and definitely not compatible with my usage. I removed the internal HDD drive, swapped it out with a Samsung 250GB SSD and installed Debian Jessie on this drive. (BTW: Windows 8 was very sluggish on the HDD drive, even with 8GB of ram)

I prefer running the Mate/Gnome-2 desktop, so I added the mate-desktop repositories and installed mate-desktop-environment.

Hardware Configuration

Lenovo has made it very easy to disable unneeded hardware in the EFI/BIOS. The following devices can be turned off (to add battery-life and privacy 😛 )

  • 720p Webcam
  • Microphones
  • WWAN
  • WLAN
  • LAN
  • USB

Config tweaking

  • Tweak440s:
  • Synaptics configuration: /usr/share/X11/xorg.conf.d/50-synaptics.conf
    • Option “SoftButtonAreas” “60% 0 0 5% 40% 60% 0 5%”
  • Disable the soundcard, so the internal speakers are the ‘fallback’ option, then logout/login to make the media buttons work on the new default device.


  • Very quick resume from suspend, open the lid and immediately see the ‘unlock screensaver’ popup
  • Full-HD display
  • Very low battery-drain when idle and almost none in suspend
  • Hot swappable battery
  • Lightweight


  • No fysical buttons with the trackpoint/touchpad
  • No leds for wifi/disk activity
  • No way to set ‘fn-lock’ automatically
  • Not as ‘non-glare’ as they used to be, but still acceptable
  • End/Insert button is shared, to use ‘end’ you need Fn-End, while I never use insert.
    • FIXED: Edit /usr/share/X11/xkb/keycodes/evdev, and swap the codes for END and INS, then run: setxkbmap
    • <INS> = 115;
    • <END> = 118;

attiny85 powered kWh-meter-meter and 1-wire host

At Revelation Space we wanted some insight into our powerusage. After a few prototypes on arduino’s I ended up building a small board powered by an attiny85.

In later revisions I added a Dallas/Maxim 1-Wire bus that will read out DS18B20 temperature sensors, so I could monitor the temperature of the server that was logging the data (it didn’t have any supported sensors).

The schema shows the attiny85, the programming header (non-standard pinout ISP header) and used parts.

The LED will blink for every received pulse, so you can verify this with the original meter. I made the connection to the LDR as a 2-pin jumper-block, so I could easily disconnect the LDR, which is connected to a long cable so it can reach the led on the kWh-meter.

JP1 on the schema is the 1-Wire bus. I ended up using just the 2-pin version. On my board I terminated this on a 8×2 pin female header.

The final board:

The kWh-meter I am monitoring blinks a led a number of times per kW used. In this case it blinks 1000 times per kW, but I have seen other meters that blink 400, 480, 600 and 1000 times. This is usually documented somewhere on the meter itself.

It looks somewhat like this one:

The trick is to attach an LDR in front of the LED on the meter, and then read out the data using an analog port on the attiny. Make sure to blank out any outside light that can hit the LDR using black tape.

The code for the attiny can be found on my Github

The last components are rrdtool to make graphs and a perl script to log data from the (serial) attiny and pipe the data to rrdtool. Rrdtool and perl code can also be found on github.

After a few days of logging you should have a good insight into your power usage:

If your kWh-Meter uses a rotating disc, Juerd has a nice design that works with those meters. It’s based on an arduino and uses 7-segment displays to give a live insight into the used wattage.

USB-ASP Avr programmer from e-Bay, issues with attiny85

I recently bought a USBASP programmer from e-Bay, the one pictured here

It seemed to work just fine when I was programming attiny4313’s or atmega’s, but would fail on verification when programming attiny85’s (and probably other small/slow attiny’s).

Setting the fuses would work, but writing flash would fail consistently.

The trick to resolve this was to update the firmware to the 2011 version of USBASP, which can be found at

To program the USBASP itself, you need a second programmer (I used a usbtiny) and you need to jumper J2 (which are the 2 solderpoints next to the leds).

After upgrading the firmware, use avrdude with the ‘-B 10‘ option to write to slow devices. This option is not needed with faster (1.5Mhz and up) devices.

Fake PS3Break

This week I received a PS3Break device, but it seems it’s a fake version. It works just fine with the 3.41 firmware on the PS3, but doesn’t have an upgrade button to upgrade the payload on the device.

This is not (yet) a big problem, but it would be nice if I could get it to upgrade to a newer payload. It’s label claims it’s version 1.1. Here are some pictures of the device itself, and the PCB inside.

outside casing of fake ps3break
outside casing of fake ps3break

Front side of the PCB
Front side of the PCB

Back of the PCB

I have already tried shorting several sets of pins on the PCB where I guess the programming button might be wired, but so far I have not yet succeeded.

Might be a nice little project to look into on the next hackerspace meeting.

Thinkpad Edge 11″ AMD Nile, and using it with Ubuntu GNU/Linux

I recently purchased a new ultralight laptop to replace my 3 year old Sony Vaio TZ21. I settled for a Lenovo Thinkpad Edge 11″ this time. I am really fond of the Thinkpad brand, and this Thinkpad Edge is quite a deviation from the ‘normal’ Thinkpad design.
The Edge comes in a few variants, ranging from 11 to 13 and 15″, all available in AMD and Intel flavors. Wanting something thin and light I choose the 11″ model, which at 11.6 inches is slightly bigger then the Vaio (11.1″).

The red Lenovo Thinkpad Edge 11"
Shiny red Thinkpad

The screen has a decent resolution for the size, at 1366×768 it should be sufficient for most uses. The screen is of the glossy variant and has a good range in brightness settings and decent viewing angles. Like in any Thinkpad the hinges are made of metal, and the screen can bend all the way to a flat position. Also in the screen-bezel is a low-light uvc-webcam.

The Edge 11 comes in two versions, Intel Core i3 and AMD K325, both running at 1.3 Ghz. In the netherlands the AMD version comes with 4GB of DDR3 ram, while the Intel version comes with only 2GB. Given that the AMD version is also a good €100 cheaper, this choice was easy.

The 320 GB Hitachi HTS54503 5400rpm disk should provide enough space, but isn’t the fastest or biggest on the block. I’m thinking of replacing it with an SSD drive, or at the very least adding an SSD to the system.

The included Windows Home installation was quickly replaced by Ubuntu 10.10, which recognised almost all the included hardware, including (after installing the closed-source drivers) the Ati/AMD video chip, webcam, ethernet, bluetooth, cardreader and wireless network (The realtek driver does need an update before it works)

The Inside

I did have some small hardware issues with the Thinkpad, as the spacebar wouldn’t always register a press when I hit it on the far-left side. Since I mostly use my left thumb for hitting the space I noticed a lot of missing spaces. I contacted Lenovo/IBM support about this issue and then quickly sent me a replacement keyboard and directed me to the installation instructions.
I got the keyboard replaced the next day, which gave me a nice look at the inside of the Edge. It looks very well built, and is very much user-servicable.
Removing the 3 screws on the bottom allows access to all the internals:

  • Hard drive bay
  • Half-height mini-pci bay for Wifi/Bluetooth
  • Full-height mini-pci bay (empty, might want to use this for a mini-pci based SSD drive?)
  • 2 DIMM slots (both containing a 2GB DDR3 SODIMM)
  • Sim-card slot (for the optional internal Gobi 3G modem

Removing the keyboard required the removal of the battery pack and two screws underneath it (they hold the keyboard in place) and removing the sata harddrive (2 screws). After these are all removed you have access to the back of the keyboard, and it’s just a matter of a small push to click it loose.

Putting the Edge together again wasn’t hard and the entire procedure took no more then a few minutes (including doing it twice, since I didn’t correctly push down on the keyboard connector, so some keys weren’t working the first time)

Using it with Ubuntu Linux

Installation of Ubuntu was a breeze, as usual, and only a few issues remained after the initial installation:

  • The wireless network wouldn’t work
  • Suspend to ram doesn’t work
  • The touchpad/pointer would occasionally lock-up for short periods of time

Realtek rtl8192CE/8195 Wireless

The Realtek rtl8192CE driver included in Ubuntu 10.10 recognised the internal wifi card, but did have issues with it. Upgrading this driver with on from the Realtek site made the wireless network work, but still reports a lot of interesting messages in the ‘dmesg’ output. This situation should improve, as more work is done on this new driver.

Suspend to RAM

Appending ‘acpi_osi=linux noapic’ to the kernel commandline seems to fix all suspend/resume issues.

Synaptics touchpad behaving erratic

The touchpad will report errors and reset itself occasionally. This results in a few seconds of unresponsiveness. This also seems to be fixed by the above kernel commandline options. (I couldn’t reproduce it anymore since)


Plugging in a headphone will not redirect sound to the headphone jack (that stays silent, and the speakers keep playing). As user ‘Felix’ reported below, append “options snd-hda-intel model=ideapad” in /etc/modprobe.d/alsa-base.conf to fix issues with the microphone and jack plug-detection. (untested by me)

The Good, the Bad, and the Ugly


  • Cheap
  • Light
  • Good battery life
  • Good chiclet keyboard, and also the ‘clit’ pointer
  • No optical drive or other useless hardware
  • Vga, HDMI, 3x USB, Cardreader, Ethernet… so much more then a macbook air.
  • 64 Bit, Dual Core, AMD-V capable CPU and enough memory
  • A nice red led as the dot on the ‘i’ in Thinkpad
  • Silent, without getting hot

The Bad

  • No backlit keyboard or thinklight
  • No disk and network-activity leds
  • Current state of linux support (though getting better)

The Ugly

  • No working suspend (yet) in Linux
  • Issues with the trackpad


The device list of this laptop:

00:00.0 Host bridge: Advanced Micro Devices [AMD] RS780 Host Bridge Alternate
00:01.0 PCI bridge: Advanced Micro Devices [AMD] RS780 PCI to PCI bridge (int gfx)
00:04.0 PCI bridge: Advanced Micro Devices [AMD] RS780 PCI to PCI bridge (PCIE port 0)
00:05.0 PCI bridge: Advanced Micro Devices [AMD] RS780 PCI to PCI bridge (PCIE port 1)
00:11.0 SATA controller: ATI Technologies Inc SB700/SB800 SATA Controller [AHCI mode]
00:12.0 USB Controller: ATI Technologies Inc SB700/SB800 USB OHCI0 Controller
00:12.2 USB Controller: ATI Technologies Inc SB700/SB800 USB EHCI Controller
00:13.0 USB Controller: ATI Technologies Inc SB700/SB800 USB OHCI0 Controller
00:13.2 USB Controller: ATI Technologies Inc SB700/SB800 USB EHCI Controller
00:14.0 SMBus: ATI Technologies Inc SBx00 SMBus Controller (rev 42)
00:14.2 Audio device: ATI Technologies Inc SBx00 Azalia (Intel HDA) (rev 40)
00:14.3 ISA bridge: ATI Technologies Inc SB700/SB800 LPC host controller (rev 40)
00:14.4 PCI bridge: ATI Technologies Inc SBx00 PCI to PCI Bridge (rev 40)
00:18.0 Host bridge: Advanced Micro Devices [AMD] Family 10h Processor HyperTransport Configuration
00:18.1 Host bridge: Advanced Micro Devices [AMD] Family 10h Processor Address Map
00:18.2 Host bridge: Advanced Micro Devices [AMD] Family 10h Processor DRAM Controller
00:18.3 Host bridge: Advanced Micro Devices [AMD] Family 10h Processor Miscellaneous Control
00:18.4 Host bridge: Advanced Micro Devices [AMD] Family 10h Processor Link Control
01:05.0 VGA compatible controller: ATI Technologies Inc M880G [Mobility Radeon HD 4200]
01:05.1 Audio device: ATI Technologies Inc RS880 Audio Device [Radeon HD 4200]
02:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 03)
08:00.0 Network controller: Realtek Semiconductor Co., Ltd. Device 8176 (rev 01)

Cpu Info

processor       : 1
vendor_id       : AuthenticAMD
cpu family      : 16
model           : 6
model name      : AMD Athlon(tm) II Neo K325 Dual-Core Processor
stepping        : 3
cpu MHz         : 800.000
cache size      : 1024 KB
physical id     : 0
siblings        : 2
core id         : 1
cpu cores       : 2
apicid          : 1
initial apicid  : 1
fpu             : yes
fpu_exception   : yes
cpuid level     : 5
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr \
    sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm 3dnowext 3dnow constant_tsc rep_good \
    nonstop_tsc extd_apicid pni monitor cx16 popcnt lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a \
    3dnowprefetch osvw ibs skinit wdt nodeid_msr npt lbrv svm_lock nrip_save
bogomips        : 2593.54
TLB size        : 1024 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 48 bits physical, 48 bits virtual
power management: ts ttp tm stc 100mhzsteps hwpstate

…becomes a mame-cabinet

The scrapmame cabinet is getting to a functional level. Today I was able to play a game of asteroids, pacman and galaga on it.
All the buttons have been wired up to the controller using screw terminals (kroonsteentje) for easy (dis)assembly.

Galaga running on scrapmame

Before getting there I had to do some creative wiring, as it seems I cut some corners with wiring up the controller. A few separate ground-points were connected, however this was causing interesting signals on the analog joystick axes. A lot of trial-and-error later it seems I have clean inputs from all buttons and the digital joystick.

I still need to hook up the second stick (which will hopefully arrive from DX this week), some buttons (insert coin, start game) and a usb keypad (for misc buttons). A set of speakers should also arrive this week, allowing the scrapmame to make a decent amount of noise.

Next week I’ll probably fit in the PC (I’ve been using my laptop for testing so far) and then I’ll start on the launcher/menu interface.

I’ll try to add some more pictures of the inside of the cabinet later.

… and some electronics…

After the woodworking on the scrapmame it was time for the electronics.

The first bit was unsoldering/cutting the wires on the sacrificed PSX controller and then connecting new wires to the solder-pads
first wires attached
The yellow wires are for the direction buttons, white for the 4 fire-buttons and blue is the common ground.

After a long soldering session the result looked like this:
The final product
A few more solder-pads were connected to ground wires (or each-other) and the red wires connect to the shoulder-buttons and analog-stick buttons of the PSX. The 2 new yellow wires connect to ‘start’ and ‘select’.

This would give me a total of 16 buttons wired to a single PSX controller. On the mame cabinet this will translate to a sets of 4 directional buttons and 3 fire buttons for each player (2 players) and 2 remaining buttons for ‘start’ or ‘insert coin’… I’m not too sure yet about what would be the ‘best’ combination.

Lastly, before calling it a night, I wired up the ground-connections on the joystick section, so I only need to bring 5 cables up to the stick ( and not 8 )
common ground on the joystick microswitches

Next time I plan to connect all the wires to plugs that connect to the buttons (still need to buy the correct sized plugs) and joystick microswitches (which you can see in the background of the first picture)

Some woodworking…

At Revelation Space I have been doing some woodworking for a project I’m working on. I’m normaly the guy with two left hands when it comes to working with heavy machinery and old-skool hardware, but I must say I’m not doing too bad.
It helps that revspace has more then enough of the necessary tools (at home I only have a hammer and a screwdriver :P)

The project is a self-built Arcade cabinet, which at this time has been called ‘ScrapMAME’, as it’s been built completely out of scrap-materials.
Step 1... getting lots of wood

I PSX Controller (pre disassembly)have built the frame and outsides of the cabinet from wood boards that were originally bolted onto the windows in the workshop, together with some wood beams that were still lying around the space.
The buttons and joystick have been ordered from DealExtreme, and the first batch has arrived. Hopefully my second shipment with the remaining parts will arrive soon.
I’m using this arcade stick, and these buttons from DX. The buttons will be wired to the pcb of an old PSX controller, which will be connected to a PSX->USB adapter.

2010/06/26: The buttons and joystick arrived, so I could finally drill the holes.
Unpacked the newly arrived buttons and arcade stick
Holes for the fire-buttons and joysticks

There is still lots to be done… which will be added as soon as I get to it ;P

Bouncing mails and other misery

It seems my mailserver has been bouncing mails this morning.
My spam filtering setup was broken somewhere in the virus-scanning phase, as clamav was reporting errors. This caused all mail to be rejected. This should now be fixed (at least for now, as I disabled the clamav plugin on pythonfilter).

Also, someone had hacked into my ICQ account (which I hardly use anymore) and spammed all my contacts for some russian site. The password on my ICQ account has been changed, so this should no longer be an issue either.

Sorry for causing this mess