Linux driver for the Rio Karma

Introduction

The Rio Karma is a 20GB portable digital music player that supports MP3, OGG, and FLAC playback, among others. The device can be used under Linux over ethernet using the dock; however this transport is rather slow and requires possession of the dock. This page documents efforts to produce a mass storage class driver for the Karma under Linux.

The hardware driver is in mainline since 2.6.16 and the FS driver (below) is stable at this time. Visit the sourceforge project for more Karma software on Linux including a HOWTO. You may also be interested in my Karma plugin for Banshee. The latest OMFS driver files will always reside here.

Downloads

OMFS driver (Rio Karma filesystem): There is also an experimental FUSE implementation here:

Older releases available here.

Usage

  1. Download a kernel source tree version 2.6.19 or later.
  2. Configure and build the kernel. Enable CONFIG_KARMA_PARTITION and CONFIG_USB_STORAGE_KARMA.
  3. Build and install the omfs module:
    $ tar xzvf omfs-0.7.7.tar.gz
    $ cd omfs-0.7.7
    (as root)
    # make modules modules_install
    
  4. Load usb-storage and plug in the Karma:
    # modprobe usb-storage
    # dmesg      (look for the device names, e.g. "sda1 sda2")
    
  5. Mount the device
    # mount -t omfs /dev/sda1 /mnt/karma0
    # mount -t omfs /dev/sda2 /mnt/karma1
    

You may wish to back up your disk before using OMFS write functionality. Here's how (requires 20G of space; substitute sda for the actual drive):
To backup:

$ dd if=/dev/sda of=karma.img
To restore:
$ dd if=karma.img of=/dev/sda

Other downloads:

OMFS tools:

How it works

Initialization

The Rio Karma operates as a USB mass storage device, but requires some initialization to enter mass storage mode. Traces of USB traffic from Windows reveals that the device is sent a 40 byte command packet and replies with a 512 byte response. Each request includes a command number, along with a sequence number that is used in subsequent requests and returned by the player when the command completes.

'R' 'I' 'O' 'P' 00 XX YY 00 ...

Where XX is the command number and YY is the sequence number.

F0 00 00 00 00 ...

Until an ack is received, the client sends:

'R' 'I' 'O' 'P' 80 00 YY 00 ...

...until the Karma replies:

F0 00 00 00 00 YY 00 ...

The following commands have been observed:

command (XX)description
00?
01Enter storage mode
02Leave storage mode ("press riostick to continue")
03Reload firmware (from recovery mode)
04?
05Display basic karma info (sample output)
07Set the time. Payload contains a zero followed by a time_t (UTC) as LE32
08Display sensor information (sample output)
0BReboot karma
0CReturn to normal operation (after leave storage mode)
0DDisplay disk information (sample output)

Filesystem

The filesystem consists of fixed-size blocks, with sector 0 containing the partition table. The partition table layout is the same as that of a DOS MBR but it appears earlier in the record (0x10e) and has unnecessary fields zeroed out. My table looks like this:

00 00 00 00 4d 00 00 00 02 80 00 00 00 00 02 00
00 00 00 00 4d 00 00 00 02 80 02 00 5d a9 51 02

Byte 4 (0x4d) is the FS type, bytes 8-11 are the sector offset of the partition (little-endian), and 12-15 are the size of the partition (in sectors).

Block 0 has a magic number of 0x56AB instead of the usual 0x55AA.

After much inspection with a hex editor and some serendipitous googling, I have discovered that the Karma uses the same filesystem as ReplayTV, which has been well-documented over here. The Karma uses 8k blocks.

In addition I have discovered that the FS uses hashing on the filename to locate nodes. The hash function is:

h_i = h_(i-1) xor s_i << (i mod 24)

where h is the hash, s is the string, and the result is modulo the number of buckets. There are 201 buckets in the Rio implementation, although this likely depends on the cluster size (201 * 8 + dirent offset 0x1b8 = 2k = sys_blocksize).

Unlike the ReplayTV, the Karma has a pointer in its superblock to a free space bitmap stored on disk. This bitmap has a bit for each block -- cleared for free blocks -- for a total of around 300k for 20 gigs.

Other things we know about the filesystem, specifically with regards to the Karma:


The following test programs are in various stages of working. They may require some voodoo to compile: