ODROID C2 Hyperion Setup

Hi Guys

Just a quick update on Hyperion on the ODROID C2.

Essentially, yes, it works, however there is some additional config you need to add to the hyperion.config.json to support the Amlogic frame buffer.

My config is as follows:

// Automatically generated configuration file for Hyperion ambilight daemon
// Notice: All values are explained with comments at our wiki: wiki.hyperion-project.org (config area)
// Generated by: HyperCon (The Hyperion deamon configuration file builder)
// Created with HyperCon V1.03.1 (11.06.2016)

{
	// DEVICE CONFIGURATION 
	"device" :
	{
		"name"       : "odroid",
		"type"       : "ws2801",
		"output"     : "/dev/spidev0.0",
		"rate"     : 250000,
		"colorOrder" : "rgb"
	},
	// COLOR CALIBRATION CONFIG
	"color" :
	{
		"channelAdjustment" :
		[
			{
				"id"   : "default",
				"leds" : "*",
				"pureRed" :
				{
					"redChannel"		: 255,
					"greenChannel"		: 0,
					"blueChannel"		: 0
				},
				"pureGreen" :
				{
					"redChannel"		: 0,
					"greenChannel"		: 255,
					"blueChannel"		: 0
				},
				"pureBlue" :
				{
					"redChannel"		: 0,
					"greenChannel"		: 0,
					"blueChannel"		: 255
				}
			}
		],
		"temperature" :
		[
			{
				"id"   : "default",
				"leds" : "*",
				"correctionValues" :
				{
					"red" 	: 255,
					"green"	: 255,
					"blue" 	: 255
				}
			}
		],
		"transform" :
		[
			{
				"id"   : "default",
				"leds" : "*",
				"hsl" :
				{
					"saturationGain"	: 1.0000,
					"luminanceGain"		: 1.0000,
					"luminanceMinimum"		: 0.0000
				},
				"red" :
				{
					"threshold" 	: 0.0000,
					"gamma"     	: 2.5000
				},
				"green" :
				{
					"threshold" 	: 0.0000,
					"gamma"     	: 2.5000
				},
				"blue" :
				{
					"threshold" 	: 0.0000,
					"gamma"     	: 2.5000
				}
			}
		],
	// SMOOTHING CONFIG
		"smoothing" :
		{
			"type"            : "linear",
			"time_ms"         : 200,
			"updateFrequency" : 20.0000,
			"updateDelay"     : 0
		}
	},

	// NO V4L2 GRABBER CONFIG
        // AML Grabber
        "amlgrabber" :
        {
                "width" : 64,
                "height" : 64,
                "frequency_Hz" : 10.0,
                "priority" : 880
        },

        // FRAME GRABBER CONFIG
        "framegrabber" :
        {
                "width" : 64,
                "height" : 64,
                "frequency_Hz" : 10.0,
                "priority" : 890
        },


	// BLACKBORDER CONFIG
	"blackborderdetector" : 
	{
		"enable" : true,
		"threshold" : 0.0,
		"unknownFrameCnt" : 600,
		"borderFrameCnt" : 50,
		"maxInconsistentCnt" : 10,
		"blurRemoveCnt" : 1,
		"mode" : "default"
	},

	// KODI CHECK CONFIG
	"xbmcVideoChecker" : 
	{
		"xbmcAddress" : "127.0.0.1",
		"xbmcTcpPort" : 9090,
		"grabVideo" : true,
		"grabPictures" : true,
		"grabAudio" : true,
		"grabMenu" : false,
		"grabPause" : true,
		"grabScreensaver" : true,
		"enable3DDetection" : true
	},

	// BOOTEFFECT CONFIG
	"bootsequence" : 
	{
		"color" : [0,0,0],
		"effect" : "Rainbow swirl fast",
		"duration_ms" : 3000,
		"priority" : 700
	},

	// JSON SERVER CONFIG
	"jsonServer" : 
	{
		"port" : 19444
	},

	// PROTO SERVER CONFIG
	"protoServer" : 
	{
		"port" : 19445
	},

	// EFFECT PATH
	"effects" : 
	{
		"paths" : 
		[
			"/storage/hyperion/effects",
			"/usr/share/hyperion/effects"
		]
	},

	// NO BOBLIGHT SERVER CONFIG
	// NO JSON/PROTO FORWARD CONFIG

	// LED CONFIGURATION
	"leds" : 
	[
		{
			"index" : 0,
			"hscan" : { "minimum" : 0.5000, "maximum" : 0.5714 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 1,
			"hscan" : { "minimum" : 0.5714, "maximum" : 0.6429 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 2,
			"hscan" : { "minimum" : 0.6429, "maximum" : 0.7143 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 3,
			"hscan" : { "minimum" : 0.7143, "maximum" : 0.7857 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 4,
			"hscan" : { "minimum" : 0.7857, "maximum" : 0.8571 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 5,
			"hscan" : { "minimum" : 0.8571, "maximum" : 0.9286 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 6,
			"hscan" : { "minimum" : 0.9286, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 7,
			"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 8,
			"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.1111 }
		},
		{
			"index" : 9,
			"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.1111, "maximum" : 0.2222 }
		},
		{
			"index" : 10,
			"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.2222, "maximum" : 0.3333 }
		},
		{
			"index" : 11,
			"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.3333, "maximum" : 0.4444 }
		},
		{
			"index" : 12,
			"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.4444, "maximum" : 0.5556 }
		},
		{
			"index" : 13,
			"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.5556, "maximum" : 0.6667 }
		},
		{
			"index" : 14,
			"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.6667, "maximum" : 0.7778 }
		},
		{
			"index" : 15,
			"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.7778, "maximum" : 0.8889 }
		},
		{
			"index" : 16,
			"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.8889, "maximum" : 1.0000 }
		},
		{
			"index" : 17,
			"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 18,
			"hscan" : { "minimum" : 0.9286, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 19,
			"hscan" : { "minimum" : 0.8571, "maximum" : 0.9286 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 20,
			"hscan" : { "minimum" : 0.7857, "maximum" : 0.8571 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 21,
			"hscan" : { "minimum" : 0.7143, "maximum" : 0.7857 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 22,
			"hscan" : { "minimum" : 0.6429, "maximum" : 0.7143 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 23,
			"hscan" : { "minimum" : 0.5714, "maximum" : 0.6429 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 24,
			"hscan" : { "minimum" : 0.5000, "maximum" : 0.5714 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 25,
			"hscan" : { "minimum" : 0.4286, "maximum" : 0.5000 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 26,
			"hscan" : { "minimum" : 0.3571, "maximum" : 0.4286 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 27,
			"hscan" : { "minimum" : 0.2857, "maximum" : 0.3571 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 28,
			"hscan" : { "minimum" : 0.2143, "maximum" : 0.2857 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 29,
			"hscan" : { "minimum" : 0.1429, "maximum" : 0.2143 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 30,
			"hscan" : { "minimum" : 0.0714, "maximum" : 0.1429 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 31,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0714 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 32,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 33,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
			"vscan" : { "minimum" : 0.8889, "maximum" : 1.0000 }
		},
		{
			"index" : 34,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
			"vscan" : { "minimum" : 0.7778, "maximum" : 0.8889 }
		},
		{
			"index" : 35,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
			"vscan" : { "minimum" : 0.6667, "maximum" : 0.7778 }
		},
		{
			"index" : 36,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
			"vscan" : { "minimum" : 0.5556, "maximum" : 0.6667 }
		},
		{
			"index" : 37,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
			"vscan" : { "minimum" : 0.4444, "maximum" : 0.5556 }
		},
		{
			"index" : 38,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
			"vscan" : { "minimum" : 0.3333, "maximum" : 0.4444 }
		},
		{
			"index" : 39,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
			"vscan" : { "minimum" : 0.2222, "maximum" : 0.3333 }
		},
		{
			"index" : 40,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
			"vscan" : { "minimum" : 0.1111, "maximum" : 0.2222 }
		},
		{
			"index" : 41,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.1111 }
		},
		{
			"index" : 42,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 43,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0714 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 44,
			"hscan" : { "minimum" : 0.0714, "maximum" : 0.1429 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 45,
			"hscan" : { "minimum" : 0.1429, "maximum" : 0.2143 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 46,
			"hscan" : { "minimum" : 0.2143, "maximum" : 0.2857 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 47,
			"hscan" : { "minimum" : 0.2857, "maximum" : 0.3571 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 48,
			"hscan" : { "minimum" : 0.3571, "maximum" : 0.4286 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 49,
			"hscan" : { "minimum" : 0.4286, "maximum" : 0.5000 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		}
	],

	"endOfJson" : "endOfJson"
}

The pertinent bit is the Framebuffer config:

    // AML Grabber
    "amlgrabber" :
    {
            "width" : 64,
            "height" : 64,
            "frequency_Hz" : 10.0,
            "priority" : 880
    },

    // FRAME GRABBER CONFIG
    "framegrabber" :
    {
            "width" : 64,
            "height" : 64,
            "frequency_Hz" : 10.0,
            "priority" : 890
    },

You need to add in support for the Amlogic frame buffer, but you also need to make sure it has a LOWER priority than the standard frame buffer. I dont know if you might actually just be able to replace the existing frame buffer config entirely…? Anyway that’s a test for another day!

I’ve not tested extensively yet, however it seems to be working reasonably well, however there are apparently SPI timing issues on the ODROID, so we may be better off in the long run moving to APA102 based LED strips instead of those based on the WS2801.

Anyway, time for bed now!

Josh

A little update on this. On the whole this is working, however when watching shows/movies, although everything is in sync, the lights will randomly flicker in weird and wonderful ways! I am pretty sure this is the same issue seen here: http://forum.odroid.com/viewtopic.php?f=117&t=15632

They mention an updated SPI driver from Hard Kernel, I dont know if OpenPHT uses this?

Hi,
thanks for this.
Do you have any news about an update ?
I try to make my C2 work with Hyperion but I don’t know how to implement it in OpenPHT.
Are you aware of any page where I could find some explainations to succeed ?
:wink: