reMarkable microSD

This page discusses how I added a microSD card to my reMarkable tablet. I did this because I want to develop software for my rM without wearing out the internal eMMC. I chose an external card because I want to be able to swap them easily; it also makes backups faster.

Opened reMarkable tablet

Opening the case

The aluminum back panel is held to the plastic case with glue. I have not yet determined what melts this glue, or how to “properly” take the back off. I was able to lift it off, by starting slowly in a corner. Thereafter, I used a putty knife to slowly peel it away. The panel bent, but I was able to bend it mostly-flat again.

Next, there is a magnesium chassis screwed to the plastic case. Underneath the rubber feet are six silver screws. There are also XX black screws, that must be removed.

The epaper display is glued to the magnesium chassis; don’t try to pull it apart. There is also a white silicone-like substance around the edge of the epaper panel, which seems to disintegrate and flake off. I think it fills the gap, and perhaps offers a little waterproofing. This is non-replaceable. The screen can be pushed apart from the plastic chassis. It is held on the perimeter with plastic latches, so split it with a spudger and go slowly.

With the case off, the guts can be removed. There are five connectors to the logic board. In clockwise order starting at top-left: power button, touch panel, antenna, epaper display, USB daughterboard and buttons, and Wacom digitizer.

Finally, the logic board can be removed. It is held with six small screws and washers. Underneath the logic board is a plastic tape, a section of which must be removed around the SD pads.

MMC solder pads

Positioning the card

The bottom-right seemed like an appropriate placement for the card socket, because the area is already spacious. The right side was easier to route the cables to, because of the channels cut in the white plastic case. I reassembled the reMarkable prior to soldering, to ensure no bulges or deformities appered.

Placing the microSD slot in the lower right corner

Soldering the wires

Using ten 30 AWG wires and plenty of flux, I connected the board to the socket. The board indicates which pin is first. The board has a ninth pin, which is used for card-detect. This gets pulled low when a card is inserted.

Wires underneath logic board

To keep things as flat as possible, I used cellophane tape to mate the wires to the board. They feed out beneath the digitizer’s FFC cable in one beautiful ribbon. This also prevents elecrical contact to the grounded chassis.

Wires on back

Cutting the case

I drilled the SD slot by-hand with a rotary tool. Starting with a carving bit on the inside, I first hollowed out the area to give me a thin veneer, measured with a flashlight. Once I felt it was thin enough, I drilled from the front with a pointy sanding bit, and cut longitudinally.

The magnesium chassis had a small section removed, which was easy with a tiny wire cutter. While it sacrifices a little bit of strength, it makes up for it in storage capacity.

After testing the fit once again, I fillited epoxy around the edge of the socket, gluing it down. I was careful not to get any inside the socket.

microSD slot from the outside

Loading the kernel

The stock rM kernel doesn't enable the SDHC1 slot, which is how these pins are designated in the device tree file. I recommend first being comforable with this remarkable-flash guide, the NXP porting guide for the i.MX6 processor, and the i.MX Yocto user guide.

The rM is a mostly-vanilla i.MX6 board (many share similaries, including the Hobbitboard). As such, it shares the same SDHC interface. What the microSD slot connects to, and what the stock kernel does not activate, is the SDHC1 interface. This can be enabled in the device tree, and the kernel may be recompiled to include support for an SD card.

By default, the sdhc1 interface is disabled in the device tree. Enabling this is the first step. Copy the arch/arm/boot/dts/zero-gravitas-factory.dts over arch/arm/boot/dts/zero-gravitas.dts. Then, edit it to enable the sdhc1 interface like shown in the diff below.

 &usdhc1 {
pinctrl-names = "default", "state_100mhz", "state_200mhz";
pinctrl-0 = <&pinctrl_usdhc1>;
pinctrl-1 = <&pinctrl_usdhc1_100mhz>;
pinctrl-2 = <&pinctrl_usdhc1_200mhz>;
bus-width = <4>;
cd-gpios = <&gpio4 7 GPIO_ACTIVE_LOW>;
disable-wp;
wp-controller;
keep-power-in-suspend;
enable-sdio-wakeup;
no-1-8-v;
/*disable-wp;*/
- status = "disabled";
+ status = "okay";
};

Next, make zero-gravitas_defconfig and edit the .config file produced to include the following drivers.

CONFIG_CFG80211=y
CONFIG_MAC80211=y
CONFIG_BRCMUTIL=y
CONFIG_BRCMFMAC=y
CONFIG_RTL_CARDS=y
CONFIG_BATTERY_BQ27XXX=y
CONFIG_BATTERY_BQ27XXX_I2C=y
CONFIG_USB_ACM=y
CONFIG_USB_F_ACM=y
CONFIG_USB_U_SERIAL=y
CONFIG_USB_CDC_COMPOSITE=y
CONFIG_CRYPTO_AEAD=y
CONFIG_CRYPTO_GF128MUL=y
CONFIG_CRYPTO_NULL=y
CONFIG_CRYPTO_CCM=y
CONFIG_CRYPTO_GCM=y
CONFIG_CRYPTO_SEQIV=y
CONFIG_CRYPTO_CTR=y
CONFIG_CRYPTO_GHASH=y
CONFIG_CRYPTO_ARC4=y

Once done, rebuild the Linux kernel with make. Copy the artifacts to the rM's /boot directory: arch/arm/boot/dts/zero-gravitas.dtb and arch/arm/boot/zImage. I have included my artifacts here for posterity, but it is foolish to install a kernel that someone else compiled.

Reboot the rM, to make sure xochitl still runs. Then, check dmesg | grep ‘mmc0’ to ensure the card was detected, and double-check it with fdisk -l. Partition your card as you like, then change the /etc/fstab option to mount that partition at /home.

root@reMarkable:~# dmesg | grep mmc0
[    2.091218] mmc0: SDHCI controller on 2190000.usdhc [2190000.usdhc] using DMA
[    2.377570] mmc0: new high speed SDXC card at address aaaa
[    2.391939] mmcblk0: mmc0:aaaa SC200 183 GiB 
#/dev/mmcblk1p7 /home auto defaults,nofail 1 2
/dev/mmcblk0p7 /home auto defaults,nofail 1 2

Reboot, and bask in the increased storage capacity.

Storage screen showing 179 GB free

Ending notes

Go home