Split "Provide mainline support" section
[rmll_2011.git] / slides.html
1 <!DOCTYPE html>
2
3 <meta charset="utf-8">
4 <title>lacie-nas.org RMLL 2011</title>
5
6 <!-- Your Slides -->
7 <!-- One section is one slide -->
8
9 <section class=title>
10     <!-- This is the first slide -->
11     <h1>lacie-nas.org</h1>
12     <footer>by Simon and Thomas <a href="http://lacie-nas.org">@lacie-nas.org</a></footer>
13 </section>
14
15 <section class=chapter>
16     <h1>What is a NAS ?</h1>
17 </section>
18 <section>
19     <h1>What is a NAS ?</h1>
20     <h2>A kind of desktop</h2>
21     <ul>
22         <li>without monitor
23         <li>without keyboard
24         <li>like a server in a tiny package
25     </ul>
26 </section>
27 <section>
28     <h1>What is a NAS ?</h1>
29     <h2>A remote storage</h2>
30     <ul>
31         <li>available through network protocols
32             <p>(NFS, Samba, Netatalk, DLNA, FTP, etc)
33         <li>additional services more or less useful
34             <p>(BitTorrent, backup, web hosting, etc)
35     </ul>
36 </section>
37 <section>
38     <h1>What is a NAS ?</h1>
39     <h2>Exotic devices for user interface</h2>
40     <h2>(instead of keyboard / monitor)</h2>
41     <ul>
42         <li>buttons
43         <li>LEDs
44         <li>LCD
45     </ul>
46 </section>
47 <section>
48     <h1>What is a NAS ?</h1>
49     <h2>Various architectures</h2>
50     <ul>
51         <li>ARM
52         <li>MIPS
53         <li>PPC
54         <li>x86 more recently
55     </ul>
56     <note>Power up NS2 for demo</note>
57 </section>
58 <section>
59     <h1>What is a NAS ?</h1>
60     <h2>Low cost</h2>
61     <ul>
62         <li>cheap hardware
63         <li>low power consumption
64         <li>firmwares are largely based on free software
65     </ul>
66 </section>
67
68 <section class=chapter>
69     <h1>Project Overview</h1>
70 </section>
71
72 <section>
73     <h1>Project Overview</h1>
74     <h2>Origins</h2>
75     <ul>
76         <li>lacie.com: non free hardware
77         <li>until 2009, no mainline support
78         <li>except for EDmini v2 (2008 Linux patch)
79             <p>by hobbyists: Albert Aribaud and Christopher Moore
80             <p>signed off by Marvell guys: Lennert Buytenhek and Nicolas Pitre
81         <li>discussions with patch authors
82         <li>a framework was needed...
83     </ul>
84 </section>
85
86 <section>
87     <h1>Project Overview</h1>
88     <h2>What is not lacie-nas.org ?</h2>
89     <ul>
90         <li><a>not</a> a project hosted by LaCie
91         <note>very limited sponsoring from lacie.com</note>
92         <li><a>not</a> after sales service for LaCie
93         <li><a>not</a> a hacking house for LaCie firmwares
94         <p>Some other projects (like nas-central.org) already does it well.
95     </ul>
96     <note>Often people comes and ask how to hack a LaCie NAS</note>
97 </section>
98
99 <section class=chapter>
100     <h1>Projects and targets</h1>
101 </section>
102
103 <section>
104     <h1>Projects and targets</h1>
105     <h2>Open/unlock hardware</h2>
106     <ul>
107         <li>boards specifications
108         <li>pinout
109         <p>JTAG, serial, MPPs, GPIOs, etc...
110         <li>provide support for <a href="http://openocd.berlios.de/web/">OpenOCD</a>
111     </ul>
112 </section>
113
114 <section>
115     <h1>Projects and targets</h1>
116     <h2>Provide <a href="http://www.denx.de/wiki/U-Boot">U-Boot</a> mainline support</h2>
117     <ul>
118         <li>don't rely on Marvell HAL
119             <p>dual license (commercial or GPL)
120         <li>LaCie U-Boot stock limitations
121             <p>no 'saveenv' allowed, huge binary size
122         <li>more features
123             <p>USB boot, enhanced command line, ...
124     </ul>
125 </section>
126
127 <section>
128     <h1>Projects and targets</h1>
129     <h2>Provide <a href="http://kernel.org">Linux</a> mainline support</h2>
130     <ul>
131         <li>don't rely on Marvell HAL
132             <p>dual license (commercial or GPL)
133         <li>long term maintenance
134         <li>mostly drivers for boards and devices
135     </ul>
136     <note>
137         Linux mainline submission - Free software and enterprise
138     </note>
139 </section>
140
141 <section>
142     <h1>Projects and targets</h1>
143     <h2>Provide NAS modules</h2>
144     <p>Develop and package <a>generic</a> NAS modules</p>
145     <ul>
146         <li><a href="http://lacie-nas.org/doku.php?id=nastools">NAS system tools</a>
147         <p>handle GPIO buttons, GPIO LEDs, disk by slot naming, ...
148         <p>TODO: disk PM, fan, hardware sensors, ...
149         <li>configuration manager
150         <p>someone interested ?
151         <note>provide a GNU/Debian package</note>
152     </ul>
153 </section>
154
155 <section>
156     <h1>Projects and targets</h1>
157     <h2>Provide development/hacking tools</h2>
158     <ul>
159         <li><a href="http://lacie-nas.org/doku.php?id=clunc">clunc</a> (Client for LaCie U-Boot NetConsole)
160         <p>mainline DHCP
161         <li><a href="http://git.lacie-nas.org/?p=miniroot.git;a=summary">miniroot</a>
162         <p>build system
163     </ul>
164 </section>
165
166 <section>
167     <h1>Projects and targets</h1>
168     <h2>Provide development services</h2>
169     <ul>
170         <li>hosted inside a dedicated VM
171         <li><a href="http://lacie-nas.org">wiki</a>
172         <li><a href="http://git.lacie-nas.org">git repositories</a>
173         <li><a href="http://sequanux.org/cgi-bin/mailman/listinfo/lacie-nas">mailing List</a>
174         <li>IRC channel <a href="irc://irc.freenode.net/lacie-nas">#lacie-nas</a> @freenode.net
175         <li><a href="ftp://lacie-nas.org/">FTP</a>
176     </ul>
177 </section>
178
179 <section>
180     <h1>Projects and targets</h1>
181     <h2>Roadmap</h2>
182     <p>No roadmap, no deadlines, but tasks and priorities
183     <ul>
184         <li>complete low-level support
185         <li>installer for GNU/Debian
186         <p>network and USB
187         <note>two ways: miniroot and rootfs copy or Debian way</note>
188         <li>more NAS packages
189         <li>more documents (wiki)
190         <p>increase the knowledge database
191     </ul>
192     <note>to be merged with perspectives</note>
193 </section>
194
195 <section class=chapter>
196     <h1>Free a NS2 demo !</h1>
197 </section>
198
199 <section>
200     <h1>Free a NS2 demo !</h1>
201     <h2>Take board control with clunc</h2>
202 </section>
203
204 <section>
205     <h1>Free a NS2 demo !</h1>
206     <h2>Install U-boot mainline</h2>
207 </section>
208
209 <section>
210     <h1>Free a NS2 demo !</h1>
211     <h2>Startup an installation system</h2>
212     <h2>(powered by miniroot)</h2>
213 </section>
214
215 <section>
216     <h1>Free a NS2 demo !</h1>
217     <h2>Install GNU/Debian ARM</h2>
218 </section>
219
220 <section>
221     <h1>Free a NS2 demo !</h1>
222     <h2>Use SSH and log into the NS2 :)</h2>
223 </section>
224
225 <section class=chapter>
226     <h1>Perspectives</h1>
227 </section>
228
229 <section>
230     <h1>Perspectives</h1>
231     <h2>Device Tree early adopter</h2>
232 </section>
233
234 <section>
235     <h1>Perspectives</h1>
236     <h2>Free NAS distribution</h2>
237 <note>
238 - why Debian ?
239 - openwrt ?
240 </note>
241 </section>
242
243 <section class=chapter>
244     <h1>Questions ?</h1>
245 </section>
246
247 <section class=chapter>
248     <h1>Thanks</h1>
249 </section>
250
251 <!-- Your Style -->
252 <!-- Define the style of you presentation -->
253
254 <!-- Maybe a font from http://www.google.com/webfonts ? -->
255 <!-- link href='http://fonts.googleapis.com/css?family=Oswald' rel='stylesheet'-->
256 <style>
257   html { background-color: black; }
258   a { color: #FF0066; } a:hover {text-decoration: underline;}
259   footer { position: absolute; bottom: 50px; right: 50px; }
260   strong {color: #FF0066}
261   body {
262       font-family: 'Oswald', arial, serif;
263       background-color: white;
264       color: white;
265       font-size: 2em;
266       background: #1C1C1C;
267       background-image: -moz-radial-gradient(center 45deg, #333 0%, #1C1C1C 50%);
268       background-image: -moz-radial-gradient(center 45deg, #333 0%, #1C1C1C 50%);
269   }
270
271   note { display: none; }
272
273   /* Transition effect */
274   section {
275       -moz-transition: left 400ms linear 0s;
276       -webkit-transition: left 400ms linear 0s;
277       -o-transition: left 400ms linear 0s;
278       -ms-transition: left 400ms linear 0s;
279       transition: left 400ms linear 0s;
280   }
281   section { left: -150%; }
282   section[aria-selected] { left: 0; }
283   section[aria-selected] ~ section { left: +150% }
284
285   .title { background-color: black; }
286   .title h1 {
287       vertical-align: middle; margin: 0; text-align: center; display: block;
288       line-height: 400px;
289       font-size: 70px;
290   }
291
292   .chapter { background-color: black;}
293   .chapter h1 {
294       font-size: 50px;
295       line-height: 600px;
296       vertical-align: middle; margin: 0; text-align: center; display: block
297   }
298
299   h1 {
300       margin: 10px;
301       text-align: left;
302       font-size: 25px;
303       text-shadow: 0px -1px 0px #000;
304   }
305   h2 {
306       color: #FAE50B;
307       margin: 70px 0 0 0;
308       font-size: 40px;
309       text-align: center;
310   }
311   ul {
312       margin-top: 70px;
313       font-size: 35px;
314       text-align: left;
315       border-left: 4px solid white;
316       padding-left: 40px;
317       min-width: 310px;
318       margin-left: 50px;
319       display: inline-block;
320   }
321   li {
322       margin-top: 10px;
323   }
324   ul > li:first-child {
325       margin-top: 0;
326   }
327   q, p {
328       margin: 50px auto 0 auto;
329       text-align: left;
330       margin-left: 50px;
331   }
332   q:after {content: ""}
333   q:before {content: ""}
334   q {
335       display: block;
336       margin-top: 140px;
337   }
338   li p {
339       margin-top: 0;
340       font-size: 20px;
341       font-style: italic;
342   }
343   video {
344       position: absolute;
345       top: 210px;
346       width: 260px;
347       left: 445px;
348       box-shadow: 0 0 10px black;
349   }
350   #arrow {
351       position: absolute;
352       top: 165px;
353       left: 460px;
354       font-size: 100px;
355       color: white;
356
357   }
358   li {list-style-type: none}
359
360 </style>
361
362 <!-- {{{{ *****************  DZSlides CORE 2.0b1 *************************** -->
363 <!-- *********************************************************************** -->
364 <!-- *********************************************************************** -->
365 <!-- *********************************************************************** -->
366 <!-- *********************************************************************** -->
367
368 <!-- This block of code is not supposed to be edited, but if you want to change the behavior of the slides, feel free to hack it ;) -->
369
370 <!-- Default Style -->
371 <style>
372   * { margin: 0; padding: 0; }
373   details {display: none;}
374   body {
375     width: 800px; height: 600px;
376     margin-left: -400px; margin-top: -300px;
377     position: absolute; top: 50%; left: 50%;
378     overflow: hidden;
379   }
380   section {
381     position: absolute;
382     pointer-events: none;
383     width: 100%; height: 100%;
384   }
385   section[aria-selected] { pointer-events: auto;}
386   body {display: none}
387   body.loaded {display: block}
388 </style>
389
390 <script>
391   var friendWindows = [];
392   var idx = 1;
393   var slides;
394
395   /* main() */
396
397   window.onload = function() {
398     slides = document.querySelectorAll("body > section");
399     onhashchange();
400     setSlide();
401     document.body.className = "loaded";
402     onresize();
403   }
404
405   /* Handle keys */
406
407   window.onkeydown = function(e) {
408     // Don't intercept keyboard shortcuts
409     if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) {
410       return;
411     }
412     if ( e.keyCode == 37 // left arrow
413       || e.keyCode == 33 // page up
414     ) {
415       e.preventDefault();
416       back();
417     }
418     if ( e.keyCode == 39 // right arrow
419       || e.keyCode == 34 // page down
420     ) {
421       e.preventDefault();
422       forward();
423     }
424
425     if ( e.keyCode == 32) { // space
426         e.preventDefault();
427         toggleContent();
428     }
429   }
430
431   /* Adapt the size of the slides to the window */
432
433   window.onresize = function() {
434     var sx = document.body.clientWidth / window.innerWidth;
435     var sy = document.body.clientHeight / window.innerHeight;
436     var transform = "scale(" + (1/Math.max(sx, sy)) + ")";
437     document.body.style.MozTransform = transform;
438     document.body.style.WebkitTransform = transform;
439     document.body.style.OTransform = transform;
440     document.body.style.msTransform = transform;
441     document.body.style.transform = transform;
442   }
443   function getDetails(idx) {
444     var s = document.querySelector("section:nth-of-type("+ idx +")");
445     var d = s.querySelector("details");
446     return d?d.innerHTML:"";
447   }
448   window.onmessage = function(e) {
449     msg = e.data;
450     win = e.source;
451     if (msg === "register") {
452       friendWindows.push(win);
453       win.postMessage(JSON.stringify({method: "registered", title: document.title, count: slides.length}), document.location);
454       win.postMessage(JSON.stringify({method: "newslide", details: getDetails(idx), idx: idx}), document.location);
455       return;
456     }
457     if (msg === "back") back();
458     if (msg === "forward") forward();
459     if (msg === "toggleContent") toggleContent();
460     // setSlide(42)
461     var r = /setSlide\((\d+)\)/.exec(msg);
462     if (r) {
463         idx = r[1];
464         setSlide();
465     }
466   }
467
468   /* If a Video is present in this new slide, play it.
469      If a Video is present in the previous slide, stop it. */
470
471   function toggleContent() {
472     var s = document.querySelector("section[aria-selected]");
473     if (s) {
474         var video = s.querySelector("video");
475         if (video) {
476             if (video.ended || video.paused) {
477                 video.play();
478             } else {
479                 video.pause();
480             }
481         }
482     }
483   }
484
485   /* If the user change the slide number in the URL bar, jump
486      to this slide. */
487
488   window.onhashchange = function(e) {
489     var newidx = ~~window.location.hash.split("#")[1];
490     if (!newidx) newidx = 1;
491     if (newidx == idx) return;
492     idx = newidx;
493     setSlide();
494   }
495
496   /* Slide controls */
497
498   function back() {
499     if (idx == 1) return;
500     idx--;
501     setSlide();
502   }
503   function forward() {
504     if (idx >= slides.length) return;
505     idx++;
506     setSlide();
507   }
508   function setSlide() {
509     var old = document.querySelector("section[aria-selected]");
510     var next = document.querySelector("section:nth-of-type("+ idx +")");
511     if (old) {
512       old.removeAttribute("aria-selected");
513       var video = old.querySelector("video");
514       if (video) { video.pause(); }
515     }
516     if (next) {
517       next.setAttribute("aria-selected", "true");
518       var video = next.querySelector("video");
519       if (video) { video.play(); }
520     } else {
521       console.warn("No such slide: " + idx);
522       idx = 0;
523       for (var i = 0; i < slides.length; i++) {
524           if (slides[i].hasAttribute("aria-selected")) {
525               idx = i + 1;
526           }
527       }
528     }
529     window.location.hash = idx;
530     for (var i = 0; i < friendWindows.length; i++) {
531         friendWindows[i].postMessage(JSON.stringify({method: "newslide", details: getDetails(idx), idx: idx}), document.location);
532     }
533   }
534 </script>
535 <!-- vim: set fdm=marker: }}} -->