<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Pydev: o pythonie... po polsku &#187; embeded</title>
	<atom:link href="http://pydev.pl/tag/embeded/feed/" rel="self" type="application/rss+xml" />
	<link>http://pydev.pl</link>
	<description>Kolejny blog o życiu programisty</description>
	<lastBuildDate>Tue, 15 Dec 2009 23:06:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Linux na QQ2440: mini HOWTO</title>
		<link>http://pydev.pl/2009/08/23/linux-na-qq2440-mini-howto/</link>
		<comments>http://pydev.pl/2009/08/23/linux-na-qq2440-mini-howto/#comments</comments>
		<pubDate>Sun, 23 Aug 2009 16:41:38 +0000</pubDate>
		<dc:creator>Krzysiek</dc:creator>
				<category><![CDATA[QQ2440]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[embeded]]></category>
		<category><![CDATA[qq2440]]></category>
		<category><![CDATA[toolchain]]></category>
		<category><![CDATA[uboot]]></category>

		<guid isPermaLink="false">http://pydev.pl/?p=22</guid>
		<description><![CDATA[Od dłuższego czasu walczę z moją pracą magisterską, w skrócie temat dotyka Linuksa na urządzeniu wbudowanym. Specjalnie na tą okazję zaopatrzyłem się w zestaw developerski QQ2440 (made in China sic!)  oparty na procesorze Samsung s3c2440. Tak oto prezentuje się w pełnej krasie: Wczoraj wieczorem udało mi się uruchomić na nim moją własną wersję skompilowanego jądra.  [...]]]></description>
			<content:encoded><![CDATA[<p>Od dłuższego czasu walczę z moją pracą magisterską, w skrócie temat dotyka Linuksa na urządzeniu wbudowanym. Specjalnie na tą okazję zaopatrzyłem się w zestaw developerski QQ2440 (made in China sic!)  oparty na procesorze <em>Samsung s3c2440. </em>Tak oto prezentuje się w pełnej krasie:<em><br />
</em></p>
<p style="text-align: center;"><em><a rel="lightbox[22]" href="http://lh3.ggpht.com/_XfRQrrZa0cc/SpEGwtp_W1I/AAAAAAAAAbk/OLOryoAHzjE/s800/23082009088.jpg"><img class="aligncenter" src="http://lh3.ggpht.com/_XfRQrrZa0cc/SpEGwtp_W1I/AAAAAAAAAbk/OLOryoAHzjE/s320/23082009088.jpg" alt="23082009088.jpg" /></a></em></p>
<p style="text-align: left;">Wczoraj wieczorem udało mi się uruchomić na nim moją własną wersję skompilowanego jądra.  Oczywiście nie customizowałem wszystkiego samemu, skorzystałem<em> z patchy </em>oraz wskazówek <a href="http://blog.leshak.ru/" target="_blank">LeshaK&#8217;a</a>. Wszystkich zainteresowanych odsyłam do jego bloga, gdyż to on jest autorem tego rozwiązania, w tym artykule postaram się tylko opisać czym różniło się moje podejście i ewentualnie doprecyzować niektóre moim zdaniem niejasne kwestie.</p>
<p>W tym artykule postaram się opisać:</p>
<ul>
<li>przygotowanie środowiska kompilacji (toolchain)</li>
<li>skompilowanie kernela i przygotowanie obrazu jądra</li>
</ul>
<p style="text-align: left;">W przeciwieństwie do niego jednak zamiast toolchaina <a href="http://ymorin.is-a-geek.org/dokuwiki/projects/crosstool">crosstool-NG</a> użyłem system <a href="http://wiki.openembedded.net/index.php/Main_Page" target="_blank">OpenEmbedded</a>. Nie zagłębiając się zanadto w szczegóły tej decyzji w skrócie opowiem, że z narzędziem <a href="http://ymorin.is-a-geek.org/dokuwiki/projects/crosstool">crosstool-NG</a> i kompilacją jajka walczyłem kilka miesięcy, a za pomocą OE udało mi się skompilować i uruchomić środowisko w jeden wieczór (może to tylko kwestia szczęścia).</p>
<p style="text-align: left;"><strong>Cross compile toolchain:</strong></p>
<p style="text-align: left;">W skrócie to kompilatory, bin utilts&#8217;y, uc/glibc itp. słowem wszystko co potrzebne do procesu kompilacji czegokolwiek. Jako, że (przynajmniej tak zakładam) pracujemy na PC z rodziny x86,  mamy (lub nie) domyślnie kompilatory na tąże platformę (i tylko tą). Więc aby na x86 skompilować coś na ARM trzeba mieć osobny zestaw narzędzi czyli fachowo cross-compile toolchain na rodzinę ARM.  Polecam w wolnym czasie przeglądnąć artykuł na <a href="http://en.wikipedia.org/wiki/ARM_architecture">Wikipedii</a>.</p>
<p style="text-align: left;">No to nurkujemy, na początek instalacja OE tu wam nie pomogę, ale wszystko jet na oficjalnym <a href="http://wiki.openembedded.net/index.php/Getting_started">wiki</a>, aha nic nie budujemy, tylko instalacja! Jeżeli czytasz dalej to znaczy, że już masz OE na swoim hoście pora na konfigurację. Nasza platforma to QQ2440 i nie jest ona obsługiwana przez OE <img src='http://pydev.pl/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> , ale jest osadzona na procesorze z rodziny <em>s3c24xx</em>, tak tej samej na której działa OpenMoko, więc w pliku local.conf ustawiamy:</p>
<pre>MACHINE = "om-gta02"
TARGET_OS = "linux-uclibc"
DISTRO = "minimal-uclibc"
IMAGE_FSTYPES = "jffs2"</pre>
<p style="text-align: left;">Teraz OE już jest gotowe do zbudowania naszego toolchaina:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">bitbake task-sdk-host</pre></div></div>

<p style="text-align: left;">To polecenie pobierze i skompiluje automagicznie około 500 pakietów. Po udanym wykonaniu powyższego polecenia możemy udać się do katalogu:</p>
<pre>{OE}/build/conf/tmp/cross/armv4t/bin</pre>
<p style="text-align: left;">i cieszyć się naszym wspaniałym świeżutkim toolchainem.</p>
<p style="text-align: left;"><strong>Kernel:</strong></p>
<p style="text-align: left;">Niestety nie możemy wykorzystać dobrodziejstw systemu Open Embedded w celu przygotowania obrazu jądra gdyż nasza platforma nie jest wspierana pod tym kątem. Ten krok nie odbiega bardzo od podejścia Leshak&#8217;a, podam tylko skrócone tłumaczenie dla leniwych:</p>
<ul>
<li>instalujemy program mkimage,

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> mkimage</pre></div></div>

</li>
<li>instalujemy dowolny serwer tftp (przyda się do przesyłania po sieci binariów na sprzęt), np.

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> atftpd</pre></div></div>

</li>
<li>pobieramy jądro Linuksa 2.6.29, standardowo z <a href="http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.29.tar.bz2">kernel.org</a></li>
<li>patch ze strony <a href="http://blog.leshak.ru/file/xx2440-2.6.29-rc6-20090225.diff.gz">Leshaka</a></li>
</ul>
<p>Następnie patchujemy pobrane źrodła kernela i jesteśmy prawie gotowi do kompilacji. Domyślnie Makefile Leshak&#8217;a po skompilowaniu jądra tworzy obraz za pomocą programu mkimage i umieszcza go katalogu głównym serwera tftp (domyślna ścieżka dla obrazu u Leshak&#8217;a: <code>/opt/share</code>/tftp/uImage), dodatkowa instrukcja znajduje się w pliku linux-2.6.29/arch/arm/boot/Makefile.<br />
Wystarczy zmienić tą ścieżkę na nasz katalog główny serwera tftp i możemy bawić się dalej.</p>
<p>Teraz zgodnie z zaleceniami kompilujemy:</p>
<pre> cd linux-2.6.29
 export PATH=$PATH:/Wpisz/tu/sciezke/do/build/conf/tmp/cross/armv4t/bin
 make qq2440_defconfig
 CROSS_COMPILE=arm-oe-linux-uclibcgnueabi- make -j5</pre>
<p>Po tym kroku otrzymujemy wspaniałe świeże jajko i co najważniejsze działające!<br />
Pozostaje tylko kilka kroków zanim przekonamy się, że faktycznie nasz Linux działa.</p>
<p><strong>Boot loader i instalacja:</strong></p>
<p>Odsyłam do artykułu o przygotowaniu U-Boota (<a href="http://translate.google.com/translate?prev=hp&amp;hl=en&amp;u=http%3A%2F%2Fblog.leshak.ru%2F&amp;sl=ru&amp;tl=en">link</a>), są tam zarówno źródła jak i instrukcje jak postępować. Należy tylko pamiętać aby skompilować U-Boot za pomocą naszego toolchaina, postępując analogicznie jak z kernelem.</p>
<p>Dalej w celu instalacji znowu odsyłam do strony Leshak&#8217;a w celu zasięgnięcia instrukcji odnośnie osadzenia przygotowanych binarek na urządzeniu (<a href="http://blog.leshak.ru/english/pages/how-to-install-u-boot-linux-2629-rootfsjffs2-busybox-1132-into-nand-qq2440/">link</a>).  Tutaj znowu mam drobną uwagę, w związku ze zmianą rozmiaru obrazów należy przeliczyć sobie rozmiar swojego jądra, systemu plików, bootloadera i odpowiednio zmodyfikować polecenia dla bootloadera (super vivi oraz U-Boot ). Dla mnie wyglądało to mniej więcej tak:</p>
<pre>qq2440&gt; tftp 0x32000000 uImage
qq2440&gt; nand erase 0x100000 0x200000
qq2440&gt; nand write 0x32000000 0x100000 0x200000
qq2440&gt; setenv bootcmd 'nand read 0x32000000 0x100000 0x1a78c4; bootm 0x32000000'
qq2440&gt; saveenv
qq2440&gt; reset</pre>
<p>W skrócie opisze co się dzieje:</p>
<ol>
<li>pobierz z serwera tftp plik uImage pod adres 0&#215;32000000 w RAM</li>
<li>wyczyść 2097152 bajtów pamięci NAND od adresu 0&#215;100000</li>
<li>wczytaj z RAM (spod adresu 0&#215;32000000) i zapisz do NAND (pod adres 0&#215;100000) 2097152 bajtów</li>
<li>ustaw parametry &#8220;bootowania&#8221; dla U-Boot&#8217;a, a w nich:
<ol>
<li>wczytaj z NAND (spod adresu 0&#215;100000) i zapisz do RAM (0&#215;32000000)  1734852 bajtów</li>
<li>wykonaj skok do (czytaj uruchom program spod adresu) 0&#215;32000000 (RAM)</li>
</ol>
</li>
</ol>
<p>Wybaczcie za tak łopatologiczne tłumaczenie, ale nie potrafię inaczej tego wytłumaczyć.  Jako, że dane przelatują kilka razy tam i z powrotem trzeba odpowiednio zmodyfikować parametry tak by odpowiadały rzeczywistej wielkości danych, należy uważać też, aby nie napisać &#8220;przypadkiem&#8221; kawałka jądra, systemu plików czy boot loadera. Polecam do tego celu kartkę i długopis.</p>
<p>Może też zdarzyć sytuacja, że występują bad sektory w pamięci NAND flash, najlepiej wówczas odpowiednio przesunąć obraz w którym one występują. Przy przenoszeniu jądra należy pamiętać aby odpowiednio zmodyfikować parametry programu mkimage.</p>
<p><strong>System plików i dystrybucja:</strong></p>
<p>Aktualnie pracuje nad tą częścią artykułu, tymczasem kolejny raz odsyłam do bloga <a href="http://blog.leshak.ru/">Leshak</a>&#8216;a, do załączonej płyty z oprogramowaniem (tam też są gotowe obrazy systemu plików) oraz jako ciekawostkę polecam narzędzie online do tworzenia obrazu dystrybucji <a href="http://amethyst.openembedded.net/~koen/narcissus/">Angstrom</a>.</p>
<p style="text-align: left;"><!-- start of reCAPTCHA form -->
<script type="text/javascript">
var RecaptchaOptions = {
theme: 'white',
lang: 'en'
};
</script>
<noscript>&nbsp;</noscript>
<form method="post" action="/tag/embeded/feed/">
<fieldset class="recaptcha_form_fieldset">
<p class="recaptcha_form_p">Your Name:<br /><label for="recaptcha_form_name"><input type="text" id="recaptcha_form_name" name="recaptcha_form_name" value="" class="recaptcha_form_input" /></label></p>
<p class="recaptcha_form_p">Your Email Address:<br /><label for="recaptcha_form_email"><input type="text" id="recaptcha_form_email" name="recaptcha_form_email" value="" class="recaptcha_form_input" /></label></p>
<p class="recaptcha_form_p">Your Message:<br /><label for="recaptcha_form_message"><textarea id="recaptcha_form_message" name="recaptcha_form_message" rows="10" cols="20" class="recaptcha_form_textarea"></textarea></label></p>
<script type="text/javascript" src="http://api.recaptcha.net/challenge?k=6LcZ8QcAAAAAACA44ZMEgFA6GW1QRTXLnMduDTlA"></script>
<noscript>
<div id="gatt_design_recaptcha_plugin">
<object data="http://api.recaptcha.net/noscript?k=6LcZ8QcAAAAAACA44ZMEgFA6GW1QRTXLnMduDTlA" type="text/html" id="gatt_design_recaptcha_plugin_object" class="recaptcha_form_captcha_box">
<!--[if IE]>
<object classid="clsid:235336920-03F9-11CF-8FD0-00AA00686F13" data="http://api.recaptcha.net/noscript?k=6LcZ8QcAAAAAACA44ZMEgFA6GW1QRTXLnMduDTlA" type="text/html" id="gatt_design_recaptcha_plugin_object" class="recaptcha_form_captcha_box">
<p>&nbsp;</p>
</object>
<![endif]-->
<p>&nbsp;</p>
</object>
</div>
<br />
<textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea>
<input type="hidden" name="recaptcha_response_field" value="manual_challenge" />
</noscript>
<br />
<p class="recaptcha_form_p"><input type="submit" name="recaptcha_client" value="Submit" /></p>
</fieldset>
</form>
<!-- end of reCAPTCHA form -->
</p>
]]></content:encoded>
			<wfw:commentRss>http://pydev.pl/2009/08/23/linux-na-qq2440-mini-howto/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
