Jekyll2021-11-03T12:01:10+01:00https://schuett.io/feed.xmlschuett.ioAnother tech blog by Dennis Schütt. Everything about development, coding and stuff. Moved from dev.shyd.de.
Dennis Schütteufy Lumi Stick-On: Fading Night Light2018-02-23T00:00:00+01:002018-02-23T00:00:00+01:00https://schuett.io/2018/02/eufy-lumi-smooth-fader<p>Do you have a dark stairway at night and you want it to be illuminated when you come across? This is why you bought the <a href="http://amzn.to/2EJ5D2Z">eufy Lumi Stick-On pack</a>? Now you don’t use it because it switches on immediately when you get in its range?</p>
<p>I encountered this situation an thought about it. In conclusion I came up with modifying the inner circuit by adding an ATtiny10 to slowly ramp up the LED brightness with a PWM.</p>
<h2 id="1-open-up-lumi">1. Open up Lumi</h2>
<p>After unscrewing four screws inside the battery housing you can easily pull the housing into two pieces. But don’t pull to far and watch the wires connected to either pieces.</p>
<picture><source srcset="/assets/images/36bc44f59fe20b7f01e38829bd7756cccec7b55d-1000-8e73671b8.webp 1000w, /assets/images/36bc44f59fe20b7f01e38829bd7756cccec7b55d-2000-8e73671b8.webp 2000w" type="image/webp" /><source srcset="/assets/images/36bc44f59fe20b7f01e38829bd7756cccec7b55d-1000-8e73671b8.jpg 1000w, /assets/images/36bc44f59fe20b7f01e38829bd7756cccec7b55d-2000-8e73671b8.jpg 2000w" type="image/jpeg" /><img class="img-responsive img-rounded" src="/assets/images/36bc44f59fe20b7f01e38829bd7756cccec7b55d-2000-8e73671b8.jpg" width="5760" height="3840" /></picture>
<h2 id="2-desolder-r9">2. Desolder R9</h2>
<p>Carefully desolder <em>R9</em>, marked in red.</p>
<picture><source srcset="/assets/images/d6fc625d662f640c9d46b0c5314d32beeaf87e3c-799-abb77950c.webp 799w" type="image/webp" /><source srcset="/assets/images/d6fc625d662f640c9d46b0c5314d32beeaf87e3c-799-abb77950c.jpg 799w" type="image/jpeg" /><img class="img-responsive img-rounded" src="/assets/images/d6fc625d662f640c9d46b0c5314d32beeaf87e3c-799-abb77950c.jpg" width="799" height="533" /></picture>
<h2 id="3-resolder-r9">3. Resolder R9</h2>
<p>Then resolder <em>R9</em> in a 90° angle like so and connect <code class="language-plaintext highlighter-rouge">OC0A</code> to the resistor (green wire).</p>
<picture><source srcset="/assets/images/c2a6d7d3248782cafbb062d52edde4f96bf233d7-844-7cd7453f6.webp 844w" type="image/webp" /><source srcset="/assets/images/c2a6d7d3248782cafbb062d52edde4f96bf233d7-844-7cd7453f6.jpg 844w" type="image/jpeg" /><img class="img-responsive img-rounded" src="/assets/images/c2a6d7d3248782cafbb062d52edde4f96bf233d7-844-7cd7453f6.jpg" width="844" height="563" /></picture>
<h2 id="4-solder-supply-wires-for-the-attiny10">4. Solder supply wires for the ATtiny10</h2>
<p>Make sure to solder one wire to the same terminal as the red wire from the battery housing, this is <em>VCC</em> for the ATtiny10.</p>
<p>Connect <em>GND</em> to the open pad of <em>R9</em> which is <code class="language-plaintext highlighter-rouge">DRAIN</code> from <em>Q1</em>.</p>
<picture><source srcset="/assets/images/a2dfae55ec7fc63976f7317d8035cca2bfc2a635-1000-70d31b4ff.webp 1000w, /assets/images/a2dfae55ec7fc63976f7317d8035cca2bfc2a635-2000-70d31b4ff.webp 2000w" type="image/webp" /><source srcset="/assets/images/a2dfae55ec7fc63976f7317d8035cca2bfc2a635-1000-70d31b4ff.jpg 1000w, /assets/images/a2dfae55ec7fc63976f7317d8035cca2bfc2a635-2000-70d31b4ff.jpg 2000w" type="image/jpeg" /><img class="img-responsive img-rounded" src="/assets/images/a2dfae55ec7fc63976f7317d8035cca2bfc2a635-2000-70d31b4ff.jpg" width="5760" height="3840" /></picture>
<h2 id="5-write-some-piece-of-code">5. Write some piece of code</h2>
<p>To put some life in the Tiny, compile this piece of code below or from <a href="https://github.com/shyd/eufy-lumi">https://github.com/shyd/eufy-lumi</a>.</p>
<figure class="highlight"><pre><code class="language-c" data-lang="c"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
</pre></td><td class="code"><pre><span class="cm">/*
* fader.c
*
* Created: 03.01.2018 20:55:13
* Author : Dennis Schuett <https://schuett.io>
*/</span>
<span class="cp">#define F_CPU 1000000UL
</span>
<span class="cp">#include <avr/io.h>
#include <util/delay.h>
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
<span class="p">{</span>
<span class="cm">/* OC0A as output */</span>
<span class="n">DDRB</span> <span class="o">|=</span> <span class="p">(</span><span class="mi">1</span> <span class="o"><<</span> <span class="n">PINB0</span><span class="p">);</span>
<span class="cm">/* Set OC0A/OC0B on Compare Match when up-counting.
Clear OC0A/OC0B on Compare Match when down-counting.
Mode 5: Fast PWM, 8-bit (with WGM02) */</span>
<span class="n">TCCR0A</span> <span class="o">|=</span> <span class="p">(</span><span class="mi">1</span> <span class="o"><<</span> <span class="n">COM0A1</span><span class="p">)</span> <span class="o">|</span> <span class="p">(</span><span class="mi">1</span> <span class="o"><<</span> <span class="n">COM0A0</span><span class="p">)</span> <span class="o">|</span> <span class="p">(</span><span class="mi">1</span> <span class="o"><<</span> <span class="n">WGM00</span><span class="p">);</span>
<span class="cm">/* Prescaler clk/8 */</span>
<span class="n">TCCR0B</span> <span class="o">|=</span> <span class="p">(</span><span class="mi">1</span> <span class="o"><<</span> <span class="n">CS01</span><span class="p">)</span> <span class="o">|</span> <span class="p">(</span><span class="mi">1</span> <span class="o"><<</span> <span class="n">WGM02</span><span class="p">);</span>
<span class="n">OCR0A</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="k">for</span> <span class="p">(</span><span class="kt">uint8_t</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o"><</span><span class="mh">0xFF</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">_delay_us</span><span class="p">(</span><span class="mi">2250</span><span class="p">);</span>
<span class="n">OCR0A</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">OCR0A</span> <span class="o">=</span> <span class="mh">0xFF</span><span class="p">;</span>
<span class="k">while</span> <span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="p">{</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></figure>
<p>And flash this little guy:</p>
<picture><source srcset="/assets/images/43a1aec40cf3b23bab1b613af4ba961adb546197-1000-b4a8b9390.webp 1000w, /assets/images/43a1aec40cf3b23bab1b613af4ba961adb546197-2000-b4a8b9390.webp 2000w" type="image/webp" /><source srcset="/assets/images/43a1aec40cf3b23bab1b613af4ba961adb546197-1000-b4a8b9390.jpg 1000w, /assets/images/43a1aec40cf3b23bab1b613af4ba961adb546197-2000-b4a8b9390.jpg 2000w" type="image/jpeg" /><img class="img-responsive img-rounded" src="/assets/images/43a1aec40cf3b23bab1b613af4ba961adb546197-2000-b4a8b9390.jpg" width="5760" height="3840" /></picture>
<p>Wire the Tiny—then darken your room and give it a test. Lumi should now smoothly fade on.</p>Dennis SchüttDo you have a dark stairway at night and you want it to be illuminated when you come across? This is why you bought the eufy Lumi Stick-On pack? Now you don’t use it because it switches on immediately when you get in its range?Building an IKEA Firefly Light with ATtiny852017-05-08T15:39:25+02:002017-05-08T15:39:25+02:00https://schuett.io/2017/05/building-ikea-firefly-light-attiny<p>Did you ever wanted your room decoration to be a smoothly fading light strip in a jar?
Inspired by the Pimoroni firefly light I built my own variation with an ATtiny and two AA batteries instead of using a Raspberry Pi Zero and a huge battery pack.</p>
<p>There are three LED strings that fade in a sine pattern. Two of them fade anti parallel at one of 16 adjustable speeds. The third fades differently at a second configurable sine.
This is how the final result looks like!</p>
<style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style>
<div class="embed-container"> <iframe title="YouTube video player" width="640" height="390" src="//www.youtube.com/embed/UASnjQXvQ1c" frameborder="0" allowfullscreen=""></iframe></div>
<p>After some planning I ended up buying three <a href="http://www.ikea.com/de/de/catalog/products/60277514/">SÄRDAL lights</a> and one <a href="http://www.ikea.com/de/de/catalog/products/10239888/">ENSIDIG jar</a> at IKEA for about €15.</p>
<p>Then after unboxing the lights, I completely disassembled them and desoldered the cables in order to attach them to the ATtiny later on. Some measuring showed that the inbuilt circuit boosts or drops down the voltage to about 2.6 V if load is applied. If the output doesn’t draw enough current the voltage jumps up like crazy. That is why I decided to power at least two strips anti parallel to manage a continuous minimum draw of one strip in sum. This means the two strips share the duty cycle of the PWM output. If one strip is of, the other one is on.
I just added a third strip to give the whole thing a more beautiful attitude. This one runs on the second PWM channel output.</p>
<p>All three LED strips are power directly from the controller because each of them draws about 30 mA at around 2.6 V which is in the specs of the ATtiny.</p>
<p>In order to make some settings I added a jumper and a push button. The push button toggles through PWM 16 different prescalers to adjust the sine frequency whereas the jumper is used to decide which PWM channel should be adjusted.</p>
<p>Everything you need in addition to the IKEA stuff is</p>
<ul>
<li>1x Atmel ATtiny85</li>
<li>2x 100nF</li>
<li>1x quite big elko around 330µF to smooth the voltage</li>
<li>1x Push button</li>
<li>some double sided tape to attach the circuit to the battery housing</li>
</ul>
<h1 id="hardware">Hardware</h1>
<p>The images below show the schematics, pin mappings and the final circuit.</p>
<picture><source srcset="/assets/images/e32b059857dff549550e1b54af11b7b7d40ae34b-1000-db0e6c13d.webp 1000w, /assets/images/e32b059857dff549550e1b54af11b7b7d40ae34b-1600-db0e6c13d.webp 1600w" type="image/webp" /><source srcset="/assets/images/e32b059857dff549550e1b54af11b7b7d40ae34b-1000-db0e6c13d.png 1000w, /assets/images/e32b059857dff549550e1b54af11b7b7d40ae34b-1600-db0e6c13d.png 1600w" type="image/png" /><img class="img-responsive img-rounded picture-bot" src="/assets/images/e32b059857dff549550e1b54af11b7b7d40ae34b-1600-db0e6c13d.png" width="1600" height="910" /></picture>
<picture><source srcset="/assets/images/cfd59410d40e5582a9800db67c8b7d795caa56cf-1000-ed45172c7.webp 1000w, /assets/images/cfd59410d40e5582a9800db67c8b7d795caa56cf-2000-ed45172c7.webp 2000w" type="image/webp" /><source srcset="/assets/images/cfd59410d40e5582a9800db67c8b7d795caa56cf-1000-ed45172c7.jpg 1000w, /assets/images/cfd59410d40e5582a9800db67c8b7d795caa56cf-2000-ed45172c7.jpg 2000w" type="image/jpeg" /><img class="img-responsive img-rounded picture-bot" src="/assets/images/cfd59410d40e5582a9800db67c8b7d795caa56cf-2000-ed45172c7.jpg" width="2000" height="1283" /></picture>
<picture><source srcset="/assets/images/4e8e6eb050a494a0d67e73ce2700592bed4c9b93-1000-5acc2d9db.webp 1000w, /assets/images/4e8e6eb050a494a0d67e73ce2700592bed4c9b93-2000-5acc2d9db.webp 2000w" type="image/webp" /><source srcset="/assets/images/4e8e6eb050a494a0d67e73ce2700592bed4c9b93-1000-5acc2d9db.jpg 1000w, /assets/images/4e8e6eb050a494a0d67e73ce2700592bed4c9b93-2000-5acc2d9db.jpg 2000w" type="image/jpeg" /><img class="img-responsive img-rounded picture-bot" src="/assets/images/4e8e6eb050a494a0d67e73ce2700592bed4c9b93-2000-5acc2d9db.jpg" width="2000" height="1283" /></picture>
<h1 id="software">Software</h1>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
</pre></td><td class="code"><pre><span class="cm">/*
* FireflyLight.c
*
* Created: 08.03.2017 12:18:04
* Author : Dennis
*/</span>
<span class="err">#</span><span class="nx">include</span> <span class="o"><</span><span class="nx">avr</span><span class="o">/</span><span class="nx">io</span><span class="p">.</span><span class="nx">h</span><span class="o">></span>
<span class="err">#</span><span class="nx">include</span> <span class="o"><</span><span class="nx">avr</span><span class="o">/</span><span class="nx">interrupt</span><span class="p">.</span><span class="nx">h</span><span class="o">></span>
<span class="err">#</span><span class="nx">include</span> <span class="o"><</span><span class="nx">avr</span><span class="o">/</span><span class="nx">pgmspace</span><span class="p">.</span><span class="nx">h</span><span class="o">></span>
<span class="err">#</span><span class="nx">include</span> <span class="o"><</span><span class="nx">avr</span><span class="o">/</span><span class="nx">eeprom</span><span class="p">.</span><span class="nx">h</span><span class="o">></span>
<span class="err">#</span><span class="nx">define</span> <span class="nx">PRESCALER_MAX</span> <span class="mi">32</span>
<span class="nx">typedef</span> <span class="nx">struct</span>
<span class="p">{</span>
<span class="nx">volatile</span> <span class="nx">uint16_t</span> <span class="nx">position</span><span class="p">;</span>
<span class="nx">volatile</span> <span class="nx">uint8_t</span> <span class="nx">prescaler</span><span class="p">;</span>
<span class="nx">volatile</span> <span class="nx">uint8_t</span> <span class="nx">count</span><span class="p">;</span>
<span class="nx">volatile</span> <span class="nx">uint8_t</span> <span class="nx">doSave</span><span class="p">;</span>
<span class="p">}</span> <span class="nx">sine_t</span><span class="p">;</span>
<span class="nx">volatile</span> <span class="nx">sine_t</span> <span class="nx">sineA</span><span class="p">;</span>
<span class="nx">volatile</span> <span class="nx">sine_t</span> <span class="nx">sineB</span><span class="p">;</span>
<span class="cm">/* on the fly calc:
//#define PI 3.14159265f
//value = (sinf(((float)count)*PI/180.f)+1.)*254./2.; //254 to limit pwm at top
//OCR0A = (uint8_t)lrint(value);
jsfiddle:
var count = 0;
var a=[];
for (var i=0; i<360; i++) {
var value = (Math.sin(count*3.14159265/180)+1)*254/2;
console.log(count, value.toFixed(0));
a.push(parseInt(value.toFixed(0), 10));
count = (count+1)%360;
}
var pad = function(number) {
if (number < 10) {
return " " + number;
}
if (number < 100) {
return " " + number;
}
return number;
}
var res = "";
for (var i=0; i<360; i++) {
res += pad(a[i]) + ", ";
if (i != 0 && (i+1) % 20 == 0) {
res += "\n";
}
}
console.log(res);
*/</span>
<span class="kd">const</span> <span class="nx">uint8_t</span> <span class="nx">sine</span><span class="p">[</span><span class="mi">360</span><span class="p">]</span> <span class="nx">PROGMEM</span> <span class="o">=</span> <span class="p">{</span>
<span class="mi">127</span><span class="p">,</span> <span class="mi">129</span><span class="p">,</span> <span class="mi">131</span><span class="p">,</span> <span class="mi">134</span><span class="p">,</span> <span class="mi">136</span><span class="p">,</span> <span class="mi">138</span><span class="p">,</span> <span class="mi">140</span><span class="p">,</span> <span class="mi">142</span><span class="p">,</span> <span class="mi">145</span><span class="p">,</span> <span class="mi">147</span><span class="p">,</span> <span class="mi">149</span><span class="p">,</span> <span class="mi">151</span><span class="p">,</span> <span class="mi">153</span><span class="p">,</span> <span class="mi">156</span><span class="p">,</span> <span class="mi">158</span><span class="p">,</span> <span class="mi">160</span><span class="p">,</span> <span class="mi">162</span><span class="p">,</span> <span class="mi">164</span><span class="p">,</span> <span class="mi">166</span><span class="p">,</span> <span class="mi">168</span><span class="p">,</span>
<span class="mi">170</span><span class="p">,</span> <span class="mi">173</span><span class="p">,</span> <span class="mi">175</span><span class="p">,</span> <span class="mi">177</span><span class="p">,</span> <span class="mi">179</span><span class="p">,</span> <span class="mi">181</span><span class="p">,</span> <span class="mi">183</span><span class="p">,</span> <span class="mi">185</span><span class="p">,</span> <span class="mi">187</span><span class="p">,</span> <span class="mi">189</span><span class="p">,</span> <span class="mi">190</span><span class="p">,</span> <span class="mi">192</span><span class="p">,</span> <span class="mi">194</span><span class="p">,</span> <span class="mi">196</span><span class="p">,</span> <span class="mi">198</span><span class="p">,</span> <span class="mi">200</span><span class="p">,</span> <span class="mi">202</span><span class="p">,</span> <span class="mi">203</span><span class="p">,</span> <span class="mi">205</span><span class="p">,</span> <span class="mi">207</span><span class="p">,</span>
<span class="mi">209</span><span class="p">,</span> <span class="mi">210</span><span class="p">,</span> <span class="mi">212</span><span class="p">,</span> <span class="mi">214</span><span class="p">,</span> <span class="mi">215</span><span class="p">,</span> <span class="mi">217</span><span class="p">,</span> <span class="mi">218</span><span class="p">,</span> <span class="mi">220</span><span class="p">,</span> <span class="mi">221</span><span class="p">,</span> <span class="mi">223</span><span class="p">,</span> <span class="mi">224</span><span class="p">,</span> <span class="mi">226</span><span class="p">,</span> <span class="mi">227</span><span class="p">,</span> <span class="mi">228</span><span class="p">,</span> <span class="mi">230</span><span class="p">,</span> <span class="mi">231</span><span class="p">,</span> <span class="mi">232</span><span class="p">,</span> <span class="mi">234</span><span class="p">,</span> <span class="mi">235</span><span class="p">,</span> <span class="mi">236</span><span class="p">,</span>
<span class="mi">237</span><span class="p">,</span> <span class="mi">238</span><span class="p">,</span> <span class="mi">239</span><span class="p">,</span> <span class="mi">240</span><span class="p">,</span> <span class="mi">241</span><span class="p">,</span> <span class="mi">242</span><span class="p">,</span> <span class="mi">243</span><span class="p">,</span> <span class="mi">244</span><span class="p">,</span> <span class="mi">245</span><span class="p">,</span> <span class="mi">246</span><span class="p">,</span> <span class="mi">246</span><span class="p">,</span> <span class="mi">247</span><span class="p">,</span> <span class="mi">248</span><span class="p">,</span> <span class="mi">248</span><span class="p">,</span> <span class="mi">249</span><span class="p">,</span> <span class="mi">250</span><span class="p">,</span> <span class="mi">250</span><span class="p">,</span> <span class="mi">251</span><span class="p">,</span> <span class="mi">251</span><span class="p">,</span> <span class="mi">252</span><span class="p">,</span>
<span class="mi">252</span><span class="p">,</span> <span class="mi">252</span><span class="p">,</span> <span class="mi">253</span><span class="p">,</span> <span class="mi">253</span><span class="p">,</span> <span class="mi">253</span><span class="p">,</span> <span class="mi">254</span><span class="p">,</span> <span class="mi">254</span><span class="p">,</span> <span class="mi">254</span><span class="p">,</span> <span class="mi">254</span><span class="p">,</span> <span class="mi">254</span><span class="p">,</span> <span class="mi">254</span><span class="p">,</span> <span class="mi">254</span><span class="p">,</span> <span class="mi">254</span><span class="p">,</span> <span class="mi">254</span><span class="p">,</span> <span class="mi">254</span><span class="p">,</span> <span class="mi">254</span><span class="p">,</span> <span class="mi">253</span><span class="p">,</span> <span class="mi">253</span><span class="p">,</span> <span class="mi">253</span><span class="p">,</span> <span class="mi">252</span><span class="p">,</span>
<span class="mi">252</span><span class="p">,</span> <span class="mi">252</span><span class="p">,</span> <span class="mi">251</span><span class="p">,</span> <span class="mi">251</span><span class="p">,</span> <span class="mi">250</span><span class="p">,</span> <span class="mi">250</span><span class="p">,</span> <span class="mi">249</span><span class="p">,</span> <span class="mi">248</span><span class="p">,</span> <span class="mi">248</span><span class="p">,</span> <span class="mi">247</span><span class="p">,</span> <span class="mi">246</span><span class="p">,</span> <span class="mi">246</span><span class="p">,</span> <span class="mi">245</span><span class="p">,</span> <span class="mi">244</span><span class="p">,</span> <span class="mi">243</span><span class="p">,</span> <span class="mi">242</span><span class="p">,</span> <span class="mi">241</span><span class="p">,</span> <span class="mi">240</span><span class="p">,</span> <span class="mi">239</span><span class="p">,</span> <span class="mi">238</span><span class="p">,</span>
<span class="mi">237</span><span class="p">,</span> <span class="mi">236</span><span class="p">,</span> <span class="mi">235</span><span class="p">,</span> <span class="mi">234</span><span class="p">,</span> <span class="mi">232</span><span class="p">,</span> <span class="mi">231</span><span class="p">,</span> <span class="mi">230</span><span class="p">,</span> <span class="mi">228</span><span class="p">,</span> <span class="mi">227</span><span class="p">,</span> <span class="mi">226</span><span class="p">,</span> <span class="mi">224</span><span class="p">,</span> <span class="mi">223</span><span class="p">,</span> <span class="mi">221</span><span class="p">,</span> <span class="mi">220</span><span class="p">,</span> <span class="mi">218</span><span class="p">,</span> <span class="mi">217</span><span class="p">,</span> <span class="mi">215</span><span class="p">,</span> <span class="mi">214</span><span class="p">,</span> <span class="mi">212</span><span class="p">,</span> <span class="mi">210</span><span class="p">,</span>
<span class="mi">209</span><span class="p">,</span> <span class="mi">207</span><span class="p">,</span> <span class="mi">205</span><span class="p">,</span> <span class="mi">203</span><span class="p">,</span> <span class="mi">202</span><span class="p">,</span> <span class="mi">200</span><span class="p">,</span> <span class="mi">198</span><span class="p">,</span> <span class="mi">196</span><span class="p">,</span> <span class="mi">194</span><span class="p">,</span> <span class="mi">192</span><span class="p">,</span> <span class="mi">191</span><span class="p">,</span> <span class="mi">189</span><span class="p">,</span> <span class="mi">187</span><span class="p">,</span> <span class="mi">185</span><span class="p">,</span> <span class="mi">183</span><span class="p">,</span> <span class="mi">181</span><span class="p">,</span> <span class="mi">179</span><span class="p">,</span> <span class="mi">177</span><span class="p">,</span> <span class="mi">175</span><span class="p">,</span> <span class="mi">173</span><span class="p">,</span>
<span class="mi">170</span><span class="p">,</span> <span class="mi">168</span><span class="p">,</span> <span class="mi">166</span><span class="p">,</span> <span class="mi">164</span><span class="p">,</span> <span class="mi">162</span><span class="p">,</span> <span class="mi">160</span><span class="p">,</span> <span class="mi">158</span><span class="p">,</span> <span class="mi">156</span><span class="p">,</span> <span class="mi">153</span><span class="p">,</span> <span class="mi">151</span><span class="p">,</span> <span class="mi">149</span><span class="p">,</span> <span class="mi">147</span><span class="p">,</span> <span class="mi">145</span><span class="p">,</span> <span class="mi">142</span><span class="p">,</span> <span class="mi">140</span><span class="p">,</span> <span class="mi">138</span><span class="p">,</span> <span class="mi">136</span><span class="p">,</span> <span class="mi">134</span><span class="p">,</span> <span class="mi">131</span><span class="p">,</span> <span class="mi">129</span><span class="p">,</span>
<span class="mi">127</span><span class="p">,</span> <span class="mi">125</span><span class="p">,</span> <span class="mi">123</span><span class="p">,</span> <span class="mi">120</span><span class="p">,</span> <span class="mi">118</span><span class="p">,</span> <span class="mi">116</span><span class="p">,</span> <span class="mi">114</span><span class="p">,</span> <span class="mi">112</span><span class="p">,</span> <span class="mi">109</span><span class="p">,</span> <span class="mi">107</span><span class="p">,</span> <span class="mi">105</span><span class="p">,</span> <span class="mi">103</span><span class="p">,</span> <span class="mi">101</span><span class="p">,</span> <span class="mi">98</span><span class="p">,</span> <span class="mi">96</span><span class="p">,</span> <span class="mi">94</span><span class="p">,</span> <span class="mi">92</span><span class="p">,</span> <span class="mi">90</span><span class="p">,</span> <span class="mi">88</span><span class="p">,</span> <span class="mi">86</span><span class="p">,</span>
<span class="mi">84</span><span class="p">,</span> <span class="mi">81</span><span class="p">,</span> <span class="mi">79</span><span class="p">,</span> <span class="mi">77</span><span class="p">,</span> <span class="mi">75</span><span class="p">,</span> <span class="mi">73</span><span class="p">,</span> <span class="mi">71</span><span class="p">,</span> <span class="mi">69</span><span class="p">,</span> <span class="mi">67</span><span class="p">,</span> <span class="mi">65</span><span class="p">,</span> <span class="mi">64</span><span class="p">,</span> <span class="mi">62</span><span class="p">,</span> <span class="mi">60</span><span class="p">,</span> <span class="mi">58</span><span class="p">,</span> <span class="mi">56</span><span class="p">,</span> <span class="mi">54</span><span class="p">,</span> <span class="mi">52</span><span class="p">,</span> <span class="mi">51</span><span class="p">,</span> <span class="mi">49</span><span class="p">,</span> <span class="mi">47</span><span class="p">,</span>
<span class="mi">45</span><span class="p">,</span> <span class="mi">44</span><span class="p">,</span> <span class="mi">42</span><span class="p">,</span> <span class="mi">40</span><span class="p">,</span> <span class="mi">39</span><span class="p">,</span> <span class="mi">37</span><span class="p">,</span> <span class="mi">36</span><span class="p">,</span> <span class="mi">34</span><span class="p">,</span> <span class="mi">33</span><span class="p">,</span> <span class="mi">31</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">28</span><span class="p">,</span> <span class="mi">27</span><span class="p">,</span> <span class="mi">26</span><span class="p">,</span> <span class="mi">24</span><span class="p">,</span> <span class="mi">23</span><span class="p">,</span> <span class="mi">22</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">19</span><span class="p">,</span> <span class="mi">18</span><span class="p">,</span>
<span class="mi">17</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">15</span><span class="p">,</span> <span class="mi">14</span><span class="p">,</span> <span class="mi">13</span><span class="p">,</span> <span class="mi">12</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span>
<span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span>
<span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">12</span><span class="p">,</span> <span class="mi">13</span><span class="p">,</span> <span class="mi">14</span><span class="p">,</span> <span class="mi">15</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span>
<span class="mi">17</span><span class="p">,</span> <span class="mi">18</span><span class="p">,</span> <span class="mi">19</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">22</span><span class="p">,</span> <span class="mi">23</span><span class="p">,</span> <span class="mi">24</span><span class="p">,</span> <span class="mi">26</span><span class="p">,</span> <span class="mi">27</span><span class="p">,</span> <span class="mi">28</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">31</span><span class="p">,</span> <span class="mi">33</span><span class="p">,</span> <span class="mi">34</span><span class="p">,</span> <span class="mi">36</span><span class="p">,</span> <span class="mi">37</span><span class="p">,</span> <span class="mi">39</span><span class="p">,</span> <span class="mi">40</span><span class="p">,</span> <span class="mi">42</span><span class="p">,</span> <span class="mi">44</span><span class="p">,</span>
<span class="mi">45</span><span class="p">,</span> <span class="mi">47</span><span class="p">,</span> <span class="mi">49</span><span class="p">,</span> <span class="mi">51</span><span class="p">,</span> <span class="mi">52</span><span class="p">,</span> <span class="mi">54</span><span class="p">,</span> <span class="mi">56</span><span class="p">,</span> <span class="mi">58</span><span class="p">,</span> <span class="mi">60</span><span class="p">,</span> <span class="mi">62</span><span class="p">,</span> <span class="mi">63</span><span class="p">,</span> <span class="mi">65</span><span class="p">,</span> <span class="mi">67</span><span class="p">,</span> <span class="mi">69</span><span class="p">,</span> <span class="mi">71</span><span class="p">,</span> <span class="mi">73</span><span class="p">,</span> <span class="mi">75</span><span class="p">,</span> <span class="mi">77</span><span class="p">,</span> <span class="mi">79</span><span class="p">,</span> <span class="mi">81</span><span class="p">,</span>
<span class="mi">84</span><span class="p">,</span> <span class="mi">86</span><span class="p">,</span> <span class="mi">88</span><span class="p">,</span> <span class="mi">90</span><span class="p">,</span> <span class="mi">92</span><span class="p">,</span> <span class="mi">94</span><span class="p">,</span> <span class="mi">96</span><span class="p">,</span> <span class="mi">98</span><span class="p">,</span> <span class="mi">101</span><span class="p">,</span> <span class="mi">103</span><span class="p">,</span> <span class="mi">105</span><span class="p">,</span> <span class="mi">107</span><span class="p">,</span> <span class="mi">109</span><span class="p">,</span> <span class="mi">112</span><span class="p">,</span> <span class="mi">114</span><span class="p">,</span> <span class="mi">116</span><span class="p">,</span> <span class="mi">118</span><span class="p">,</span> <span class="mi">120</span><span class="p">,</span> <span class="mi">123</span><span class="p">,</span> <span class="mi">125</span>
<span class="p">};</span>
<span class="nx">ISR</span><span class="p">(</span><span class="nx">TIMER1_COMPA_vect</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">sineA</span><span class="p">.</span><span class="nx">count</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
<span class="p">{</span>
<span class="nx">OCR0A</span> <span class="o">=</span> <span class="nx">pgm_read_byte</span><span class="p">(</span><span class="o">&</span><span class="p">(</span><span class="nx">sine</span><span class="p">[</span><span class="nx">sineA</span><span class="p">.</span><span class="nx">position</span><span class="p">]));</span>
<span class="nx">OCR0B</span> <span class="o">=</span> <span class="nx">OCR0A</span><span class="p">;</span>
<span class="nx">sineA</span><span class="p">.</span><span class="nx">position</span> <span class="o">=</span> <span class="p">(</span><span class="nx">sineA</span><span class="p">.</span><span class="nx">position</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">%</span><span class="mi">360</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">sineB</span><span class="p">.</span><span class="nx">count</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
<span class="p">{</span>
<span class="nx">OCR1B</span> <span class="o">=</span> <span class="nx">pgm_read_byte</span><span class="p">(</span><span class="o">&</span><span class="p">(</span><span class="nx">sine</span><span class="p">[</span><span class="nx">sineB</span><span class="p">.</span><span class="nx">position</span><span class="p">]));</span>
<span class="nx">sineB</span><span class="p">.</span><span class="nx">position</span> <span class="o">=</span> <span class="p">(</span><span class="nx">sineB</span><span class="p">.</span><span class="nx">position</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">%</span><span class="mi">360</span><span class="p">;</span>
<span class="p">}</span>
<span class="nx">sineA</span><span class="p">.</span><span class="nx">count</span> <span class="o">=</span> <span class="p">(</span><span class="nx">sineA</span><span class="p">.</span><span class="nx">count</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="o">%</span> <span class="nx">sineA</span><span class="p">.</span><span class="nx">prescaler</span><span class="p">;</span>
<span class="nx">sineB</span><span class="p">.</span><span class="nx">count</span> <span class="o">=</span> <span class="p">(</span><span class="nx">sineB</span><span class="p">.</span><span class="nx">count</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="o">%</span> <span class="nx">sineB</span><span class="p">.</span><span class="nx">prescaler</span><span class="p">;</span>
<span class="p">}</span>
<span class="nx">ISR</span><span class="p">(</span><span class="nx">INT0_vect</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">PINB</span> <span class="o">&</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="nx">PB3</span><span class="p">))</span>
<span class="p">{</span>
<span class="nx">sineA</span><span class="p">.</span><span class="nx">prescaler</span> <span class="o">=</span> <span class="p">(</span><span class="nx">sineA</span><span class="p">.</span><span class="nx">prescaler</span><span class="o">+</span><span class="mi">2</span><span class="p">)</span> <span class="o">%</span> <span class="nx">PRESCALER_MAX</span><span class="p">;</span>
<span class="nx">sineA</span><span class="p">.</span><span class="nx">doSave</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">else</span>
<span class="p">{</span>
<span class="nx">sineB</span><span class="p">.</span><span class="nx">prescaler</span> <span class="o">=</span> <span class="p">(</span><span class="nx">sineB</span><span class="p">.</span><span class="nx">prescaler</span><span class="o">+</span><span class="mi">2</span><span class="p">)</span> <span class="o">%</span> <span class="nx">PRESCALER_MAX</span><span class="p">;</span>
<span class="nx">sineB</span><span class="p">.</span><span class="nx">doSave</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">void</span> <span class="nx">sleep</span><span class="p">()</span>
<span class="p">{</span>
<span class="nx">ADCSRA</span> <span class="o">&=</span> <span class="o">~</span><span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="nx">ADEN</span><span class="p">);</span> <span class="c1">//disable adc</span>
<span class="nx">ACSR</span> <span class="o">=</span> <span class="mh">0x80</span><span class="p">;</span> <span class="c1">// disable analouge comp</span>
<span class="c1">//MCUCSR |= (1<<JTD); // disable jtag</span>
<span class="c1">//MCUCR &= ~0x3;</span>
<span class="c1">//sei();</span>
<span class="c1">//MCUCR |= (1<<SM1) | (1<<SM0); // Power down</span>
<span class="nx">MCUCR</span> <span class="o">|=</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="nx">SE</span><span class="p">);</span> <span class="c1">// Sleep enable</span>
<span class="nx">asm</span><span class="p">(</span><span class="dl">"</span><span class="s2">sleep</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">MCUCR</span> <span class="o">&=</span> <span class="o">~</span><span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="nx">SE</span><span class="p">);</span> <span class="c1">// Sleep disable</span>
<span class="p">}</span>
<span class="nx">int</span> <span class="nx">main</span><span class="p">(</span><span class="k">void</span><span class="p">)</span>
<span class="p">{</span>
<span class="nx">DDRB</span> <span class="o">|=</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="nx">PB0</span><span class="p">)</span> <span class="o">|</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="nx">PB1</span><span class="p">)</span> <span class="o">|</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="nx">PB4</span><span class="p">);</span>
<span class="nx">PORTB</span> <span class="o">|=</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="nx">PB2</span><span class="p">)</span> <span class="o">|</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="nx">PB3</span><span class="p">);</span> <span class="c1">//pullup int0, select jumper</span>
<span class="nx">TCCR0A</span> <span class="o">|=</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="nx">COM0A1</span><span class="p">);</span>
<span class="nx">TCCR0A</span> <span class="o">|=</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="nx">COM0B1</span><span class="p">)</span> <span class="o">|</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="nx">COM0B0</span><span class="p">);</span> <span class="c1">//inverted B</span>
<span class="nx">TCCR0A</span> <span class="o">|=</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="nx">WGM01</span><span class="p">)</span> <span class="o">|</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="nx">WGM00</span><span class="p">);</span> <span class="c1">//fast PWM</span>
<span class="nx">TCCR0B</span> <span class="o">|=</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="nx">CS00</span><span class="p">);</span> <span class="c1">//prescaler</span>
<span class="nx">OCR0A</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="nx">OCR0B</span> <span class="o">=</span> <span class="mh">0xFF</span><span class="p">;</span>
<span class="nx">TCCR1</span> <span class="o">|=</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="nx">CS10</span><span class="p">);</span> <span class="c1">//prescaler</span>
<span class="nx">OCR1A</span> <span class="o">=</span> <span class="mh">0xFF</span><span class="p">;</span>
<span class="nx">TIMSK</span> <span class="o">|=</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="nx">OCIE1A</span><span class="p">);</span> <span class="c1">//int on compare match</span>
<span class="nx">GTCCR</span> <span class="o">|=</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="nx">PWM1B</span><span class="p">);</span> <span class="c1">//pwm output</span>
<span class="nx">GTCCR</span> <span class="o">|=</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="nx">COM1B1</span><span class="p">)</span> <span class="o">|</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="nx">COM1B1</span><span class="p">);</span> <span class="c1">//output mode</span>
<span class="nx">OCR1B</span> <span class="o">=</span> <span class="mi">128</span><span class="p">;</span>
<span class="nx">OCR1C</span> <span class="o">=</span> <span class="mh">0xFF</span><span class="p">;</span>
<span class="nx">MCUCR</span> <span class="o">|=</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="nx">ISC01</span><span class="p">);</span> <span class="c1">//falling edge</span>
<span class="nx">GIMSK</span> <span class="o">|=</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="nx">INT0</span><span class="p">);</span>
<span class="c1">//power reduction</span>
<span class="nx">PRR</span> <span class="o">|=</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="nx">PRUSI</span><span class="p">)</span> <span class="o">|</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="nx">PRADC</span><span class="p">);</span>
<span class="nx">sineA</span><span class="p">.</span><span class="nx">count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="nx">sineA</span><span class="p">.</span><span class="nx">position</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="nx">sineA</span><span class="p">.</span><span class="nx">doSave</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="nx">sineB</span><span class="p">.</span><span class="nx">count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="nx">sineB</span><span class="p">.</span><span class="nx">position</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="nx">sineB</span><span class="p">.</span><span class="nx">doSave</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="nx">sineA</span><span class="p">.</span><span class="nx">prescaler</span> <span class="o">=</span> <span class="mi">16</span><span class="p">;</span>
<span class="nx">sineB</span><span class="p">.</span><span class="nx">prescaler</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
<span class="nx">eeprom_busy_wait</span><span class="p">();</span>
<span class="nx">uint8_t</span> <span class="nx">val</span> <span class="o">=</span> <span class="nx">eeprom_read_byte</span><span class="p">((</span><span class="nx">uint8_t</span><span class="o">*</span><span class="p">)</span><span class="mh">0x00</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">val</span> <span class="o">>=</span> <span class="mh">0x00</span> <span class="o">&&</span> <span class="nx">val</span> <span class="o"><</span> <span class="mh">0xFF</span><span class="p">)</span>
<span class="p">{</span>
<span class="nx">sineA</span><span class="p">.</span><span class="nx">prescaler</span> <span class="o">=</span> <span class="nx">val</span><span class="p">;</span>
<span class="p">}</span>
<span class="nx">eeprom_busy_wait</span><span class="p">();</span>
<span class="nx">val</span> <span class="o">=</span> <span class="nx">eeprom_read_byte</span><span class="p">((</span><span class="nx">uint8_t</span><span class="o">*</span><span class="p">)</span><span class="mh">0x01</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">val</span> <span class="o">>=</span> <span class="mh">0x00</span> <span class="o">&&</span> <span class="nx">val</span> <span class="o"><</span> <span class="mh">0xFF</span><span class="p">)</span>
<span class="p">{</span>
<span class="nx">sineB</span><span class="p">.</span><span class="nx">prescaler</span> <span class="o">=</span> <span class="nx">val</span><span class="p">;</span>
<span class="p">}</span>
<span class="nx">sei</span><span class="p">();</span>
<span class="k">while</span> <span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">sineA</span><span class="p">.</span><span class="nx">doSave</span><span class="p">)</span>
<span class="p">{</span>
<span class="nx">eeprom_busy_wait</span><span class="p">();</span>
<span class="nx">eeprom_update_byte</span><span class="p">((</span><span class="nx">uint8_t</span><span class="o">*</span><span class="p">)</span><span class="mh">0x00</span><span class="p">,</span> <span class="nx">sineA</span><span class="p">.</span><span class="nx">prescaler</span><span class="p">);</span>
<span class="nx">sineA</span><span class="p">.</span><span class="nx">doSave</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">sineB</span><span class="p">.</span><span class="nx">doSave</span><span class="p">)</span>
<span class="p">{</span>
<span class="nx">eeprom_busy_wait</span><span class="p">();</span>
<span class="nx">eeprom_update_byte</span><span class="p">((</span><span class="nx">uint8_t</span><span class="o">*</span><span class="p">)</span><span class="mh">0x01</span><span class="p">,</span> <span class="nx">sineB</span><span class="p">.</span><span class="nx">prescaler</span><span class="p">);</span>
<span class="nx">sineB</span><span class="p">.</span><span class="nx">doSave</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
<span class="nx">sleep</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></figure>Dennis SchüttDid you ever wanted your room decoration to be a smoothly fading light strip in a jar? Inspired by the Pimoroni firefly light I built my own variation with an ATtiny and two AA batteries instead of using a Raspberry Pi Zero and a huge battery pack.SMTP Mailing with Mailgun and Postfix2017-05-03T18:46:13+02:002017-05-03T18:46:13+02:00https://schuett.io/2017/05/smtp-mailing-mailgun-postfix<p>Do you want your servers to send mails with a dedicated mailing service in order to gain more control and logs about the mail delivery?</p>
<blockquote>
<p>Powerful APIs that enable you to send, receive and track email effortlessly. 10,000 emails free every month. mailgun.com</p>
</blockquote>
<p><a href="https://www.mailgun.com/"><picture><source srcset="/assets/images/effbda8d5a35b9a37a96f938e12622219bb876d0-1000-0a90a2e60.webp 1000w" type="image/webp"><source srcset="/assets/images/effbda8d5a35b9a37a96f938e12622219bb876d0-1000-0a90a2e60.png 1000w" type="image/png"><img class="img-responsive max-70-percent" src="/assets/images/effbda8d5a35b9a37a96f938e12622219bb876d0-1000-0a90a2e60.png" width="1000" height="317"></picture></a></p>
<p>If you already have postfix properly set up and running, edit <code class="language-plaintext highlighter-rouge">/etc/postfix/main.cf</code> and append this:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>smtp_sasl_auth_enable <span class="o">=</span> <span class="nb">yes
</span>relayhost <span class="o">=</span> smtp.mailgun.org
smtp_sasl_security_options <span class="o">=</span> noanonymous
smtp_sasl_password_maps <span class="o">=</span> <span class="nb">hash</span>:/etc/postfix/sasl_passwd
</code></pre></div></div>
<p>Then add your smtp credential of mailgun to postfix:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">echo</span> <span class="s1">'smtp.mailgun.org username@domain.com:password'</span> <span class="o">></span> /etc/postfix/sasl_passwd
</code></pre></div></div>
<p>Protect the file and populate it:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">chmod </span>600 /etc/postfix/sasl_passwd
postmap /etc/postfix/sasl_passwd
</code></pre></div></div>
<p>And finally restart postfix:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>service postfix restart
</code></pre></div></div>
<p>Now your server should send its mails via mailgun. Just give it a test shot!</p>Dennis SchüttDo you want your servers to send mails with a dedicated mailing service in order to gain more control and logs about the mail delivery?AVR, Raspberry Pi, VW Beta: VAG CDC Faker2013-09-08T18:35:51+02:002013-09-08T18:35:51+02:00https://schuett.io/2013/09/avr-raspberry-pi-vw-beta-vag-cdc-faker<p>I was tired connecting my cellphone with an old cassette adapter to my VW Golf with an Beta 5 in it. I needed something new, something cool. And here it is, a fully functional interface between the Beta 5 and any device you want to play the music with.</p>
<p>This project raised out of an ebay search: I just wanted to know if there is a solution to get an AUX input on the car radio. Yes there is, even complete mp3 players are available. But that’s not what I wanted – at first!</p>
<p>Then I started digging the web for more info about the protocol the radio talks to cd changers.
The idea was to build a tiny thingy that fakes a cd changer and simply enables the AUX input (as it is available in several online stores). But during the development my ambition became greater and I wanted to read the keys pressed on the radio to remote control my RPi.</p>
<h1 id="1-understanding-the-protocol">1. Understanding the Protocol</h1>
<p>First of all this is the pinout of the radio: <a href="http://rkieslinger.de/steckerbelegungen/vag-stecker.htm">rkieslinger.de/steckerbelegungen/vag-stecker.htm</a>
The interesting cell is no. 3, the blue one.
DATA IN simply is MOSI of an 8bit SPI interface with special timings between the bytes
CLOCK is SCK of the SPI
DATA OUT is the key code of the pressed key on the radio itself</p>
<p>The radio needs a sequence of bytes to enable the AUX input and display CD# and TR#. It looks likes this:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>frame cd# tr# time time mode frame frame
0x34, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x3C
</code></pre></div></div>
<p>cd# and tr# are sent inverted. So this sequence will display: CD1 TR00
mode sets the playmode (PLAY|SHFFL|SCAN)
As the beta doesn’t support time display, I will ignore these bytes.</p>
<p>If cd mode is switched on/off or keys are pressed, 4 byte messages will be sent from the radio. They are coded like RC5 messages.
Each message has a startsequence. A low byte has a short low phase, a high byte a longer low phase. Everything you need to know can be found in the pictures here: <a href="http://martinsuniverse.de/projekte/cdc_protokoll/cdc_protokoll.html">martinsuniverse.de/projekte/cdc_protokoll/cdc_protokoll.html</a></p>
<h1 id="2-remote-commands-from-the-radio">2. Remote commands from the radio</h1>
<p>As you know 4 byte messages are sent. The following pattern describes the control codes:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>head head cmd !cmd
0x53 0x2C 0xAA 0x55
</code></pre></div></div>
<p>Here is the complete list of all bytes from all keys:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>switch on in cd mode/radio to cd (play)
0x53 0x2C 0xE4 0x1B
0x53 0x2C 0x14 0xEB
switch off in cd mode/cd to radio (pause)
0x53 0x2C 0x10 0xEF
0x53 0x2C 0x14 0xEB
next
0x53 0x2C 0xF8 0x7
prev
0x53 0x2C 0x78 0x87
seek next
0x53 0x2C 0xD8 0x27 hold down
0x53 0x2C 0xE4 0x1B release
0x53 0x2C 0x14 0xEB
seek prev
0x53 0x2C 0x58 0xA7 hold down
0x53 0x2C 0xE4 0x1B release
0x53 0x2C 0x14 0xEB
cd 1
0x53 0x2C 0x0C 0xF3
0x53 0x2C 0x14 0xEB
0x53 0x2C 0x38 0xC7
send new cd no. to confirm change, else:
0x53 0x2C 0xE4 0x1B beep, no cd (same as play)
0x53 0x2C 0x14 0xEB
cd 2
0x53 0x2C 0x8C 0x73
0x53 0x2C 0x14 0xEB
0x53 0x2C 0x38 0xC7
send new cd no. to confirm change, else:
0x53 0x2C 0xE4 0x1B beep, no cd (same as play)
0x53 0x2C 0x14 0xEB
cd 3
0x53 0x2C 0x4C 0xB3
0x53 0x2C 0x14 0xEB
0x53 0x2C 0x38 0xC7
send new cd no. to confirm change, else:
0x53 0x2C 0xE4 0x1B beep, no cd (same as play)
0x53 0x2C 0x14 0xEB
cd 4
0x53 0x2C 0xCC 0x33
0x53 0x2C 0x14 0xEB
0x53 0x2C 0x38 0xC7
send new cd no. to confirm change, else:
0x53 0x2C 0xE4 0x1B beep, no cd (same as play)
0x53 0x2C 0x14 0xEB
cd 5
0x53 0x2C 0x2C 0xD3
0x53 0x2C 0x14 0xEB
0x53 0x2C 0x38 0xC7
send new cd no. to confirm change, else:
0x53 0x2C 0xE4 0x1B beep, no cd (same as play)
0x53 0x2C 0x14 0xEB
cd 6
0x53 0x2C 0xAC 0x53
0x53 0x2C 0x14 0xEB
0x53 0x2C 0x38 0xC7
send new cd no. to confirm change, else:
0x53 0x2C 0xE4 0x1B beep, no cd (same as play)
0x53 0x2C 0x14 0xEB
scan (in 'play', 'shffl' or 'scan' mode)
0x53 0x2C 0xA0 0x5F
shuffle in 'play' mode
0x53 0x2C 0x60 0x9F
shuffle in 'shffl' mode
0x53 0x2C 0x08 0xF7
0x53 0x2C 0x14 0xEB
</code></pre></div></div>
<p>The micro controller will only send the 3rd byte after error check over uart. See below.</p>
<h1 id="3-the-hardware-i-picked">3. The Hardware I picked</h1>
<ul>
<li>Atmel ATmega32A</li>
<li>1117 Regulator (maybe not the best, it’s heating up at >50mA due to the high drop voltage)</li>
<li>FTDI FT230X as uart usb bridge</li>
<li>ISO connector to fit into the radio</li>
</ul>
<h1 id="4-programming-the-avr">4. Programming the AVR</h1>
<p>First thing about the uart communication. I use the library of Peter Fleury: <a href="http://homepage.hispeed.ch/peterfleury/">homepage.hispeed.ch/peterfleury</a></p>
<p>To be independent from clockrates I utilized delay loops instead of timers to create correct timings. Hopefully my comments in the code explains everything very well.</p>
<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cm">/*
* VAG_CDC.c
*
* Created: 23.06.2013 20:00:51
* Author: Dennis Schuett, dev.shyd.de
*/</span>
<span class="cp">#define F_CPU 8000000UL
</span>
<span class="cp">#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
</span>
<span class="cp">#include "uart.h"
</span>
<span class="cp">#define UART_BAUD_RATE 9600
#define LED_PWR PA0
#define RADIO_OUT PD2
#define FT_CBUS1 PD3
#define RADIO_OUT_IS_HIGH (PIND & (1<<RADIO_OUT))
</span>
<span class="cp">#define CDC_PREFIX1 0x53
#define CDC_PREFIX2 0x2C
</span>
<span class="cp">#define CDC_END_CMD 0x14
#define CDC_PLAY 0xE4
#define CDC_STOP 0x10
#define CDC_NEXT 0xF8
#define CDC_PREV 0x78
#define CDC_SEEK_FWD 0xD8
#define CDC_SEEK_RWD 0x58
#define CDC_CD1 0x0C
#define CDC_CD2 0x8C
#define CDC_CD3 0x4C
#define CDC_CD4 0xCC
#define CDC_CD5 0x2C
#define CDC_CD6 0xAC
#define CDC_SCAN 0xA0
#define CDC_SFL 0x60
#define CDC_PLAY_NORMAL 0x08
</span>
<span class="cp">#define MODE_PLAY 0xFF
#define MODE_SHFFL 0x55
#define MODE_SCAN 0x00
</span>
<span class="kt">uint16_t</span> <span class="n">captimehi</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="kt">uint16_t</span> <span class="n">captimelo</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="kt">uint8_t</span> <span class="n">capturingstart</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="kt">uint8_t</span> <span class="n">capturingbytes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="kt">uint32_t</span> <span class="n">cmd</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="kt">uint8_t</span> <span class="n">cmdbit</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="kt">uint8_t</span> <span class="n">newcmd</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="kt">uint8_t</span> <span class="n">shutdownpending</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="kt">uint8_t</span> <span class="nf">getCommand</span><span class="p">(</span><span class="kt">uint32_t</span> <span class="n">cmd</span><span class="p">);</span>
<span class="kt">void</span> <span class="nf">shutdown</span><span class="p">();</span>
<span class="kt">void</span> <span class="nf">softreset</span><span class="p">();</span>
<span class="k">volatile</span> <span class="kt">uint8_t</span> <span class="n">cd</span><span class="p">;</span>
<span class="k">volatile</span> <span class="kt">uint8_t</span> <span class="n">tr</span><span class="p">;</span>
<span class="k">volatile</span> <span class="kt">uint8_t</span> <span class="n">mode</span><span class="p">;</span>
<span class="n">ISR</span><span class="p">(</span><span class="n">INT0_vect</span><span class="p">)</span> <span class="c1">//remote signals</span>
<span class="p">{</span>
<span class="k">if</span><span class="p">(</span><span class="n">RADIO_OUT_IS_HIGH</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="n">capturingstart</span> <span class="o">||</span> <span class="n">capturingbytes</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">captimelo</span> <span class="o">=</span> <span class="n">TCNT1</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">else</span>
<span class="n">capturingstart</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
<span class="n">TCNT1</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="c1">//eval times</span>
<span class="k">if</span> <span class="p">(</span><span class="n">captimehi</span> <span class="o">></span> <span class="mi">8300</span> <span class="o">&&</span> <span class="n">captimelo</span> <span class="o">></span> <span class="mi">3500</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">capturingstart</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="n">capturingbytes</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
<span class="c1">//uart_puts("startseq found\r\n");</span>
<span class="p">}</span>
<span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">capturingbytes</span> <span class="o">&&</span> <span class="n">captimelo</span> <span class="o">></span> <span class="mi">1500</span><span class="p">)</span>
<span class="p">{</span>
<span class="c1">//uart_puts("bit 1\r\n");</span>
<span class="n">cmd</span> <span class="o">=</span> <span class="p">(</span><span class="n">cmd</span><span class="o"><<</span><span class="mi">1</span><span class="p">)</span> <span class="o">|</span> <span class="mh">0x00000001</span><span class="p">;</span>
<span class="n">cmdbit</span><span class="o">++</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">capturingbytes</span> <span class="o">&&</span> <span class="n">captimelo</span> <span class="o">></span> <span class="mi">500</span><span class="p">)</span>
<span class="p">{</span>
<span class="c1">//uart_puts("bit 0\r\n");</span>
<span class="n">cmd</span> <span class="o">=</span> <span class="p">(</span><span class="n">cmd</span><span class="o"><<</span><span class="mi">1</span><span class="p">);</span>
<span class="n">cmdbit</span><span class="o">++</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">else</span>
<span class="p">{</span>
<span class="c1">//uart_puts("nothing found\r\n");</span>
<span class="p">}</span>
<span class="k">if</span><span class="p">(</span><span class="n">cmdbit</span> <span class="o">==</span> <span class="mi">32</span><span class="p">)</span>
<span class="p">{</span>
<span class="c1">//uart_puts("new cmd\r\n");</span>
<span class="n">newcmd</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
<span class="n">cmdbit</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="n">capturingbytes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">else</span>
<span class="p">{</span>
<span class="n">captimehi</span> <span class="o">=</span> <span class="n">TCNT1</span><span class="p">;</span>
<span class="n">TCNT1</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="n">ISR</span><span class="p">(</span><span class="n">INT1_vect</span><span class="p">)</span> <span class="c1">//ft230x cbus1</span>
<span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="n">PIND</span> <span class="o">&</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="n">FT_CBUS1</span><span class="p">))</span> <span class="c1">//reset radio display to 'PLAY' CD01 TR00</span>
<span class="p">{</span>
<span class="c1">//PORTA &= ~(1<<LED_PWR);</span>
<span class="n">cd</span> <span class="o">=</span> <span class="mh">0xBE</span><span class="p">;</span>
<span class="n">tr</span> <span class="o">=</span> <span class="mh">0xFF</span><span class="p">;</span>
<span class="n">mode</span> <span class="o">=</span> <span class="mh">0xFF</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">else</span> <span class="c1">//usb connect</span>
<span class="p">{</span>
<span class="n">PORTA</span> <span class="o">|=</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="n">LED_PWR</span><span class="p">);</span>
<span class="n">_delay_ms</span><span class="p">(</span><span class="mi">50</span><span class="p">);</span>
<span class="n">PORTA</span> <span class="o">&=</span> <span class="o">~</span><span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="n">LED_PWR</span><span class="p">);</span>
<span class="n">cd</span> <span class="o">=</span> <span class="mh">0xB0</span><span class="p">;</span>
<span class="n">tr</span> <span class="o">=</span> <span class="mh">0x00</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="kt">uint8_t</span> <span class="nf">spi_xmit</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="n">val</span><span class="p">)</span> <span class="p">{</span>
<span class="n">SPDR</span> <span class="o">=</span> <span class="n">val</span><span class="p">;</span>
<span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="n">SPSR</span> <span class="o">&</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="n">SPIF</span><span class="p">)));</span>
<span class="k">return</span> <span class="n">SPDR</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">void</span> <span class="nf">send_package</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="n">c0</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">c1</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">c2</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">c3</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">c4</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">c5</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">c6</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">c7</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">spi_xmit</span><span class="p">(</span><span class="n">c0</span><span class="p">);</span>
<span class="n">_delay_us</span><span class="p">(</span><span class="mi">874</span><span class="p">);</span>
<span class="n">spi_xmit</span><span class="p">(</span><span class="n">c1</span><span class="p">);</span>
<span class="n">_delay_us</span><span class="p">(</span><span class="mi">874</span><span class="p">);</span>
<span class="n">spi_xmit</span><span class="p">(</span><span class="n">c2</span><span class="p">);</span>
<span class="n">_delay_us</span><span class="p">(</span><span class="mi">874</span><span class="p">);</span>
<span class="n">spi_xmit</span><span class="p">(</span><span class="n">c3</span><span class="p">);</span>
<span class="n">_delay_us</span><span class="p">(</span><span class="mi">874</span><span class="p">);</span>
<span class="n">spi_xmit</span><span class="p">(</span><span class="n">c4</span><span class="p">);</span>
<span class="n">_delay_us</span><span class="p">(</span><span class="mi">874</span><span class="p">);</span>
<span class="n">spi_xmit</span><span class="p">(</span><span class="n">c5</span><span class="p">);</span>
<span class="n">_delay_us</span><span class="p">(</span><span class="mi">874</span><span class="p">);</span>
<span class="n">spi_xmit</span><span class="p">(</span><span class="n">c6</span><span class="p">);</span>
<span class="n">_delay_us</span><span class="p">(</span><span class="mi">874</span><span class="p">);</span>
<span class="n">spi_xmit</span><span class="p">(</span><span class="n">c7</span><span class="p">);</span>
<span class="p">}</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">cd</span> <span class="o">=</span> <span class="mh">0xBE</span><span class="p">;</span>
<span class="n">tr</span> <span class="o">=</span> <span class="mh">0xFF</span><span class="p">;</span>
<span class="n">mode</span> <span class="o">=</span> <span class="mh">0xFF</span><span class="p">;</span>
<span class="c1">//LEDs</span>
<span class="n">DDRA</span> <span class="o">|=</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="n">LED_PWR</span><span class="p">);</span>
<span class="c1">//pullup</span>
<span class="n">PORTD</span> <span class="o">|=</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="n">FT_CBUS1</span><span class="p">);</span>
<span class="n">uart_init</span><span class="p">(</span><span class="n">UART_BAUD_SELECT</span><span class="p">(</span><span class="n">UART_BAUD_RATE</span><span class="p">,</span> <span class="n">F_CPU</span><span class="p">));</span>
<span class="c1">//init SPI</span>
<span class="n">DDRB</span> <span class="o">|=</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="n">PB5</span><span class="p">)</span> <span class="o">|</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="n">PB7</span><span class="p">)</span><span class="o">|</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="n">DDB4</span><span class="p">);</span>
<span class="c1">// SPI Type: Master</span>
<span class="c1">// SPI Clock Rate: 62,500 kHz</span>
<span class="c1">// SPI Clock Phase: Cycle Start</span>
<span class="c1">// SPI Clock Polarity: Low</span>
<span class="c1">// SPI Data Order: MSB First</span>
<span class="n">SPCR</span><span class="o">=</span><span class="mh">0x57</span><span class="p">;</span><span class="c1">//at 8MHz</span>
<span class="c1">//SPCR=0x56;//at 4MHz</span>
<span class="n">SPSR</span><span class="o">=</span><span class="mh">0x00</span><span class="p">;</span>
<span class="c1">//beta commands -> cdc</span>
<span class="n">TCCR1B</span> <span class="o">|=</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="n">CS11</span><span class="p">);</span> <span class="c1">// no prescaler 8 -> 1 timer clock tick is 1us long</span>
<span class="n">GICR</span> <span class="o">|=</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="n">INT0</span><span class="p">)</span> <span class="o">|</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="n">INT1</span><span class="p">);</span>
<span class="n">MCUCR</span> <span class="o">|=</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="n">ISC00</span><span class="p">)</span> <span class="o">|</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="n">ISC10</span><span class="p">);</span> <span class="c1">//any change on INT0 and INT1</span>
<span class="n">sei</span><span class="p">();</span>
<span class="c1">//init led on</span>
<span class="n">PORTA</span> <span class="o">|=</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="n">LED_PWR</span><span class="p">);</span>
<span class="n">_delay_ms</span><span class="p">(</span><span class="mi">500</span><span class="p">);</span>
<span class="c1">//uart_puts("VAG_CDC ready...\r\n");</span>
<span class="n">uart_putc</span><span class="p">(</span><span class="mh">0xAA</span><span class="p">);</span>
<span class="n">uart_putc</span><span class="p">(</span><span class="mh">0x55</span><span class="p">);</span>
<span class="n">PORTA</span> <span class="o">&=</span> <span class="o">~</span><span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="n">LED_PWR</span><span class="p">);</span>
<span class="n">send_package</span><span class="p">(</span><span class="mh">0x74</span><span class="p">,</span><span class="mh">0xBE</span><span class="p">,</span><span class="mh">0xFE</span><span class="p">,</span><span class="mh">0xFF</span><span class="p">,</span><span class="mh">0xFF</span><span class="p">,</span><span class="mh">0xFF</span><span class="p">,</span><span class="mh">0x8F</span><span class="p">,</span><span class="mh">0x7C</span><span class="p">);</span> <span class="c1">//idle</span>
<span class="n">_delay_ms</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span>
<span class="n">send_package</span><span class="p">(</span><span class="mh">0x34</span><span class="p">,</span><span class="mh">0xFF</span><span class="p">,</span><span class="mh">0xFE</span><span class="p">,</span><span class="mh">0xFE</span><span class="p">,</span><span class="mh">0xFE</span><span class="p">,</span><span class="mh">0xFF</span><span class="p">,</span><span class="mh">0xFA</span><span class="p">,</span><span class="mh">0x3C</span><span class="p">);</span> <span class="c1">//load disc</span>
<span class="n">_delay_ms</span><span class="p">(</span><span class="mi">100</span><span class="p">);</span>
<span class="n">send_package</span><span class="p">(</span><span class="mh">0x74</span><span class="p">,</span><span class="mh">0xBE</span><span class="p">,</span><span class="mh">0xFE</span><span class="p">,</span><span class="mh">0xFF</span><span class="p">,</span><span class="mh">0xFF</span><span class="p">,</span><span class="mh">0xFF</span><span class="p">,</span><span class="mh">0x8F</span><span class="p">,</span><span class="mh">0x7C</span><span class="p">);</span> <span class="c1">//idle</span>
<span class="n">_delay_ms</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span>
<span class="k">while</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="p">{</span>
<span class="kt">int</span> <span class="n">r</span> <span class="o">=</span> <span class="n">uart_getc</span><span class="p">();</span>
<span class="c1">//r has new data</span>
<span class="k">if</span><span class="p">(</span><span class="n">r</span> <span class="o"><=</span> <span class="mh">0xFF</span><span class="p">)</span>
<span class="p">{</span>
<span class="c1">//send inverted CD No.</span>
<span class="k">if</span><span class="p">((</span><span class="n">r</span> <span class="o">&</span> <span class="mh">0xC0</span><span class="p">)</span> <span class="o">==</span> <span class="mh">0xC0</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="n">r</span> <span class="o">==</span> <span class="mh">0xCA</span><span class="p">)</span>
<span class="n">mode</span> <span class="o">=</span> <span class="n">MODE_SCAN</span><span class="p">;</span>
<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">r</span> <span class="o">==</span> <span class="mh">0xCB</span><span class="p">)</span>
<span class="n">mode</span> <span class="o">=</span> <span class="n">MODE_SHFFL</span><span class="p">;</span>
<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">r</span> <span class="o">==</span> <span class="mh">0xCC</span><span class="p">)</span>
<span class="n">mode</span> <span class="o">=</span> <span class="n">MODE_PLAY</span><span class="p">;</span>
<span class="k">else</span>
<span class="n">cd</span> <span class="o">=</span> <span class="mh">0xFF</span><span class="o">^</span><span class="p">(</span><span class="n">r</span> <span class="o">&</span> <span class="mh">0x0F</span><span class="p">);</span>
<span class="p">}</span>
<span class="c1">//send inverted TR No.</span>
<span class="k">else</span>
<span class="n">tr</span> <span class="o">=</span> <span class="mh">0xFF</span><span class="o">^</span><span class="n">r</span><span class="p">;</span>
<span class="p">}</span>
<span class="c1">// disc trk min sec</span>
<span class="c1">//send_package(0x34,cd,tr,0xFF,0xFF,0xFF,0xCF,0x3C);</span>
<span class="n">send_package</span><span class="p">(</span><span class="mh">0x34</span><span class="p">,</span><span class="n">cd</span><span class="p">,</span><span class="n">tr</span><span class="p">,</span><span class="mh">0xFF</span><span class="p">,</span><span class="mh">0xFF</span><span class="p">,</span><span class="n">mode</span><span class="p">,</span><span class="mh">0xCF</span><span class="p">,</span><span class="mh">0x3C</span><span class="p">);</span>
<span class="n">_delay_ms</span><span class="p">(</span><span class="mi">41</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">newcmd</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">newcmd</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="kt">uint8_t</span> <span class="n">c</span> <span class="o">=</span> <span class="n">getCommand</span><span class="p">(</span><span class="n">cmd</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">c</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">uart_putc</span><span class="p">(</span><span class="n">c</span><span class="p">);</span>
<span class="cm">/*if (c == CDC_STOP)
{
shutdownpending = 1;
}
else if (shutdownpending && c == CDC_END_CMD)
{
shutdownpending = 0;
PORTA &= ~(1<<LED_PWR);
_delay_ms(100);
shutdown();
PORTA |= (1<<LED_PWR);
}*/</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="kt">uint8_t</span> <span class="nf">getCommand</span><span class="p">(</span><span class="kt">uint32_t</span> <span class="n">cmd</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">if</span> <span class="p">(((</span><span class="n">cmd</span><span class="o">>></span><span class="mi">24</span><span class="p">)</span> <span class="o">&</span> <span class="mh">0xFF</span><span class="p">)</span> <span class="o">==</span> <span class="n">CDC_PREFIX1</span> <span class="o">&&</span> <span class="p">((</span><span class="n">cmd</span><span class="o">>></span><span class="mi">16</span><span class="p">)</span> <span class="o">&</span> <span class="mh">0xFF</span><span class="p">)</span> <span class="o">==</span> <span class="n">CDC_PREFIX2</span><span class="p">)</span>
<span class="k">if</span> <span class="p">(((</span><span class="n">cmd</span><span class="o">>></span><span class="mi">8</span><span class="p">)</span> <span class="o">&</span> <span class="mh">0xFF</span><span class="p">)</span> <span class="o">==</span> <span class="p">(</span><span class="mh">0xFF</span><span class="o">^</span><span class="p">((</span><span class="n">cmd</span><span class="p">)</span> <span class="o">&</span> <span class="mh">0xFF</span><span class="p">)))</span>
<span class="k">return</span> <span class="p">(</span><span class="n">cmd</span><span class="o">>></span><span class="mi">8</span><span class="p">)</span> <span class="o">&</span> <span class="mh">0xFF</span><span class="p">;</span>
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Additional info can be found here: <www.mikrocontroller.net/topic/28549> (in German)</p>
<h1 id="5-the-circuit">5. The Circuit</h1>
<p>Nothing special here, just an ISP header for programming the AVR, USB connector, voltage regulator, LED,…
For feature circuits in the glovebox I provided 12V, 5V and GND through further pins. I was thinking of powering the RPi directly from my faker. But I don’t know if the radio is able to provide around 400mAmps. Even the regulator would heat up like hell at these currents.</p>
<picture><source srcset="/assets/images/20cdcb3c1825640cb35620a024ae08e6fab3702f-1000-65e887561.webp 1000w, /assets/images/20cdcb3c1825640cb35620a024ae08e6fab3702f-1746-65e887561.webp 1746w" type="image/webp" /><source srcset="/assets/images/20cdcb3c1825640cb35620a024ae08e6fab3702f-1000-65e887561.png 1000w, /assets/images/20cdcb3c1825640cb35620a024ae08e6fab3702f-1746-65e887561.png 1746w" type="image/png" /><img src="/assets/images/20cdcb3c1825640cb35620a024ae08e6fab3702f-1746-65e887561.png" width="1746" height="786" /></picture>
<p>The FT230X is programmed as selfpowered and CBUS1 as output for the #POWER_ON singnal.</p>
<h1 id="6-bringing-all-together-mpd-and-rpi">6. Bringing all together: MPD and RPi</h1>
<p>Now we need a wrapper for <code class="language-plaintext highlighter-rouge">mpc</code> to let mpd act as our cd changer. I’ve written a python script to evaluate the radio commands and send cd and track numbers back periodically. The script starts at startup by the <code class="language-plaintext highlighter-rouge">rc.local</code> and checks for the connected faker.
The last listened cd no. will be stored in a file to send it to the faker if something is restarted or reconnected. I let the script stop mpd to save power and make sure the current settings are synced with the filesystem, because a powerfail will cause a corrupted playlist.
The music is stored in <code class="language-plaintext highlighter-rouge">/var/vag_cdc/cdX</code> where X is the cd no. 1 to 6. You can put up to 99 tracks in each folder due to radio display limitations.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#!/usr/bin/python
</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">serial</span>
<span class="kn">import</span> <span class="nn">string</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="c1"># bytes sent when radio keys are pressed
</span><span class="n">CDC_END_CMD</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mh">0x14</span><span class="p">)</span>
<span class="n">CDC_PLAY</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mh">0xE4</span><span class="p">)</span>
<span class="n">CDC_STOP</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mh">0x10</span><span class="p">)</span>
<span class="n">CDC_NEXT</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mh">0xF8</span><span class="p">)</span>
<span class="n">CDC_PREV</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mh">0x78</span><span class="p">)</span>
<span class="n">CDC_SEEK_FWD</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mh">0xD8</span><span class="p">)</span>
<span class="n">CDC_SEEK_RWD</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mh">0x58</span><span class="p">)</span>
<span class="n">CDC_CD1</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mh">0x0C</span><span class="p">)</span>
<span class="n">CDC_CD2</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mh">0x8C</span><span class="p">)</span>
<span class="n">CDC_CD3</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mh">0x4C</span><span class="p">)</span>
<span class="n">CDC_CD4</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mh">0xCC</span><span class="p">)</span>
<span class="n">CDC_CD5</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mh">0x2C</span><span class="p">)</span>
<span class="n">CDC_CD6</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mh">0xAC</span><span class="p">)</span>
<span class="n">CDC_CDSET</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mh">0x38</span><span class="p">)</span>
<span class="n">CDC_SCAN</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mh">0xA0</span><span class="p">)</span>
<span class="n">CDC_SFL</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mh">0x60</span><span class="p">)</span>
<span class="n">CDC_PLAY_NORMAL</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mh">0x08</span><span class="p">)</span>
<span class="c1"># control bytes to set the display
</span><span class="n">CMD_SCAN</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mh">0xCA</span><span class="p">)</span>
<span class="n">CMD_SHFFL</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mh">0xCB</span><span class="p">)</span>
<span class="n">CMD_PLAY</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mh">0xCC</span><span class="p">)</span>
<span class="n">CD_MASK</span> <span class="o">=</span> <span class="mh">0xC0</span>
<span class="n">cd_filename</span> <span class="o">=</span> <span class="s">"/var/vag_cdc/last_cd"</span>
<span class="k">global</span> <span class="n">ser</span>
<span class="n">ser</span> <span class="o">=</span> <span class="bp">None</span>
<span class="n">timeout_seek</span> <span class="o">=</span> <span class="mf">0.5</span>
<span class="n">timeout_normal</span> <span class="o">=</span> <span class="mi">2</span>
<span class="c1"># send current cd no. to radio and save it for next reboot
</span><span class="k">def</span> <span class="nf">set_cd_no</span><span class="p">(</span><span class="n">val</span><span class="p">):</span>
<span class="n">ser</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
<span class="n">fo</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">cd_filename</span><span class="p">,</span> <span class="s">"wb"</span><span class="p">)</span>
<span class="n">fo</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
<span class="n">fo</span><span class="p">.</span><span class="n">close</span><span class="p">()</span>
<span class="c1"># load new cd-dir
</span><span class="k">def</span> <span class="nf">play_cd</span><span class="p">(</span><span class="n">cd_no</span><span class="p">):</span>
<span class="k">if</span> <span class="n">ser</span><span class="p">.</span><span class="n">read</span><span class="p">()</span> <span class="o">==</span> <span class="n">CDC_END_CMD</span> <span class="ow">and</span> <span class="n">ser</span><span class="p">.</span><span class="n">read</span><span class="p">()</span> <span class="o">==</span> <span class="n">CDC_CDSET</span><span class="p">:</span>
<span class="n">r</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">popen</span><span class="p">(</span><span class="s">"mpc ls cd"</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">cd_no</span><span class="p">)).</span><span class="n">read</span><span class="p">()</span>
<span class="k">if</span> <span class="n">r</span> <span class="o">!=</span> <span class="s">""</span><span class="p">:</span>
<span class="n">set_cd_no</span><span class="p">(</span><span class="nb">chr</span><span class="p">(</span><span class="n">CD_MASK</span> <span class="o">+</span> <span class="n">cd_no</span><span class="p">))</span>
<span class="n">os</span><span class="p">.</span><span class="n">popen</span><span class="p">(</span><span class="s">"mpc clear"</span><span class="p">)</span>
<span class="n">os</span><span class="p">.</span><span class="n">popen</span><span class="p">(</span><span class="s">"mpc ls cd"</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">cd_no</span><span class="p">)</span> <span class="o">+</span> <span class="s">" | mpc add"</span><span class="p">)</span>
<span class="n">os</span><span class="p">.</span><span class="n">popen</span><span class="p">(</span><span class="s">"mpc play"</span><span class="p">)</span>
<span class="c1"># init serial and last cd no. for correct radio display
</span><span class="k">def</span> <span class="nf">connect</span><span class="p">():</span>
<span class="k">while</span><span class="p">(</span><span class="mi">1</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">global</span> <span class="n">ser</span>
<span class="n">ser</span> <span class="o">=</span> <span class="n">serial</span><span class="p">.</span><span class="n">Serial</span><span class="p">(</span><span class="s">'/dev/ttyUSB0'</span><span class="p">,</span> <span class="mi">9600</span><span class="p">)</span>
<span class="n">ser</span><span class="p">.</span><span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout_normal</span> <span class="c1">#we need a timeout to update the track no.
</span> <span class="n">ser</span><span class="p">.</span><span class="n">writeTimeout</span> <span class="o">=</span> <span class="n">timeout_normal</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">fo</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">cd_filename</span><span class="p">,</span> <span class="s">"rb"</span><span class="p">)</span>
<span class="n">cd</span> <span class="o">=</span> <span class="n">fo</span><span class="p">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="n">fo</span><span class="p">.</span><span class="n">close</span><span class="p">()</span>
<span class="n">ser</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="n">cd</span><span class="p">)</span>
<span class="k">except</span><span class="p">:</span>
<span class="k">print</span> <span class="s">"no last cd no. [not sending cd#]"</span>
<span class="k">return</span>
<span class="k">except</span><span class="p">:</span>
<span class="n">time</span><span class="p">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="c1">#wait before retrying
</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">os</span><span class="p">.</span><span class="n">popen</span><span class="p">(</span><span class="s">"/etc/init.d/mpd restart"</span><span class="p">)</span> <span class="c1">#restart mpd due to alsa-equalizer
</span> <span class="n">connect</span><span class="p">()</span>
<span class="c1"># read cmds from the radio and act like a cd changer
</span> <span class="k">while</span><span class="p">(</span><span class="mi">1</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">c</span> <span class="o">=</span> <span class="n">ser</span><span class="p">.</span><span class="n">read</span><span class="p">()</span>
<span class="k">if</span> <span class="n">c</span> <span class="o">==</span> <span class="n">CDC_PLAY</span><span class="p">:</span>
<span class="k">if</span> <span class="n">ser</span><span class="p">.</span><span class="n">read</span><span class="p">()</span> <span class="o">==</span> <span class="n">CDC_END_CMD</span><span class="p">:</span>
<span class="n">os</span><span class="p">.</span><span class="n">popen</span><span class="p">(</span><span class="s">"/etc/init.d/mpd start"</span><span class="p">)</span>
<span class="n">os</span><span class="p">.</span><span class="n">popen</span><span class="p">(</span><span class="s">"mpc play"</span><span class="p">)</span>
<span class="n">os</span><span class="p">.</span><span class="n">popen</span><span class="p">(</span><span class="s">"mpc repeat on"</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">c</span> <span class="o">==</span> <span class="n">CDC_STOP</span><span class="p">:</span>
<span class="k">if</span> <span class="n">ser</span><span class="p">.</span><span class="n">read</span><span class="p">()</span> <span class="o">==</span> <span class="n">CDC_END_CMD</span><span class="p">:</span>
<span class="c1">#os.popen("mpc pause")
</span> <span class="c1"># stop service to sync current status
</span> <span class="n">os</span><span class="p">.</span><span class="n">popen</span><span class="p">(</span><span class="s">"/etc/init.d/mpd stop"</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">c</span> <span class="o">==</span> <span class="n">CDC_NEXT</span><span class="p">:</span>
<span class="n">os</span><span class="p">.</span><span class="n">popen</span><span class="p">(</span><span class="s">"mpc next"</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">c</span> <span class="o">==</span> <span class="n">CDC_PREV</span><span class="p">:</span>
<span class="n">os</span><span class="p">.</span><span class="n">popen</span><span class="p">(</span><span class="s">"mpc prev"</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">c</span> <span class="o">==</span> <span class="n">CDC_SEEK_FWD</span><span class="p">:</span>
<span class="n">ser</span><span class="p">.</span><span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout_seek</span>
<span class="k">while</span><span class="p">(</span><span class="mi">1</span><span class="p">):</span>
<span class="n">os</span><span class="p">.</span><span class="n">popen</span><span class="p">(</span><span class="s">"mpc seek +00:00:10"</span><span class="p">)</span>
<span class="k">if</span> <span class="n">ser</span><span class="p">.</span><span class="n">read</span><span class="p">()</span> <span class="o">==</span> <span class="n">CDC_PLAY</span> <span class="ow">and</span> <span class="n">ser</span><span class="p">.</span><span class="n">read</span><span class="p">()</span> <span class="o">==</span> <span class="n">CDC_END_CMD</span><span class="p">:</span>
<span class="k">break</span>
<span class="n">ser</span><span class="p">.</span><span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout_normal</span>
<span class="k">elif</span> <span class="n">c</span> <span class="o">==</span> <span class="n">CDC_SEEK_RWD</span><span class="p">:</span>
<span class="n">ser</span><span class="p">.</span><span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout_seek</span>
<span class="k">while</span><span class="p">(</span><span class="mi">1</span><span class="p">):</span>
<span class="n">os</span><span class="p">.</span><span class="n">popen</span><span class="p">(</span><span class="s">"mpc seek -00:00:10"</span><span class="p">)</span>
<span class="k">if</span> <span class="n">ser</span><span class="p">.</span><span class="n">read</span><span class="p">()</span> <span class="o">==</span> <span class="n">CDC_PLAY</span> <span class="ow">and</span> <span class="n">ser</span><span class="p">.</span><span class="n">read</span><span class="p">()</span> <span class="o">==</span> <span class="n">CDC_END_CMD</span><span class="p">:</span>
<span class="k">break</span>
<span class="n">ser</span><span class="p">.</span><span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout_normal</span>
<span class="k">elif</span> <span class="n">c</span> <span class="o">==</span> <span class="n">CDC_CD1</span><span class="p">:</span>
<span class="n">play_cd</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">c</span> <span class="o">==</span> <span class="n">CDC_CD2</span><span class="p">:</span>
<span class="n">play_cd</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">c</span> <span class="o">==</span> <span class="n">CDC_CD3</span><span class="p">:</span>
<span class="n">play_cd</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">c</span> <span class="o">==</span> <span class="n">CDC_CD4</span><span class="p">:</span>
<span class="n">play_cd</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">c</span> <span class="o">==</span> <span class="n">CDC_CD5</span><span class="p">:</span>
<span class="n">play_cd</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">c</span> <span class="o">==</span> <span class="n">CDC_CD6</span><span class="p">:</span>
<span class="n">play_cd</span><span class="p">(</span><span class="mi">6</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">c</span> <span class="o">==</span> <span class="n">CDC_SCAN</span><span class="p">:</span>
<span class="n">os</span><span class="p">.</span><span class="n">popen</span><span class="p">(</span><span class="s">"mpc update"</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">c</span> <span class="o">==</span> <span class="n">CDC_SFL</span><span class="p">:</span>
<span class="n">os</span><span class="p">.</span><span class="n">popen</span><span class="p">(</span><span class="s">"mpc random on"</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">c</span> <span class="o">==</span> <span class="n">CDC_PLAY_NORMAL</span><span class="p">:</span>
<span class="k">if</span> <span class="n">ser</span><span class="p">.</span><span class="n">read</span><span class="p">()</span> <span class="o">==</span> <span class="n">CDC_END_CMD</span><span class="p">:</span>
<span class="n">os</span><span class="p">.</span><span class="n">popen</span><span class="p">(</span><span class="s">"mpc random off"</span><span class="p">)</span>
<span class="c1">#get current track no. (radio display will be delayed up to {timeout_normal})
</span> <span class="n">mpc</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">popen</span><span class="p">(</span><span class="s">"mpc |grep ] #"</span><span class="p">).</span><span class="n">read</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">mpc</span> <span class="o">=</span> <span class="n">mpc</span><span class="p">.</span><span class="n">split</span><span class="p">(</span><span class="s">"/"</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">mpc</span> <span class="o">=</span> <span class="n">mpc</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">split</span><span class="p">(</span><span class="s">"#"</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">tr</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="n">string</span><span class="p">.</span><span class="n">atoi</span><span class="p">(</span><span class="n">mpc</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="mi">16</span><span class="p">))</span>
<span class="n">ser</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="n">tr</span><span class="p">)</span>
<span class="k">except</span><span class="p">:</span>
<span class="k">print</span> <span class="s">"not playing"</span>
<span class="c1">#get current playmode
</span> <span class="n">mpc</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">popen</span><span class="p">(</span><span class="s">"mpc | grep random:"</span><span class="p">).</span><span class="n">read</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">mpc</span> <span class="o">=</span> <span class="n">mpc</span><span class="p">.</span><span class="n">split</span><span class="p">(</span><span class="s">"random: "</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="k">if</span> <span class="n">mpc</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="n">startswith</span><span class="p">(</span><span class="s">"on"</span><span class="p">):</span>
<span class="n">ser</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="n">CMD_SHFFL</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">mpc</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="n">startswith</span><span class="p">(</span><span class="s">"off"</span><span class="p">):</span>
<span class="n">ser</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="n">CMD_PLAY</span><span class="p">)</span>
<span class="k">except</span><span class="p">:</span>
<span class="k">print</span> <span class="s">"not playing"</span>
<span class="k">except</span> <span class="p">(</span><span class="n">serial</span><span class="p">.</span><span class="n">SerialException</span><span class="p">,</span> <span class="n">serial</span><span class="p">.</span><span class="n">SerialTimeoutException</span><span class="p">):</span>
<span class="k">print</span> <span class="s">"serial port unavailable, reconnecting..."</span>
<span class="n">ser</span><span class="p">.</span><span class="n">close</span><span class="p">()</span>
<span class="n">connect</span><span class="p">()</span>
<span class="k">except</span><span class="p">:</span>
<span class="k">raise</span>
<span class="k">except</span> <span class="p">(</span><span class="nb">KeyboardInterrupt</span><span class="p">):</span>
<span class="k">if</span> <span class="n">ser</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">ser</span><span class="p">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">print</span> <span class="s">"port closed!"</span>
<span class="k">print</span> <span class="s">"KeyboardInterrupt detected, exiting..."</span>
</code></pre></div></div>
<h1 id="7-some-further-ideas">7. Some further ideas</h1>
<p>The project is mostly complete - for now. But there are some things I have in mind that could be quite nice to have. It would be awesome if it had bluetooth to remote control my android phone. Or mute the radio at incoming calls and act as a hands free set.
But what I’ve done lately is preparing the RPi with Wifi, so it connects automatically to my Wifi, when parking in the garage to sync the music folders with rsync.</p>Dennis SchüttI was tired connecting my cellphone with an old cassette adapter to my VW Golf with an Beta 5 in it. I needed something new, something cool. And here it is, a fully functional interface between the Beta 5 and any device you want to play the music with.Dockstar/Goflex: new Kernel 3.9.5 ready to use2013-06-14T13:03:25+02:002013-06-14T13:03:25+02:00https://schuett.io/2013/06/kernel-3-9-5-ready-to-use<p>It’s been one year since I published a compiled kernel for our devices. Now I decided to build a new one and share it!</p>
<p>Some facts about it:</p>
<ul>
<li>As all of my other kernels this one uses heartbeat during boot.</li>
<li>It supports the dockstar, goflex net and home.</li>
<li>Some of you asked for I2C support, it’s now working on the dockstar and goflex net. <code class="language-plaintext highlighter-rouge">i2cdetect -l</code> has the desired output!</li>
</ul>
<p>If you encounter any missing modules for certain devices, try to compile them yourself with the given headers and give me a hint so I can include them in feature releases.</p>
<h1 id="1-prerequisites">1. Prerequisites</h1>
<p>In order to install the kernel properly, you need to have <code class="language-plaintext highlighter-rouge">initramfs-tools</code> installed. Otherwise your device won’t be able to boot! Thanks to chessplayer for sharing this info!</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>apt-get <span class="nb">install </span>initramfs-tools
</code></pre></div></div>
<p>Make sure you have the latest uboot installed. See 1. in <a href="http://dev.shyd.de/2012/04/kernel-3-3-3-ready-to-use/">Dockstar: new Kernel 3.3.3 ready to use</a>.</p>
<h1 id="2-upgrade-the-kernel">2. Upgrade the Kernel</h1>
<p>This part is analogue to my other articles concerning kernel installations:</p>
<p><strong>If you know what you are doing you are ready to download and install the kernel. I am not responsible for any malfunctions or damages on your device!</strong></p>
<p>I assume that you already set the correct arcNumber fitting your device:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dockstar 2998
goflexnet 3089
goflexhome 3338
</code></pre></div></div>
<p>You can install it as follows:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd</span> /tmp
wget http://dev.shyd.de/dockstar/linux-image-3.9.5-dockstar-goflex-shyd_1.1_armel.deb
dpkg <span class="nt">-i</span> linux-image-3.9.5-dockstar-goflex-shyd_1.1_armel.deb
</code></pre></div></div>
<p>If you are encountering problems with flash-kernel, the kernel will be installed though. But rerun it, to finish the process:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>apt-get <span class="nt">-f</span> <span class="nb">install</span>
</code></pre></div></div>
<p>Create the boot files:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd</span> /boot
/usr/bin/mkimage <span class="nt">-A</span> arm <span class="nt">-O</span> linux <span class="nt">-T</span> kernel <span class="nt">-C</span> none <span class="nt">-a</span> 0x00008000 <span class="nt">-e</span> 0x00008000 <span class="nt">-n</span> Linux-3.9.5 <span class="nt">-d</span> /boot/vmlinuz-3.9.5-dockstar-goflex-shyd /boot/uImage
/usr/bin/mkimage <span class="nt">-A</span> arm <span class="nt">-O</span> linux <span class="nt">-T</span> ramdisk <span class="nt">-C</span> <span class="nb">gzip</span> <span class="nt">-a</span> 0x00000000 <span class="nt">-e</span> 0x00000000 <span class="nt">-n</span> initramfs <span class="nt">-d</span> /boot/initrd.img-3.9.5-dockstar-goflex-shyd /boot/uInitrd
</code></pre></div></div>
<h1 id="3-led-setup">3. LED setup</h1>
<p>You have to edit two files:</p>
<p>For the dockstar add to <code class="language-plaintext highlighter-rouge">/etc/rc.local</code>. See below for the corresponding LEDs for the goflex.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>echo default-on > /sys/class/leds/dockstar\:green\:health/trigger
echo none > /sys/class/leds/dockstar\:orange\:misc/trigger
</code></pre></div></div>
<p>and in <code class="language-plaintext highlighter-rouge">/etc/init.d/halt</code> find</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>log_action_msg "Will now halt"
halt -d -f $netdown $poweroff $hddown
</code></pre></div></div>
<p>add after</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>echo none > /sys/class/leds/dockstar\:green\:health/trigger
</code></pre></div></div>
<p>to set it off, when the system halts.</p>
<p>The LEDs of the Goflex Home are called:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>status:green:health
status:orange:misc
status:white:misc
</code></pre></div></div>
<p>…and for the Goflex Net:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>status:green:health
status:orange:misc
status:white:left0
status:white:left1
status:white:left2
status:white:left3
status:white:right0
status:white:right1
status:white:right2
status:white:right3
</code></pre></div></div>
<p>Once the device booted up again, log in and check the output of <code class="language-plaintext highlighter-rouge">uname -r</code>:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">uname</span> <span class="nt">-r</span>
3.1.10-dockstar-goflex-shyd
</code></pre></div></div>
<h1 id="4-additional-files">4. Additional files</h1>
<p>The config is available at:
<a href="/dockstar/config-3.9.5-dockstar-goflex-shyd_1.1">config-3.9.5-dockstar-goflex-shyd_1.1</a></p>
<p>If you want to compile further modules, the headers can be found here:
<a href="/dockstar/linux-headers-3.9.5-dockstar-goflex-shyd_1.1_armel.deb">linux-headers-3.9.5-dockstar-goflex-shyd_1.1_armel.deb</a>
Remember to create the symlinks <code class="language-plaintext highlighter-rouge">/lib/modules/3.9.5-dockstar-goflex-shyd/build</code> and <code class="language-plaintext highlighter-rouge">/lib/modules/3.9.5-dockstar-goflex-shyd/source</code> if you install the headers after the kernel.</p>
<p>And here is the patch with everything I’ve changed from the source tree:
<a href="/dockstar/linux-3.9.5-dockstar-goflex.patch">linux-3.9.5-dockstar-goflex.patch</a></p>Dennis SchüttIt’s been one year since I published a compiled kernel for our devices. Now I decided to build a new one and share it!FTDI: interfacing FT1248/FT220x over SPI2013-06-07T18:55:25+02:002013-06-07T18:55:25+02:00https://schuett.io/2013/06/ftdi-interfacing-ft1248-ft220x-spi<p>In my current project I want to interface the <a href="http://www.ftdichip.com/Products/ICs/FT220X.html">FT220x</a> over 1-bit SPI with an TI piccolo TMS320F28027.
After some trouble and various cups of coffee I managed the whole thing by implementing the SPI in pure software.</p>
<p>I wasn’t able to get it working with the built in tri-wire hardware SPI as the FT uses MIOSIO and MISO to send/receive data and status respectively.</p>
<p>Because there is no sample code available on the web concerning this problem I decided to publish my library here. Take a look into the datasheet for further information!</p>
<p>Sending data over SPI to the FT1248/FT220x is quite easy: Just send a WRITE_REQ (0x00) followed by the payload on MIOSIO.</p>
<p>Reading is a bit more complicated: We need to know how many chars to read. Well, send a READ_REQ (0x02), evaluate MISO and read data on MIOSIO if the FIFO is not empty.
If MISO returns 0xFF, the FT’s FIFO is empty, cancel transmission immediately!
If MISO returns 0xFE while sending READ_REQ, there is data in the FIFO ready to be shifted out.
If MISO returns 0x7F while reading data, there is more data in the FIFO.</p>
<p>In my project there are other 4-wire SPI slaves, that’s why I need to toggle MIOSIO’s direction and MIOSIO/MOSI. Therefor I use the functions <code class="language-plaintext highlighter-rouge">setSoftSpi4wire3wireOut()</code> and <code class="language-plaintext highlighter-rouge">setSoftSpi3wireIn()</code>.</p>
<p>libft220x.h</p>
<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cm">/*
* libft220x.h
*
* Created on: 29.05.2013
* Author: Dennis Schuett, dev.shyd.de
*/</span>
<span class="cp">#ifndef LIBFT220X_H_
#define LIBFT220X_H_
</span>
<span class="cp">#include "main.h"
#define uint8_t unsigned char
</span>
<span class="cp">#define READ_REQ 0x02
#define WRITE_REQ 0x00
</span>
<span class="kt">void</span> <span class="nf">FTwrite</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="o">*</span><span class="n">buf</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">len</span><span class="p">);</span>
<span class="kt">int</span> <span class="nf">FTread</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="o">*</span><span class="n">buf</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">len</span><span class="p">);</span>
<span class="kt">uint8_t</span> <span class="nf">spi3_write</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="n">value</span><span class="p">);</span>
<span class="kt">uint8_t</span> <span class="nf">spi3_read</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="o">*</span><span class="n">value</span><span class="p">);</span>
<span class="cp">#endif </span><span class="cm">/* LIBFT220X_H_ */</span><span class="cp">
</span></code></pre></div></div>
<p>libft220x.c</p>
<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cm">/*
* libft220x.c
*
* Created on: 29.05.2013
* Author: Dennis Schuett, dev.shyd.de
*/</span>
<span class="cp">#include "libft220x.h"
</span>
<span class="kt">void</span> <span class="nf">FTwrite</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="o">*</span><span class="n">buf</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">len</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">setSoftSpi4wire3wireOut</span><span class="p">();</span> <span class="c1">// MIOSIO as output</span>
<span class="n">FT_CE_EN</span><span class="p">;</span>
<span class="n">spi3_write</span><span class="p">(</span><span class="n">WRITE_REQ</span><span class="p">);</span>
<span class="k">while</span> <span class="p">(</span><span class="n">len</span><span class="o">--</span><span class="p">)</span>
<span class="n">spi3_write</span><span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="n">buf</span><span class="o">++</span><span class="p">));</span>
<span class="n">FT_CE_DIS</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">int</span> <span class="nf">FTread</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="o">*</span><span class="n">buf</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">len</span><span class="p">)</span>
<span class="p">{</span>
<span class="kt">uint8_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="kt">uint8_t</span> <span class="n">err</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="n">setSoftSpi4wire3wireOut</span><span class="p">();</span> <span class="c1">// MIOSIO as output</span>
<span class="n">FT_CE_EN</span><span class="p">;</span>
<span class="n">err</span> <span class="o">=</span> <span class="n">spi3_write</span><span class="p">(</span><span class="n">READ_REQ</span><span class="p">);</span>
<span class="k">if</span> <span class="p">((</span><span class="n">err</span> <span class="o">&</span> <span class="mh">0xFF</span><span class="p">)</span> <span class="o">==</span> <span class="mh">0xFE</span><span class="p">)</span> <span class="c1">// check for data in fifo</span>
<span class="p">{</span>
<span class="n">setSoftSpi3wireIn</span><span class="p">();</span> <span class="c1">// MIOSIO as input</span>
<span class="k">for</span> <span class="p">(</span><span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o"><</span> <span class="n">len</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">err</span> <span class="o">=</span> <span class="n">spi3_read</span><span class="p">(</span><span class="o">&</span><span class="n">buf</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
<span class="k">if</span> <span class="p">((</span><span class="n">err</span> <span class="o">&</span> <span class="mh">0xFF</span><span class="p">)</span> <span class="o">==</span> <span class="mh">0xFF</span><span class="p">)</span> <span class="c1">// break if no more data in fifo</span>
<span class="k">break</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="n">FT_CE_DIS</span><span class="p">;</span>
<span class="k">return</span> <span class="n">i</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">uint8_t</span> <span class="nf">spi3_write</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="n">value</span><span class="p">)</span>
<span class="p">{</span>
<span class="kt">uint8_t</span> <span class="n">bit_ctr</span><span class="p">;</span>
<span class="k">for</span> <span class="p">(</span><span class="n">bit_ctr</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">bit_ctr</span><span class="o"><</span><span class="mi">8</span><span class="p">;</span> <span class="n">bit_ctr</span><span class="o">++</span><span class="p">)</span> <span class="c1">// output 8-bit</span>
<span class="p">{</span>
<span class="k">if</span><span class="p">(</span><span class="n">value</span> <span class="o">&</span> <span class="mh">0x80</span><span class="p">)</span>
<span class="n">MOSI_1</span><span class="p">;</span>
<span class="k">else</span>
<span class="n">MOSI_0</span><span class="p">;</span>
<span class="n">value</span> <span class="o">=</span> <span class="p">(</span><span class="n">value</span> <span class="o"><<</span> <span class="mi">1</span><span class="p">);</span> <span class="c1">// shift next bit into MSB..</span>
<span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span>
<span class="n">SCK_1</span><span class="p">;</span> <span class="c1">// Set SCK high..</span>
<span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span>
<span class="n">value</span> <span class="o">|=</span> <span class="n">MISO</span><span class="p">;</span> <span class="c1">// capture current MISO bit</span>
<span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span>
<span class="n">SCK_0</span><span class="p">;</span> <span class="c1">// ..then set SCK low again</span>
<span class="p">}</span>
<span class="k">return</span> <span class="n">value</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">uint8_t</span> <span class="nf">spi3_read</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="o">*</span><span class="n">value</span><span class="p">)</span>
<span class="p">{</span>
<span class="kt">uint8_t</span> <span class="n">bit_ctr</span><span class="p">;</span>
<span class="kt">uint8_t</span> <span class="n">err</span><span class="p">;</span> <span class="c1">// error from MISO</span>
<span class="k">for</span> <span class="p">(</span><span class="n">bit_ctr</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">bit_ctr</span><span class="o"><</span><span class="mi">8</span><span class="p">;</span> <span class="n">bit_ctr</span><span class="o">++</span><span class="p">)</span> <span class="c1">// output 8-bit</span>
<span class="p">{</span>
<span class="o">*</span><span class="n">value</span> <span class="o">=</span> <span class="p">(</span><span class="o">*</span><span class="n">value</span> <span class="o"><<</span> <span class="mi">1</span><span class="p">);</span> <span class="c1">// shift next bit into MSB..</span>
<span class="n">err</span> <span class="o">=</span> <span class="p">(</span><span class="n">err</span> <span class="o"><<</span> <span class="mi">1</span><span class="p">);</span>
<span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span>
<span class="n">SCK_1</span><span class="p">;</span> <span class="c1">// Set SCK high..</span>
<span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span>
<span class="o">*</span><span class="n">value</span> <span class="o">|=</span> <span class="n">MOSI</span><span class="p">;</span> <span class="c1">// capture current MIOSIO bit</span>
<span class="n">err</span> <span class="o">|=</span> <span class="n">MISO</span><span class="p">;</span> <span class="c1">// capture current error bit on MISO</span>
<span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span> <span class="n">asm</span> <span class="p">(</span><span class="s">" nop"</span><span class="p">);</span>
<span class="n">SCK_0</span><span class="p">;</span> <span class="c1">// ..then set SCK low again</span>
<span class="p">}</span>
<span class="k">return</span> <span class="n">err</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>Dennis SchüttIn my current project I want to interface the FT220x over 1-bit SPI with an TI piccolo TMS320F28027. After some trouble and various cups of coffee I managed the whole thing by implementing the SPI in pure software.Dockstar/Golfex: booting with LABEL or UUID instead of device name2013-06-07T17:42:29+02:002013-06-07T17:42:29+02:00https://schuett.io/2013/06/booting-with-uuid-not-device-name<p>Did you want to reboot your Dockstar or Golfex with multiple drives attached? Well, that’s not the problem if uboot lists the devices in the correct order.
But what if your Golfex has SATA drives attached and you want to boot from an usb-drive?</p>
<p>The answer my Goflex gives me all the time: Loading kernel from usb works. Starting the kernel also works. But mounting the filesystem fails, because the device names are remapped when the SATA drives are initialized. The usb-drive ain’t <code class="language-plaintext highlighter-rouge">/dev/sda</code> anymore…</p>
<p>I (have) had one rule since I had to drive more than 100 kilometers to fix that: never reboot remotely with SATA attached. 😠</p>
<p>The solution is quite simple:
We have to tell the kernel properly where to get the rootfs from to mount it. To be versatile, uboot is configured to boot the kernel with device names as parameter, such as <code class="language-plaintext highlighter-rouge">/dev/sda1</code>. But I know what I am doing and want to boot from one single device, no matter if other drives are attached or not, which could mess the device names. So the disk LABEL or the Universally Unique Identifier (UUID) is what we need.
You might say: Ha! I adapt <code class="language-plaintext highlighter-rouge">fstab</code>. But this doesn’t do the trick.</p>
<p>We need to alter the uboot bootargs. You have to decide which method is more suitable for your environment.</p>
<p>First of all backup the current argument:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>fw_printenv usb_set_bootargs
usb_set_bootargs=setenv bootargs console=$console root=&usb_root rootdelay=$usb_rootdelay rootfstype=$usb_rootfstype $mtdparts $usb_custom_params
</code></pre></div></div>
<h1 id="label-method">LABEL method</h1>
<p>The more flexible method is to use the disk LABEL. It allows you to easily change your boot device without modifying the uboot vars.</p>
<p>Determine the rootfs’ LABEL:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>blkid
/dev/sdc1: <span class="nv">LABEL</span><span class="o">=</span><span class="s2">"my-rootfs"</span> <span class="nv">UUID</span><span class="o">=</span><span class="s2">"4812b490-4104-5b33-85ae-7aa4ba635173"</span> <span class="nv">TYPE</span><span class="o">=</span><span class="s2">"ext2"</span> <span class="c"># that's it</span>
/dev/sdc2: <span class="nv">UUID</span><span class="o">=</span><span class="s2">"d8ae81eb-28ff-a983-42a6-28d2b868759c"</span> <span class="nv">TYPE</span><span class="o">=</span><span class="s2">"swap"</span>
</code></pre></div></div>
<p>Now alter <code class="language-plaintext highlighter-rouge">usb_set_bootargs</code> and <code class="language-plaintext highlighter-rouge">create usb_root_label</code>:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>fw_setenv usb_set_bootargs setenv bootargs <span class="nv">console</span><span class="o">=</span><span class="se">\$</span>console <span class="nv">root</span><span class="o">=</span><span class="nv">LABEL</span><span class="o">=</span><span class="se">\$</span>usb_root_label <span class="nv">rootdelay</span><span class="o">=</span><span class="se">\$</span>usb_rootdelay <span class="nv">rootfstype</span><span class="o">=</span><span class="se">\$</span>usb_rootfstype <span class="se">\$</span>mtdparts <span class="se">\$</span>usb_custom_params
fw_setenv usb_root_label my-rootfs
</code></pre></div></div>
<h1 id="uuid-method">UUID method</h1>
<p><strong>Before you start:</strong> If you change your bootdevice or change it’s UUID, your device will most likely fail to boot! I have a fallback rescue system installed on nand, and a serial console to debug things. If you are not on the latest uboot or you didn’t use Jeff’s uboot script, your output may vary.</p>
<p>Determine the rootfs’ UUID:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>blkid
/dev/sdc1: <span class="nv">LABEL</span><span class="o">=</span><span class="s2">"my-rootfs"</span> <span class="nv">UUID</span><span class="o">=</span><span class="s2">"4812b490-4104-5b33-85ae-7aa4ba635173"</span> <span class="nv">TYPE</span><span class="o">=</span><span class="s2">"ext2"</span> <span class="c"># that's it</span>
/dev/sdc2: <span class="nv">UUID</span><span class="o">=</span><span class="s2">"d8ae81eb-28ff-a983-42a6-28d2b868759c"</span> <span class="nv">TYPE</span><span class="o">=</span><span class="s2">"swap"</span>
</code></pre></div></div>
<p>Now alter <code class="language-plaintext highlighter-rouge">usb_set_bootargs</code> and <code class="language-plaintext highlighter-rouge">create usb_root_uuid</code>:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>fw_setenv usb_set_bootargs setenv bootargs <span class="nv">console</span><span class="o">=</span><span class="se">\$</span>console <span class="nv">root</span><span class="o">=</span><span class="nv">UUID</span><span class="o">=</span><span class="se">\$</span>usb_root_uuid <span class="nv">rootdelay</span><span class="o">=</span><span class="se">\$</span>usb_rootdelay <span class="nv">rootfstype</span><span class="o">=</span><span class="se">\$</span>usb_rootfstype <span class="se">\$</span>mtdparts <span class="se">\$</span>usb_custom_params
fw_setenv usb_root_uuid 4812b490-4104-5b33-85ae-7aa4ba635173
</code></pre></div></div>
<p>If you do this directly in uboot use printenv, setenv and saveenv instead of <code class="language-plaintext highlighter-rouge">fw_printenv</code> and <code class="language-plaintext highlighter-rouge">fw_setenv</code>.</p>
<h1 id="reboot">Reboot</h1>
<p>Now give it a try and reboot your system.</p>
<p>To verify your work, check <code class="language-plaintext highlighter-rouge">mount</code>. It should look like this:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mount
/dev/disk/by-uuid/4812b490-4104-5b33-85ae-7aa4ba635173 on / <span class="nb">type </span>ext2 <span class="o">(</span>rw,noatime,errors<span class="o">=</span>remount-ro,user_xattr,acl<span class="o">)</span>
</code></pre></div></div>
<p><strong>NOT</strong> like this:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/dev/sda1 on / <span class="nb">type </span>ext2 <span class="o">(</span>rw,noatime,errors<span class="o">=</span>remount-ro<span class="o">)</span>
</code></pre></div></div>
<h1 id="update-09062013">Update 09.06.2013:</h1>
<p>Thanks to chessplayer pointing at the advantages/disadvantages on these methods! I’ve rewritten this article to have both methods together in one place.</p>Dennis SchüttDid you want to reboot your Dockstar or Golfex with multiple drives attached? Well, that’s not the problem if uboot lists the devices in the correct order. But what if your Golfex has SATA drives attached and you want to boot from an usb-drive?Raspberry Pi: Setup Debian with SanDisk Extreme2012-07-01T20:08:06+02:002012-07-01T20:08:06+02:00https://schuett.io/2012/07/raspberry-pi-setup-debian-sandisk-extreme<p>Finally my RPi has been delivered! After unboxing it I really couldn’t image that is was that tiny. First thing I did, was grabbing my 8GB SanDisk SD-Card and copying the rootfs debian6-19-04-2012 onto it.</p>
<p>After plugging the sd card in the RPi and connecting power supply the problems came up…</p>
<p>This article is not a detailed guide how to set up your RPi. It just describes my second afford to get the RPi booting flawlessly in a few words I can refer to in the future.</p>
<h1 id="problems-i-had">Problems I had</h1>
<ul>
<li>device didn’t boot at all</li>
<li>no serial output on the GPIOs</li>
<li>login failures with definitely correct password</li>
<li>mouse/keyboard stopped working after startx</li>
</ul>
<h1 id="workthrough">Workthrough</h1>
<p>Prepare the SD-Card as described here: <a href="http://elinux.org/RPi_Easy_SD_Card_Setup">elinux.org/RPi_Easy_SD_Card_Setup</a>
After replugging it I used gparted on my laptop to resize the partitions to fill the card.</p>
<p>My card is an 8GB SanDisk Extreme class 10, which is too fast for the stock kernel and the RPi doesn’t boot. Therefor we need a newer kernel. Grab the tarball from <a href="https://github.com/raspberrypi/firmware/tree/master/boot">github.com/raspberrypi/firmware/tree/master/boot</a> and overwrite the files on the sd card.</p>
<p>Now plug the card into the RPi and boot it. At this time I saw it was alive, I got the kernel output on the serial interface!</p>
<p>You should be able to login with pi:raspberry
Well, I wasn’t… So sd card back into my laptop. I just edited the last line in <code class="language-plaintext highlighter-rouge">/media/xyz/etc/shadow</code> to another password. Then the login worked for me.</p>
<p>If you want to be able to login as root (make sure to change pw) type</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo</span> <span class="nt">-i</span>
passwd
</code></pre></div></div>
<p>To get the right timezone type:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dpkg-reconfigure tzdata
</code></pre></div></div>
<p>Change the update server to one nearby:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>vim.tiny /etc/apt/sources.list
</code></pre></div></div>
<p>Then upgrade your installation:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>apt-get update
apt-get dist-upgrade
</code></pre></div></div>
<p>If I now try to start the GUI with <code class="language-plaintext highlighter-rouge">startx</code> mouse and keyboard stop working. Due to the incredible fast sd card we need a newer kernel one more time. Get <code class="language-plaintext highlighter-rouge">rpi-update</code> as shown at <a href="https://github.com/Hexxeh/rpi-update/blob/master/README.md">github.com/Hexxeh/rpi-update/blob/master/README.md</a>
Maybe you get dependency issues</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>apt-get <span class="nb">install </span>ca-certificates git-core
</code></pre></div></div>
<p>Another thing I noticed is that overscan is activated by default (maybe tv specific?). There are several things that can be set in the <code class="language-plaintext highlighter-rouge">config.txt</code>: <a href="https://elinux.org/RPi_config.txt">elinux.org/RPi_config.txt</a>
For me it’s fine with these lines in <code class="language-plaintext highlighter-rouge">/boot/config.txt</code></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># create the file</span>
vim.tiny /boot/config.txt
<span class="c"># insert the following</span>
<span class="nv">hdmi_force_hotplug</span><span class="o">=</span>1
<span class="nv">config_hdmi_boost</span><span class="o">=</span>4
<span class="nv">hdmi_group</span><span class="o">=</span>1
<span class="nv">hdmi_mode</span><span class="o">=</span>32
<span class="nv">disable_overscan</span><span class="o">=</span>1
</code></pre></div></div>
<h1 id="update-22072012-configtxt">Update 22.07.2012: config.txt</h1>
<p>Thanks to Patschi, he posted a link to a really nice description on the <code class="language-plaintext highlighter-rouge">config.txt</code>! You can read it here:</p>
<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
</pre></td><td class="code"><pre><span class="c">################################################################################</span>
<span class="c">## Raspberry Pi Configuration Settings</span>
<span class="c">##</span>
<span class="c">## Details taken from the eLinux wiki 2012/06/27</span>
<span class="c">## For up-to-date information please refer to wiki page.</span>
<span class="c">##</span>
<span class="c">## Wiki Location : http://elinux.org/RPi_config.txt</span>
<span class="c">##</span>
<span class="c">################################################################################</span>
<span class="c">################################################################################</span>
<span class="c">## Standard Definition Video Settings</span>
<span class="c">################################################################################</span>
<span class="c">## sdtv_mode</span>
<span class="c">## defines the TV standard for composite output</span>
<span class="c">##</span>
<span class="c">## Value Description</span>
<span class="c">## -------------------------------------------------------------------------</span>
<span class="c">## 0 Normal NTSC (Default)</span>
<span class="c">## 1 Japanese version of NTSC - no pedestal</span>
<span class="c">## 2 Normal PAL</span>
<span class="c">## 3 Brazilian version of PAL - 525/60 rather than 625/50, different subcarrier</span>
<span class="c">##</span>
<span class="c">#sdtv_mode=0</span>
<span class="c">## sdtv_aspect</span>
<span class="c">## defines the aspect ratio for composite output</span>
<span class="c">##</span>
<span class="c">## Value Description</span>
<span class="c">## -------------------------------------------------------------------------</span>
<span class="c">## 1 4:3 (Default)</span>
<span class="c">## 2 14:9</span>
<span class="c">## 3 16:9</span>
<span class="c">##</span>
<span class="c">#sdtv_aspect=1</span>
<span class="c">################################################################################</span>
<span class="c">## High Definition Video Settings</span>
<span class="c">################################################################################</span>
<span class="c">## hdmi_safe</span>
<span class="c">## Use "safe mode" settings to try to boot with maximum hdmi compatibility.</span>
<span class="c">##</span>
<span class="c">## Value Description</span>
<span class="c">## -------------------------------------------------------------------------</span>
<span class="c">## 0 Disabled (Default)</span>
<span class="c">## 1 Enabled (this does: hdmi_force_hotplug=1, config_hdmi_boost=4, hdmi_group=1, hdmi_mode=1, disable_overscan=0)</span>
<span class="c">##</span>
<span class="c">#hdmi_safe=1</span>
<span class="c">## hdmi_force_hotplug</span>
<span class="c">## overrides the normal selection of composite if no HDMI is detected</span>
<span class="c">##</span>
<span class="c">## Value Description</span>
<span class="c">## -------------------------------------------------------------------------</span>
<span class="c">## 0 Disabled (Default)</span>
<span class="c">## 1 Use HDMI mode even if no HDMI monitor is detected</span>
<span class="c">##</span>
<span class="c">#hdmi_force_hotplug=1</span>
<span class="c">## hdmi_drive</span>
<span class="c">## chooses between HDMI and DVI modes</span>
<span class="c">##</span>
<span class="c">## Value Description</span>
<span class="c">## -------------------------------------------------------------------------</span>
<span class="c">## 1 Normal DVI mode (No sound)</span>
<span class="c">## 2 Normal HDMI mode (Sound will be sent if supported and enabled)</span>
<span class="c">##</span>
<span class="c">#hdmi_drive=2</span>
<span class="c">## hdmi_group</span>
<span class="c">## defines the HDMI type</span>
<span class="c">##</span>
<span class="c">## [rgh] I think values are 0 and 1 really, and the default 0 for CEA - at least with the latest firmware as of May 25th 2012.</span>
<span class="c">##</span>
<span class="c">## Value Description</span>
<span class="c">## -------------------------------------------------------------------------</span>
<span class="c">## 1 CEA (Default)</span>
<span class="c">## 2 DMT</span>
<span class="c">##</span>
<span class="c">#hdmi_group=1</span>
<span class="c">## hdmi_mode</span>
<span class="c">## defines screen resolution in CEA or DMT format</span>
<span class="c">##</span>
<span class="c">## H means 16:9 variant (of a normally 4:3 mode).</span>
<span class="c">## 2x means pixel doubled (i.e. higher clock rate, with each pixel repeated twice)</span>
<span class="c">## 4x means pixel quadrupled (i.e. higher clock rate, with each pixel repeated four times)</span>
<span class="c">##</span>
<span class="c">## Value hdmi_group=CEA hdmi_group=DMT</span>
<span class="c">## -------------------------------------------------------------------------</span>
<span class="c">## 1 VGA 640x350 85Hz</span>
<span class="c">## 2 480p 60Hz 640x400 85Hz</span>
<span class="c">## 3 480p 60Hz H 720x400 85Hz</span>
<span class="c">## 4 720p 60Hz 640x480 60Hz</span>
<span class="c">## 5 1080i 60Hz 640x480 72Hz</span>
<span class="c">## 6 480i 60Hz 640x480 75Hz</span>
<span class="c">## 7 480i 60Hz H 640x480 85Hz</span>
<span class="c">## 8 240p 60Hz 800x600 56Hz</span>
<span class="c">## 9 240p 60Hz H 800x600 60Hz</span>
<span class="c">## 10 480i 60Hz 4x 800x600 72Hz</span>
<span class="c">## 11 480i 60Hz 4x H 800x600 75Hz</span>
<span class="c">## 12 240p 60Hz 4x 800x600 85Hz</span>
<span class="c">## 13 240p 60Hz 4x H 800x600 120Hz</span>
<span class="c">## 14 480p 60Hz 2x 848x480 60Hz</span>
<span class="c">## 15 480p 60Hz 2x H 1024x768 43Hz DO NOT USE</span>
<span class="c">## 16 1080p 60Hz 1024x768 60Hz</span>
<span class="c">## 17 576p 50Hz 1024x768 70Hz</span>
<span class="c">## 18 576p 50Hz H 1024x768 75Hz</span>
<span class="c">## 19 720p 50Hz 1024x768 85Hz</span>
<span class="c">## 20 1080i 50Hz 1024x768 120Hz</span>
<span class="c">## 21 576i 50Hz 1152x864 75Hz</span>
<span class="c">## 22 576i 50Hz H 1280x768 reduced blanking</span>
<span class="c">## 23 288p 50Hz 1280x768 60Hz</span>
<span class="c">## 24 288p 50Hz H 1280x768 75Hz</span>
<span class="c">## 25 576i 50Hz 4x 1280x768 85Hz</span>
<span class="c">## 26 576i 50Hz 4x H 1280x768 120Hz reduced blanking</span>
<span class="c">## 27 288p 50Hz 4x 1280x800 reduced blanking</span>
<span class="c">## 28 288p 50Hz 4x H 1280x800 60Hz</span>
<span class="c">## 29 576p 50Hz 2x 1280x800 75Hz</span>
<span class="c">## 30 576p 50Hz 2x H 1280x800 85Hz</span>
<span class="c">## 31 1080p 50Hz 1280x800 120Hz reduced blanking</span>
<span class="c">## 32 1080p 24Hz 1280x960 60Hz</span>
<span class="c">## 33 1080p 25Hz 1280x960 85Hz</span>
<span class="c">## 34 1080p 30Hz 1280x960 120Hz reduced blanking</span>
<span class="c">## 35 480p 60Hz 4x 1280x1024 60Hz</span>
<span class="c">## 36 480p 60Hz 4x H 1280x1024 75Hz</span>
<span class="c">## 37 576p 50Hz 4x 1280x1024 85Hz</span>
<span class="c">## 38 576p 50Hz 4x H 1280x1024 120Hz reduced blanking</span>
<span class="c">## 39 1080i 50Hz reduced blanking 1360x768 60Hz</span>
<span class="c">## 40 1080i 100Hz 1360x768 120Hz reduced blanking</span>
<span class="c">## 41 720p 100Hz 1400x1050 reduced blanking</span>
<span class="c">## 42 576p 100Hz 1400x1050 60Hz</span>
<span class="c">## 43 576p 100Hz H 1400x1050 75Hz</span>
<span class="c">## 44 576i 100Hz 1400x1050 85Hz</span>
<span class="c">## 45 576i 100Hz H 1400x1050 120Hz reduced blanking</span>
<span class="c">## 46 1080i 120Hz 1440x900 reduced blanking</span>
<span class="c">## 47 720p 120Hz 1440x900 60Hz</span>
<span class="c">## 48 480p 120Hz 1440x900 75Hz</span>
<span class="c">## 49 480p 120Hz H 1440x900 85Hz</span>
<span class="c">## 50 480i 120Hz 1440x900 120Hz reduced blanking</span>
<span class="c">## 51 480i 120Hz H 1600x1200 60Hz</span>
<span class="c">## 52 576p 200Hz 1600x1200 65Hz</span>
<span class="c">## 53 576p 200Hz H 1600x1200 70Hz</span>
<span class="c">## 54 576i 200Hz 1600x1200 75Hz</span>
<span class="c">## 55 576i 200Hz H 1600x1200 85Hz</span>
<span class="c">## 56 480p 240Hz 1600x1200 120Hz reduced blanking</span>
<span class="c">## 57 480p 240Hz H 1680x1050 reduced blanking</span>
<span class="c">## 58 480i 240Hz 1680x1050 60Hz</span>
<span class="c">## 59 480i 240Hz H 1680x1050 75Hz</span>
<span class="c">## 60 1680x1050 85Hz</span>
<span class="c">## 61 1680x1050 120Hz reduced blanking</span>
<span class="c">## 62 1792x1344 60Hz</span>
<span class="c">## 63 1792x1344 75Hz</span>
<span class="c">## 64 1792x1344 120Hz reduced blanking</span>
<span class="c">## 65 1856x1392 60Hz</span>
<span class="c">## 66 1856x1392 75Hz</span>
<span class="c">## 67 1856x1392 120Hz reduced blanking</span>
<span class="c">## 68 1920x1200 reduced blanking</span>
<span class="c">## 69 1920x1200 60Hz</span>
<span class="c">## 70 1920x1200 75Hz</span>
<span class="c">## 71 1920x1200 85Hz</span>
<span class="c">## 72 1920x1200 120Hz reduced blanking</span>
<span class="c">## 73 1920x1440 60Hz</span>
<span class="c">## 74 1920x1440 75Hz</span>
<span class="c">## 75 1920x1440 120Hz reduced blanking</span>
<span class="c">## 76 2560x1600 reduced blanking</span>
<span class="c">## 77 2560x1600 60Hz</span>
<span class="c">## 78 2560x1600 75Hz</span>
<span class="c">## 79 2560x1600 85Hz</span>
<span class="c">## 80 2560x1600 120Hz reduced blanking</span>
<span class="c">## 81 1366x768 60Hz</span>
<span class="c">## 82 1080p 60Hz</span>
<span class="c">## 83 1600x900 reduced blanking</span>
<span class="c">## 84 2048x1152 reduced blanking</span>
<span class="c">## 85 720p 60Hz</span>
<span class="c">## 86 1366x768 reduced blanking</span>
<span class="c">##</span>
<span class="c">#hdmi_mode=1</span>
<span class="c">## hdmi_force_hotplug</span>
<span class="c">## Make RPi ignore hotplug signal from display and assume it is asserted.</span>
<span class="c">##</span>
<span class="c">#hdmi_force_hotplug=0</span>
<span class="c">## config_hdmi_boost</span>
<span class="c">## configure the signal strength of the HDMI interface.</span>
<span class="c">##</span>
<span class="c">## Value Description</span>
<span class="c">## -------------------------------------------------------------------------</span>
<span class="c">## 0 (Default)</span>
<span class="c">## 1</span>
<span class="c">## 2</span>
<span class="c">## 3</span>
<span class="c">## 4 Try if you have interference issues with HDMI</span>
<span class="c">## 5</span>
<span class="c">## 6</span>
<span class="c">## 7 Maximum</span>
<span class="c">##</span>
<span class="c">#config_hdmi_boost=0</span>
<span class="c">################################################################################</span>
<span class="c">## Overscan Video Settings</span>
<span class="c">################################################################################</span>
<span class="c">## overscan_left</span>
<span class="c">## number of pixels to skip on left</span>
<span class="c">##</span>
<span class="c">#overscan_left=0</span>
<span class="c">## overscan_right</span>
<span class="c">## number of pixels to skip on right</span>
<span class="c">##</span>
<span class="c">#overscan_right=0</span>
<span class="c">## overscan_top</span>
<span class="c">## number of pixels to skip on top</span>
<span class="c">##</span>
<span class="c">#overscan_top=0</span>
<span class="c">## overscan_bottom</span>
<span class="c">## number of pixels to skip on bottom</span>
<span class="c">##</span>
<span class="c">#overscan_bottom=0</span>
<span class="c">## disable_overscan</span>
<span class="c">## set to 1 to disable overscan</span>
<span class="c">##</span>
<span class="c">## Value Description</span>
<span class="c">## -------------------------------------------------------------------------</span>
<span class="c">## 0 Overscan Enabled (Default)</span>
<span class="c">## 1 Overscan Disabled</span>
<span class="c">##</span>
<span class="c">#disable_overscan=1</span>
<span class="c">################################################################################</span>
<span class="c">## Framebuffer Video Settings</span>
<span class="c">################################################################################</span>
<span class="c">## framebuffer_width</span>
<span class="c">## console framebuffer width in pixels. Default is display width minus overscan.</span>
<span class="c">##</span>
<span class="c">#framebuffer_width=0</span>
<span class="c">## framebuffer_height</span>
<span class="c">## console framebuffer height in pixels. Default is display height minus overscan.</span>
<span class="c">##</span>
<span class="c">#framebuffer_height=0</span>
<span class="c">## framebuffer_depth</span>
<span class="c">## console framebuffer depth in bits per pixel.</span>
<span class="c">##</span>
<span class="c">## Value Description</span>
<span class="c">## -------------------------------------------------------------------------</span>
<span class="c">## 8 valid, but default RGB palette makes an unreadable screen</span>
<span class="c">## 16 (Default)</span>
<span class="c">## 24 looks better but has corruption issues as of 2012/06/15</span>
<span class="c">## 32 has no corruption issues but needs framebuffer_ignore_alpha=1 and shows the wrong colors as of 2012/06/15</span>
<span class="c">##</span>
<span class="c">#framebuffer_height=16</span>
<span class="c">## framebuffer_ignore_alpha</span>
<span class="c">## set to 1 to disable alpha channel. Helps with 32bit.</span>
<span class="c">##</span>
<span class="c">## Value Description</span>
<span class="c">## -------------------------------------------------------------------------</span>
<span class="c">## 0 Enable Alpha Channel (Default)</span>
<span class="c">## 1 Disable Alpha Channel</span>
<span class="c">##</span>
<span class="c">#framebuffer_ignore_alpha=0</span>
<span class="c">################################################################################</span>
<span class="c">## Test Settings</span>
<span class="c">################################################################################</span>
<span class="c">## test_mode</span>
<span class="c">## enable test sound/image during boot for manufacturing test.</span>
<span class="c">##</span>
<span class="c">## Value Description</span>
<span class="c">## -------------------------------------------------------------------------</span>
<span class="c">## 0 Disable Test Mod (Default)</span>
<span class="c">## 1 Enable Test Mode</span>
<span class="c">##</span>
<span class="c">#test_mode=0</span>
<span class="c">################################################################################</span>
<span class="c">## Cache Settings</span>
<span class="c">################################################################################</span>
<span class="c">## disable_l2cache</span>
<span class="c">## disable arm access to GPU's L2 cache. Needs corresponding L2 disabled kernel.</span>
<span class="c">##</span>
<span class="c">## Value Description</span>
<span class="c">## -------------------------------------------------------------------------</span>
<span class="c">## 0 Enable L2 Cache (Default)</span>
<span class="c">## 1 Disable L2 cache</span>
<span class="c">##</span>
<span class="c">#disable_l2cache=0</span>
<span class="c">################################################################################</span>
<span class="c">## Boot Option Settings</span>
<span class="c">################################################################################</span>
<span class="c">## disable_commandline_tags</span>
<span class="c">## Stops start.elf from filling in ATAGS (memory from 0x100) before launching kernel</span>
<span class="c">##</span>
<span class="c">#disable_commandline_tags=0</span>
<span class="c">## cmdline (string)</span>
<span class="c">## Command line parameters. Can be used instead of cmdline.txt file</span>
<span class="c">##</span>
<span class="c">#cmdline=""</span>
<span class="c">## kernel (string)</span>
<span class="c">## Alternative name to use when loading kernel.</span>
<span class="c">##</span>
<span class="c">#kernel=""</span>
<span class="c">## kernel_address</span>
<span class="c">## address to load kernel.img file at</span>
<span class="c">##</span>
<span class="c">#kernel_address=0x00000000</span>
<span class="c">## ramfsfile (string)</span>
<span class="c">## ramfs file to load</span>
<span class="c">##</span>
<span class="c">#ramfsfile=""</span>
<span class="c">## device_tree_address</span>
<span class="c">## address to load device_tree at</span>
<span class="c">##</span>
<span class="c">#device_tree_address=0x00000000</span>
<span class="c">## init_uart_baud</span>
<span class="c">## initial uart baud rate. Default 115200</span>
<span class="c">##</span>
<span class="c">#init_uart_baud=115200</span>
<span class="c">## init_uart_clock</span>
<span class="c">## initial uart clock. Default 3000000</span>
<span class="c">##</span>
<span class="c">#init_uart_clock=3000000</span>
<span class="c">## init_emmc_clock</span>
<span class="c">## initial emmc clock. Default 50000000 (50mhz default. increasing this can speedup your SD-card)</span>
<span class="c">##</span>
<span class="c">#init_emmc_clock=50000000</span>
<span class="c">## boot_delay</span>
<span class="c">## Waits for given number of seconds in start.elf before loading kernel.img.</span>
<span class="c">##</span>
<span class="c">#boot_delay=0</span>
<span class="c">################################################################################</span>
<span class="c">## Overclocking Settings</span>
<span class="c">################################################################################</span>
<span class="c">## arm_freq</span>
<span class="c">## frequency of ARM in MHz. Default 700.</span>
<span class="c">##</span>
<span class="c">#arm_freq=700</span>
<span class="c">## gpu_freq</span>
<span class="c">## Sets core_freq, h264_freq, isp_freq, v3d_freq together.</span>
<span class="c">##</span>
<span class="c">#gpu_freq=250</span>
<span class="c">## core_freq</span>
<span class="c">## frequency of GPU processor core in MHz. Default 250.</span>
<span class="c">##</span>
<span class="c">#core_freq=250</span>
<span class="c">## h264_freq</span>
<span class="c">## frequency of hardware video block in MHz. Default 250.</span>
<span class="c">##</span>
<span class="c">#h264_freq=250</span>
<span class="c">## isp_freq</span>
<span class="c">## frequency of image sensor pipeline block in MHz. Default 250.</span>
<span class="c">##</span>
<span class="c">#isp_freq=250</span>
<span class="c">## v3d_freq</span>
<span class="c">## frequency of 3D block in MHz. Default 250.</span>
<span class="c">##</span>
<span class="c">#v3d_freq=250</span>
<span class="c">## sdram_freq</span>
<span class="c">## frequency of SDRAM in MHz. Default 400.</span>
<span class="c">##</span>
<span class="c">#sdram_freq=400</span>
<span class="c">################################################################################</span>
<span class="c">## Voltage Settings</span>
<span class="c">##</span>
<span class="c">## WARNING: Setting any of the parameters which over volt your Raspberry Pi</span>
<span class="c">## will set a permanent bit within the SOC and your warranty is void. So If</span>
<span class="c">## you care about the warranty do not adjust voltage.</span>
<span class="c">##</span>
<span class="c">################################################################################</span>
<span class="c">## over_voltage</span>
<span class="c">## ARM/GPU core voltage adjust.</span>
<span class="c">##</span>
<span class="c">## Value Description</span>
<span class="c">## -------------------------------------------------------------------------</span>
<span class="c">## -16 0.8 V</span>
<span class="c">## -15 0.825 V</span>
<span class="c">## -14 0.85 V</span>
<span class="c">## -13 0.875 V</span>
<span class="c">## -12 0.9 V</span>
<span class="c">## -11 0.925 V</span>
<span class="c">## -10 0.95 V</span>
<span class="c">## -9 0.975 V</span>
<span class="c">## -8 1.0 V</span>
<span class="c">## -7 1.025 V</span>
<span class="c">## -6 1.05 V</span>
<span class="c">## -5 1.075 V</span>
<span class="c">## -4 1.1 V</span>
<span class="c">## -3 1.125 V</span>
<span class="c">## -2 1.15 V</span>
<span class="c">## -1 1.175 V</span>
<span class="c">## 0 1.2 V (Default)</span>
<span class="c">## 1 1.225 V</span>
<span class="c">## 2 1.25 V</span>
<span class="c">## 3 1.275 V</span>
<span class="c">## 4 1.3 V</span>
<span class="c">## 5 1.325 V</span>
<span class="c">## 6 1.35 V</span>
<span class="c">## 7 1.375 V</span>
<span class="c">## 8 1.4 V</span>
<span class="c">##</span>
<span class="c">#over_voltage=0</span>
<span class="c">## over_voltage_sdram</span>
<span class="c">## Sets over_voltage_sdram_c, over_voltage_sdram_i, over_voltage_sdram_p together</span>
<span class="c">##</span>
<span class="c">## Value Description</span>
<span class="c">## -------------------------------------------------------------------------</span>
<span class="c">## -16 0.8 V</span>
<span class="c">## -15 0.825 V</span>
<span class="c">## -14 0.85 V</span>
<span class="c">## -13 0.875 V</span>
<span class="c">## -12 0.9 V</span>
<span class="c">## -11 0.925 V</span>
<span class="c">## -10 0.95 V</span>
<span class="c">## -9 0.975 V</span>
<span class="c">## -8 1.0 V</span>
<span class="c">## -7 1.025 V</span>
<span class="c">## -6 1.05 V</span>
<span class="c">## -5 1.075 V</span>
<span class="c">## -4 1.1 V</span>
<span class="c">## -3 1.125 V</span>
<span class="c">## -2 1.15 V</span>
<span class="c">## -1 1.175 V</span>
<span class="c">## 0 1.2 V (Default)</span>
<span class="c">## 1 1.225 V</span>
<span class="c">## 2 1.25 V</span>
<span class="c">## 3 1.275 V</span>
<span class="c">## 4 1.3 V</span>
<span class="c">## 5 1.325 V</span>
<span class="c">## 6 1.35 V</span>
<span class="c">## 7 1.375 V</span>
<span class="c">## 8 1.4 V</span>
<span class="c">##</span>
<span class="c">#over_voltage_sdram=0</span>
<span class="c">## over_voltage_sdram_c</span>
<span class="c">## SDRAM controller voltage adjust.</span>
<span class="c">##</span>
<span class="c">## Value Description</span>
<span class="c">## -------------------------------------------------------------------------</span>
<span class="c">## -16 0.8 V</span>
<span class="c">## -15 0.825 V</span>
<span class="c">## -14 0.85 V</span>
<span class="c">## -13 0.875 V</span>
<span class="c">## -12 0.9 V</span>
<span class="c">## -11 0.925 V</span>
<span class="c">## -10 0.95 V</span>
<span class="c">## -9 0.975 V</span>
<span class="c">## -8 1.0 V</span>
<span class="c">## -7 1.025 V</span>
<span class="c">## -6 1.05 V</span>
<span class="c">## -5 1.075 V</span>
<span class="c">## -4 1.1 V</span>
<span class="c">## -3 1.125 V</span>
<span class="c">## -2 1.15 V</span>
<span class="c">## -1 1.175 V</span>
<span class="c">## 0 1.2 V (Default)</span>
<span class="c">## 1 1.225 V</span>
<span class="c">## 2 1.25 V</span>
<span class="c">## 3 1.275 V</span>
<span class="c">## 4 1.3 V</span>
<span class="c">## 5 1.325 V</span>
<span class="c">## 6 1.35 V</span>
<span class="c">## 7 1.375 V</span>
<span class="c">## 8 1.4 V</span>
<span class="c">##</span>
<span class="c">#over_voltage_sdram_c=0</span>
<span class="c">## over_voltage_sdram_i</span>
<span class="c">## SDRAM I/O voltage adjust.</span>
<span class="c">##</span>
<span class="c">## Value Description</span>
<span class="c">## -------------------------------------------------------------------------</span>
<span class="c">## -16 0.8 V</span>
<span class="c">## -15 0.825 V</span>
<span class="c">## -14 0.85 V</span>
<span class="c">## -13 0.875 V</span>
<span class="c">## -12 0.9 V</span>
<span class="c">## -11 0.925 V</span>
<span class="c">## -10 0.95 V</span>
<span class="c">## -9 0.975 V</span>
<span class="c">## -8 1.0 V</span>
<span class="c">## -7 1.025 V</span>
<span class="c">## -6 1.05 V</span>
<span class="c">## -5 1.075 V</span>
<span class="c">## -4 1.1 V</span>
<span class="c">## -3 1.125 V</span>
<span class="c">## -2 1.15 V</span>
<span class="c">## -1 1.175 V</span>
<span class="c">## 0 1.2 V (Default)</span>
<span class="c">## 1 1.225 V</span>
<span class="c">## 2 1.25 V</span>
<span class="c">## 3 1.275 V</span>
<span class="c">## 4 1.3 V</span>
<span class="c">## 5 1.325 V</span>
<span class="c">## 6 1.35 V</span>
<span class="c">## 7 1.375 V</span>
<span class="c">## 8 1.4 V</span>
<span class="c">##</span>
<span class="c">#over_voltage_sdram_i=0</span>
<span class="c">## over_voltage_sdram_p</span>
<span class="c">## SDRAM phy voltage adjust.</span>
<span class="c">##</span>
<span class="c">## Value Description</span>
<span class="c">## -------------------------------------------------------------------------</span>
<span class="c">## -16 0.8 V</span>
<span class="c">## -15 0.825 V</span>
<span class="c">## -14 0.85 V</span>
<span class="c">## -13 0.875 V</span>
<span class="c">## -12 0.9 V</span>
<span class="c">## -11 0.925 V</span>
<span class="c">## -10 0.95 V</span>
<span class="c">## -9 0.975 V</span>
<span class="c">## -8 1.0 V</span>
<span class="c">## -7 1.025 V</span>
<span class="c">## -6 1.05 V</span>
<span class="c">## -5 1.075 V</span>
<span class="c">## -4 1.1 V</span>
<span class="c">## -3 1.125 V</span>
<span class="c">## -2 1.15 V</span>
<span class="c">## -1 1.175 V</span>
<span class="c">## 0 1.2 V (Default)</span>
<span class="c">## 1 1.225 V</span>
<span class="c">## 2 1.25 V</span>
<span class="c">## 3 1.275 V</span>
<span class="c">## 4 1.3 V</span>
<span class="c">## 5 1.325 V</span>
<span class="c">## 6 1.35 V</span>
<span class="c">## 7 1.375 V</span>
<span class="c">## 8 1.4 V</span>
<span class="c">##</span>
<span class="c">#over_voltage_sdram_p=0</span>
</pre></td></tr></tbody></table></code></pre></figure>Dennis SchüttFinally my RPi has been delivered! After unboxing it I really couldn’t image that is was that tiny. First thing I did, was grabbing my 8GB SanDisk SD-Card and copying the rootfs debian6-19-04-2012 onto it.Preparing for the Future: IPv62012-04-27T19:14:59+02:002012-04-27T19:14:59+02:00https://schuett.io/2012/04/ipv6-launch<p>More and more providers change to dual stack to make their servers ready for the future. Dual stack means running IPv4 and IPv6 parallel on servers.</p>
<p>The magic date for several providers is 6 June 2012, from then on dual stack should work for daily use. I want to participate and made this site accessible through IPv6 today.</p>
<picture><source srcset="/assets/images/96af52085b7b2c06b3daf88b9cdacca613e15765-512-cc7a0197c.webp 512w" type="image/webp" /><source srcset="/assets/images/96af52085b7b2c06b3daf88b9cdacca613e15765-512-cc7a0197c.png 512w" type="image/png" /><img class="img-responsive img-rounded" src="/assets/images/96af52085b7b2c06b3daf88b9cdacca613e15765-512-cc7a0197c.png" width="512" height="512" /></picture>
<p>Get more information at <a href="http://www.worldipv6launch.org/">www.worldipv6launch.org</a></p>Dennis SchüttMore and more providers change to dual stack to make their servers ready for the future. Dual stack means running IPv4 and IPv6 parallel on servers.Dockstar: new Kernel 3.3.3 ready to use2012-04-26T14:31:20+02:002012-04-26T14:31:20+02:00https://schuett.io/2012/04/kernel-3-3-3-ready-to-use<p>As you may have noticed, we were discussing things about newer kernels and drivers in the comments of <a href="/2012/01/kernel-3-1-10-ready-to-use/">Dockstar/Goflex: new Kernel 3.1.10 ready to use</a>. With that in mind I started up my VM and looked at what I’ve got there in <code class="language-plaintext highlighter-rouge">/usr/src</code> – there was a compiled 3.2.1 that initially wouldn’t boot. But following davy’s guide to upgrade U-Boot makes that one boot.</p>
<p>Taking a look at <a href="http://kernel.org/">kernel.org</a> made me jealous… Here it is – a fully working 3.3.3:</p>
<h1 id="1-upgrading-u-boot">1. Upgrading U-Boot</h1>
<p>It is absolutely necessary to get a newer version than provided in Jeff’s script. Otherwise your dockstar will fail to boot up. If this happens you need to revert to a lower version of the kernel than 3.2.x (find help here: Dockstar: <a href="/2011/03/dockstar-no-boot-self-compiled-kernel/">Does not boot with self-compiled Kernel?</a>).</p>
<p>For now I didn’t get the kernel working with the goflex series, so this article is dedicated to dockstar users only.</p>
<p>What you need to do is carefully read through davy’s post <a href="http://forum.doozan.com/read.php?3,6965">Newer uBoot as workaround to 3.2 kernel problem?</a> and follow these steps before installing my kernel.</p>
<h1 id="2-upgrade-the-kernel">2. Upgrade the Kernel</h1>
<p>This part is analogue to my other articles concerning kernel installations:</p>
<p><strong>If you know what you are doing you are ready to download and install the kernel. I am not responsible for any malfunctions or damages on your device!</strong></p>
<p>I assume that you already set the arcNumber to 2998 to make the kernel identify the dockstar as a dockstar.
You can install it as follows:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd</span> /tmp
wget http://dev.shyd.de/dockstar/linux-image-3.3.3-dockstar-shyd_1.1_armel.deb
dpkg <span class="nt">-i</span> linux-image-3.3.3-dockstar-shyd_1.1_armel.deb
<span class="nb">cd</span> /boot
/usr/bin/mkimage <span class="nt">-A</span> arm <span class="nt">-O</span> linux <span class="nt">-T</span> kernel <span class="nt">-C</span> none <span class="nt">-a</span> 0x00008000 <span class="nt">-e</span> 0x00008000 <span class="nt">-n</span> Linux-3.3.3 <span class="nt">-d</span> /boot/vmlinuz-3.3.3-dockstar-shyd /boot/uImage
/usr/bin/mkimage <span class="nt">-A</span> arm <span class="nt">-O</span> linux <span class="nt">-T</span> ramdisk <span class="nt">-C</span> <span class="nb">gzip</span> <span class="nt">-a</span> 0x00000000 <span class="nt">-e</span> 0x00000000 <span class="nt">-n</span> initramfs <span class="nt">-d</span> /boot/initrd.img-3.3.3-dockstar-shyd /boot/uInitrd
</code></pre></div></div>
<p>You can leave the arcNumber untouched. In this case the LED will go off once the kernel has been loaded.</p>
<p>Once the device booted up again log in and check the output of <code class="language-plaintext highlighter-rouge">uname -r</code>:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">uname</span> <span class="nt">-r</span>
3.3.3-dockstar-shyd
</code></pre></div></div>
<h1 id="led-setup">LED setup</h1>
<p>You have to edit two files:</p>
<p>add to <code class="language-plaintext highlighter-rouge">/etc/rc.local</code></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">echo </span>default-on <span class="o">></span> /sys/class/leds/dockstar<span class="se">\:</span>green<span class="se">\:</span>health/trigger
<span class="nb">echo </span>none <span class="o">></span> /sys/class/leds/dockstar<span class="se">\:</span>orange<span class="se">\:</span>misc/trigger
</code></pre></div></div>
<p>and in <code class="language-plaintext highlighter-rouge">/etc/init.d/halt</code> find</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>log_action_msg <span class="s2">"Will now halt"</span>
halt <span class="nt">-d</span> <span class="nt">-f</span> <span class="nv">$netdown</span> <span class="nv">$poweroff</span> <span class="nv">$hddown</span>
</code></pre></div></div>
<p>add after</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">echo </span>none <span class="o">></span> /sys/class/leds/dockstar<span class="se">\:</span>green<span class="se">\:</span>health/trigger
</code></pre></div></div>
<p>to set it off, when the system halts.</p>Dennis SchüttAs you may have noticed, we were discussing things about newer kernels and drivers in the comments of Dockstar/Goflex: new Kernel 3.1.10 ready to use. With that in mind I started up my VM and looked at what I’ve got there in /usr/src – there was a compiled 3.2.1 that initially wouldn’t boot. But following davy’s guide to upgrade U-Boot makes that one boot.