Native Linux on Toshiba CB35-C33X0 Chromebook

Overview

The Toshiba CB35-C33X0 Chromebooks are impressive in terms of what you get for the price. Both models come with 4GB of RAM, a 16GB SSD storage, 802.11ac wireless, a backlit keyboard, and an absolutely stunning 1920x1080 IPS display. This all comes in a package that is both slightly smaller and lighter than a Macbook Air, and a real world 6 or more hours of battery life (to be honest, I've not yet drained the thing over the 24 hours or so I've owned it, but the battery gage moves quite slowly). Best of all, the CB35-C3300 comes with a 1.7GHz Celeron 3215U for a mere $330USD. For $430, you can instead get the CB35-C3350, which is the same machine with a beefier Core i3-5015U processor, but the Celeron is fast enough for most things.

However, this package has two flaws. The first is that it has a paltry 16GB of internal storage. However, unlike its predecessor, the CB35-C3300 series uses replacable SATA III 42mm M.2 SSD drives. How much storage you need is up to you, but I added a Transcend 256GB SSD for $115. (I should point out that a linux install will easily fit in 16GB, but there isn't much room left over for files. So if you're ok using USB sticks or just want an "X Terminal", you don't need a bigger SSD.) The second "flaw", is that it comes saddled with ChromeOS. Well, ok, that may not be a major flaw for everyone, but this hardware has the potential to do so much more than ChromeOS. Fortunately, this can be rectified as well.

This guide is for people who want to run native linux on this hardware. There are plenty of crouton guides out there. Crouton is pretty awesome too. But this guide is for people who want to run linux natively instead of starting an X window manager up in a chroot. Note that this involves popping open your laptop. It's easy as such things go, but you will be looking at the internal components of the machine, so if you're not comfortable with that, I suggest the crouton path.

Before we Begin

This guide is for the 2015 Toshiba Chromebook 2. The model number will be CB35-C3300 or CB35-C3350. On the Chrome developer splash screen, it will say "Gandof". If you have the older Baytrail "Toshiba Chromebook 2", that is "Swanky", then your adventure will be harder, and is not covered here. (in short, the older model used eMMC storage, which many online reports call out as being not supported by SeaBIOS -- I don't know the current state since I don't have the old model).

Note 1: I have only worked with the CB35-C3300 (Celeron). There is no reason that these instructions shouldn't also work with the CB35-C3350 (Core i3), but I have not personally tried it.

Note 2: Almost ALL of this information is available elsewhere. This guide serves as a compilation for the lazy :).

Note 3: I also assume that if you're installing linux, you have some idea of what you are doing. (I am not spending time spelling out things that are well prompted or obvious).

What You'll Need

You will need at least one, a preferably two USB flash drives of at least 2GB in size. You will also need a phillips screwdriver, and a flat screwdriver with a really thin blade. You might want to have an SSD upgrade on hand, since we're going to have the machine open anyway. I also suggest having a small amount of electrical tape on hand to cover the BIOS Write Protect circuit.

Contents

* Make a USB restore of ChromeOS
* (Backup any local files if you have them)
* Put the Chromebook into Developer Mode
* Open up the Chromebook
* Remove the BIOS Write Protection Screw
* Replace the SSD Drive
* (Restore ChromeOS if You Added a New Drive)
* Download Linux, And Make a Bootable USB
* Flash the BIOS with a custom SeaBIOS
* Install Linux
* Linux On Your Chromebook Tips
* Profit

Make a USB restore of ChromeOS

This step allows us to restore ChromeOS at a later date should we decide. It is required if you are swapping out the SSD. Well ok, you could opt to open the case twice instead, but I prefer to restore ChromeOS, and then flash the BIOS rather than opening the case up twice. You can get detailed instructions for making this media
here.

Backup any local files if you have them

I did this on a brand new laptop, so I had no files. If you have any files on the local storage that you want to keep, now is a good time to save them, because we are about to overwrite the drive.

Put the Chromebook into Developer Mode

This is easy. Press [Esc]+[Refresh]+[Power] (Refresh is the button that is a circular arrow, three keys right of escape). There will be a scary looking screen that says the OS is broken. It is lying. Just press [Ctrl]+[D] and follow the prompts to
enable developer mode. This will wipe the data on your drive (see the previous step). Unfortunately, every time you boot from now on, you'll get a nasty looking warning page saying that disk verification is turned off. It's annoying, but all you need to do is press [Ctrl]+[D] to boot ChromeOS. Later, after we flash the BIOS, we'll instead press [Ctrl]+[L] to activate the "legacy" BIOS (and boot linux).

Open up the Chromebook

This is the scary part to some extent. There are various guides out there with pictures, but basically there are 10 screws on the bottom of the Chromebook. 8 of them are obvious. The other two are under the FRONT rubber feet. You can pry the rubber feet off gently with a flat screwdriver. If you are careful, they should come off undamaged, and even have enough adhesive left to just stick back on when you are done. Once the screws are out, use the thin flat head screw driver to gently wedge the bottom panel loose at the seams. I found it easiest to get my foothold right next to the hinges. Once you get it started, it will come off pretty easily. See
this guide that is for replacing the SSD, but neccesarily shows how to open the device too.

Also: this video, but note that the video is for a CB35-B3440, so while the outside is the same, the inside is NOT.

When you are done inside, the bottom snaps back into place, and the screws go back in the same way they came out.

Remove the BIOS Write Protection Screw

There is a screw between the CPU and the wireless card that has a silver metalic sticker under it. This is the BIOS write protect. You need to remove the screw, and then scrape the sticker off gently with the flat head screwdriver. The video in the last step shows how to remove the sticker, but in the newer models, you don't have to dig to get to it. See this post for photos of what it looks like in this model.

Once I removed the screw and sticker, I stuck a small square of electrical tape over the contacts to prevent anything else in the case from shorting across the contacts.

Replace the SSD Drive

While you're in here, the SSD drive is right next to the processor, so now would be a great time to replace it.

Restore ChromeOS if You Added a New Drive

If you installed a new drive, you need to
Restore ChromeOS (but note, that we already made a recovery disk, so pretty much just plug the USB drive in, and follow the prompts.)

Download Linux, And Make a Bootable USB

There are multiple paths here, but I chose ubuntu, and so I
downloaded an installer, and followed the instructions to create a bootable USB stick. (OSX instruction)

HINT: If you go ubuntu, the 14.04 installer throws an error about the graphics failing to load, but if you type "help" at the resulting boot prompt, and then press enter at the subsequent boot prompt, it will boot normally. The 15.x release I tried did not accept my "help" in booting, so stick with 14.04.

Flash the BIOS with a custom SeaBIOS

Boot into ChromeOS, and press [Ctrl]+[Alt]+[T] to get a shell. As you're in developer mode, you can type "shell" to get a REAL shell. From there, follow these instructions to flash the BIOS.

[The import part is this command here (all one line):]

cd; rm -f flash_chromebook_rom.sh; curl -L -O
https://johnlewis.ie/flash_chromebook_rom.sh; sudo -E bash flash_chromebook_rom.sh
You then need to enable legacy boot, and usb boot. In crosh, issue this command:

sudo crossystem dev_boot_usb=1 dev_boot_legacy=1

Install Linux

So now, power down, and then put your USB linux installer into the USB 2.0 port. Power back on, and at the scary looking write protect disabled screen, press [Ctrl]+[L] to bring up the legacy BIOS. Press [Esc] to choose a boot device, and choose the USB device. SeaBIOS cannot see the USB 3.0 port, so you're stuck with USB 2.0 here. (UPDATE: Morgan Risch says that the USB 3.0 port worked for him. Maybe John Lewis updated SeaBIOS since I installed. If it works for you, it'll make installation faster.) Your linux media should boot up. From here, you could write an entire wiki on this by itself, so I am going to assume that if you are doing this, you can figure out how to run the installer for your favorite flavor of linux.

Once you're done, you will have to use [Ctrl]+[L] at the developer mode warning screen whenever you boot to get the legacy BIOS boot, but you can just hit enter to boot the hard drive (you don't need to press [Esc] and then choose a device to boot).

Screenshots

Linux On Your Chromebook Tips

So, some of this is ubuntu shaded, but the gist should be transferable to other flavors.

Mouse/Trackpad

So, X uses three mouse buttons. Your Chromebook has one. This can be painful. What I did was map the right [Alt] and [Ctrl] keys as middle and right click, and then disable the soft corner because it drives me nuts:

#!/bin/bash

setxkbmap -layout us
xkbset m
xkbset exp =m

# map left alt to middle button
xmodmap -e "keycode 108 = Pointer_Button2"

# map left ctrl to right button
xmodmap -e "keycode 105 = Pointer_Button3"

# disable annoyiung soft button
xinput set-prop "Elan Touchpad" "Synaptics Soft Button Areas" 0 0 0 0 0 0 0 0

# disable annoying tap action
xinput set-prop "Elan Touchpad" "Synaptics Tap Action" 0 0 0 0 0 0 0

I set this script to run as a session launch action in my window manager.

Note: The LEFT [Ctrl] and [Alt] keys do not get mapped, only the right ones. I never use the ones on the right hand side, which are next to the track pad, so for me they make great mouse buttons.

Volume Keys

To get the volume keys to work, I used amixer, and mapped key presses as follows:

F8 -> amixer -q -D pulse sset Master toggle
F9 -> amixer -q -D pulse sset Master 3%-
F10 -> amixer -q -D pulse sset Master 3%+

LCD Brightness Keys

To get the brightness keys to adjust the LCD brightness, I installed a utility called xbacklight, and then made the following key mappings:

F6 -> xbacklight -dec 10
F7 -> xbacklight -inc 10

Page Up and Page Down

The keyboard lacks a page up and page down key. To get around this, I did some creative remapping:

# enable super+up and super+down for pageup and pagedown
xmodmap -e 'keycode 133 = Mode_switch Mode_switch Mode_switch'
xmodmap -e 'keycode 111 = Up Prior Prior'
xmodmap -e 'keycode 116 = Down Next Next'

So, in general, shift+up and shift+down will send page up and page down respectively. However, the chrome browser, and firefox (and possibly other programs) don't listen to this map. So for them we ALSO mapped the magnifying glass key to "Mode_switch", and mapped "Mode_switch"+up and "Mode_switch"+down to page up and page down. It's a little annoying because shift+key works in some programs, but not mode_switch+key, and then in other programs it is reversed. However, this is still better than not having pageup and pagedown.

laptop-mode-tools

This package is not installed by default. You want it. It will add 20-30% to your battery life, I kid you not. For ubuntu, I did this:

sudo apt-get install laptop-mode-tools

Much of this just works, but the auto backlight adjustment does not. You need to edit /etc/laptop-mode/conf.d/lcd-brightness.conf and make changes as follows:

# turn on brightness control
CONTROL_BRIGHTNESS=1

# set the backlight brightness of AC power state change
BATT_BRIGHTNESS_COMMAND="echo 93"
LM_AC_BRIGHTNESS_COMMAND="echo 937"
NOLM_AC_BRIGHTNESS_COMMAND="echo 937"
BRIGHTNESS_OUTPUT="/sys/class/backlight/intel_backlight/brightness"

Keyboard Backlight

The module for controling the backlight LED does not exist in the ubuntu distribution. Thanks to help from
Jesse Lichtenberg, I was able to download the source to the pixel backlight driver, and modify it to work for the Toshiba. To make it easier, you can download the source, modified for toshiba here.

To set it up, I did this:

tar zxvf backlight-driver.tar.gz
cd chromebook_keyboard_backlight_driver
make
sudo cp chromeos_keyboard_leds.ko chromebook_kb_backlight.ko /lib/modules/`uname -r`/kernel/drivers/platform/chrome/
sudo depmod -a
sudo insmod chromeos_keyboard_leds.ko
sudo insmod chromebook_kb_backlight.ko

You'll want to add "chromeos_keyboard_leds" and "chromebook_kb_backlight" to the end of /etc/modules so that they load automatically. Now that the driver is installed, you need to make it actually work. My zipfile includes code for keyboard_brightness (replacing the shellscript in the original source). I did this so that we can make it setuid, so that you don't need to be root to change the keyboard backlight. To do this:

sudo cp keyboard_brightness /usr/local/bin
sudo chmod u+s /usr/local/bin/keyboard_brightness

Now all you have to do is map keys to the script. I chose to do this:

Ctrl+F6 -> /usr/local/bin/keyboard_brightness down
Ctrl+F7 -> /usr/local/bin/keyboard_brightness up

(You may prefer to use off and on instead of down and up if you just want a switch).