Roku Netflix Player

From Linux Hints

Revision as of 18:22, 28 December 2009 by Pancio (Talk | contribs)
(diff) ← Older revision | Current revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Contents

About

This page is intended as a collection of information about the Roku Netflix player. The aim is to enhance the player in order to achieve several possible goals:

  • Enhance the player to serve additional content other than that provided by Netflix - such as locally served media.
  • Interoperate with MythTV, possibly as a frontend, or having MythTV control it.

The goal also is not to interfere with services provided either Roku or Netflix.

This is a wiki. You may edit and add any additional information you have.

Credits and other information

Kudos to Eric Cooper for his examination of the software to date.

In addition, much has been discussed in the Roku forums, particularly in the Roku branded Netflix STB technical thread.

Accessing the Player

The goal is to enable software level access. Like many embedded devices, it is intended to be a black box, with no obvious user access to the internals. However, could it be accessed, modification becomes relatively straightforward. The system is a standard busybox-based embedded MIPS system (it has much in common with the Linux running on Linksys wireless routers).

Software Access

As Eric and others have noted, access is controlled by private keys, so unless these keys are known, or another way in is found, this is perhaps an unlikely access point.

Bootloader Access

As with many embedded Linux systems, the Roku uses the U-boot bootloader, which controls launching of the Linux kernel and control over the onboard flash, etc. Typically, this can be access via a TTL-level serial port on the board. The Roku is no different, and the 10 pin jumper appears to have this pin out:

 NC  1 2  NC
RTS? 3 4  CTS?
 RX? 5 6  TX
 NC  7 8  NC
 5V  9 10 GND

You will need a TTL to RS232 (or USB) serial adapter to connect to this. The paramaters are 115200,8N1. This is the result:

--------------------------------------------------------------------
-- Griffin Primary Bootloader v0.1-1091d (17:15:35, Mar 20 2008)
-- Andre McCurdy, NXP Semiconductors
--------------------------------------------------------------------
Device: PNX8935 M1
Secure boot: enabled, keysel: 13, vid: 6 (expecting 6)
Flash config: 7 (omni: 8bit NAND), timing: 0x04
CPU clock: 320 MHz
DRAM: DDR400 (CL3), 2 x 2 64MByte 8bit devices: 256 MBytes
DRAM: 197 MHz, Bandwidth (MB/s): Rd 94.4, Wr 76.9, Cp 37.7
NAND: Samsung, small-page, 64 MByte (4096 x 16k blocks)
aboot exec time: 184581 uSec


U-Boot 1.2.0 (NAND or Rescue image - so no hardware configuration) (May 29 2008 - 18:13:11)

CPU is PNX8935 M1, CPU speed 320 MHz
Secure boot: enabled
Flash type is Nand
DRAM:  256 MB
## Unknown FLASH on Bank 1 - Size = 0x00000000 = 0 MB
Flash:  0 kB
NAND:  Remapping Bad Blocks: 3728
64 MiB
Env: default
Splash:  done
u-boot startup time so far: 1077 msec

Image 0: Version 4
Image 1: Version 3
Application image detected
..................................................................................................................................................................s
Partition 1: Verify uimage: Success
Application image detected
## Booting image at 8f406748 ...
   Image Name:   Linux Kernel Image
   Image Type:   MIPS Linux Kernel Image (gzip compressed)
   Data Size:    1423637 Bytes =  1.4 MB
   Load Address: 80001000
   Entry Point:  802ed000
   Verifying Checksum ... OK
   Uncompressing Kernel Image ... OK

Starting kernel ...

Typically, on such systems, the boot can be interrupted with a key press, but this does not appear to be the case here.

JTAG Access

The 14 pin header on the board is almost certain a MIPS EJTAG header. This may provide a more effective way to control the system. I have a JTAG interface that was originally designed for a LART, and using UrJTAG only made a small amount of progress:

jtag> cable arcom parallel 0x378
Initializing parallel port at 0x378
jtag> detect
Warning: TDO seems to be stuck at 1

(Now connect power)

jtag> detect
IR length: 5
Chain length: 1
Device Id: 0 (0x0000000000000000)
Error: Unable to detect JTAG chain end!
chain.c(133) Part 0 without active instruction
chain.c(184) Part 0 without active instruction
chain.c(133) Part 0 without active instruction
jtag>

I'm not sure if UrJTAG fully understands my JTAG interface or if the issue is completely different. Three's some relevant information on the MIPS Wiki. In short, it needs some input from someone who's more of a MIPS and hardware hacker than I am.

Playing Other Content

I had originally thought that it might be straight forward to intercept the HTTP request for playlist queries and add your own content to it. However, it seems that this is mostly over HTTPS, making it much harder (only the movie images are plain HTTP). The actual movie data itself is HTTP (Netflix movies are WMV encoded); what other formats it might play without modification is an open question.

Player Debug Mode

This has been mentioned in the forums to access the debug menu to force the playback speed (reset after reboot). It may take some tries. Press on the remote:

  • Home 5 times
  • Rewind 3 times
  • Fast forward 2 times

Secret Screen Mode

I found other features, press on the remote:

  • Home 5 times
  • Fast forward 3 times
  • Rewind 2 times

Other Information

  • Roku Player GPL resources - Most of these archives are just vanilla copies of the original. The real changes are in the stb225_base and mipsutils archives.
related