Skip to content

Instantly share code, notes, and snippets.

@pirj
Created April 29, 2014 18:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pirj/11408634 to your computer and use it in GitHub Desktop.
Save pirj/11408634 to your computer and use it in GitHub Desktop.
GNU/Linux и устройство на Rockchip 2918 / Хабрахабр
<!DOCTYPE html>
<!-- saved from url=(0032)http://habrahabr.ru/post/147793/ -->
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width = 1080">
<title>GNU/Linux и устройство на Rockchip 2918 / Хабрахабр</title>
<meta name="yandex-verification" content="67d46b975fa41645">
<meta name="description" content="Сначала немного предыстории. Небольшое продолжение истории с медиаплеером GV2B, описанным мной ранее ту/т. Напомню, что изначально бокс покупался не как Android приставка к телевизору, а как более...">
<meta name="keywords" content="linux, embedded">
<meta property="fb:app_id" content="444736788986613">
<meta property="og:type" content="article">
<meta property="og:url" content="http://habrahabr.ru/post/147793/">
<meta property="og:title" content="GNU/Linux и устройство на Rockchip 2918">
<meta property="og:image" content="http://habrastorage.org/storage2/71b/5f1/3fe/71b5f13fe3ef78d50a16340160b1c7ca.jpg">
<link rel="image_src" href="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/71b5f13fe3ef78d50a16340160b1c7ca.jpg"><meta property="og:image" content="http://habrastorage.org/storage2/38a/faa/d17/38afaad17e9dc309437f3ef5b7f370cc.jpg">
<link rel="image_src" href="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/38afaad17e9dc309437f3ef5b7f370cc.jpg"><meta property="og:image" content="http://habrastorage.org/storage2/907/764/098/907764098e723978abfe2d7f2ef785bf.jpg">
<link rel="image_src" href="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/907764098e723978abfe2d7f2ef785bf.jpg"><meta property="og:image" content="http://habrastorage.org/storage2/9ec/236/3f2/9ec2363f2879965fad19c0137fd0ac6e.jpg">
<link rel="image_src" href="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/9ec2363f2879965fad19c0137fd0ac6e.jpg"><meta property="og:image" content="http://habrastorage.org/storage2/07c/0b7/67d/07c0b767da79fec81be11ec99fa84ea2.jpg">
<link rel="image_src" href="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/07c0b767da79fec81be11ec99fa84ea2.jpg">
<meta property="og:description" content="Сначала немного предыстории. Небольшое продолжение истории с медиаплеером GV2B, описанным мной ранее ту/т. Напомню, что изначально бокс покупался не как Android...">
<meta name="twitter:card" content="summary">
<meta name="twitter:site" content="@habrahabr">
<script type="text/javascript" async="" src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/watch.js"></script><script async="" src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/analytics.js"></script><script type="text/javascript">function adriver(a,b){};</script>
<link href="http://habrahabr.ru/styles/1398441886/all.css" rel="stylesheet" media="all">
<link href="http://habrahabr.ru/styles/1398441886/_parts/posts.css" rel="stylesheet" media="all">
<link href="http://habrahabr.ru/styles/1398441886/_parts/comments.css" rel="stylesheet" media="all">
<link href="http://habrahabr.ru/styles/1398441886/forms.css" rel="stylesheet" media="all">
<link href="http://habrahabr.ru/styles/1398441886/highlight.css" rel="stylesheet" media="all">
<link href="http://habrahabr.ru/styles/1398441886/printer.css" rel="stylesheet" media="print">
<script src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/all.js"></script><style type="text/css"></style>
<script type="text/javascript" src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/jquery.form.js"></script>
<script type="text/javascript" src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/jquery.cookie.js"></script>
<script type="text/javascript" src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/wysiwyg.js"></script>
<script type="text/javascript" src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/highlight.js"></script>
<script type="text/javascript" src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/jquery-ui-highlight.js"></script>
<script type="text/javascript" src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/posts.js"></script>
<script type="text/javascript" src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/comments.js"></script>
<script type="text/javascript" src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/all(1).js"></script>
<script type="text/javascript">
var crtg_nid="2580";
var crtg_cookiename="cto_rtt";
var crtg_varname="crtg_content";
function crtg_getCookie(c_name){
var i,x,y,ARRCookies=document.cookie.split(";");
for(i=0;i<ARRCookies.length;i++){
x=ARRCookies[i].substr(0,ARRCookies[i].indexOf("="));
y=ARRCookies[i].substr(ARRCookies[i].indexOf("=")+1);
x=x.replace(/^\s+|\s+$/g,"");
if(x==c_name){return unescape(y);}
}
return'';
}
var crtg_content = crtg_getCookie(crtg_cookiename);var crtg_rnd=Math.floor(Math.random()*99999999999);
var crtg_url=location.protocol+'//rtax.criteo.com/delivery/rta/rta.js?netId='+escape(crtg_nid);crtg_url+='&cookieName='+escape(crtg_cookiename);crtg_url+='&rnd='+crtg_rnd;crtg_url+='&varName=' + escape(crtg_varname);
var crtg_script=document.createElement('script');crtg_script.type='text/javascript';crtg_script.src=crtg_url;crtg_script.async=true;
if(document.getElementsByTagName("head").length>0)document.getElementsByTagName("head")[0].appendChild(crtg_script);
else
if(document.getElementsByTagName("body").length>0)document.getElementsByTagName("body")[0].appendChild(crtg_script);
</script><script type="text/javascript" src="http://rtax.criteo.com/delivery/rta/rta.js?netId=2580&cookieName=cto_rtt&rnd=47397402626&varName=crtg_content" async=""></script>
<script>
var N = 5;
var ar_duo1 = Math.floor(Math.random()*N+1);
</script>
<script type="text/javascript" src="http://habrahabr.ru/javascripts/1398441886/adriver.core.2.js"></script>
<link title="Хабрахабр / Комментарии к публикации «GNU/Linux и устройство на Rockchip 2918»" type="application/rss+xml" rel="alternate" href="http://habrahabr.ru/rss/post/147793/">
<script type="text/javascript">
var user_type = 'habrauser';
var username = 'philpirj';
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-726094-1', 'auto' );
ga('require', 'displayfeatures');
ga('set', 'dimension1', user_type); // user type - guest/readonly/habrauser
ga('set', 'dimension2', username); // username
ga('send', 'pageview');
</script>
<script type="text/javascript">
var pp_gemius_identifier = new String('p8zr4.NqiIZJgD2cnP2s5fWWnIQFHrAvZ280B955gIr.f7');
</script>
<script src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/gemius.js"></script>
<!-- Yandex.Metrika counter -->
<script type="text/javascript">
(function (d, w, c) {
(w[c] = w[c] || []).push(function() {
try {
w.yaCounter24049213 = new Ya.Metrika({id:24049213,
webvisor:true,
clickmap:true,
trackLinks:true,
accurateTrackBounce:true});
} catch(e) { }
});
var n = d.getElementsByTagName("script")[0],
s = d.createElement("script"),
f = function () { n.parentNode.insertBefore(s, n); };
s.type = "text/javascript";
s.async = true;
s.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//mc.yandex.ru/metrika/watch.js";
if (w.opera == "[object Opera]") {
d.addEventListener("DOMContentLoaded", f, false);
} else { f(); }
})(document, window, "yandex_metrika_callbacks");
</script>
<noscript>&lt;div&gt;&lt;img src="//mc.yandex.ru/watch/24049213" style="position:absolute; left:-9999px;" alt="" /&gt;&lt;/div&gt;</noscript>
<!-- /Yandex.Metrika counter -->
</head>
<body>
<script type="text/javascript">
$(function() {
// возвращает cookie с именем name, если есть, если нет, то undefined
function getBNCookie(name) {
var matches = document.cookie.match(new RegExp(
"(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
));
return matches ? decodeURIComponent(matches[1]) : undefined;
}
function setBNCookie(name, value, options) {
options = options || {};
var expires = options.expires;
if (typeof expires == "number" && expires) {
var d = new Date();
d.setTime(d.getTime() + expires*1000);
expires = options.expires = d;
}
if (expires && expires.toUTCString) {
options.expires = expires.toUTCString();
}
value = encodeURIComponent(value);
var updatedCookie = name + "=" + value;
for(var propName in options) {
updatedCookie += "; " + propName;
var propValue = options[propName];
if (propValue !== true) {
updatedCookie += "=" + propValue;
}
}
document.cookie = updatedCookie;
}
var bntop = $('.apps_bn');
var vbn = parseInt(getBNCookie('vbn')) || 0;
if (vbn < 3)
{
bntop.show();
setBNCookie('vbn', vbn + 1, { expires: 31556926, path: '/', domain: 'habrahabr.ru' });
}
if (/Android/i.test(navigator.userAgent))
{
$('.app_android', bntop).show();
}
else if (/iPhone/i.test(navigator.userAgent))
{
$('.app_iphone', bntop).show();
}
else if (/IEMobile|MSIE/i.test(navigator.userAgent))
{
$('.app_wp', bntop).show();
}
else
{
$('.app_anything', bntop).show();
}
});
</script>
<div class="apps_bn">
<div class="app_iphone">
<a href="http://ad.adriver.ru/cgi-bin/click.cgi?sid=1&ad=463784&bt=21&pid=1620360&bid=3322408&bn=3322408&rnd=1514420851" target="_blank"><img src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/app_ios.jpg" alt="Приложение в твоем смартфоне"></a>
</div>
<div class="app_wp">
<a href="http://ad.adriver.ru/cgi-bin/click.cgi?sid=1&ad=463784&bt=21&pid=1620360&bid=3322414&bn=3322414&rnd=717208825" target="_blank"><img src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/app_wstore.jpg" alt="Приложение в твоем смартфоне"></a>
</div>
<div class="app_android">
<a href="http://ad.adriver.ru/cgi-bin/click.cgi?sid=1&ad=463784&bt=21&pid=1620360&bid=3322404&bn=3322404&rnd=1516395565" target="_blank"><img src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/app_googleplay.jpg" alt="Приложение в твоем смартфоне"></a>
</div>
<div class="app_anything" style="display: block;">
<a href="http://ad.adriver.ru/cgi-bin/click.cgi?sid=1&ad=463784&bt=21&pid=1620336&bid=3322335&bn=3322335&rnd=586566606" target="_blank"><img src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/habraapps.jpg" alt="Приложение в твоем смартфоне"></a>
</div>
</div>
<div class="wrapper">
<div id="layout">
<div id="header">
<div class="userpanel silver">
<div class="top">
<a href="http://habrahabr.ru/users/philpirj/" class="username dark">philpirj</a>
<a href="https://habrahabr.ru/auth/settings/" class="nav-settings">настройки</a>
<a href="http://habrahabr.ru/logout/philpirj/98284283/">выйти</a>
</div>
<div class="bottom">
<a href="http://habrahabr.ru/tracker/">трекер</a>
<a href="http://habrahabr.ru/tracker/" class="count">+240</a>
<a href="http://habrahabr.ru/conversations/">диалоги</a>
<a href="http://habrahabr.ru/users/philpirj/favorites/">избранное</a>
</div>
<div class="charge" id="charge_string">
У вас 137 голосов за карму/топики и 275 за комментарии
</div>
</div>
<a class="logo " href="http://habrahabr.ru/feed/posts/" title="На главную страницу"></a>
<div class="search">
<form id="search_form" name="search" method="get" action="http://habrahabr.ru/search/">
<input type="submit" value="">
<input type="text" name="q" x-webkit-speech="" speech="" tabindex="1" autocomplete="off">
</form>
</div>
<div class="main_menu">
<a href="http://habrahabr.ru/feed/posts/">лента</a><a href="http://habrahabr.ru/posts/top/" class="active">посты</a><a href="http://toster.ru/?_aa=press_anykey">q&amp;a</a><a href="http://habrahabr.ru/events/coming/">события</a><a href="http://habrahabr.ru/hubs/">хабы</a><a href="http://habrahabr.ru/companies/">компании</a>
<div class="banner_special">
<div id="adriver_banner_318167982"></div>
<script type="text/javascript">
$(function(){
var keyword = '';
if (typeof crtg_content !== 'undefined' && crtg_content) { keyword = crtg_content; }
var custom = {4:ar_duo1};
custom[1] = 'hardware';
custom[2] = 'gadgets';
custom[3] = 'linux';
new adriver("adriver_banner_318167982", {sid: 176776, bt: 52, bn: 4, custom: custom, keyword: keyword});
}());
</script>
</div>
</div>
</div>
<div class="content_left">
<div class="post shortcuts_item" id="post_147793">
<div class="published">14 июля 2012 в 05:05</div>
<h1 class="title">
<span class="post_title">GNU/Linux и устройство на Rockchip 2918</span>
<a title="Редактировать пост" class="edit" href="http://habrahabr.ru/topic/edit/147793/"><img src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/topic_edit.gif" width="16" height="16" alt="Редактировать"></a>
</h1>
<div class="hubs">
<a href="http://habrahabr.ru/hub/hardware/" class="hub subscribed" title="Вы подписаны на этот хаб">Железо</a>,
<a href="http://habrahabr.ru/hub/gadgets/" class="hub subscribed" title="Вы подписаны на этот хаб">Гаджеты. Устройства для гиков</a>,
<a href="http://habrahabr.ru/hub/linux/" class="hub subscribed" title="Вы подписаны на этот хаб">Linux</a><span class="profiled_hub" title="Профильный хаб">*</span>
</div>
<div class="content html_format">
Сначала немного предыстории. Небольшое продолжение истории с медиаплеером GV2B, описанным мной ранее <a href="http://habrahabr.ru/post/145601/">ту/т</a>. Напомню, что изначально бокс покупался <b>не</b> как Android приставка к телевизору, а как более мощная замена Raspberry Pi, на который я оставил заявку ещё в апреле, но приедет который только в августе. А GV2B оказался у меня в руках через 8 дней после заказа, всего за $100 и с полным комплектом кабелей (что всего на $5 дороже, чем комплект Raspberry Pi с зарядкой, шнурами и корпусом).<br>
Успокою злопыхателей из моего предыдущего поста, что Youtube и другие приложения, установленные с Play, заработали замечательно, и больше никаких недостатков у устройства обнаружено не было.<br>
<br>
Совсем недавно появилось <a href="http://habrahabr.ru/post/146436/">пара</a> <a href="http://habrahabr.ru/post/145930">топиков</a>, в которых рассказывалось, как на ARM устройства удалось поставить Puppy Linux, Arch Linux и Ubuntu. Это уникальная особенность Allwinner A10, недооценить которую тяжело, но всё-таки система физически запускается с SD карты, а не встроенного флеша. Я начал активнее работать над вопросом, и наткнулся аж на три способа прошить что-либо во флеш память устройства, что обнадёживает и, возможно открывает лазейку для заливки туда полноценного GNU/Linux. Самонадеянно замечу, что это уже следующий шаг за банальным запуском чуть допиленного образа с SD карты.<br>
<br>
<h4>Цель</h4><br>
— Установить на устройство ядро Linux. Желательно самое новое. Либо самое новое из тех, которое содержит все драйвера, специфические для устройства;<br>
— Поставить GNU;<br>
— Поставить окружение рабочего стола;<br>
— Сделать резервную копию, чтобы устройство можно было вернуть в изначальное состояние, если что пойдёт не так;<br>
— Хорошенько повеселиться со сложной задачей (сравнимо с установкой первых версий USB загрузчиков на Wii и прохождению NetHack или Dwarf Fortress).<br>
<br>
<h4>Средства</h4><br>
Устройство GV-2B от неизвестного китайского <a href="http://www.enybox.com/En">производителя</a>, на базе Rockchip 2918 (сокращённо RK29) (CPU ARM Cortex A8 1ГГц + GPU Vivante GC800 600МГц), с 4ГБ флеш памяти, 512МБ оперативной памяти и неплохим количеством разьёмов.<br>
SD карта 16ГБ class 10.<br>
PC с Arch Linux.<br>
Клавиатура.<br>
Монитор.<br>
Шнур HDMI-DVI для подключения монитора.<br>
Куча USB шнуров, переходников итп.<br>
<br>
<h4>Предостережение и самобичевание</h4><br>
Наверняка многие из читателей сделали бы то, что описано в топике или хотя бы какую-то определённую часть, быстрее и лучше, но никаких упоминаний о таком подвиге я в просторах сети не нашёл. Топик содержит много практики и совсем немного теории, лишь самое необходимое, чтобы понять о чём идёт речь и что происходит (признаюсь честно, мне и самому теории в описанных областях явно не хватает). С академической точки зрения тянет на трёхчасовую лабораторную работу. Также хочу сказать, что впервые занимаюсь всем этим, если исключить подключение диска с предварительно установленным на настольком компьютере Ubuntu к PC104 x86-совместимому одноплатнику.<br>
<a name="habracut"></a><br>
<h3>Выбор устройства</h3><br>
В <a href="http://www.enybox.com/En/product/class/?119.html">модельном ряду G</a> около двадцати разных устройств, на разных процессорах, с разным количеством разъёмов, но примерно одинакового функционала.<br>
<br>
Поначалу я убивался по поводу того, что не взял устройство на Allwinner A10, но после прочтения нескольких отзывов по поводу <a href="http://habrahabr.ru/post/145930/#comment_4908850">открытости</a> исходников ядра к нему, я понял, что с Rockchip ситуация не намного хуже. <br>
<br>
Был вариант заказать устройство того же модельного ряда, но уже с Cortex A9, а именно AmLogic 8726-M, но каких-то чрезвычаных преимуществ перед Rockchip 2918 он не имеет, а с иходным кодом для последних чипов, судя по <a href="http://openlinux.amlogic.com/wiki/index.php/OpenLinux/Platform_Info">сайту AmLogic</a>, всё тоже печально.<br>
<br>
<h3>Методы</h3><br>
Итак, было найдено три способа обновить прошивку устройства (содержание той самой 4хгигабайтной флеш памяти).<br>
<br>
<a href="http://www.maxq.com.my/index.php/support/media-player-1635/firmware-update-24542/category/16-maxq-r7">Первый</a> — от производителя, использующего одну из OEM моделей линейки GV, не cработал, да оно и хорошо, потому что их прошивка предназначается для немного другого устройства, к которого три USB порта, и разница между ними настолько серьёзна, что обычно прошивка оборачивается превращением устройства в кирпич.<br>
<br>
Остались два. Второй, от хакера с <a href="http://androidforums.com/google-tv/506298-rk2918-android-tv-box-4x-usb-rooted-firmware-manual.html#post3996093">AndroidForums</a>, заключается в том, что нужно наживать на дополнительную, вторую кнопку reset, находящуюся внутри коробки, удерживая её держать кнопку включения в течение нескольких секунд. Этот способ открыл интересные особенности, а именно меню Android system recovery utility v1.3.37 (очевидно <a href="http://ru.wikipedia.org/wiki/Leet">1337</a>), предлагающее на выбор:<br>
— Reboot system now<br>
— Factory reset<br>
— SYSTEM recover<br>
— Update from SDCARD<br>
— Update from uDisk<br>
— Factory test<br>
<br>
<img src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/71b5f13fe3ef78d50a16340160b1c7ca.jpg"><br>
<br>
К огромному сожалению, клавиатура, будучи подключенной к устройству, и отлично работающая уже после загрузки Android, на меню system recovery никакого воздействия не оказывала, а из трёх имеющихся на плате кнопок (power, reset, ещё reset) на меню действовала толко одна — первый reset, который то ли приводил он к выбору активного по умолчанию пункта Reboot system now, а то ли и просто работал по прямому назначению. Остальные кнопки курсор, к сожалению, не двигали. Способ заключался именно в том, чтобы залить прошивку с карты памяти SD, что никак и не получалось.<br>
<br>
Отформатировав SD карту в fat32, я залил на неё с трудом скачанный с файлопомойки (боже, неужели они не слышали о Dropbox'е?) скачанный апдейт для Android'а. При нормальной загрузке Android ругался на то, что на SD карте находится неправильный update.img. Но заливать его я всё равно не спешил, ведь резервные копии делают не только трусы, а на форумах зачастую соощалось, что заливка того или иного update.img, который у одного автора заработал, на аналогичном устройстве приводило к превращению в кирпич у другого автора.<br>
<br>
Третий <s>сын</s><a href="http://androidforums.com/google-tv/505559-flashing-android-tv-box-one-four-usb.html">способ</a> оказался ближе к тому, что я собирался сделать. Заключался он в подключении устройства к компьютеру с помощью USB шнура.<br>
<img src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/38afaad17e9dc309437f3ef5b7f370cc.jpg"><br>
Поначалу очень смущало то, что в режиме system recovery устройство никак не определялось с компьютера, несмотря на то, что все нужные провода я подключал куда надо (и даже куда не надо, направляя встречное питание 4.57В и 5.08В по USB, что по счастью не обернулось никакими последствиями). Как позже выяснилось, так и должно быть, ибо протокол у них там свой, и разница с подключением внешних носителей существенна.<br>
<img src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/907764098e723978abfe2d7f2ef785bf.jpg"><br>
Под Windows обнаружилась программа Rockchip Flasher tool, которую язык никак не поворачивается назвать замечательной, потому что сделана она ужасно и единственное, что умеет делать — это прошивать новые update.img. Но мне нужно было не только прошить, но и скачать имеющуюся, на случай того, если вдруг что-то пойдёт не так, поэтому от творчества китайских программистов пришлось отказаться.<br>
<br>
С ножками, кстати, нужно быть осторожнее.<br>
<img src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/9ec2363f2879965fad19c0137fd0ac6e.jpg"><br>
<br>
<h3>Резервное копирование</h3><br>
Хочется сохранить всё, что хранится во флеш памяти для возможности восстановления всего к изначальному варианту, если что пойдёт не так. Для этого существует несолько разных методов.<br>
<br>
<a href="http://matrixrewriter.com/android/">Titanium Backup</a>. Android приложение, с помощью которого можно сделать снимок системных разделов и скопировать его на SD карту. Всё бы хорошо, но устройство для этого необходимо рутировать (получить административные привилении). Для того, чтобы рутировать устройство на Android 2.3.1, Universal Androot уже не подходит, и его автор предлагает на выбор воспользоваться <a href="http://unrevoked.com/">Unrevoked</a>, который подходит только для телефонов HTC, или <a href="http://forum.xda-developers.com/showthread.php?t=803682">SuperOneClick</a>, который вроде бы всем хорош, но для того, чтобы зарутировать устройство требует его подключения шнуром к компьютеру с Windows. Всё бы и неплохо, но он скачивает прошивку, добавляет туда какие-то файлы и заливает обратно. Менять прошивку для того, чтобы сделать её резервную копию — это маразм.<br>
<br>
Оставалось воспользоватся <a href="http://developer.android.com/tools/help/adb.html">Android Debug Bridge</a> из Android SDK, которая не факт что заработала бы с этим конкретным устройством, и тянущая за собой немалое количество зависимостей, которых мне совсем не хотелось. Ко всему прочему собирать всё это нужно было из исходников (читай AUR для Arch Linux).<br>
<br>
Уже было взгрустнув, я вдруг обнаружил замечательную утилиту <a href="https://github.com/OlegKyiashko/RK29kitchen">RK29kitchen</a>, аннонсированную <a href="http://4pda.ru/forum/lofiversion/index.php?t337784-0.html">здесь</a> которая, судя по описанию, впитала в себя ряд других не менее замечательных утилит от авторов, которые разобрали хитрый протокол общения устройств по USB, и чуть менее хитрый файл с таблицей разделов.<br>
<br>
<h4>Запуск</h4><br>
Оказалось не так просто. Оказывается, устройство должно быть не в system recovery режиме, а в выключенном состоянии, но обязательно с подключенным питанием. Проблема в том, что оно пытается включиться, как только чуствует, что поключено по USB. Но с этим можно совладать. Удерживая обе кнопки reset 5 секунд, отпускаю сначала вненшюю, а через 3 секунды и внутреннюю. Запускаю и стараюсь быть терпеливым.<br>
<pre><code class="actionscript">$ ./flashdump.sh
Check that your tablet <span class="keyword">is</span> <span class="keyword">in</span> the firmware flash mode and connected to computer
rkflashtool: info: <span class="class"><span class="keyword">interface</span> <span class="title">claimed</span>
<span class="title">rkflashtool</span>: <span class="title">info</span>: <span class="title">reading</span> <span class="title">flash</span> <span class="title">memory</span> <span class="title">at</span> <span class="title">offset</span> 0<span class="title">x00000100</span>
<span class="title">unpacking</span>...<span class="title">OK</span>
<span class="title">Dumping</span> <span class="title">misc</span> (<span class="title">rkflashtool29</span> <span class="title">r</span> 0<span class="title">x00002000</span> 0<span class="title">x00002000</span> )
<span class="title">Dumping</span> <span class="title">kernel</span> (<span class="title">rkflashtool29</span> <span class="title">r</span> 0<span class="title">x00004000</span> 0<span class="title">x00004000</span> )
<span class="title">Dumping</span> <span class="title">boot</span> (<span class="title">rkflashtool29</span> <span class="title">r</span> 0<span class="title">x00008000</span> 0<span class="title">x00002000</span> )
<span class="title">Dumping</span> <span class="title">recovery</span> (<span class="title">rkflashtool29</span> <span class="title">r</span> 0<span class="title">x0000a000</span> 0<span class="title">x00004000</span> )
<span class="title">Dumping</span> <span class="title">system</span> (<span class="title">rkflashtool29</span> <span class="title">r</span> 0<span class="title">x0000e000</span> 0<span class="title">x00080000</span> )
<span class="title">Dumping</span> <span class="title">backup</span> (<span class="title">rkflashtool29</span> <span class="title">r</span> 0<span class="title">x0008e000</span> 0<span class="title">x00082000</span> )
</span></code></pre><br>
Немного смущает то, что в исходнике flashdump'а написано:<br>
<pre><code class="nginx"><span class="title">rkflashtool29</span> r <span class="number">0</span> 0x200
</code></pre><br>
А в выводе:<br>
<pre><code class="sql">reading flash memory at off<span class="operator"><span class="keyword">set</span> <span class="number">0x00000100</span>
</span></code></pre><br>
Не совсем понятно, с какого же именно смещения читается parm.img.<br>
<br>
Итак, 5-10 минут и <s>золотой ключик</s> у меня есть образа флеш памяти целиком и по отдельности всех разделов:<br>
<pre><code class="profile">$ ls -l flashdump/Image/
<span class="number">4194304</span> Jun <span class="number">29</span> <span class="number">18</span>:<span class="number">15</span> <span class="filename">boot.img
8388608 Jun 29 18</span>:<span class="number">15</span> <span class="filename">kernel.img
4194304 Jun 29 18</span>:<span class="number">14</span> <span class="filename">misc.img
8388608 Jun 29 18</span>:<span class="number">16</span> <span class="filename">recovery.img
268435456 Jun 29 18</span>:<span class="number">18</span> <span class="filename">system.img
$ ls -l flashdump
272629760 Jun 29 18</span>:<span class="number">21</span> <span class="filename">backup.img
4096 Jun 29 18</span>:<span class="number">16</span> Image
<span class="number">583</span> Jun <span class="number">29</span> <span class="number">18</span>:<span class="number">13</span> parameter
<span class="number">262144</span> Jun <span class="number">29</span> <span class="number">18</span>:<span class="number">13</span> <span class="filename">parm.img
</span></code></pre><br>
Что же произошло? Если покопаться на форумах и в исходниках RK29kitchen, становится понятно, что я только что прочёл содержание флеш памяти устройства, начиная с таблицы разделов, которую нам разобрали по полочкам и записали в текстовом файле parameter, и используя её, записали по раздельности таблицы разделов.<br>
Вот <a href="http://www.freaktab.com/showthread.php?287-RockChip-ROM-Building-Tips-and-Tricks-by-Finless">тут</a> было найдено неимоверное количество информации, относящейся конкретно к обновлению флеш памяти устройств на RK2918. Все описанные устройства это таблетки, и подключать их к компьютеру для обновления несколько проще (учитывая встроенный порт microUSB, он же USB OTG).<br>
<br>
Вот так выглядит файл parameter:<br>
<pre><code class="avrasm"><span class="label">FIRMWARE_VER:</span><span class="number">1.2</span><span class="number">.3</span>
<span class="label">MACHINE_MODEL:</span>SUNVEK
<span class="label">MACHINE_ID:</span><span class="number">007</span>
<span class="label">MANUFACTURER:</span>rock-chips
<span class="label">MAGIC:</span> <span class="number">0x5041524B</span>
<span class="label">ATAG:</span> <span class="number">0x60000800</span>
<span class="label">MACHINE:</span> <span class="number">2929</span>
<span class="label">CHECK_MASK:</span> <span class="number">0x80</span>
<span class="label">KERNEL_IMG:</span> <span class="number">0x60408000</span>
<span class="label">CMDLINE:</span> console=ttyS1,<span class="number">115200</span>n8n androidboot<span class="preprocessor">.console</span>=ttyS1 init=/init initrd=<span class="number">0x62000000</span>,<span class="number">0x300000</span> mtdparts=rk29xxnand:<span class="number">0x00002000</span><span class="localvars">@0</span>x00002000(misc),<span class="number">0x00004000</span><span class="localvars">@0</span>x00004000(kernel),<span class="number">0x00002000</span><span class="localvars">@0</span>x00008000(boot),<span class="number">0x00004000</span><span class="localvars">@0</span>x0000A000(recovery),<span class="number">0x00080000</span><span class="localvars">@0</span>x0000E000(system),<span class="number">0x00082000</span><span class="localvars">@0</span>x0008E000(backup),<span class="number">0x0003a000</span><span class="localvars">@0</span>x00110000(cache),<span class="number">0x00100000</span><span class="localvars">@0</span>x0014a000(userdata),<span class="number">0x00002000</span><span class="localvars">@0</span>x0024a000(kpanic),-<span class="localvars">@0</span>x0024c000(user)
</code></pre><br>
В последней строке с помощью шестнадцатиричной системы записаны длины, начала разделов, а в скобочках их наименование. Пропущен обязательный раздел, в котором собственно хранится сама таблица разделов. Попробую расшифровать.<br>
<br>
Размер считанного блока parameter — 0x200 (из исходных файлов RK29kitchen), это 512, а размер файла 262144 байт. Получается что размер условного блока это 262144/512, то есть 512 байт, что подтверждает и документация к rkflashtool.<br>
Что занимает память между 0x200 и 0x2000, а это целых 3.75МБ — загадка.<br>
<br>
<table>
<tbody><tr>
<td>parameter (таблица разделов)</td>
<td>256КБ</td>
</tr>
<tr>
<td>misc</td>
<td>4МБ</td>
</tr>
<tr>
<td>kernel</td>
<td>8МБ</td>
</tr>
<tr>
<td>boot</td>
<td>4МБ</td>
</tr>
<tr>
<td>recovery</td>
<td>8МБ</td>
</tr>
<tr>
<td>system</td>
<td>256МБ</td>
</tr>
<tr>
<td>backup</td>
<td>260МБ</td>
</tr>
<tr>
<td>cache</td>
<td>116МБ</td>
</tr>
<tr>
<td>userdata</td>
<td>512МБ</td>
</tr>
<tr>
<td>kpanic</td>
<td>4МБ</td>
</tr>
<tr>
<td>user</td>
<td>всё оставшееся место</td>
</tr>
</tbody></table><br>
<h3>Препарация</h3><br>
Теперь у меня в руках набор img файлов, образов диска, которые я скачал. Интересно, что внутри. Из ранее полученных знаний мне известно, что для записи файлов, не предназначающихся для изменения (как то ядро ОС) на флеш память делают в формате <a href="http://ru.wikipedia.org/wiki/Cramfs">cramfs</a>, но некоторые особо хитрые китайцы умудряются то добавлять к этим образам ещё заголовки и подвалы, то использовать gzip, видимо, пытаясь затруднить чтение своих и создание собственных образов.<br>
<br>
Именно это чудо, прозванное в народе cra<b>p</b>fs, я и увидел:<br>
<pre><code class="smalltalk"><span class="char">$ </span>sudo mount -t cramfs <span class="class">Image</span>/boot.img /media/cramfs
<span class="method">mount:</span> wrong fs type, bad option, bad superblock on /dev/loop0
<span class="char">$ </span>dmesg |tail
[<span class="number">41549.071136</span>] <span class="method">cramfs:</span> wrong magic
</code></pre><br>
При попытке подключения тем же RK29kitchen'ом результат примерно тот же:<br>
<pre><code class="vhdl">/sbin/e2fsck: Bad magic number <span class="keyword">in</span> super-<span class="keyword">block</span> <span class="keyword">while</span> trying <span class="keyword">to</span> <span class="keyword">open</span> system.img
</code></pre><br>
Нужно обрезать первые 8 байт из img файла:<br>
<pre><code class="avrasm">$ dd if=boot<span class="preprocessor">.img</span> of=bootimg<span class="preprocessor">.gz</span> skip=<span class="number">8</span> bs=<span class="number">8</span> count=<span class="number">20000000</span>
<span class="number">524280</span>+<span class="number">0</span> records <span class="keyword">in</span>
<span class="number">524280</span>+<span class="number">0</span> records <span class="keyword">out</span>
<span class="number">4194296</span> bytes (<span class="number">4.2</span> MB) copied, <span class="number">4.41275</span> s, <span class="number">950</span> kB/s
</code></pre><br>
Отлично. Мне попался тот самый случай, когда файлы пакуются gzip'ом, а потом к ним добавляется нелепый заголовок и подвал, в которых находится CRC и, наверное, ещё что-то.<br>
<br>
Дальше — интереснее:<br>
<pre><code class="objectivec">$ mkdir myboot
$ cd myboot
$ gunzip &lt; ../bootimg<span class="variable">.gz</span> | sudo cpio -i --make-directories
$ ls
data dev init_battery<span class="variable">.sh</span> init<span class="variable">.rc</span> proc sbin system ueventd<span class="variable">.rc</span>
<span class="keyword">default</span><span class="variable">.prop</span> init init<span class="variable">.goldfish</span><span class="variable">.rc</span> init<span class="variable">.rk29board</span><span class="variable">.rc</span> rk29xxnand_ko<span class="variable">.ko</span> sys ueventd<span class="variable">.goldfish</span><span class="variable">.rc</span> ueventd<span class="variable">.rk29board</span><span class="variable">.rc</span>
</code></pre><br>
Там внутри куча файлов, не слишком понятно, нужных или нет. Собирать это дело в обратном порядке нужно ещё аккуратнее, нужно сбросить даты на файлах:<br>
<pre><code class="brainfuck"><span class="comment">$</span> <span class="comment">find</span> <span class="string">.</span> <span class="literal">-</span><span class="comment">exec</span> <span class="comment">touch</span> <span class="literal">-</span><span class="comment">d</span> <span class="comment">"1970</span>-<span class="comment">01</span>-<span class="comment">01</span> <span class="comment">01:00"</span> <span class="comment">{}</span> <span class="comment">\;</span>
<span class="comment">$</span> <span class="comment">find</span> <span class="string">.</span> <span class="comment">!</span> <span class="literal">-</span><span class="comment">name</span> <span class="comment">"</span>.<span class="comment">"</span> <span class="comment">|</span> <span class="comment">sort</span> <span class="comment">|</span> <span class="comment">cpio</span> <span class="literal">-</span><span class="comment">oa</span> <span class="literal">-</span><span class="comment">H</span> <span class="comment">newc</span> <span class="comment">|</span> <span class="comment">gzip</span> <span class="literal">-</span><span class="comment">n</span> &gt;<span class="string">.</span><span class="string">.</span><span class="comment">/customboot</span>.<span class="comment">gz</span>
<span class="comment">$</span> <span class="comment">cd</span> <span class="string">.</span><span class="string">.</span>
<span class="comment">$</span> <span class="comment">rkcrc</span> <span class="literal">-</span><span class="comment">k</span> <span class="comment">customboot</span>.<span class="comment">gz</span> <span class="comment">customboot</span>.<span class="comment">img</span>
</code></pre><br>
<br>
Для сборки образов традиционно использовуется cpio. По сравнению с более ходовым tar, cpio имеет ряд преимуществ, углубляться в <a href="http://stackoverflow.com/a/4293196/202914">которые</a> я в этом топике не хочу.<br>
<br>
И вот, у меня на руках собраный своими руками customboot.img, который можно залить обратно в устройство.<br>
С kernel.img такая препарация не проходит.<br>
<br>
А вот что вышло с system.img:<br>
<pre><code class="ruby"><span class="variable">$ </span>sudo mount -t cramfs system.img /media/cramfs
<span class="variable">$ </span>ls /media/cramfs/
app bin build.prop etc fonts framework lib media tts usr xbin
</code></pre><br>
В папке app нашлись Android'овские APK файлы (архив исполняемого файла). То есть можно туда добавить какие-нибудь новые программы или удалить те, которые есть, включая какой-нибудь назойливый и надоевший. В bin можно добавить su и busybox, что как я понимаю, достаточно для рутирования устройства. В etc поменять конфигурацию. И так далее. В теории. На практике придётся несколько повозиться с тем, что в примонтированный образ cramfs просто так записать ничего не получится.<br>
<br>
Ну, кое-что препарировать удалось.<br>
<br>
<h3>Новый образ</h3><br>
Было бы, конечно, здорово попробовать загрузиться с SD карты, загрузив туда заботливо приготовленный кем-нибудь образ, но такой возможности у RK29 нет, поэтому придётся создавать образ, и прошивать его прямо во флеш память устройства. Уповаю на то, что есть резервная копия.<br>
<br>
Образы, препарированные в предыдущем параграфе, все были в разных форматах, а именно:<br>
boot.img был в формате cra<b>p</b>fs, а остальные, которые уже загружаются после него — в более удобоваримых. Отсюда предположу, что танцы с бубном предстоят только с этим boot.img, а с остальными образами всё будет более-менее обыденно.<br>
<br>
Освежу память, напишу какие разделы нужны для установки Linux.<br>
/ Корневой раздел. Содержит важную папку /boot, содержащую в себе образ ядра. /boot можно сделать и отдельным разделом, с другой, не журналируемой, файловой системой (так как используется оно только при загрузке и обновлении ядра). Но для простоты можно держать её и в корневом разделе. Другая важная папка, /home, содержит пользовательские данные, и неплохо выделить для неё отдельный раздел. Swap, нужен для виртуальной памяти для устройств с менее, чем 1ГБ памяти, однако использовать под это дело встроенную флеш-память с ограниченным циклом чтения-записи как минимум неразумно, лучше потом подцепить для этих целей внешнюю SD карту. /usr хранит общие для всех пользователей файлы. /var, хранит логи, и тоже логичнее бы было хранить их на внешней SD карте.<br>
<br>
Итак, чтобы меньше работать, сделаю-ка я образ, состоящий из трёх разделов:<br>
/boot, 16МБ с файловой системой cra<b>p</b>fs<br>
/, ~4ГБ оставшееся место под корневую файловую систему<br>
/home создавать не будем, поживём пока под root'ом, а как получится подмонтировать внешнюю SD карту, так её и подмонтируем<br>
/swap тоже смонтирую на внешней флеш-карте<br>
<br>
Скачал и распаковал последнее ядро с открытым кодом, которое заточено под Rockchip 2918, от odys.de. Версия ядра 2.6 опечалила. Инструкции по кросс-компиляции ядра от Archlinux ARM заставили почуствовать себя тупицей, а список поддерживаемых устройств расстроил. Yoctoproject слегка запутал. Обилие сборок Linaro и, опять же, ограниченный список поддерживаемых устройств, а также немалое количество багов даже на поддерживаемых устройствах, ввело в замешательство. Уже начал поглядывать в сторону <a href="http://www.linuxfromscratch.org/">LFS</a>. Неужели нету чего-то универсального, что с полтычка бы завелось на более-менее стандартном оборудовании на базе Cortex A8/A9? Уфффф.<br>
<br>
Мне не оставили выбора, придётся кросс-компилировать ядро из исходников и собирать образы самостоятельно. Скачал исходные коды ядра linux-linaro-3.5-rc3-2012.06.tar.bz2 и набор инструментов для кросс-компиляции gcc-linaro-arm-linux-gnueabihf-2012.06-20120625_linux.tar.bz2. Досадно только то, что для компиляции требуется специфичный для устройства .config файл, которого для RK2918 у Linaro нет. К счастью, в упоминавшемся чуть ранее ядре от odys есть специфичные для Rockchip файлы, и также они нашлись в <a href="https://github.com/DJNoXD/rockchip-kernel-rk2918">исходниках</a> поновее от easypix.eu. Их-то я и скопировал в исходники от Linaro, а именно:<br>
— папку arch/arm/mach-rk29<br>
— 50-килобайтный arch/arm/configs/rk29_ddr3sdk_defconfig с огромным количеством специфичных для устройства опций<br>
— последнуюю строку из arch/arm/tools/mach-types<br>
— раздел ARCH_RK29 из arch/arm/Kconfig<br>
— mkkrnlimg из корня исходников<br>
<br>
<h4>Кросс-компиляция ядра</h4><br>
<br>
<h5>3.5.0-rc3 от Linaro</h5><br>
<pre><code class="r">$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- rk29_ddr3sdk_defconfig
$ PATH=$PATH:~/linaro/gcc-linaro-arm-linux-gnueabihf-<span class="number">2012.06</span>-20120625_linux/bin
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImage
<span class="keyword">...</span>
kernel/cgroup.c:<span class="number">470</span>:<span class="number">2</span>: error: <span class="string">'saved_link'</span> undeclared (first use <span class="keyword">in</span> this <span class="keyword">function</span>)
<span class="keyword">...</span>
make: *** [kernel] Error <span class="number">2</span>
</code></pre><br>
Довольно мило, но поправимо. Оказывается, кто-то заботливо стёр две строчки и комментарий. Я помню, это называется оптимизация использования памяти и рефакторинг, но мне это в этот раз не подходит, и придётся вернуть на место:<br>
<pre><code class="cs"><span class="keyword">static</span> <span class="keyword">void</span> __put_css_set(<span class="keyword">struct</span> css_set *cg, <span class="keyword">int</span> taskexit)
{
<span class="keyword">struct</span> cg_cgroup_link *link;
<span class="keyword">struct</span> cg_cgroup_link *saved_link;
</code></pre><br>
Сработало. Интересно, стабильные сборки от Linaro вообще пробуют собирать, как туда пробираются ошибки компиляции?<br>
<br>
Ещё одна ошибка:<br>
<pre><code class="sql">fs/yaffs2/yaffs_vfs.c:46:28: fatal error: linux/smp_<span class="operator"><span class="keyword">lock</span>.h: <span class="keyword">No</span> such file <span class="keyword">or</span> directory
</span></code></pre><br>
Файл нашёлся в исходниках от odys, но возникла и другая ошибка, и ещё с десяток других:<br>
<pre><code class="r">fs/yaffs2/yaffs_vfs.c:<span class="number">317</span>:<span class="number">3</span>: error: assignment of read-only member ‘i_nlink’
<span class="keyword">...</span>
fs/yaffs2/yaffs_vfs.c:<span class="number">1995</span>:<span class="number">9</span>: error: ?struct mtd_info? has no member named ?sync?
fs/yaffs2/yaffs_vfs.c:<span class="number">1996</span>:<span class="number">6</span>: error: ?struct mtd_info? has no member named ?sync?
fs/yaffs2/yaffs_vfs.c:<span class="number">2097</span>:<span class="number">2</span>: error: ?struct mtd_info? has no member named ?erase
<span class="keyword">...</span>
</code></pre><br>
Исключать yaffs2 из сборки? Править код на C, в котором я ничего не понимаю? С первой ошибкой я справился, потом нашёлся <a href="https://groups.google.com/forum/?fromgroups#!topic/android-kernel/HT4oZ2f3c6M">патч</a>, который ни капли не помог, и пришлось исправлять наобум, ориентируясь на inode.c. Остались ошибки со struct mtd, и надо сказать, что в версии ядра от Android 3.4, <a href="https://android.googlesource.com/kernel/common.git/+/android-3.4/fs/yaffs2/yaffs_vfs.c">всё то же самое</a>, и пришло чуство, что надежды ждать неоткуда. Пришло чуство, что день раннего утра мудренее. Но желание убрать все строки, связанные с YAFFS из .config и продолжить оказалось сильнее. Потом можно использовать UBIFS, или на крайний случай даже ext3, не предназначенную для флеш носителей.<br>
<br>
Награда была скорой:<br>
<pre><code class="sql">Image Name: Linux-3.5.0-rc3
Created: Tue Jul 3 05:35:58 2012
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 2258064 Bytes = 2205.14 kB = 2.15 MB
<span class="operator"><span class="keyword">Load</span> Address: fffffff2
Entry Point: fffffff2
echo <span class="string">' Image arch/arm/boot/uImage is ready'</span>
Image arch/arm/boot/uImage <span class="keyword">is</span> ready
</span></code></pre><br>
Идём дальше:<br>
<pre><code class="r">$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules
<span class="keyword">...</span>
CC drivers/media/video/gspca/gspca_main.mod.o
LD [M] drivers/media/video/gspca/gspca_main.ko
CC drivers/scsi/scsi_wait_scan.mod.o
LD [M] drivers/scsi/scsi_wait_scan.ko
</code></pre><br>
Всё прошло успешно, и только насторожило то, что ничего специфичного RK29 скомпилировано не было, и это очень подозрительно. uImage получен.<br>
<br>
<h5>3.0.8+ от easypix.eu</h5><br>
На всякий запасной случай решил попробовать собрать исходники от easypix.eu. Тут отчётливо видно, что исходники RK29 компилируются. В .config'е YAFFS'а нет, равно как и UBIFS. Есть только предназначенный исключительно для чтения cramfs, который подойдёт для /boot, но совсем не подойдёт для корневого раздела. Сборка падает на:<br>
<pre><code class="lua"> CC drivers/net/wireless/bcm4329/wl_iw.o
drivers/net/wireless/bcm4329/wl_iw.c: In <span class="function"><span class="keyword">function</span> ‘<span class="title">wl_iw_set_pmksa</span>’:
<span class="title">drivers</span>/<span class="title">net</span>/<span class="title">wireless</span>/<span class="title">bcm4329</span>/<span class="title">wl_iw.c</span>:5069:5: <span class="title">error</span>: <span class="title">array</span> <span class="title">subscript</span> <span class="title">is</span> <span class="title">above</span> <span class="title">array</span> <span class="title">bounds</span> [-<span class="title">Werror</span>=<span class="title">array</span>-<span class="title">bounds</span>]
</span></code></pre><br>
Исправил .config, удалил оттуда WiFi модуль BCM4329 и добавил все возможные файловые системы для флеш памяти. Не понял, будет ли компилироваться драйвер RTL8192, ну и ладно. Продолжаю и прихожу к успеху:<br>
<pre><code class="coffeescript"> OBJCOPY arch<span class="regexp">/arm/boot/</span>Image
Kernel: arch<span class="regexp">/arm/boot/</span>Image <span class="keyword">is</span> ready
UIMAGE arch<span class="regexp">/arm/boot/</span>uImage
Image Name: Linux-<span class="number">3.0</span><span class="number">.8</span>+
Created: Thu Jul <span class="number">5</span> <span class="number">13</span>:<span class="number">29</span>:<span class="number">41</span> <span class="number">2012</span>
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: <span class="number">7028772</span> Bytes = <span class="number">6864.04</span> kB = <span class="number">6.70</span> MB
Load Address: <span class="number">60408000</span>
Entry Point: <span class="number">60408000</span>
Image: arch<span class="regexp">/arm/boot/</span>uImage <span class="keyword">is</span> ready
</code></pre><br>
<br>
<h5>Чудовище</h5><br>
Доктор Франкенштейн бросает природе вызов и будет скрещивать последнее ядро с теми останками, что подбросил нам easypix.<br>
<br>
Очень подмывает создать <a href="https://wiki.linaro.org/Platform/DevPlatform/Hwpacks">HWpack</a> для Linaro, но опыта в этом деле нет, желания поддерживать в одиночку — тоже. Так что берём последнее ядро из <a href="http://git//git.linaro.org/kernel/linux-linaro-tracking.git">Linaro git</a> и буду на него постепенно накатывать то, что нужно для нормальной работы RK29.<br>
<br>
Итак, теперь .config и Kconfig у меня от easypix.eu. Понял, что в прошлый раз забыл добавить в arch/arm/Kconfig строчку:<br>
<pre><code class="nginx"><span class="title">source</span> <span class="string">"arch/arm/mach-rk29/Kconfig"</span>
</code></pre><br>
<br>
и в Makefile:<br>
<pre><code class="xml">machine-$(CONFIG_ARCH_RK29) := rk29
<span class="tag">&lt;<span class="title">source</span>&gt;</span>
После запуска:
<span class="tag">&lt;<span class="title">source</span>&gt;</span>
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- rk29_ddr3sdk_defconfig
</code></pre><br>
<br>
добавил в .config следующее:<br>
<pre><code class="ini"><span class="setting">CONFIG_MSDOS_FS=<span class="value">y</span></span>
<span class="setting">CONFIG_VFAT_FS=<span class="value">y</span></span>
<span class="setting">CONFIG_TMPFS=<span class="value">y</span></span>
<span class="setting">CONFIG_UBIFS_FS=<span class="value">y</span></span>
<span class="setting">CONFIG_UBIFS_FS_ADVANCED_COMPR=<span class="value">y</span></span>
</code></pre><br>
Но это ещё далеко не всё. Поиск 'rk29' по исходникам дал 10707 совпадений в 358 файлах, которые предстоит смерджить, среди них драйвера аудио, кодеки, Makefile'ы, Kconfig'и, разбросанные ровным слоем по всему проекту.<br>
<br>
Оставлю это за кадром этого топика. Как только получится, обязательно обновлю топик и выложу исходники и результаты. Если есть желающие присоединиться к моему порыву — пишите.<br>
<br>
<h3>Дистрибутив</h3><br>
Как известно, <a href="http://www.gnu.org/gnu/gnu-linux-faq.html#why">ядром единым сыт не будешь</a>, и к нему полагается подавать GNU. <a href="http://www.linuxfromscratch.org/lfs/view/stable/prologue/package-choices.html">Тут</a> описано что и зачем нужно, чтобы превратить ядро в полноценную операционную систему.<br>
<br>
В идеале хочется Arch Linux, и как написано на их сайте, можно взять дистрибутив под любое другое устройство и просто добавить своё ядро. Ядро у меня уже есть, так что осталось распаковать скачанный ArchLinuxARM-am33x-latest.tar.gz, удалить из него /boot, подивившись насколько же велико полученное самостоятельно ядро (почти 7МБ) в сравнении с ядром для BeagleBone (2.7МБ). Папка root, из которой я собираюсь сделать образ корневого раздела, занимает около 421МБ, 10% из которых занимают совершенно лишние в моей ситуации исходники ядра (linux-3.2.18-1).<br>
<br>
<h3>Сборка и заливка</h3><br>
<br>
<h4>Подготовка</h4><br>
Итак, у меня есть две папки, boot и root, из которых нужно сделать два образа, причём первый в cra<b>p</b>fs, а второй в какой-то файловой системе знакомой ядру и, желательно, предназначенной для флеш памяти. Выбор файловой системы для корневого раздела у меня обширен, так как ядро от easypix.eu собралось с поддержкой и JFFS2, и UBIFS, и EXT[2|3|4], и VFAT и MSDOS. В сети хвалят YAFFS2, он немного быстрее UBIFS и использует чуть меньше оперативной памяти, но сборка опять выдавала ошибки при попытке его подключения в .config, так что пускай будет UBIFS.<br>
<br>
Помимо сбора образов нужно составить новую таблицу разделов и точку входа в ядро, а именно файл parameter, который занимает 256КБ памяти в начале флеш памяти, который я привёл в начале топика.<br>
<br>
KERNEL_IMG, совпадает с тем, что выдало ядро по окончании сборки, так что менять не нужно. CHECK_MASK одинаков для всех виденных мной образов, тоже не трогаю. Остальные строки тоже, кроме CMDLINE, содержащей таблицы MTD разделов и аргументы загрузки.<br>
На сайте U-Boot <a href="http://www.denx.de/wiki/DULG/UBootCmdGroupFlash">сказано</a> о том, что таблицу разделов MTD можно задать и в упрощённом виде, но я рисковать не стану, и буду близок к оригиналу насколько это возможно.<br>
<br>
Итак, память в устройсте распределяется следующим образом:<br>
256КБ на файл parameters<br>
16МБ на /boot (на случай, если вдруг захочется перезалить исключительно ядро, а оно перерастёт 8МБ)<br>
остаток на /<br>
<br>
Выглядит это так:<br>
<pre><code class="perl">mtdparts=rk29xxnand:<span class="number">0x00008000</span><span class="variable">@0x00002000</span>(kernel),-<span class="variable">@0x0000a000</span>(<span class="keyword">system</span>)
</code></pre><br>
До:<br>
<pre><code class="r">CMDLINE: console=ttyS1,115200n8n androidboot.console=ttyS1 init=/init initrd=<span class="number">0x62000000</span>,<span class="number">0x300000</span> mtdparts=<span class="keyword">...</span>
</code></pre><br>
Вроде бы в ядре Linux, начиная с 3.0, консоли стали именоваться по-другому, tty01 и т.д., но оставлю как есть.<br>
androidboot.console и init нам не понадобятся. Initrd (диск в памяти, который используется для сборки и динамической подгрузки модулей) я решил не делать, возможно, зря. Нужно установить нахождение root раздела, ткнув ему в нужный mtd раздел (нумерующихся начиная с 0). Ещё нужно указать тип файловой системы для корневого раздела.<br>
<br>
Итого получается:<br>
<pre><code class="ruby"><span class="constant">CMDLINE</span><span class="symbol">:</span> console=ttyS1,<span class="number">115200</span>n8n root=<span class="regexp">/dev/mtdblock</span>1 rootfstype=ubifs noinitrd mtdparts=<span class="symbol">rk29xxnand:</span><span class="number">0x00008000</span><span class="variable">@0x00002000</span>(kernel),-<span class="variable">@0x0000a000</span>(root)
</code></pre><br>
<br>
<h4>Сборка</h4><br>
<br>
<h5>Таблица MTD разделов и параметры запуска ядра</h5><br>
Запускаю mkkrnlimg из RK29kitchen:<br>
<pre><code class="brainfuck"><span class="comment">$</span> <span class="comment">mkkrnlimg</span> <span class="literal">-</span><span class="comment">a</span> <span class="comment">parameter</span> <span class="comment">parameter</span>.<span class="comment">img</span>
<span class="comment">F535BA01</span>
<span class="comment">$</span> <span class="comment">ls</span> <span class="literal">-</span><span class="comment">l</span>
<span class="comment">316</span> <span class="comment">Jul</span> <span class="comment">5</span> <span class="comment">22:56</span> <span class="comment">parameter</span>
<span class="comment">328</span> <span class="comment">Jul</span> <span class="comment">10</span> <span class="comment">20:27</span> <span class="comment">parameter</span>.<span class="comment">img</span>
</code></pre><br>
Смущает то, что исходный parm.img, извлечённый с устройства, имеет размер 256КБ, и содержимое там находится аж в пяти разных местах. А тут только в начале файла. Скорее всего, китайцы подстраховались на случай, если U-Boot будет пытаться грузить эти данные по другому смещению в памяти, и залили его дополнительно со смещением +16КБ, +32КБ, +48КБ и +64КБ. Не исключено, что оставшиеся 3.75МБ, которые, судя по таблице разделов, ничем не заняты, тоже содержат тот же самый кусок.<br>
Различаются всего на 12 байт, 8 из которых добавлено в начало. Увы, сравнение с оригинальным parm.img показало, что mkkrnlimg добавляет <pre><code class="xml">KRNL<span class="tag">&lt;</span></code></pre> и 0x01, а в parm.img было <pre><code class="http"><span class="attribute">PARMG</span></code></pre> и 0x02.<br>
Шестнадцатиричный редактор из mc помогает, и я подправляю заголовок, чтобы был как в оригинале.<br>
<br>
<h5>Ядро</h5><br>
<br>
<pre><code class="xml">$ mkkrnlimg -a uImage kernel.img
7DDF79C6
$ ls -l
7139328 Jul 5 22:49 uImage
7139340 Jul 10 20:42 kernel.img
<span class="tag">&lt;<span class="title">source</span>&gt;</span>
Различаются всего на 12 байт, 8 добавлено в начало, и подозреваю, что 4 в конец. Такого, как было с boot.img (заголовок на 8КБ, запаковка gzip'ом и cpio) нет в помине.
<span class="tag">&lt;<span class="title">h5</span>&gt;</span>Корневой в UBIFS<span class="tag">&lt;/<span class="title">h5</span>&gt;</span>
Немного теории специально для тех, кто не понял <span class="tag">&lt;<span class="title">a</span> <span class="attribute">href</span>=<span class="value">"http://www.linux-mtd.infradead.org/faq/ubifs.html#L_mkfubifs"</span>&gt;</span>ЧаВо<span class="tag">&lt;/<span class="title">a</span>&gt;</span> (включая меня), <span class="tag">&lt;<span class="title">a</span> <span class="attribute">href</span>=<span class="value">"http://lists.infradead.org/pipermail/linux-mtd/2008-April/021189.html"</span>&gt;</span>тут<span class="tag">&lt;/<span class="title">a</span>&gt;</span>.
Выясняется, что неплохо бы знать размер erase блока и размер страницы для используемой NAND флеш памяти. На плате устройства обнаружен чип с маркировкой Samsung 201 K9GBG08U0A SCB0, по <span class="tag">&lt;<span class="title">a</span> <span class="attribute">href</span>=<span class="value">"http://gxwy.en.alibaba.com/product/530746803-213362683/IC_Samsung_Nand_Flash_Flash_Memory_K9GBG08U0A_SCBO.html"</span>&gt;</span>найденной<span class="tag">&lt;/<span class="title">a</span>&gt;</span> спецификации 4ГБ, размер erase блока значится 128КБ+4КБ, а размер страницы 2КБ.
Из полученного выбираю параметры для создания образа UBIFS и из него образа UBI и состав ubinize.cfg:
<span class="tag">&lt;<span class="title">source</span>&gt;</span>
[ubifs]
mode=ubi
image=ubifs.img
vol_id=0
vol_size=4000MiB
vol_type=dynamic
vol_name=rootfs
vol_flags=autoresize
</code></pre><br>
<br>
<pre><code class="brainfuck"><span class="comment">$</span> <span class="comment">mkfs</span>.<span class="comment">ubifs</span> <span class="literal">-</span><span class="comment">q</span> <span class="literal">-</span><span class="comment">r</span> <span class="comment">~/gv2b/root</span> <span class="literal">-</span><span class="comment">m</span> <span class="comment">2048</span> <span class="literal">-</span><span class="comment">e</span> <span class="comment">131072</span> <span class="literal">-</span><span class="comment">c</span> <span class="comment">32767</span> <span class="literal">-</span><span class="comment">o</span> <span class="comment">ubifs</span>.<span class="comment">img</span>
<span class="comment">$</span> <span class="comment">ubinize</span> <span class="literal">-</span><span class="comment">o</span> <span class="comment">ubi</span>.<span class="comment">img</span> <span class="literal">-</span><span class="comment">m</span> <span class="comment">2048</span> <span class="literal">-</span><span class="comment">p</span> <span class="comment">128KiB</span> <span class="comment">ubinize</span>.<span class="comment">cfg</span>
<span class="comment">$</span> <span class="comment">ls</span> <span class="literal">-</span><span class="comment">l</span>
<span class="comment">221904896</span> <span class="comment">Jul</span> <span class="comment">10</span> <span class="comment">01:14</span> <span class="comment">ubifs</span>.<span class="comment">img</span>
<span class="comment">229376000</span> <span class="comment">Jul</span> <span class="comment">10</span> <span class="comment">01:17</span> <span class="comment">ubi</span>.<span class="comment">img</span>
</code></pre><br>
UBIFS поддерживает сжатие данных, а я ограничил размер тома 4ГБ при аналогичном размере физического носителя, не уверен, что это верное решение.<br>
<br>
<h4>Прошивка</h4><br>
Немного смущает то, что для записи образов UBI желательно использовать <a href="http://www.linux-mtd.infradead.org/doc/ubi.html#L_flasher_algo">специальный алгоритм</a>.<br>
<br>
Параметры начальной позиции и размера к rkflashtool задаются в блоках размером 512 байт.<br>
Образ таблицы разделов parameter.img пишу по пяти разным смещениям, как у китайцев. Остальное согласно таблице разделов.<br>
<pre><code class="parser3"><span class="xml">$ rkflashtool29 w </span><span class="number">0</span><span class="xml"> </span><span class="number">1</span><span class="xml"> <span class="tag">&lt; <span class="attribute">parameter.img</span>
$ <span class="attribute">rkflashtool29</span> <span class="attribute">w</span> </span><span class="number">0x00000020</span><span class="xml"> </span><span class="number">1</span><span class="xml"> <span class="tag">&lt; <span class="attribute">parameter.img</span>
$ <span class="attribute">rkflashtool29</span> <span class="attribute">w</span> </span><span class="number">0x00000040</span><span class="xml"> </span><span class="number">1</span><span class="xml"> <span class="tag">&lt; <span class="attribute">parameter.img</span>
$ <span class="attribute">rkflashtool29</span> <span class="attribute">w</span> </span><span class="number">0x00000060</span><span class="xml"> </span><span class="number">1</span><span class="xml"> <span class="tag">&lt; <span class="attribute">parameter.img</span>
$ <span class="attribute">rkflashtool29</span> <span class="attribute">w</span> </span><span class="number">0x00000080</span><span class="xml"> </span><span class="number">1</span><span class="xml"> <span class="tag">&lt; <span class="attribute">parameter.img</span>
$ <span class="attribute">rkflashtool29</span> <span class="attribute">w</span> </span><span class="number">0x00002000</span><span class="xml"> </span><span class="number">0x00008000</span><span class="xml"> <span class="tag">&lt; <span class="attribute">kernel.img</span>
$ <span class="attribute">rkflashtool29</span> <span class="attribute">w</span> </span><span class="number">0x0000a000</span><span class="xml"> </span><span class="number">0x0006d600</span><span class="xml"> <span class="tag">&lt; <span class="attribute">ubi.img</span>
&lt;<span class="attribute">source</span>&gt;</span>
В принципе пишется быстро, судя по последнему куску размером почти </span><span class="number">4</span><span class="xml">ГБ у меня получилось меньше минуты, но вот при запуске каждый раз происходит инициацилизация, занимающая </span><span class="number">50</span><span class="xml"> секунд. В любом случае процедура не заняла и десяти минут.
На всякий случай штатным образом перегружу устройство:
<span class="tag">&lt;<span class="title">source</span>&gt;</span>
$ rkflashtool29 b
</span></span></span></span></span></span></span></code></pre><br>
<br>
<h3>Метод проб и ошибок</h3><br>
<br>
<h4>Первый запуск</h4><br>
Первый запуск прошёл не то, чтобы не успешно, а прямо таки скажу, провально. Устройство не включило диод, не реагировало на нажатие кнопок, и ничего не выдало по HDMI. Очень удачно, что всё-таки сделал резервную копию. Очень удачно, что устройство всё ещё в состоянии принимать данные. Восстанавливаю в исходное состояние:<br>
<pre><code class="xml">rkflashtool29 w 0 0x00082000 <span class="tag">&lt; <span class="attribute">backup.img</span>
</span></code></pre><br>
Устройство продолжает не работать.<br>
<br>
Запускаю ./menu.sh из RK29kitchen, меняю размер раздела /system в резервной копии и прошиваю. Устройство включается, и показывает строку «Loading...», но дальше не идёт. Уже неплохо. Восстанвливаю оригинальную резервную копию, после второй перезагрузки загружается таки Android в первозданном виде.<br>
<br>
<h4>Что я делал так и что не так</h4><br>
После копания в исходниках RK29kitchen и на форуме, на котором <a href="http://forum.xda-developers.com/archive/index.php/t-1286305.html">аннонсировался</a> rkflashtool, выяснилось, что я не зря приписывал этот образ по пяти разным смещениям, и что так и нужно (90.flash.sh).<br>
<br>
Файл parameter.img содержит «PARM» в первых четырёх байтах, а следующие два, которые я ошибочно скопировал из оригинального parm.img — это длина файла parameter, 583 байта. Это объясняет, почему ничего не грузилось (не определялась таблица MTD разделов и U-Boot не мог загрузить ядро), но не объясняет почему не горела лампочка. Вместо припрялсываний с шестнадцатеричным редактором обнаружилась утилита rkcrc, которая делает из файла parameter образ с правильным заголовками и общим размером 16КБ, будучи запущена с опцией "-p". Опция "-k" предназначена для создания образов с меткой «KRNL».<br>
<br>
Покопался в оригинальном backup.img. Не ясно, стоило ли так радикально менять таблицу разделов, в файле отчётливо читается, что размеры, смещения и порядок (разделы должны идти в порядке смещения) разделов менять можно, а также можно создавать новые разделы, а вот названия разделов менять нельзя. Кто именно задаёт такое ограничение — не ясно, но скорее всего загрузчик (U-Boot?).<br>
Там же обнаружилось, что используется RK29xxLoader(L)_V2.08.bin (чуть далее явно идёт бинарник версии 2.04), в то время как в списке загрузчиков RK29kitchen обнаружились также версии 2.12, 2.14 и 2.18, а в Nextbook'е так и вообще используется 2.20. Как обновить загрузчик, находящийся на NOR флеш памяти (которой всего 1МБ или около того), и стоит ли это делать — не ясно. Помимо загрузчика, там ещё находится файл package-file, содержащий немало интересной информации.<br>
<br>
<h4>Попытка номер два, паника и уныние</h4><br>
Повторяю всю процедуру прошивки, но теперь с правильным parameter.img. Не получается. Восстанавливаю обратно.<br>
В какой-то момент сдуру вместо того, чтобы воспользоваться RK29kitchen, записал backup.img прямо по смещению 0. Потом резервную копию восстановил, ещё раз снял дамп и лишние резервные копии затёр. Обновление прошивки из резервной копии в какой-то момент не сработало. Наступила паника от того, что мне показалось, что я затёр ту самую изначальную резервную копию, с правильным backup.img. Написал скрипт, чтобы восстанавливать из отдельных образов, но и он не помог. Хотя бы лампочка при включении устройства загорается. Но по HDMI никакого сигнала нет.<br>
Задумался об extundelete, но поняв, что потребуется chroot и umount, отказался от этой мысли в страхе запороть систему не только на недорогом китайском устройстве.<br>
Прошивал все возможные прошивки, от gbox (немного другого устройства всего с тремя портами USB), от автора метода прошивки, найденные <a href="http://4pda.ru/forum/lofiversion/index.php?t295852-50.html">вот здесь</a>. Ничего не помогало. Всё равно кирпич, иногда со светодиодом при включении, а иногда и совсем без. Наступило раннее утро, и я в очередной раз решил, что вечер раннего утра мудренее.<br>
<br>
И как я оказался прав. Подключив устройство к монитору, оказалось, что всё работает.<br>
<br>
<h5>Выводы и изыскания</h5><br>
Подобный опыт, хоть и не слишком приятен, но привёл меня к следующим заключениям и находкам в сети:<br>
— устройству нужно время, чтобы после прошивки переформатировать разделы<br>
— в некоторых прошивках есть загрузчик, иногда 2.08, иногда 2.14. Куда его прошивать — не ясно. Автор RK29kitchen ответа на этот вопрос не смог получить<br>
— таинственный package-file возможно как раз находится в загадочном пространстве между parameters и ядром, и также не исключено, что там же находятся загрузчик и не менее загадочный HWDEF, описывающий парметры устройства<br>
<br>
Из одной из прошивок:<br>
<pre><code class="haskell"><span class="type">HWDEF</span> <span class="number">0x00000800</span> <span class="number">0x0000031B</span>
<span class="title">package</span>-file <span class="number">0x00001000</span> <span class="number">0x00000216</span>
<span class="type">RK29xxLoader</span>(<span class="type">L</span>)_V2<span class="number">.08</span>.bin <span class="number">0x00001800</span> <span class="number">0x000225BE</span>
<span class="title">parameter</span> <span class="number">0x00024000</span> <span class="number">0x00000251</span>
</code></pre><br>
<br>
<h4>Попытка номер три</h4><br>
Первым делом сделал полный дамп всех 4ГБ флеш-памяти.<br>
<br>
Пробую залить ядро из резервной копии, распаковав его и запаковав заново. Если не будет работать — значит, что-то не так пакую.<br>
<br>
Распаковываю, запаковываю и прошиваю:<br>
<pre><code class="haskell"><span class="title">mkkrnlimg</span> -r kernel.img kernelimg
<span class="title">mkkrnlimg</span> -a kernelimg kernel2.img
<span class="title">rkflashtool29</span> w <span class="number">0x00004000</span> <span class="number">0x00004000</span> &lt; kernel2.img
</code></pre><br>
Перегружаю — работает. Тот же самый трюк с самостоятельно полученным uImage не проходит.<br>
<br>
Ещё при распаковке c помощью RK29kitchen оригинального kernel.img обнаружилось, что внутри у образа сигнатура отличается от стандартной <a href="http://www.linux-m32r.org/public/codefestweek2008/takata/qemu-0.9.1/html/HTML/S/380.html">по версии U-Boot</a> 27 05 19 56. Все разнообразные образы ядра из разных прошивок имеют одинаковый заголовок:<br>
<pre><code class="nginx"><span class="title">D3</span> F0 <span class="number">21</span> E3 <span class="number">10</span> 9F <span class="number">10</span> EE xx xx <span class="number">00</span> EB <span class="number">05</span> A0 B0 E1 xx xx <span class="number">00</span> 0A
</code></pre><br>
Первая мысль — по образу прошлись XOR'ом. Проверяю, но, к сожалению, 8 и 16 битные не подходят, а 32 битный по четвёртому квартету выдаёт слишком большое число, чтобы оно могло быть размером образа, да и то, что в третьем квартете, в котором должно быть время, слишком уж много совпадений между разными образами.<br>
<br>
Поисковый запрос по «D3 F0 21 E3» показывает крайне мало результатов, а среди них ещё меньше интересных. Вот в <a href="http://www.androidiani.com/forum/mediacom-smartpad-810c/81148-good-news-6.html#post780280">этой</a> ветке итальянского форума заявлено, что исходники от Odys не создают корректного образа, в отличии от <a href="https://bitbucket.org/paulobrien/android_kernel_andypad/src">вот этих</a> исходников ядра от Anypad.<br>
А возможно, что проблема в использовании мной mkkrnlimg из RK29kitchen, ведь к исходникам от Odys и easypix прилагается (кстати, одинаковый) mrkrnlimg, который сильно отличается размером и умеет конвертировать только в одну сторону. Нет, созданные всеми тремя утилитами образы ничем не отличаются.<br>
<br>
Собираю ядро от Anypad. Оно 2.6, но интересно посмотреть, какой заголовок будет у uImage. Избавился от той же ошибки с модулем bcm4329.<br>
<br>
Случайно заметил, что в моём .config файле включён выход на накую-то LCD панель, а опция DEFAULT_OUT_HDMI выключена. Это огромный прокол. Не удивился бы, если бы Linux загрузился, но ничего не показывал по HDMI, и я так бы и не узнал, что он загрузился. Обнаружилась связанная с этим DEFAULT_OUT_HDMI проблема в rk29_fb.c, не нашлось функции hdmi_get_default_resolution, причём в исходниках от easypix её тоже нет. Пришлось писать её наощупь, проставляя более десятка параметров. В структуре, которую эта функция заполняет, есть забавный параметр перемены местами цветовых каналов RGB.<br>
<br>
Собрался образ, но в нём те же злосчастные стандартные «27 05». И тут я осмотрелся, и в том же каталоге заметил образ Image, и в нём лежит долгожданный заголовок «D3 F0». Посмотрел в результаты сборки ядра easypix — и там тоже такой есть. Приятная неожиданность.<br>
<br>
Нельзя обойти вниманием такую интересная вещь, как zImage, самораспаковывающийся архив с образом ядра. Ради интереса собрал zImage и, разница в размере впечатляет. Для раздела с ядром явно хватило бы и 8МБ, с большим запасом. Кстати, почти вдвое отличается и от так называемого «zImage» (который на самом деле просто Image), извлечённого из образа ядра устройства (5.8МБ).<br>
<pre><code class="ruby"><span class="variable">$ </span>make <span class="constant">ARCH</span>=arm <span class="constant">CROSS_COMPILE</span>=arm-linux-gnueabihf- zImage
<span class="variable">$ </span>ls -l arch/arm/boot
<span class="number">7135268</span> <span class="constant">Jul</span> <span class="number">13</span> <span class="number">03</span><span class="symbol">:</span><span class="number">37</span> <span class="constant">Image</span>
<span class="number">7139328</span> <span class="constant">Jul</span> <span class="number">5</span> <span class="number">21</span><span class="symbol">:</span><span class="number">41</span> uImage
<span class="number">3408472</span> <span class="constant">Jul</span> <span class="number">12</span> <span class="number">00</span><span class="symbol">:</span><span class="number">20</span> zImage
</code></pre><br>
Ну, теперь в получившийся образ остаётся только добавить заголовки и прошить. Хочу заметить, что rkcrc -k и mkkrnlimg -a дают один и тот же результат.<br>
Прошил, включил — не горит диод. Что-то не выходит с ядром. Подправил расходящиеся с оригиналом байты заголовка (который ещё до CRC, конечно), добавил заголовки, прошил — не работает. Вернул старое ядро на место.<br>
<br>
Закралась мысль посмотреть в раздел /kpanic, <a href="http://ru.wikipedia.org/wiki/Kernel_panic">не зря же</a> его выделили. Скачал, но увы, там только что-то относящееся к панике штатного ядра 2.6.32.27.<br>
<br>
Отчаялся прошивать своё ядро.<br>
<br>
<h4>Попытка номер 4</h4><br>
Ну, раз ядро прошить не удалось, может быть получится прошить всё остальное, оставив только ядро. Посколько с набега взять не получилось, буду делать маленькие шажки.<br>
<br>
Небольшой <a href="http://www.androidenea.com/2009/06/android-boot-process-from-power-on.html">экскурс</a> в теорию. Как вообще загружается Android на устройстве?<br>
1. При включении из NOR памяти (напрямую, так как она поддерживает execute-in-place) запускается загрузчик, U-Boot.<br>
2. U-Boot загружает таблицу MTD разделов и загружает ядро Linux из образа в память.<br>
3. Linux инициализирует драйвера устройств, монтирует разделы и т.п., а потом запускает init из /.<br>
4. init…<br>
дальше не интересно, потому что это уже Android'овый init, и как раз вместо него хочется записать свой, от Arch Linux.<br>
<br>
init находится в корне, а в дистрибутиве Arch Linux он находится в /sbin. Ничего другого не остаётся, как скопировать его в корень.<br>
<br>
В оригинальном Android'е файл init находится не в разделе system, а в boot. То есть именно этот boot раздел монтируется в корень, а system монтируется в /system. Так и оставлю.<br>
<br>
В оригинальном boot разделе лежит rk29xxnand_ko.ko, модуль, очевидно, предназначенный для работы с NAND флеш памятью. Остальные модули лежат в /lib/modules/3.2.18-1/kernel, а ссылки на них прописаны в /lib/modules/3.2.18-1/modules.order. Пакую gzip'ом прилагающийся ko, кладу к остальным модулям, относящимся к nand, в kernel/drivers/mtd/nand, ставлю на него права root.root, и прописываю его в modules.order и modules.dep. Вряд ли это поможет ядру найти нужный модуль, но заставить depmod копаться в ELF'ах другой архитектуры и находить зависмости у меня не вышло.<br>
<br>
Оригинальное ядро ничего не знает о UBIFS, поэтому созданный ранее образ придётся оставить в сторонке, а собирать буду с помощью cpio, gzip и mkkrnlimg:<br>
<pre><code class="brainfuck"><span class="comment">$</span> <span class="comment">find</span> <span class="string">.</span> <span class="literal">-</span><span class="comment">exec</span> <span class="comment">touch</span> <span class="literal">-</span><span class="comment">d</span> <span class="comment">"1970</span>-<span class="comment">01</span>-<span class="comment">01</span> <span class="comment">01:00"</span> <span class="comment">{}</span> <span class="comment">\;</span>
<span class="comment">$</span> <span class="comment">find</span> <span class="string">.</span> <span class="comment">!</span> <span class="literal">-</span><span class="comment">name</span> <span class="comment">"</span>.<span class="comment">"</span> <span class="comment">|</span> <span class="comment">sort</span> <span class="comment">|</span> <span class="comment">sudo</span> <span class="comment">cpio</span> <span class="literal">-</span><span class="comment">oa</span> <span class="literal">-</span><span class="comment">H</span> <span class="comment">newc</span> <span class="comment">|</span> <span class="comment">gzip</span> <span class="literal">-</span><span class="comment">n</span> &gt;<span class="string">.</span><span class="string">.</span><span class="comment">/boot</span>.<span class="comment">gz</span>
<span class="comment">$</span> <span class="comment">cd</span> <span class="string">.</span><span class="string">.</span>
<span class="comment">$</span> <span class="comment">mkkrnlimg</span> <span class="literal">-</span><span class="comment">a</span> <span class="comment">boot</span>.<span class="comment">gz</span> <span class="comment">boot</span>.<span class="comment">img</span>
<span class="comment">$</span> <span class="comment">ls</span> <span class="literal">-</span><span class="comment">l</span> <span class="comment">boot</span>.<span class="comment">img</span>
<span class="comment">155166888</span> <span class="comment">Jul</span> <span class="comment">13</span> <span class="comment">20:55</span> <span class="comment">boot</span>.<span class="comment">img</span>
</code></pre><br>
Увы, раздел boot слегка маловат, и придётся слегка подправить parameters, расширив его и подвинув остальные разделы, для простоты редактирования расширю его на 512МБ (0x00100000):<br>
<pre><code class="avrasm"><span class="label">CMDLINE:</span> console=ttyS1,<span class="number">115200</span>n8n androidboot<span class="preprocessor">.console</span>=ttyS1 init=/sbin/init initrd=<span class="number">0x62000000</span>,<span class="number">0x300000</span> mtdparts=rk29xxnand:<span class="number">0x00002000</span><span class="localvars">@0</span>x00002000(misc),<span class="number">0x00004000</span><span class="localvars">@0</span>x00004000(kernel),<span class="number">0x00082000</span><span class="localvars">@0</span>x00008000(boot),<span class="number">0x00004000</span><span class="localvars">@0</span>x0008A000(recovery),<span class="number">0x00080000</span><span class="localvars">@0</span>x0008E000(system),<span class="number">0x00082000</span><span class="localvars">@0</span>x0010E000(backup),<span class="number">0x0003a000</span><span class="localvars">@0</span>x00190000(cache),<span class="number">0x00100000</span><span class="localvars">@0</span>x001ca000(userdata),<span class="number">0x00002000</span><span class="localvars">@0</span>x002ca000(kpanic),-<span class="localvars">@0</span>x002cc000(user)
</code></pre><br>
Заодно нашёлся и путь до init файла, поправил его тоже на /sbin/init. Пакую:<br>
<pre><code class="brainfuck"><span class="comment">$</span> <span class="comment">rkcrc</span> <span class="literal">-</span><span class="comment">p</span> <span class="comment">parameter</span> <span class="comment">parmnew</span>.<span class="comment">img</span>
<span class="comment">$</span> <span class="comment">ls</span> <span class="literal">-</span><span class="comment">l</span>
<span class="comment">16384</span> <span class="comment">Jul</span> <span class="comment">13</span> <span class="comment">21:13</span> <span class="comment">parmnew</span>.<span class="comment">img</span>
</code></pre><br>
Кстати сказать, у разделов cache, kpanic и userdata принято стирать первые 256КБ, а раздел user вообще не трогать, как я почерпнул из исходников RK29kitchen, но меня разделы идущие после system волнуют мало. Разделы misc и kernel не меняю. В boot заливаю Arch Linux, остальное перетираю целиком.<br>
<pre><code class="parser3"><span class="xml">$ rkflashtool29 w </span><span class="number">0</span><span class="xml"> </span><span class="number">1</span><span class="xml"> <span class="tag">&lt; <span class="attribute">parmnew.img</span>
$ <span class="attribute">rkflashtool29</span> <span class="attribute">w</span> </span><span class="number">0x00000020</span><span class="xml"> </span><span class="number">1</span><span class="xml"> <span class="tag">&lt; <span class="attribute">parmnew.img</span>
$ <span class="attribute">rkflashtool29</span> <span class="attribute">w</span> </span><span class="number">0x00000040</span><span class="xml"> </span><span class="number">1</span><span class="xml"> <span class="tag">&lt; <span class="attribute">parmnew.img</span>
$ <span class="attribute">rkflashtool29</span> <span class="attribute">w</span> </span><span class="number">0x00000060</span><span class="xml"> </span><span class="number">1</span><span class="xml"> <span class="tag">&lt; <span class="attribute">parmnew.img</span>
$ <span class="attribute">rkflashtool29</span> <span class="attribute">w</span> </span><span class="number">0x00000080</span><span class="xml"> </span><span class="number">1</span><span class="xml"> <span class="tag">&lt; <span class="attribute">parmnew.img</span>
$ <span class="attribute">rkflashtool29</span> <span class="attribute">w</span> </span><span class="number">0x00008000</span><span class="xml"> </span><span class="number">0x00082000</span><span class="xml"> <span class="tag">&lt; <span class="attribute">boot.img</span>
$ <span class="attribute">rkflashtool29</span> <span class="attribute">e</span> </span><span class="number">0x0008a000</span><span class="xml"> </span><span class="number">0x006f6000</span><span class="xml">
$ rkflashtool29 b
</span></span></span></span></span></span></span></code></pre><br>
Чуть досадно не ошибся в размере boot.img и дальнейшем смещении для стирания. Интересно, сколько подобных ошибок я уже допустил? Может, и не родное ядро бы нормально запустилось?<br>
<br>
После перезагрузки проходит секунд 10, потом загорается светодиод. И, о чудо! Появился пингвин в левом верхнем углу экрана, минут десять повисел, а потом остался тёмно-синий фон, и больше ничего не происходило. При последующих загрузках пингвин появляется почти мнгновенно. Подключенная клавиатура не оказывает никакого эффекта. В kpanic чисто (ничего, кроме 00 и FF).<br>
<img src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/07c0b767da79fec81be11ec99fa84ea2.jpg"><br>
<br>
<h3>Заключение</h3><br>
Нужно быть неплохого уровня специалистом, чтобы без документации и исходников справиться с таким устройством, и этот специалист — явно не я. Либо устройство совсем уж не то, что нужно.<br>
<br>
Очень хотел выложить те образы, что у меня получились, загрузить скриншоты и краткое видео с какой-нибудь новой 3D игрой, но не судьба. Согласитесь, неудачный опыт — тоже опыт.<br>
<br>
<h3>Ссылки</h3><br>
Представляю сокращённый список того интересного, что я прочёл, что по каким-либо причинам не попало в ссылки к самому топику.<br>
<br>
<h4>Прошивка, образы, железо</h4><br>
<a href="http://androidforums.com/google-tv/505559-flashing-android-tv-box-one-four-usb.html">androidforums.com/google-tv/505559-flashing-android-tv-box-one-four-usb.html</a><br>
<a href="http://androidforums.com/google-tv/506298-rk2918-android-tv-box-4x-usb-rooted-firmware-manual.html">androidforums.com/google-tv/506298-rk2918-android-tv-box-4x-usb-rooted-firmware-manual.html</a><br>
<a href="http://androidforums.com/google-tv/413090-r-box-rockchip-2918-google-tv-3.html">androidforums.com/google-tv/413090-r-box-rockchip-2918-google-tv-3.html</a><br>
<br>
<a href="https://sites.google.com/site/rk2918tools">sites.google.com/site/rk2918tools</a><br>
<br>
<a href="http://thomaspolasek.blogspot.com/2012/04/arch-linux-lxde-w-xorg-mouse-keyboard_16.html">thomaspolasek.blogspot.com/2012/04/arch-linux-lxde-w-xorg-mouse-keyboard_16.html</a><br>
<br>
<a href="http://cxem.net/comp/comp70.php">cxem.net/comp/comp70.php</a><br>
<a href="https://github.com/OlegKyiashko/RK29kitchen">github.com/OlegKyiashko/RK29kitchen</a><br>
<br>
<a href="http://4pda.ru/forum/lofiversion/index.php?t337784-50.html">4pda.ru/forum/lofiversion/index.php?t337784-50.html</a><br>
<a href="http://4pda.ru/forum/index.php?showtopic=319345">4pda.ru/forum/index.php?showtopic=319345</a><br>
<a href="http://4pda.ru/forum/index.php?showtopic=313261">4pda.ru/forum/index.php?showtopic=313261</a><br>
<br>
<a href="http://forum.xda-developers.com/showthread.php?t=1286305">forum.xda-developers.com/showthread.php?t=1286305</a><br>
<br>
<a href="http://www.androidtablets.net/forum/rockchip-rk2818-tablets/21291-problems-getting-image-dumped-rkdump.html">www.androidtablets.net/forum/rockchip-rk2818-tablets/21291-problems-getting-image-dumped-rkdump.html</a><br>
<a href="http://www.androidtablets.net/forum/rockchip-based/439-how-unpack-repack-custom-firmwares-rockchip-rk28xx.html">www.androidtablets.net/forum/rockchip-based/439-how-unpack-repack-custom-firmwares-rockchip-rk28xx.html</a><br>
<br>
<a href="http://www.freaktab.com/showthread.php?287-RockChip-ROM-Building-Tips-and-Tricks-by-Finless">www.freaktab.com/showthread.php?287-RockChip-ROM-Building-Tips-and-Tricks-by-Finless</a><br>
<a href="http://www.freaktab.com/showthread.php?401-Dumping-ROM-using-ADB-guide">www.freaktab.com/showthread.php?401-Dumping-ROM-using-ADB-guide</a><br>
<br>
<a href="http://www.arctablet.com/wiki/index.php/Rockchip_2918_devices_MTD_partitions_mapping">www.arctablet.com/wiki/index.php/Rockchip_2918_devices_MTD_partitions_mapping</a><br>
<br>
<a href="http://yanzicjustnubie.wordpress.com/2011/09/10/linux-installer-easy-way-to-install-debianubuntu-on-android/">yanzicjustnubie.wordpress.com/2011/09/10/linux-installer-easy-way-to-install-debianubuntu-on-android/</a> chroot linux on android<br>
<a href="http://wiki.debian.org/DebianInstaller/Arm/OtherPlatforms">wiki.debian.org/DebianInstaller/Arm/OtherPlatforms</a><br>
<a href="http://www.arm.com/community/software-enablement/linux.php">www.arm.com/community/software-enablement/linux.php</a><br>
<a href="http://code.google.com/p/beagleboard/wiki/LinuxBootDiskFormat">code.google.com/p/beagleboard/wiki/LinuxBootDiskFormat</a><br>
<br>
<a href="http://www.yoctoproject.org/">www.yoctoproject.org/</a> — build custom linux distro<br>
<a href="http://www.freaktab.com/showthread.php?1053-RK2918-set-top-box-linux-installation">www.freaktab.com/showthread.php?1053-RK2918-set-top-box-linux-installation</a><br>
<a href="https://github.com/wendal/teclast_tools">github.com/wendal/teclast_tools</a><br>
<a href="https://wiki.archlinux.org/index.php/Partitioning#Partitions_in_a_GNU.2FUnix_system">wiki.archlinux.org/index.php/Partitioning#Partitions_in_a_GNU.2FUnix_system</a><br>
<a href="http://www.google.com/search?q=rockchips+confidential+2918">Замечательный поисковый запрос</a><br>
<br>
<h4>Прочее</h4><br>
<br>
Особого внимания достоин <a href="http://www.cnx-software.com/">www.cnx-software.com</a>, интереснейший сайт обо всём, связанном с ARM.<br>
<br>
<h4>Другое интересное железо</h4><br>
<br>
<a href="http://www.cnx-software.com/2012/06/26/list-of-39-low-cost-linux-friendly-boards-and-products">Подборка с ценами</a><br>
<a href="http://olimex.com/dev/index.html">olimex.com/dev/index.html</a><br>
<a href="http://rhombus-tech.net/allwinner_a10/">rhombus-tech.net/allwinner_a10/</a><br>
<a href="http://www.hardkernel.com/renewal_2011/products/prdt_info.php?g_code=G133999328931">www.hardkernel.com/renewal_2011/products/prdt_info.php?g_code=G133999328931</a><br>
<a href="http://www.technexion.com/index.php/products/development-kits/infernopack">www.technexion.com/index.php/products/development-kits/infernopack</a><br>
<a href="http://www.advantech.com/products/ROM-1210/mod_D5882807-78CE-4A64-AADA-FAEAA099F2CB.aspx">www.advantech.com/products/ROM-1210/mod_D5882807-78CE-4A64-AADA-FAEAA099F2CB.aspx</a><br>
<a href="http://www.sigmadesigns.com/products.php?id=38">www.sigmadesigns.com/products.php?id=38</a><br>
<a href="http://www.renesas.com/press/news/2012/news20120110.jsp">www.renesas.com/press/news/2012/news20120110.jsp</a><br>
И <a href="http://www.renesas.com/press/news/2012/news20120110_s.jsp">прообраз</a> всех этих HDMI stick'ов на процессоре строчкой выше.<br>
<a href="http://www.cnx-software.com/2012/07/10/ippea-tv-android-4-0-3-hdmi-stick-based-on-ingenic-jz4770-mips-sells-for-50-usd">www.cnx-software.com/2012/07/10/ippea-tv-android-4-0-3-hdmi-stick-based-on-ingenic-jz4770-mips-sells-for-50-usd</a><br>
<br>
<a href="http://www.uplaytablet.com/compare-soc-cpus-used-in-ainol-elf-aurora-ii-amlogic-8726-mx-wopad-i7-i8-rock-chip-rk-2918-and-wopad-a10-allwinner-a10/">www.uplaytablet.com/compare-soc-cpus-used-in-ainol-elf-aurora-ii-amlogic-8726-mx-wopad-i7-i8-rock-chip-rk-2918-and-wopad-a10-allwinner-a10/</a><br>
<a href="http://rhombus-tech.net/evaluated_cpus/">rhombus-tech.net/evaluated_cpus/</a> — обзор различных процессоров для применения в компактных устройствах<br>
<br>
<a href="http://en.qi-hardware.com/wiki/Main_Page">en.qi-hardware.com/wiki/Main_Page</a><br>
<br>
<a href="http://www.wits-tech.com/pages/board-en.jsp">www.wits-tech.com/pages/board-en.jsp</a><br>
<a href="http://www.pineriver.cn/eshowProDetail.asp?ProID=1527">www.pineriver.cn/eshowProDetail.asp?ProID=1527</a><br>
<a href="http://www.calao-systems.com/articles.php?lng=en&pg=6186">www.calao-systems.com/articles.php?lng=en&amp;pg=6186</a><br>
<br>
<a href="http://www.st.com/internet/mcu/product/251211.jsp">www.st.com/internet/mcu/product/251211.jsp</a><br>
<a href="http://www.st.com/internet/evalboard/product/253211.jsp">www.st.com/internet/evalboard/product/253211.jsp</a><br>
<br>
<h4>Установка GNU/Linux на железо</h4><br>
<br>
<a href="http://archlinuxarm.org/forum/viewtopic.php?f=27&t=2709">archlinuxarm.org/forum/viewtopic.php?f=27&amp;t=2709</a> Mele A1000 Archlinux<br>
<a href="http://rhombus-tech.net/allwinner_a10/hacking_the_mele_a1000/">rhombus-tech.net/allwinner_a10/hacking_the_mele_a1000/</a><br>
<a href="http://www.cnx-software.com/2012/06/13/hardware-packs-for-allwinner-a10-devices-and-easier-method-to-create-a-bootable-ubuntu-12-04-sd-card/">www.cnx-software.com/2012/06/13/hardware-packs-for-allwinner-a10-devices-and-easier-method-to-create-a-bootable-ubuntu-12-04-sd-card/</a><br>
<a href="http://gitorious.org/ac100/abootimg/blobs/master/README">gitorious.org/ac100/abootimg/blobs/master/README</a>
<div class="clear"></div>
</div>
<ul class="tags">
<li><a href="http://habrahabr.ru/search/?q=%5Blinux%5D&target_type=posts" rel="tag">linux</a></li><li>, <a href="http://habrahabr.ru/search/?q=%5Bembedded%5D&target_type=posts" rel="tag">embedded</a></li>
</ul>
<div class="infopanel_wrapper">
<div class="infopanel " id="infopanel_post_147793">
<div class="voting ">
<span class="plus" title="За свои посты голосовать нельзя. Срок голосования истек."></span>
<div class="mark positive ">
<span class="score" title="Всего 31: ↑29 и ↓2">+27</span>
</div>
<span class="minus" title="За свои посты голосовать нельзя.Срок голосования истек."></span>
</div>
<div class="pageviews" title="Просмотры поста">19472</div>
<div class="favorite">
<a class="add" title="Добавить в избранное" href="http://habrahabr.ru/post/147793/#" onclick="return posts_add_to_favorite(this, &#39;2&#39;, 147793)"> </a>
</div>
<div class="favs_count" title="Количество пользователей, добавивших пост в избранное">134</div>
<div class="author">
<a title="Автор текста" href="http://habrahabr.ru/users/philpirj/">philpirj</a>
<span class="rating" title="рейтинг пользователя">68,9</span>
</div>
<div class="share">
<div class="twitter">
<a href="http://twitter.com/intent/tweet?text=GNU%2FLinux+%D0%B8+%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%BE+%D0%BD%D0%B0+Rockchip+2918+http://habr.ru/p/147793/+via+%40habrahabr+%23habr" title="Опубликовать ссылку в Twitter" target="_blank"></a>
</div>
<div class="vkontakte">
<a href="http://vk.com/share.php?url=http://habrahabr.ru/post/147793/" title="Опубликовать ссылку во ВКонтакте" onclick="window.open(this.href, &#39;Опубликовать ссылку во Вконтакте&#39;, &#39;width=800,height=300&#39;); return false"></a>
</div>
<div class="facebook">
<a href="https://www.facebook.com/sharer/sharer.php?u=http://habrahabr.ru/post/147793/" title="Опубликовать ссылку в Facebook" onclick="window.open(this.href, &#39;Опубликовать ссылку в Facebook&#39;, &#39;width=640,height=436,toolbar=0,status=0&#39;); return false"></a>
</div>
<div class="googleplus">
<a href="https://plus.google.com/share?url=http://habrahabr.ru/post/147793/" title="Опубликовать ссылку в Google Plus" onclick="window.open(this.href, &#39;Опубликовать ссылку в Google Plus&#39;, &#39;width=800,height=300&#39;); return false"></a>
</div>
</div>
</div>
<div class="clear"></div>
</div>
</div>
<div id="adriver_banner_132032996"></div>
<script type="text/javascript">
function show_inner_banner_block(name, url){
if( typeof(name) !== 'undefined'){
$.get('/html/'+name+'/1398441886/', function(html){
$('#adriver_banner_132032996').html(html);
$('.'+name+'_inner_banner').removeClass('hidden');
if( typeof(url) !== 'undefined'){
$('.'+name+'_inner_banner .block_url').attr('href', url);
}
})
}
}
$(function(){
var keyword = '';
if (typeof crtg_content !== 'undefined' && crtg_content) { keyword = crtg_content; }
var custom = { 4:ar_duo1 };
custom[1] = 'hardware';
custom[2] = 'gadgets';
custom[3] = 'linux';
/* Антоша не удаляй это условие блеать! Как я тестить буду? */
//if (true)
// show_inner_banner_block('profit');
//else
new adriver("adriver_banner_132032996", {sid: 176776, bt: 52, bn: 3, custom: custom, keyword: keyword});
});
</script>
<div class="comments_list " id="comments">
<h2 class="title ">комментарии (<span id="comments_count">9</span>)
<span class="subscribe_comments">
отслеживать новые:
<label><input type="checkbox" id="subscribe_comments" rel="{target_type:&#39;2&#39;,target_id:147793 }" checked="checked"> в почте</label>
<label><input type="checkbox" id="tracker_comments" rel="{target_type:&#39;2&#39;,target_id:147793 }"> в трекере</label>
</span>
</h2>
<div class="comment_item" id="comment_4984042">
<span class="parent_id" data-parent_id="0"></span>
<div class="comment_body">
<div class="info " rel="4984042">
<div class="folding-dot-holder"><div class="folding-dot"></div></div>
<div id="voting_4984042" class="voting ">
<span class="minus" title="Срок голосования истек "></span>
<span class="plus" title="Срок голосования истек "></span>
<div class="mark ">
<span class="score" title="Всего 6: ↑3 и ↓3">0</span>
</div>
</div>
<a href="http://habrahabr.ru/users/telegamochka/" class="avatar"><img src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/c66282b2550fafdb859fc6291fe68b51_small.jpg" alt=""></a>
<a href="http://habrahabr.ru/users/telegamochka/" class="username">telegamochka</a><span class="comma">,</span>
<time>14 июля 2012 в 11:40</time>
<a href="http://habrahabr.ru/post/147793/#comment_4984042" class="link_to_comment">#</a>
<a href="http://habrahabr.ru/post/147793/#" class="favorite add" onclick="return comments_add_to_favorite(this, &#39;3&#39;, 4984042 )" title="В избранное"></a>
<span class="to_chidren"></span>
<div class="clear"></div>
</div>
<div class="message html_format ">
&gt; всего за $100 и с полным комплектом кабелей (что всего на $5 дороже, чем комплект Raspberry Pi с зарядкой, шнурами и корпусом).<br>
<br>
Любопытно, где и по каким ценам Вы заказывали Raspberry Pi :) Мне мой с зарядником, кабелями, _двумя_ корпусами и доставкой в Москву обошелся в $73. Брала бы с одним корпусом — получилось бы меньше $67. А между $100 и $67 разница далеко не в $5 :)<br>
<br>
RS Stock No. Qty Description Unit Price Goods Value<br>
756-8308 1 Raspberry Pi Type B Single Board Computer US$35.00 US$35.00<br>
2000114155 1 3.5mm Stereo to twin RCA plug cable for Raspberry Pi US$2.41 US$2.41<br>
726-3053 1 Micro USB Euro power supply for Raspberry Pi US$7.92 US$7.92<br>
Case-CLR 1 Raspberry Pi Type B Case — Clear US$6.47 US$6.47<br>
2000114151 1 HDMI cable for Raspberry Pi US$5.49 US$5.49<br>
CASE-BLK 1 Raspberry Pi Type B Case — Black US$6.47 US$6.47<br>
557-032 1 Ethernet network cable for Raspberry Pi US$1.57 US$1.57<br>
Running Total US$65.33 <br>
Standard Delivery (Despatch expected within 10 week(s)) US$8.02 <br>
Order total US$73.35
</div>
<div class="reply_form_placeholder"></div>
<div class="reply">
<a href="http://habrahabr.ru/post/147793/#reply" class="reply_link" onclick="return comment_show_reply_form(4984042 )">ответить</a>
</div>
</div>
<div class="reply_comments" id="reply_comments_4984042">
<div class="comment_item" id="comment_4984095">
<span class="parent_id" data-parent_id="4984042"></span>
<div class="comment_body">
<div class="info is_topic_starter is_author" rel="4984095">
<div class="folding-dot-holder"><div class="folding-dot"></div></div>
<div id="voting_4984095" class="voting ">
<span class="minus" title="За свои комментарии голосовать нельзя"></span>
<span class="plus" title="За свои комментарии голосовать нельзя"></span>
<div class="mark positive ">
<span class="score" title="Всего 6: ↑4 и ↓2">+2</span>
</div>
</div>
<a href="http://habrahabr.ru/users/philpirj/" class="avatar"><img src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/f50b744625ff1e41ec0bdbb754b62824_small.jpg" alt=""></a>
<a href="http://habrahabr.ru/users/philpirj/" class="username">philpirj</a><span class="comma">,</span>
<time>14 июля 2012 в 12:14</time>
<a href="http://habrahabr.ru/post/147793/#comment_4984095" class="link_to_comment">#</a>
<a href="http://habrahabr.ru/post/147793/#" class="favorite add" onclick="return comments_add_to_favorite(this, &#39;3&#39;, 4984095 )" title="В избранное"></a>
<div class="show_tree" data-id="4984095" data-parent_id="4984042" title="Показать ветку комментариев">↵</div>
<a href="http://habrahabr.ru/post/147793/#comment_4984042" data-id="4984095" data-parent_id="4984042" class="to_parent">↑</a>
<span class="to_chidren"></span>
<div class="clear"></div>
</div>
<div class="message html_format ">
Это правда единственное, что вам любопытно во всём топике?
</div>
<div class="reply_form_placeholder"></div>
<div class="reply">
<a href="http://habrahabr.ru/post/147793/#reply" class="reply_link" onclick="return comment_show_reply_form(4984095 )">ответить</a>
</div>
</div>
<div class="reply_comments" id="reply_comments_4984095">
</div>
</div>
<div class="comment_item" id="comment_4984121">
<span class="parent_id" data-parent_id="4984042"></span>
<div class="comment_body">
<div class="info is_topic_starter is_author" rel="4984121">
<div class="folding-dot-holder"><div class="folding-dot"></div></div>
<div id="voting_4984121" class="voting ">
<span class="minus" title="За свои комментарии голосовать нельзя"></span>
<span class="plus" title="За свои комментарии голосовать нельзя"></span>
<div class="mark positive ">
<span class="score" title="Всего 2: ↑2 и ↓0">+2</span>
</div>
</div>
<a href="http://habrahabr.ru/users/philpirj/" class="avatar"><img src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/f50b744625ff1e41ec0bdbb754b62824_small.jpg" alt=""></a>
<a href="http://habrahabr.ru/users/philpirj/" class="username">philpirj</a><span class="comma">,</span>
<time>14 июля 2012 в 12:35</time>
<a href="http://habrahabr.ru/post/147793/#comment_4984121" class="link_to_comment">#</a>
<a href="http://habrahabr.ru/post/147793/#" class="favorite add" onclick="return comments_add_to_favorite(this, &#39;3&#39;, 4984121 )" title="В избранное"></a>
<div class="show_tree" data-id="4984121" data-parent_id="4984042" title="Показать ветку комментариев">↵</div>
<a href="http://habrahabr.ru/post/147793/#comment_4984042" data-id="4984121" data-parent_id="4984042" class="to_parent">↑</a>
<span class="to_chidren"></span>
<div class="clear"></div>
</div>
<div class="message html_format ">
RS Stock No. Qty Description Unit Price Goods Value<br>
756-8308 1 Raspberry Pi Type B Single Board Computer £21.60 £21.60<br>
726-3053 1 Micro USB Euro power supply for Raspberry Pi £4.89 £4.89<br>
CASE-BLK 1 Raspberry Pi Type B Case — Black £3.99 £3.99<br>
557-032 1 Ethernet network cable for Raspberry Pi £0.97 £0.97<br>
Running Total £31.45 <br>
Standard Delivery (Despatch expected within 11 week(s)) £4.95 <br>
Order total £36.40<br>
Что есть примерно $56.<br>
+ $5 HDMI шнур<br>
+ $5 SD карта<br>
+ $15 WiFi USB заглушка<br>
Итого $80.<br>
<br>
GV-2B стоил мне $65 плюс доставка $40. Как выяснилось позже, доставка <a href="http://www.gets.cn/shipping_cost.php">стоит</a> $25. Увы, я забыл упомянуть это в топике. Итого в теории $90.<br>
<br>
Мне интересно, как быстро вы найдёте технические ошибки в топике, раз так быстро нашли ошибку в подсчёте.
</div>
<div class="reply_form_placeholder"></div>
<div class="reply">
<a href="http://habrahabr.ru/post/147793/#reply" class="reply_link" onclick="return comment_show_reply_form(4984121 )">ответить</a>
</div>
</div>
<div class="reply_comments" id="reply_comments_4984121">
</div>
</div>
</div>
</div>
<div class="comment_item" id="comment_4984464">
<span class="parent_id" data-parent_id="0"></span>
<div class="comment_body">
<div class="info " rel="4984464">
<div class="folding-dot-holder"><div class="folding-dot"></div></div>
<div id="voting_4984464" class="voting voted_plus ">
<span class="minus" title="Вы проголосовали положительно, отменить голос нельзя"></span>
<span class="plus" title="Вы проголосовали положительно"></span>
<div class="mark positive ">
<span class="score" title="Всего 1: ↑1 и ↓0">+1</span>
</div>
</div>
<a href="http://habrahabr.ru/users/dasm32/" class="avatar"><img src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/f4d6997628e721c9f3b524767659cd7c_small.png" alt=""></a>
<a href="http://habrahabr.ru/users/dasm32/" class="username">dasm32</a><span class="comma">,</span>
<time>14 июля 2012 в 17:22</time>
<a href="http://habrahabr.ru/post/147793/#comment_4984464" class="link_to_comment">#</a>
<a href="http://habrahabr.ru/post/147793/#" class="favorite add" onclick="return comments_add_to_favorite(this, &#39;3&#39;, 4984464 )" title="В избранное"></a>
<span class="to_chidren"></span>
<div class="clear"></div>
</div>
<div class="message html_format ">
Ох, напомнило мои похожие мытарства с ZTE W300 (роутер такой, стримовцы его продавали), тоже пришлось много чего ковырять, и «нашлепки» китайские разбирать, только там на форумах была такая ситуация:<br>
«zte w300? никогда не видели и не трогали такого… покажите вывод того-то и того-то… ого, это разительно отличается от всего, что мы когда-либо встречали. врятли мы чем-то поможем. где-нибудь есть исходники прошивки?». Разумеется их и в помине нет :)<br>
<br>
Автору — удачи и терпения! :)
</div>
<div class="reply_form_placeholder"></div>
<div class="reply">
<a href="http://habrahabr.ru/post/147793/#reply" class="reply_link" onclick="return comment_show_reply_form(4984464 )">ответить</a>
</div>
</div>
<div class="reply_comments" id="reply_comments_4984464">
</div>
</div>
<div class="comment_item" id="comment_4985118">
<span class="parent_id" data-parent_id="0"></span>
<div class="comment_body">
<div class="info " rel="4985118">
<div class="folding-dot-holder"><div class="folding-dot"></div></div>
<div id="voting_4985118" class="voting voted_plus ">
<span class="minus" title="Вы проголосовали положительно, отменить голос нельзя"></span>
<span class="plus" title="Вы проголосовали положительно"></span>
<div class="mark positive ">
<span class="score" title="Всего 2: ↑2 и ↓0">+2</span>
</div>
</div>
<a href="http://habrahabr.ru/users/art_linux/" class="avatar"><img src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/cf2d1e732e0facd49255909aa551b1b6_small.jpg" alt=""></a>
<a href="http://habrahabr.ru/users/art_linux/" class="username">art_linux</a><span class="comma">,</span>
<time>15 июля 2012 в 01:10</time>
<a href="http://habrahabr.ru/post/147793/#comment_4985118" class="link_to_comment">#</a>
<a href="http://habrahabr.ru/post/147793/#" class="favorite add" onclick="return comments_add_to_favorite(this, &#39;3&#39;, 4985118 )" title="В избранное"></a>
<span class="to_chidren"></span>
<div class="clear"></div>
</div>
<div class="message html_format ">
Потрясающий топик, прочитал на одном дыхании.<br>
На старой работе чем-то похожим иногда занимался, но те времена прошли, на мое счастье
</div>
<div class="reply_form_placeholder"></div>
<div class="reply">
<a href="http://habrahabr.ru/post/147793/#reply" class="reply_link" onclick="return comment_show_reply_form(4985118 )">ответить</a>
</div>
</div>
<div class="reply_comments" id="reply_comments_4985118">
</div>
</div>
<div class="comment_item" id="comment_4986945">
<span class="parent_id" data-parent_id="0"></span>
<div class="comment_body">
<div class="info " rel="4986945">
<div class="folding-dot-holder"><div class="folding-dot"></div></div>
<div id="voting_4986945" class="voting ">
<span class="minus" title="Срок голосования истек "></span>
<span class="plus" title="Срок голосования истек "></span>
<div class="mark ">
<span class="score" title="Всего 0: ↑0 и ↓0">0</span>
</div>
</div>
<a href="http://habrahabr.ru/users/nizulko/" class="avatar"><img src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/stub-user-small.gif" alt=""></a>
<a href="http://habrahabr.ru/users/nizulko/" class="username">nizulko</a><span class="comma">,</span>
<time>16 июля 2012 в 10:12</time>
<a href="http://habrahabr.ru/post/147793/#comment_4986945" class="link_to_comment">#</a>
<a href="http://habrahabr.ru/post/147793/#" class="favorite add" onclick="return comments_add_to_favorite(this, &#39;3&#39;, 4986945 )" title="В избранное"></a>
<span class="to_chidren"></span>
<div class="clear"></div>
</div>
<div class="message html_format ">
Автору низкий поклон! <br>
Такая работа, такой анализ и упорство!
</div>
<div class="reply_form_placeholder"></div>
<div class="reply">
<a href="http://habrahabr.ru/post/147793/#reply" class="reply_link" onclick="return comment_show_reply_form(4986945 )">ответить</a>
</div>
</div>
<div class="reply_comments" id="reply_comments_4986945">
</div>
</div>
<div class="comment_item" id="comment_4989655">
<span class="parent_id" data-parent_id="0"></span>
<div class="comment_body">
<div class="info " rel="4989655">
<div class="folding-dot-holder"><div class="folding-dot"></div></div>
<div id="voting_4989655" class="voting voted_plus ">
<span class="minus" title="Вы проголосовали положительно, отменить голос нельзя"></span>
<span class="plus" title="Вы проголосовали положительно"></span>
<div class="mark positive ">
<span class="score" title="Всего 1: ↑1 и ↓0">+1</span>
</div>
</div>
<a href="http://habrahabr.ru/users/dmiceman/" class="avatar"><img src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/stub-user-small.gif" alt=""></a>
<a href="http://habrahabr.ru/users/dmiceman/" class="username">dmiceman</a><span class="comma">,</span>
<time>17 июля 2012 в 08:25</time>
<a href="http://habrahabr.ru/post/147793/#comment_4989655" class="link_to_comment">#</a>
<a href="http://habrahabr.ru/post/147793/#" class="favorite add" onclick="return comments_add_to_favorite(this, &#39;3&#39;, 4989655 )" title="В избранное"></a>
<span class="to_chidren"></span>
<div class="clear"></div>
</div>
<div class="message html_format ">
Респектище и уважуха! Огромную и нужную работу провел. Дойдут руки, буду по мотивам этой статьи измываться над своим планшетом на 2918.
</div>
<div class="reply_form_placeholder"></div>
<div class="reply">
<a href="http://habrahabr.ru/post/147793/#reply" class="reply_link" onclick="return comment_show_reply_form(4989655 )">ответить</a>
</div>
</div>
<div class="reply_comments" id="reply_comments_4989655">
</div>
</div>
<div class="comment_item" id="comment_5009489">
<span class="parent_id" data-parent_id="0"></span>
<div class="comment_body">
<div class="info " rel="5009489">
<div class="folding-dot-holder"><div class="folding-dot"></div></div>
<div id="voting_5009489" class="voting voted_plus ">
<span class="minus" title="Вы проголосовали положительно, отменить голос нельзя"></span>
<span class="plus" title="Вы проголосовали положительно"></span>
<div class="mark positive ">
<span class="score" title="Всего 1: ↑1 и ↓0">+1</span>
</div>
</div>
<a href="http://habrahabr.ru/users/onk/" class="avatar"><img src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/c0b0a668dedff684d882a6d524f9165c_small.jpg" alt=""></a>
<a href="http://habrahabr.ru/users/onk/" class="username">onk</a><span class="comma">,</span>
<time>25 июля 2012 в 00:38</time>
<a href="http://habrahabr.ru/post/147793/#comment_5009489" class="link_to_comment">#</a>
<a href="http://habrahabr.ru/post/147793/#" class="favorite add" onclick="return comments_add_to_favorite(this, &#39;3&#39;, 5009489 )" title="В избранное"></a>
<span class="to_chidren"></span>
<div class="clear"></div>
</div>
<div class="message html_format ">
насколько удалось наскрести док по рокчипу, информация о разделах должна писаться именно пять раз. <br>
<br>
rkcrc -p генерит корректный хидер и футер к файлу parameter. (в кухне это используется)<br>
<br>
если разделы (img) идут со стандартными сигнатурами ANDROID или KRNL то они далее вполне успешно распаковываются <br>
<br>
cramfs используется не из зловредности производителей. эта фс является по сути архивом. размер фс получается намного (чутьли не в разы) меньше тойже ext3 <br>
для внесения изменений надо содержимое распаковать в каталог, изменить и затем вызвать mkfs -t cramfs для создания нового образа<br>
к сожалению пока кухня этого пока не поддерживает — надо несколько изменить структуру подкаталогов и методику распаковки/упаковки<br>
поддержку ext4 периодически включаю и потом снова выключаю<br>
<br>
порядок и наименование mtd разделов играют важную роль лишь по той причине, что в init.rc идет монтирование сучетом порядка и/или имен (сейчас точно не помню)<br>
<br>
кстати используемые ext3 в прошивках обычно имеют всего пару сотен свободных inode — так «экономят» память раздела, но записать на такой раздел чтолибо становится проблемным (при том что раздел создается размером 350М а выделяется в mtd 512M)<br>
<br>
ЗЫ попробуйте использовать вместо rkflashtool29 rkflashtool. это оригинальная версия.<br>
а в rkflashtool29 внесены некотрые изменения в протокол обмена по usb. он стал больше соответствовать тому, что происходит при использовании виндовых утилит идущих с прошивками планшетов<br>
<br>
ЗЗЫ спасибо за исследования на тему сборки и обновления версии ядра. может както попробую обновиться.<br>
по ядру может быть немаловажным таблица портов gpio (кажется так) — гдето был конфиг с назначением (обнаружил когда сравнивал исходники ядра от CM и easypix). хотя ядро по идее и должно само находить что куда подключено.<br>
<br>
ЗЗЫ в конфиге ядра можно включить вывод лога на экран (тот самый где пингвин). я както включал, но у меня в итоге консоль оказалась поверх экрана андроида. мне было проще — исходники от easypix теже что и для cube u9gt2<br>
<br>
и таки надо создавать тему по ядру для rk2918
</div>
<div class="reply_form_placeholder"></div>
<div class="reply">
<a href="http://habrahabr.ru/post/147793/#reply" class="reply_link" onclick="return comment_show_reply_form(5009489 )">ответить</a>
</div>
</div>
<div class="reply_comments" id="reply_comments_5009489">
<div class="comment_item" id="comment_5035137">
<span class="parent_id" data-parent_id="5009489"></span>
<div class="comment_body">
<div class="info is_topic_starter is_author" rel="5035137">
<div class="folding-dot-holder"><div class="folding-dot"></div></div>
<div id="voting_5035137" class="voting ">
<span class="minus" title="За свои комментарии голосовать нельзя"></span>
<span class="plus" title="За свои комментарии голосовать нельзя"></span>
<div class="mark ">
<span class="score" title="Всего 0: ↑0 и ↓0">0</span>
</div>
</div>
<a href="http://habrahabr.ru/users/philpirj/" class="avatar"><img src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/f50b744625ff1e41ec0bdbb754b62824_small.jpg" alt=""></a>
<a href="http://habrahabr.ru/users/philpirj/" class="username">philpirj</a><span class="comma">,</span>
<time> 4 августа 2012 в 18:28</time>
<a href="http://habrahabr.ru/post/147793/#comment_5035137" class="link_to_comment">#</a>
<a href="http://habrahabr.ru/post/147793/#" class="favorite add" onclick="return comments_add_to_favorite(this, &#39;3&#39;, 5035137 )" title="В избранное"></a>
<div class="show_tree" data-id="5035137" data-parent_id="5009489" title="Показать ветку комментариев">↵</div>
<a href="http://habrahabr.ru/post/147793/#comment_5009489" data-id="5035137" data-parent_id="5009489" class="to_parent">↑</a>
<span class="to_chidren"></span>
<div class="clear"></div>
</div>
<div class="message html_format ">
Во-первых, спасибо за кухню! В основном ориентировался в своих изысканиях на то, как она работает и по возможности использовал.<br>
Похоже, что ошибки я допустил глобально две:<br>
— использовал при сборке ядра тулкит hf (hard float), не подумав, что его поддержки может и не быть в устройстве. В принципе можно попробовать с soft float;<br>
— запаковал / с помощью cpio вместо mkfs.ext3/4.<br>
<br>
Как будет время, обязательно попробую ошибки исправить, и обязательно попробую немодифицированный rkflashtool.<br>
Странно, что ext3 вообще используют на устройствах с флеш-памятью, он для неё никак не оптимизирован.<br>
Ключ для вывода лога загрузки на экран не нашёл, но запихнуть его в уже готовое ядро (собранное руками у меня пингвина не выдавало) всё равно не получится.
</div>
<div class="reply_form_placeholder"></div>
<div class="reply">
<a href="http://habrahabr.ru/post/147793/#reply" class="reply_link" onclick="return comment_show_reply_form(5035137 )">ответить</a>
</div>
</div>
<div class="reply_comments" id="reply_comments_5035137">
</div>
</div>
</div>
</div>
</div>
<div class="comments_form" id="comments_form_placeholder">
<h2 class="title"><a href="http://habrahabr.ru/post/147793/#" onclick="return comment_show_form()">Написать комментарий</a></h2>
<form action="http://habrahabr.ru/json/comment/" method="post" id="comments_form">
<div id="preview_placeholder" class="hidden html_format"></div>
<input type="hidden" name="ts" value="1398619768">
<input type="hidden" name="tt" value="2">
<input type="hidden" name="ti" value="147793">
<input type="hidden" name="comment_id" value="0">
<input type="hidden" name="parent_id" value="0">
<div class="editor">
<div class="panel">
<div class="wysiwyg_wrapper">
<div class="can_use_html"><a href="http://habrahabr.ru/post/147793/#html_help" onclick="$(this).parents(&#39;.wysiwyg_wrapper&#39;).find(&#39;.help_holder&#39;).toggleClass(&#39;hidden&#39;);return false;">html-теги</a></div>
<a title="Жирный" onclick="return habraWYG.insertTagWithText(this, &#39;b&#39;);" href="http://habrahabr.ru/post/147793/#" tabindex="-1"><img width="20" height="20" alt="Ж" src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/bold_ru.gif"></a>
<a title="Курсив" onclick="return habraWYG.insertTagWithText(this, &#39;i&#39;);" href="http://habrahabr.ru/post/147793/#" tabindex="-1"><img width="20" height="20" alt="К" src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/italic_ru.gif"></a>
<a title="Подчёркнутый" onclick="return habraWYG.insertTagWithText(this, &#39;u&#39;);" href="http://habrahabr.ru/post/147793/#" tabindex="-1"><img width="20" height="20" alt="__" src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/underline_ru.gif"></a>
<a title="Зачёркнутый" onclick="return habraWYG.insertTagWithText(this, &#39;s&#39;);" href="http://habrahabr.ru/post/147793/#" tabindex="-1"><img width="20" height="20" alt="—" src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/strikethrough.gif"></a>
<a title="Цитата" style="margin-right: 10px;" onclick="return habraWYG.insertTagWithText(this, &#39;blockquote&#39;);" href="http://habrahabr.ru/post/147793/#" tabindex="-1"><img width="20" height="20" alt="Цитата" src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/blockquote.png"></a>
<select class="with-title" title="Используйте этот тег для блочных элементов" name="source" onchange="habraWYG.insertSource(this);" tabindex="-1">
<option value="" class="title">Source:</option>
<option value="bash">Bash</option>
<option value="cs">C#</option>
<option value="cpp">C++</option>
<option value="css">CSS</option>
<option value="diff">Diff</option>
<option value="html">HTML</option>
<option value="xml">XML</option>
<option value="java">Java</option>
<option value="javascript">JavaScript</option>
<option value="php">PHP</option>
<option value="perl">Perl</option>
<option value="python">Python</option>
<option value="ruby">Ruby</option>
<option value="sql">SQL</option>
<option value="1c">1C</option>
<option value="actionscript">ActionScript</option>
<option value="apache">Apache</option>
<option value="axapta">Axapta</option>
<option value="cmake">CMake</option>
<option value="coffeescript">CoffeeScript</option>
<option value="dos">DOS</option>
<option value="delphi">Delphi</option>
<option value="django">Django</option>
<option value="erlang">Erlang</option>
<option value="erlang_repl">Erlang REPL</option>
<option value="glsl">GLSL</option>
<option value="go">Go</option>
<option value="haskell">Haskell</option>
<option value="lisp">Lisp</option>
<option value="lua">Lua</option>
<option value="mel">MEL</option>
<option value="markdown">Markdown</option>
<option value="matlab">Matlab</option>
<option value="nginx">Nginx</option>
<option value="objectivec">Objective C</option>
<option value="rust">Rust</option>
<option value="scala">Scala</option>
<option value="smalltalk">Smalltalk</option>
<option value="tex">TeX</option>
<option value="vbscript">VBScript</option>
<option value="vhdl">VHDL</option>
<option value="vala">Vala</option>
</select>
<a style="margin: auto 10px;" title="Код - Используйте этот тег для строчных элементов" onclick="return habraWYG.insertTagWithText(this, &#39;code&#39;);" href="http://habrahabr.ru/post/147793/#" tabindex="-1" class="txt"><img width="30" height="20" alt="Код" src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/code.gif"></a>
<a title="Вставить ссылку" onclick="return habraWYG.insertLink(this);" href="http://habrahabr.ru/post/147793/#" tabindex="-1"><img width="20" height="20" alt="A" src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/link.gif"></a>
<a title="Вставить изображение" onclick="return habraWYG.insertImage(this);" href="http://habrahabr.ru/post/147793/#" tabindex="-1"><img width="20" height="20" alt="IMG" src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/image.gif"></a>
<div class="help_holder hidden">
<h4>Теги Хабрахабра</h4>
<dl class="block_semi">
<dt>&lt;habracut&gt;</dt>
<dd class="description">Используется только в текстах постов, скрывает под кат часть текста, следующую за тегом (будет написано «Читать дальше»).</dd>
</dl>
<dl class="block_semi">
<dt>&lt;habracut text="Подробности" /&gt;</dt>
<dd class="description">Так можно превратить надпись «Читать дальше» в любой текст.</dd>
</dl>
<dl class="block_semi">
<dt>&lt;source lang="Язык"&gt;&lt;/source&gt;</dt>
<dd class="description">Подсвечивает исходный код (на выбор:
Bash, C#, C++, CSS, Diff, HTML, XML, Ini, Java, JavaScript, PHP, Perl, Python, Ruby, SQL,
1C, AVR Assembler, ActionScript, Apache, Axapta, CMake, CoffeeScript, DOS, .bat, Delphi, Django, Erlang, Erlang REPL, Go, Haskell, Lisp, Lua, MEL, Markdown, Matlab, Nginx, Objective C, Parser3, Python profile, RenderMan, Rust, Scala, Smalltalk, TeX, VBScript, VHDL, Vala
).</dd>
</dl>
<dl class="block_semi">
<dt>&lt;video&gt;http://...&lt;/video&gt;</dt>
<dd class="description">Добавляет в пост видео со следующих хостингов: YouTube, RuTube, Google video, Vimeo, Я.Видео и Видео@Mail.ru<br>Вставляйте между тегами только прямую ссылку на видеоролик.</dd>
</dl>
<dl class="block_semi">
<dt>&lt;slideshow&gt;http://...&lt;/slideshow&gt;</dt>
<dd class="description">Вставка интерактивного слайд-шоу. Пока поддерживается только сервис Slideshare.net.</dd>
</dl>
<dl class="block_semi">
<dt>&lt;hh user="Ник" /&gt;</dt>
<dd class="description">Выводит имя хабрапользователя посреди текста, обратный слеш (/) в конце тега обязателен. Вы так же можете использовать конструкцию <b>@username</b>, где <b>username</b> — это ник пользователя. </dd>
</dl>
<dl class="block_semi">
<dt>&lt;spoiler title="Заголовок"&gt;Содержимое&lt;/spoiler&gt;</dt>
<dd class="description">Вставка спойлера (разворачиваемый блок информации).</dd>
</dl>
<h4>Стандартные</h4>
<table class="wide">
<tbody><tr>
<td>
<dl class="block_semi">
<dt>&lt;h1&gt;&lt;/h1&gt;<br>
...<br>
&lt;h6&gt;&lt;/h6&gt;
</dt>
<dd class="description">Заголовки разного уровня.</dd>
</dl>
<dl class="block_semi">
<dt>&lt;img src="" /&gt;</dt>
<dd class="description">Вставка изображения, в атрибуте src нужно указывать полный путь к изображению. Возможно выравнивание картинки атрибутом align.</dd>
</dl>
<dl class="block_semi">
<dt>&lt;a href="http://..."&gt;Ссылка&lt;/a&gt;</dt>
<dd class="description">Вставка ссылки, в атрибуте href указывается желаемый интернет-адрес или якорь (anchor) для навигации по странице.</dd>
</dl>
<dl class="block_semi">
<dt>&lt;anchor&gt;Example1&lt;/anchor&gt;</dt>
<dd class="description">Тег для указания якоря. Для вызова используйте тег вставки ссылок (&lt;a href="#Example1"&gt;Текст&lt;/a&gt;).</dd>
</dl>
<dl class="block_semi">
<dt>&lt;b&gt;&lt;/b&gt;<br>
&lt;strong&gt;&lt;/strong&gt;</dt>
<dd class="description">Выделение важного текста, на странице выделяется жирным начертанием.</dd>
</dl>
<dl class="block_semi">
<dt>&lt;i&gt;&lt;/i&gt;<br>
&lt;em&gt;&lt;/em&gt;</dt>
<dd class="description">Выделение важного текста, на странице выделяется курсивом.</dd>
</dl>
<dl class="block_semi">
<dt>
&lt;s&gt;&lt;/s&gt;<br>
&lt;strike&gt;&lt;/strike&gt;
</dt>
<dd class="description">Текст между этими тегами будет отображаться как зачеркнутый.</dd>
</dl>
<dl class="block_semi">
<dt>
&lt;u&gt;&lt;/u&gt;
</dt>
<dd class="description">Текст между этими тегами будет отображаться как подчеркнутый.</dd>
</dl>
</td>
<td width="5%"></td>
<td>
<dl class="block_semi">
<dt>
&lt;hr /&gt;
</dt>
<dd class="description">Тег для вставки горизонтальной линии.</dd>
</dl>
<dl class="block_semi">
<dt>
&lt;blockquote&gt;&lt;/blockquote&gt;
</dt>
<dd class="description">Используйте этот тег для выделения цитат.</dd>
</dl>
<dl class="block_semi">
<dt>
&lt;table&gt;&lt;/table&gt;<br>
&lt;th&gt;&lt;/th&gt;<br>
&lt;td&gt;&lt;/td&gt;<br>
&lt;tr&gt;&lt;/tr&gt;
</dt>
<dd class="description">Набор тегов для создания таблицы. Тег &lt;td&gt; обозначает ячейку таблицы, тег &lt;th&gt; - ячейку в заголовке, &lt;tr&gt; - строчку таблицы. Все содержимое таблицы помещайте в тег &lt;table&gt;.</dd>
</dl>
<dl class="block_semi">
<dt>
&lt;sup&gt;&lt;/sup&gt;<br>
&lt;sub&gt;&lt;/sub&gt;
</dt>
<dd class="description">Текст, заключенный в тег &lt;sup&gt; отображается в виде верхнего индекса, &lt;sub&gt; - в виде нижнего.</dd>
</dl>
<dl class="block_semi">
<dt>
&lt;abbr title="" &gt;&lt;/abbr&gt;<br>
&lt;acronym title="" &gt;&lt;/acronym&gt;
</dt>
<dd class="description">Тегом &lt;abbr&gt; выделяется аббревиатура, в атрибуте title указывайте её расшифровку. Используйте тег &lt;acronym&gt; для устоявшихся аббревиатур.</dd>
</dl>
<dl class="block_semi">
<dt>
&lt;pre&gt;&lt;/pre&gt;
</dt>
<dd class="description">Текст в теге &lt;pre&gt; не форматируется автоматически.</dd>
</dl>
<dl class="block_semi">
<dt>
&lt;nobr&gt;&lt;/nobr&gt;<br>
&lt;br clear="all|left||right" /&gt;
</dt>
<dd class="description">Текст, помещенный в тег &lt;nobr&gt;, не переносится на странице; для принудительного переноса текста используйте тег &lt;br /&gt;; для аккуратного выравнивания изображений используйте атрибут clear="all|left||right" в теге &lt;br /&gt;.</dd>
</dl>
<dl class="block_semi">
<dt>
&lt;ul&gt;&lt;/ul&gt;<br>
&lt;li&gt;&lt;/li&gt;
</dt>
<dd class="description">Ненумерованный список; каждый элемент списка задается тегом &lt;li&gt;, набор элементов списка помещайте в тег &lt;ul&gt;.</dd>
</dl>
<dl class="block_semi">
<dt>
&lt;ol&gt;&lt;/ol&gt;<br>
&lt;li&gt;&lt;/li&gt;
</dt>
<dd class="description">Нумерованный список; каждый элемент списка задается тегом &lt;li&gt;, набор элементов списка помещайте в тег &lt;ol&gt;.</dd>
</dl>
</td>
</tr>
</tbody></table>
<div class="close_html"><a href="http://habrahabr.ru/post/147793/#html_help_close" onclick="$(this).parents(&#39;.wysiwyg_wrapper&#39;).find(&#39;.help_holder&#39;).toggleClass(&#39;hidden&#39;);return false;">закрыть</a></div>
</div>
</div>
</div>
<div class="text-holder">
<textarea cols="30" rows="10" name="text" id="comment_text"></textarea>
</div>
<span id="error_text" class="error"></span>
</div>
<div class="buttons">
<input type="button" class="preview disableble" value="Предпросмотр" disabled="disabled" onclick="comment_preview(this.form, this)">
<input type="button" class="submit disableble" value="Написать" disabled="disabled" onclick="comment_send(this.form, this)">
<input type="button" class="edit hidden disableble" value="Сохранить" disabled="disabled" onclick="comment_update(this.form, this)">
<span class="time_left" title="Оставшееся время редактирования комментария"></span>
</div>
</form>
</div>
<form action="http://habrahabr.ru/json/favorites/" method="post" id="edit_tags_form" class="hidden">
<input type="hidden" name="action" value="add">
<input type="hidden" name="ti" value="0">
<input type="hidden" name="tt" value="0">
<label>Пометьте топик понятными вам метками, если хотите</label>
<input type="text" name="tags_string" class="tags_string" autocomplete="off">
<div class="description">Метки лучше разделять запятой. Например: <i>общение, социальные сети, myspace.com, подростки, мердок</i></div>
<input type="submit" value="Сохранить" class="submit"> или <a href="http://habrahabr.ru/post/147793/#" class="close" onclick="return close_edit_tags()">закрыть</a>
</form>
</div>
<div class="sidebar_right">
<div class="banner_300x500">
<div id="adriver_banner_1863387959"></div>
<script type="text/javascript">
$(function(){
var keyword = '';
if (typeof crtg_content !== 'undefined' && crtg_content) { keyword = crtg_content; }
var custom = {4:ar_duo1};
custom[1] = 'hardware';
custom[2] = 'gadgets';
custom[3] = 'linux';
new adriver("adriver_banner_1863387959", {sid: 176776, bt: 52, bn: 1, custom: custom, keyword: keyword});
}());
</script>
</div>
<div class="block daily_best_posts">
<div class="title">Лучшее <sup>за 24 часа</sup></div>
<div class="posts_list">
<div class="post_item">
<a href="http://habrahabr.ru/post/220999/" class="post_name">DDoS любого сайта с использованием заметок Facebook</a>
</div>
<div class="post_item">
<a href="http://habrahabr.ru/post/221031/" class="post_name">Создатель мультфильма «Крепость» выпустит продолжение</a>
</div>
<div class="post_item">
<a href="http://habrahabr.ru/post/220989/" class="post_name">Создание робота балансера на arduino</a>
</div>
<div class="post_item">
<a href="http://habrahabr.ru/post/221011/" class="post_name">J может быть читаемым</a>
</div>
<div class="post_item">
<a href="http://habrahabr.ru/company/hola/blog/220983/" class="post_name">Readability своими руками</a>
</div>
<div class="post_item">
<a href="http://habrahabr.ru/post/221033/" class="post_name">«Правило ноля»</a>
</div>
<div class="post_item">
<a href="http://habrahabr.ru/post/220977/" class="post_name">Незаметные сложности ракетной техники: Часть 5. Стартовые сооружения</a>
</div>
<div class="post_item">
<a href="http://habrahabr.ru/post/220953/" class="post_name">HD FPV на Raspberry Pi. Работа над ошибками</a>
</div>
<div class="post_item">
<a href="http://habrahabr.ru/company/zfort/blog/220995/" class="post_name">Дайджест интересных материалов из мира веб-разработки и IT за последнюю неделю №106 (20 — 26 апреля 2014)</a>
</div>
<div class="post_item">
<a href="http://habrahabr.ru/post/220961/" class="post_name">Про компоновку, dependency hell и обратную совместимость</a>
</div>
</div>
<div class="all"><a href="http://habrahabr.ru/top/">все лучшие</a></div>
</div>
<div class="block similar_posts">
<div class="title">Похожие посты</div>
<div class="posts_list">
<div class="post_item">
<a class="post_name" href="http://habrahabr.ru/post/220413/">Практические рекомендации: устраняйте неполадки, используя команду 'Top' в Linux</a>
<span class="when">25.04.2014</span>
</div>
<div class="post_item">
<a class="post_name" href="http://habrahabr.ru/post/220755/">Unreal Engine 4.1 — поддержка XBox One, PlayStation 4, Linux, SteamOS и многое другое</a>
<span class="when">24.04.2014</span>
</div>
<div class="post_item">
<a class="post_name" href="http://habrahabr.ru/post/220727/">Linux Foundation и крупнейшие IT-компании создают фонд для поддержки критически важного открытого ПО</a>
<span class="when">24.04.2014</span>
</div>
<div class="post_item">
<a class="post_name" href="http://habrahabr.ru/post/220431/">Учет трафика Cisco ASA с помощью NetFlow, nfdump и MySQL на FreeBSD или Linux (Часть 2)</a>
<span class="when">22.04.2014</span>
</div>
<div class="post_item">
<a class="post_name" href="http://habrahabr.ru/post/213775/">Написание драйвера для LCD дисплея под embedded linux</a>
<span class="when">25.02.2014</span>
</div>
<div class="post_item">
<a class="post_name" href="http://habrahabr.ru/post/132448/">Переселение души: linux на android планшете</a>
<span class="when">12.11.2011</span>
</div>
<div class="post_item">
<a class="post_name" href="http://habrahabr.ru/post/123266/">Обзор шины SPI и разработка драйвера ведомого SPI устройства для embedded Linux (Часть вторая, практическая)</a>
<span class="when">02.07.2011</span>
</div>
<div class="post_item">
<a class="post_name" href="http://habrahabr.ru/post/123145/">Обзор шины SPI и разработка драйвера ведомого SPI устройства для embedded Linux (Часть первая, обзорная)</a>
<span class="when">30.06.2011</span>
</div>
<div class="post_item">
<a class="post_name" href="http://habrahabr.ru/post/123078/">Вышел Voyage Linux 0.7.5</a>
<span class="when">30.06.2011</span>
</div>
<div class="post_item">
<a class="post_name" href="http://habrahabr.ru/post/106598/">Вопросы использования Intel Atom для embedded realtime задач</a>
<span class="when">27.10.2010</span>
</div>
</div>
</div>
<div class="block similar_questions">
<div class="title">Вопросы по теме</div>
<div class="posts_list">
<div class="post_item">
<a class="post_name" href="https://toster.ru/q/90237?_aa=press_anykey">Возникает ошибка: Call to undefined function mysql_connect()</a>
</div>
<div class="post_item">
<a class="post_name" href="https://toster.ru/q/90175?_aa=press_anykey">Авторизация по ключам SSH. Не пускает под root</a>
</div>
<div class="post_item">
<a class="post_name" href="https://toster.ru/q/90121?_aa=press_anykey">Как сделать образ SD карты (на карте дистрибутив linux)?</a>
</div>
<div class="post_item">
<a class="post_name" href="https://toster.ru/q/90101?_aa=press_anykey">Как сделать бек ап андроида если он ушел в постоянную перезагрузку?</a>
</div>
<div class="post_item">
<a class="post_name" href="https://toster.ru/q/90099?_aa=press_anykey">Как починить Yandex.Disk? Error: directory path is being used by another</a>
</div>
<div class="post_item">
<a class="post_name" href="https://toster.ru/q/90063?_aa=press_anykey">Linux, тема для диплома?</a>
</div>
<div class="post_item">
<a class="post_name" href="https://toster.ru/q/90055?_aa=press_anykey">Как обновить до Ubuntu 14.04 с LiveCD или liveusb?</a>
</div>
<div class="post_item">
<a class="post_name" href="https://toster.ru/q/90051?_aa=press_anykey">Apache не видит каталог</a>
</div>
<div class="post_item">
<a class="post_name" href="https://toster.ru/q/90049?_aa=press_anykey">Linux. Маршрутизация при 3g и wifi подключении</a>
</div>
<div class="post_item">
<a class="post_name" href="https://toster.ru/q/90041?_aa=press_anykey">Настройка подсветки на openSuse 13.1</a>
</div>
<div class="post_item">
<a class="post_name" href="https://toster.ru/q/89993?_aa=press_anykey">Как создавать Linux Server по шаблону?</a>
</div>
<div class="post_item">
<a class="post_name" href="https://toster.ru/q/89881?_aa=press_anykey">Какой debian-like дистрибутив линукс посоветуете?</a>
</div>
<div class="post_item">
<a class="post_name" href="https://toster.ru/q/89809?_aa=press_anykey">Есть ли истории успеха установки bumblebee с драйвером nouveau?</a>
</div>
<div class="post_item">
<a class="post_name" href="https://toster.ru/q/89791?_aa=press_anykey">Какой Линукс можно установить из-под Винды?</a>
</div>
<div class="post_item">
<a class="post_name" href="https://toster.ru/q/89789?_aa=press_anykey">ANSI C - Как подключиться к MySQL?</a>
</div>
<div class="post_item">
<a class="post_name" href="https://toster.ru/q/89751?_aa=press_anykey">OpenGL лаги на intel sandybridge</a>
</div>
<div class="post_item">
<a class="post_name" href="https://toster.ru/q/89593?_aa=press_anykey">Как править список установленных осей при загрузке (линукс, винда)?</a>
</div>
<div class="post_item">
<a class="post_name" href="https://toster.ru/q/89469?_aa=press_anykey">Стоит ли перейти на linux</a>
</div>
<div class="post_item">
<a class="post_name" href="https://toster.ru/q/89381?_aa=press_anykey">Как выбрать raid?</a>
</div>
<div class="post_item">
<a class="post_name" href="https://toster.ru/q/89369?_aa=press_anykey">Как в OpenWrt узнать, какой интерфейс принадлежит определенной WIFI-сети или зоне?</a>
</div>
</div>
</div>
<div class="block live_broadcast">
<div class="title">Что обсуждают? </div>
<div class="live_broadcast_activity">
<div class="posts_list">
<div class="post_item">
<a href="http://habrahabr.ru/post/123140#comments" class="post_name">Изолирование приложения с IP-адресом из VPN другой страны на примере Steam</a>&nbsp;<span class="count">7</span>
</div>
<div class="post_item">
<a href="http://habrahabr.ru/post/221027#comments" class="post_name">Изучаем Derby 0.6 — разбор примеров — #1</a>&nbsp;<span class="count">8</span>
</div>
<div class="post_item">
<a href="http://habrahabr.ru/post/220781#comments" class="post_name">import sphinxapi без танцев или простая установка sphinxapi.py через pip</a>&nbsp;<span class="count">4</span>
</div>
<div class="post_item">
<a href="http://habrahabr.ru/post/220989#comments" class="post_name">Создание робота балансера на arduino</a>&nbsp;<span class="count">9</span>
</div>
<div class="post_item">
<a href="http://habrahabr.ru/post/220403#comments" class="post_name">Официальное мобильное приложение Хабрахабра</a>&nbsp;<span class="count">547</span>
</div>
<div class="post_item">
<a href="http://habrahabr.ru/post/221063#comments" class="post_name">В который раз этот класс?</a>&nbsp;<span class="count">2</span>
</div>
<div class="post_item">
<a href="http://habrahabr.ru/post/221017#comments" class="post_name">Голым по интернету или скрываться под псевдонимом и потерять репутацию онлайн</a>&nbsp;<span class="count">21</span>
</div>
<div class="post_item">
<a href="http://habrahabr.ru/post/221055#comments" class="post_name">Алгоритмы сортировки в виде пошаговой анимации</a>&nbsp;<span class="count">9</span>
</div>
<div class="post_item">
<a href="http://habrahabr.ru/post/220897#comments" class="post_name">TI-84+</a>&nbsp;<span class="count">49</span>
</div>
<div class="post_item">
<a href="http://habrahabr.ru/post/220797#comments" class="post_name">Вангеры были переизданы на Steam</a>&nbsp;<span class="count">112</span>
</div>
</div>
<div class="all"><a href="http://habrahabr.ru/posts/">все посты</a></div>
</div>
</div>
<!-- AdRiver code START. Type:AjaxJS Site: habrahabr PZ: 0 BN: 2 -->
<div id="adriver_banner_480931290" class="adbanner"></div>
<script type="text/javascript">
$(function(){
var check_scroll_position = function() {
var height = $(window).height();
var scrollTop = $(window).scrollTop();
var scrollBottom = $(window).scrollTop() + height;
var blockTop = $('#adriver_banner_480931290').position().top;
var show = scrollTop < blockTop && blockTop < scrollBottom;
//console.log('scroll', scrollTop, blockTop, scrollBottom, show)
if( show ){
//console.log('show bn2');
$( window ).off('scroll', check_scroll_position);
$( window ).trigger('show_bn2');
}
};
$( window ).on('scroll', check_scroll_position);
$( window ).on('show_bn2', function(){
var keyword = '';
if (typeof crtg_content !== 'undefined' && crtg_content) { keyword = crtg_content; }
var custom = {4:ar_duo1};
custom[1] = 'hardware';
custom[2] = 'gadgets';
custom[3] = 'linux';
new adriver("adriver_banner_480931290", {sid: 176776, bt: 52, bn: 2, custom: custom, keyword: keyword});
});
});
</script>
<!-- AdRiver code END -->
<div class="block best_company">
<div class="title">Компания дня <img src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/bg_cicle_help.png" class="help-tip"></div>
<div class="company_info">
<div class="name">
<img class="favicon" src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/962805082f637b91dbf30ebb10ef3c33_small.jpg" alt="Mail.Ru Group" height="16" width="16">
<div class="company_name"><a href="http://habrahabr.ru/company/mailru/" class="title">Mail.Ru Group</a></div>
</div>
<p>Последний пост:
<a href="http://habrahabr.ru/company/mailru/blog/220671/">Тренировочный раунд RCC 2014 Warmup</a>
</p>
<div class="buttons">
<div id="fans_count">3300 подписчиков</div>
<input type="button" id="addCompanyFan" data-id="2" class="blue " title="Мне нравится компания" value="Подписаться">
<input type="button" id="removeCompanyFan" data-id="2" class="hidden" title="Компания мне больше не нравится" value="Подписан">
</div>
</div>
</div>
<div class="block new_vacanies">
<a href="http://brainstorage.me/jobs" class="title">Brainstorage</a>
<div class="vacancies">
<div class="job_item ">
<a href="http://brainstorage.me/jobs/18227">Программист DRUPAL</a>
</div>
<div class="job_item ">
<a href="http://brainstorage.me/jobs/10649">С++ Game (Client) Programmer</a>
</div>
<div class="job_item ">
<a href="http://brainstorage.me/jobs/10657">Senior Graphics Programmer</a>
</div>
<div class="job_item marked">
<a href="http://brainstorage.me/jobs/18225">Дизайнер</a>
</div>
<div class="job_item ">
<a href="http://brainstorage.me/jobs/18213">Java Developer в Департамент систем автоматизации ИТ </a>
</div>
<div class="job_item ">
<a href="http://brainstorage.me/jobs/18211">Java Architect в Департамент систем автоматизации ИТ</a>
</div>
<div class="job_item ">
<a href="http://brainstorage.me/jobs/16247">Разработчик C++ (Яндекс.Острова)</a>
</div>
<div class="job_item ">
<a href="http://brainstorage.me/jobs/16297">Старший разработчик поиска </a>
</div>
<div class="job_item ">
<a href="http://brainstorage.me/jobs/16315">Разработчик распределенной системы хранения и обработки данных</a>
</div>
<div class="job_item ">
<a href="http://brainstorage.me/jobs/16481">Разработчик веб-робота</a>
</div>
</div>
<div class="all"><a href="http://brainstorage.me/jobs">все вакансии</a></div>
</div>
<div class="block freelansim">
<a href="http://freelansim.ru/" class="title"></a>
<div class="tasks">
<div class="task ">
<a href="http://freelansim.ru/tasks/65899">Организовать колл центр</a>
</div>
<div class="task ">
<a href="http://freelansim.ru/tasks/65895">Доска объявлений</a>
</div>
<div class="task ">
<a href="http://freelansim.ru/tasks/65891">Установить и настроить Google Analytics</a>
</div>
<div class="task ">
<a href="http://freelansim.ru/tasks/65887">Необходимо спарсить данные с сайта биржи</a>
</div>
<div class="task ">
<a href="http://freelansim.ru/tasks/65877">Доработать jQuery - компонет Select2 - SCSS и JS</a>
</div>
<div class="task ">
<a href="http://freelansim.ru/tasks/65875">Модель угроз и требования для backup приложения</a>
</div>
<div class="task ">
<a href="http://freelansim.ru/tasks/65873">Разработка трехзвенной архитектуры</a>
</div>
<div class="task ">
<a href="http://freelansim.ru/tasks/65859">Написать первую теоретическую главу диплома по теме: "Технико экономическое обоснование..." </a>
</div>
<div class="task marked">
<a href="http://freelansim.ru/tasks/55298">Блок + админка</a>
</div>
<div class="task ">
<a href="http://freelansim.ru/tasks/65847">Составление описания товаров</a>
</div>
</div>
<div class="all"><a href="http://freelansim.ru/tasks">все заказы</a></div>
</div>
<div class="block similar_events">
<div class="title">Ближайшие события</div>
<div class="events_items">
<div class="event_item">
<div class="date">
<div class="dayname dayname_1"></div>
<div class="day">28</div>
<div class="month">апр</div>
</div>
<div class="title">
<a href="http://habrahabr.ru/events/4791/">Основы ITILv3 — 2011</a>
</div>
</div>
<div class="event_item">
<div class="date">
<div class="dayname dayname_1"></div>
<div class="day">28</div>
<div class="month">апр</div>
</div>
<div class="title">
<a href="http://habrahabr.ru/events/4863/">Интернет-конференция «Открытые инновации: данные должны работать!»</a>
</div>
</div>
<div class="event_item">
<div class="date">
<div class="dayname dayname_2"></div>
<div class="day">29</div>
<div class="month">апр</div>
</div>
<div class="title">
<a href="http://habrahabr.ru/events/4665/">Вебинар: Nokia Notifications API для платформы Nokia X</a>
</div>
</div>
<div class="event_item">
<div class="date">
<div class="dayname dayname_2"></div>
<div class="day">29</div>
<div class="month">апр</div>
</div>
<div class="title">
<a href="http://habrahabr.ru/events/4911/">Webinar: облачная инфраструктура в 3 клика. На примере 1С в облаке.</a>
</div>
</div>
<div class="event_item">
<div class="date">
<div class="dayname dayname_2"></div>
<div class="day">29</div>
<div class="month">апр</div>
</div>
<div class="title">
<a href="http://habrahabr.ru/events/4861/">Третья конференция «Дорога в облака»: Big Data &amp; OpenStack!</a>
</div>
</div>
</div>
<div class="all"><a href="http://habrahabr.ru/events/">все события</a></div>
</div>
</div>
<div class="clear"></div>
<script>
// hubs to GA
ga('send', 'event', 'Post_view', 'hardware (Железо)', window.location.pathname + window.location.search);
ga('send', 'event', 'Post_view', 'gadgets (Гаджеты. Устройства для гиков)', window.location.pathname + window.location.search);
ga('send', 'event', 'Post_view', 'linux (Linux)', window.location.pathname + window.location.search);
</script>
<div class="rotated_posts">
<div class="rotated_post ">
<a href="http://habrahabr.ru/post/208962/" class="grey">Вирус вывел из строя все комплексы видеофиксации в Подмосковье</a>
</div>
<div class="rotated_post ">
<a href="http://habrahabr.ru/post/215291/" class="grey">2048</a>
</div>
<div class="rotated_post last">
<a href="http://habrahabr.ru/post/216609/" class="grey">История создания торрент-рендера для 3ds max</a>
</div>
<div class="clear"></div>
</div>
<div class="clear"></div>
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){
// test gggg
// настройки всплывающих уведомлений
$.jGrowl.defaults.closerTemplate = '<div>Закрыть все уведомления</div>';
// настройки тултипов
$(".help-tip").tipTip({maxWidth: "300px", edgeOffset: 10});
});
// global vars
var g_base_url = 'habrahabr.ru';
var g_show_xpanel = true;
var g_base_fullurl = 'http://habrahabr.ru/';
var g_is_guest = true;
var g_user_login = 'philpirj';
var g_user_id = 60619;
var g_user_avatar = '//habrastorage.org/getpro/habr/avatars/f50/b74/462/f50b744625ff1e41ec0bdbb754b62824_small.jpg';
</script>
<script type="text/javascript" src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/shortcuts.js"></script>
<script type="text/javascript" src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/float_block.js"></script>
<script type="text/javascript" src="./GNU Linux и устройство на Rockchip 2918 Хабрахабр_files/saved_resource"></script>
<div id="footer">
<dl class="user">
<dt><a href="http://habrahabr.ru/users/philpirj/">philpirj</a></dt>
<dd><a href="http://habrahabr.ru/tracker/">Трекер</a></dd>
<dd><a href="http://habrahabr.ru/topic/add/">Написать</a></dd>
<dd><a href="http://habrahabr.ru/conversations/">Cообщения</a></dd>
<dd><a href="https://habrahabr.ru/auth/settings/">Настройки</a></dd>
<dd><a href="http://habrahabr.ru/ppa/">ППА</a></dd>
</dl>
<dl>
<dt>Разделы</dt>
<!--dd><a href="http://habrahabr.ru/qa/">Q&A</a></dd-->
<dd><a href="http://habrahabr.ru/hubs/">Хабы</a></dd>
<dd><a href="http://habrahabr.ru/events/">События</a></dd>
<dd><a href="http://habrahabr.ru/companies/">Компании</a></dd>
<dd><a href="http://habrahabr.ru/users/">Пользователи</a></dd>
</dl>
<dl>
<dt>Посты</dt>
<dd><a href="http://habrahabr.ru/feed/">Лента</a></dd>
<dd><a href="http://habrahabr.ru/posts/top/">Лучшие</a></dd>
<dd><a href="http://habrahabr.ru/posts/collective/">Тематические</a></dd>
<dd><a href="http://habrahabr.ru/posts/corporative/">Корпоративные</a></dd>
<dd><a href="http://habrahabr.ru/sandbox/">Песочница</a></dd>
</dl>
<dl>
<dt>Инфо</dt>
<dd><a href="http://habrahabr.ru/info/about/">О сайте</a></dd>
<dd><a href="http://habrahabr.ru/info/help/rules/">Правила</a></dd>
<dd><a href="http://habrahabr.ru/info/help/">Помощь</a></dd>
<dd><a href="http://habrahabr.ru/info/agreement/">Соглашение</a></dd>
</dl>
<dl>
<dt>Услуги</dt>
<dd><a href="http://habrahabr.ru/info/advertising/">Реклама</a></dd>
<dd><a href="http://habrahabr.ru/info/advertising/corporate/">Корпоративные тарифы</a></dd>
<dd><a href="http://habrahabr.ru/info/advertising/workshops/">Семинары</a></dd>
<dd><a href="http://habrahabr.ru/special/">Спецпроекты</a></dd>
<dd><a href="http://habrahabr.ru/special/minsvyaz/" style="color:green;">Льготы стартапам</a></dd>
</dl>
<div class="copyright">
<div class="about">
<a href="http://tmtm.ru/">TM</a>
© 2006–2014
<br><br>
<a href="http://habrahabr.ru/feedback/">Служба поддержки</a><br><br>
<a href="http://m.habrahabr.ru/">Мобильная версия</a><br><br>
<a href="http://habrahabr.ru/apps/" style="color: #e95e51;">Мобильные приложения</a><br><br>
<div class="social_accounts">
<a href="https://twitter.com/habrahabr" class="tw"></a>
<a href="https://www.facebook.com/habrahabr.ru" class="fb"></a>
<a href="http://vk.com/habr" class="vk"></a>
<!-- <a href="" class="gp"></a> //-->
</div>
</div>
</div>
</div>
<div class="footer_logos">
<div class="project brainstorage">
<a href="http://brainstorage.ru/" class="icon "></a>
<div class="text">Все мозги в одном месте</div>
</div>
<div class="project toster">
<a href="http://toster.ru/" class="icon "></a>
<div class="text">Q&amp;A-сервис для разработчиков</div>
</div>
<div class="project freelansim">
<a href="http://freelansim.ru/" class="icon "></a>
<div class="text">Заказы для фрилансеров</div>
</div>
<div class="project autokadabra">
<a href="http://autokadabra.ru/" class="icon "></a>
<div class="text ">Уютная и дружелюбная</div>
</div>
</div>
<div id="AutocompleteContainter_80431" style="position: absolute; z-index: 9999; top: 51px; left: 1127.5px;"><div class="autocomplete-w1"><div class="autocomplete" id="Autocomplete_80431" style="display: none; width: 300px; max-height: 400px;"></div></div></div><div id="AutocompleteContainter_3a2cf" style="position: absolute; z-index: 9999; top: 2px; left: 0px;"><div class="autocomplete-w1"><div class="autocomplete" id="Autocomplete_3a2cf" style="display: none; width: 300px; max-height: 400px;"></div></div></div><div id="xpanel" style="right: 0px;"><a href="http://habrahabr.ru/post/147793/#refresh" class="refresh"></a><div class="divider" style="display: none;"></div><a href="http://habrahabr.ru/post/147793/#new" class="new" style="display: none;">0</a></div><div id="tiptip_holder" style="max-width:300px;"><div id="tiptip_arrow"><div id="tiptip_arrow_inner"></div></div><div id="tiptip_content"></div></div></body></html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment