Table of Contents

picoPrint Software Documentation

Install Gentoo Linux on Cubieboard2

Install & bootstrap crossdev

$ emerge -av crossdev

Create a stable armv7a-hardfloat-linux-gnueabi tool chain for the Cubieboard2:

$ crossdev -S -t armv7a-hardfloat-linux-gnueabi

Install and compile u-boot

$ mkdir gentoo-cb2
$ cd gentoo-cb2
$ git clone https://github.com/linux-sunxi/u-boot-sunxi.git
$ cd u-boot-sunxi

Start clean and configure Cubieboard2 default u-boot parameters

$ CROSS_COMPILE=armv7a-hardfloat-linux-gnueabi- make distclean
$ CROSS_COMPILE=armv7a-hardfloat-linux-gnueabi- make Cubieboard2_config

should return

Configuring for Cubieboard2 - Board: sun7i, Options: CUBIEBOARD2,SPL,SUNXI_GMAC,STATUSLED=244,STATUSLED1=245,FAST_MBUS

Build u-boot

$ CROSS_COMPILE=armv7a-hardfloat-linux-gnueabi- make -j4

should return something like

tools/mkimage -A arm -T firmware -C none \
        -O u-boot -a 0x4a000000 \
        -e 0 \
        -n  "U-Boot 2014.01-rc1-09153-gc75ea90 for sunxi board" \
        -d u-boot.bin u-boot.img
Image Name:   U-Boot 2014.01-rc1-09153-gc75ea9
Created:      Wed Jan  8 10:47:48 2014
Image Type:   ARM U-Boot Firmware (uncompressed)
Data Size:    227820 Bytes = 222.48 kB = 0.22 MB
Load Address: 4a000000
Entry Point:  00000000
tr "\000" "\377" < /dev/zero | dd ibs=1 count=32768 \
                of=spl/sunxi-spl-pad.bin 2>/dev/null

and produce the following files we will need:

-rw-r--r-- 227884 Jan  8 10:47 ./gentoo-cb2/u-boot-sunxi/u-boot.img
-rwxr-xr-x 17644  Jan  8 10:47 ./gentoo-cb2/u-boot-sunxi/spl/u-boot-spl.bin

Install and compile kernel

Get the sources

$ cd ..
$ git clone https://github.com/linux-sunxi/linux-sunxi.git
$ cd linux-sunxi
$ git checkout sunxi-3.4

Prepare the kernel

Use default config to get something to start with

$ CROSS_COMPILE=armv7a-hardfloat-linux-gnueabi- ARCH=arm make sun7i_defconfig

Tweak your kernel according to your wishes

$ CROSS_COMPILE=armv7a-hardfloat-linux-gnueabi- ARCH=arm make menuconfig

The kernel seems to fail to compile when the following settings are enabled:

  • Networking support → [*] RF Switch subsystem support

Solution: Disable RF Switch subsystem support (not needed on CB2 anyways).

  • Power Management options → [*] Run-time PM core functionality

Solution: Disable Run-time PM core functionality or apply the following patch.

--- arch/arm/mach-sun7i/pm/standby/mem_printk.c 2014-01-08 12:42:26.641644236 +0100
+++ /tmp/mem_printk.c   2014-01-08 12:42:18.706835502 +0100
@@ -165,7 +165,7 @@
        int  negative = 0;                //defualt is positive value
        int  i;
        int  j;
-       char digit_string[] = "0123456789ABCDEF";       
+       char * digit_string = "0123456789ABCDEF";       
        
        if(value == 0)
        {
@@ -211,7 +211,7 @@
        char stack[16];
        int  i;
        int  j;
-       char digit_string[] = "0123456789ABCDEF";       
+       char * digit_string = "0123456789ABCDEF";       
        
        if(value == 0)
        {
@@ -366,7 +366,7 @@
 {
        //fill with space ' ' when align request,
        //the max align length is 16 byte.
-       char fill_ch[] = "                ";
+       char * fill_ch = "                ";
        if (len < align)
        {
                //fill at right

Compile kernel

$ CROSS_COMPILE=armv7a-hardfloat-linux-gnueabi- ARCH=arm make -j4 uImage
Image Name:   Linux-3.4.75-00001-g9cfbbed-dirt
Created:      Wed Jan  8 12:55:16 2014
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    4385184 Bytes = 4282.41 kB = 4.18 MB
Load Address: 40008000
Entry Point:  40008000
  Image arch/arm/boot/uImage is ready

Compile modules

$ CROSS_COMPILE=armv7a-hardfloat-linux-gnueabi- ARCH=arm make -j4 modules

Install and compile sunxi-tools

$ cd ..
$ git clone https://github.com/linux-sunxi/sunxi-tools.git
$ cd sunxi-tools
$ make bin2fex fex2bin
$ git clone https://github.com/linux-sunxi/sunxi-boards.git
emerge -pv nginx pycurl mjpg-streamer

GPIOs

http://docs.cubieboard.org/tutorials/common/using_python_program_control_gpios

nginx config

worker_processes  1;

events 
{
    worker_connections  1024;
}

http 
{
    include            mime.types;
    default_type       application/octet-stream;
    sendfile           on;
    keepalive_timeout  65;

    map                 $http_upgrade $connection_upgrade 
    {
        default         upgrade;
        ''              close;
    }

    upstream            "octoprint" 
    {
        server          127.0.0.1:5000;
    }

    upstream            "framecam" 
    {
        server          127.0.0.1:8080;
    }

    server 
    {
        listen       80;
        server_name  feliks;

        client_max_body_size 50M;

        location /framecam/
        {   
            proxy_pass http://framecam/;
            proxy_buffering off;
        }
        
        
        location /sockjs
        {  
            proxy_pass http://octoprint;   # NO trailing slash 
            proxy_buffering off;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;

        }

        location / 
        {
          
            set $pp_d http://127.0.0.1:5000;
            if ( $args = 'action=stream' ) {
                set $pp_d http://127.0.0.1:8080/$is_args$args;
            }
            
            if ( $args = 'action=snapshot' ) {
                set $pp_d http://127.0.0.1:8080/$is_args$args;
            }

            proxy_pass $pp_d;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host:$server_port;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header X-Forwarded-Port $server_port;
            proxy_set_header X-Request-Start $msec; 
          
        }

        # redirect server error pages to the static page /50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html 
        {
            root   html;
        }
    }
}