<?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>vmario techblog &#187; Elektronika</title>
	<atom:link href="http://blog.vmario.org/category/elektronika/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.vmario.org</link>
	<description>zapiski inżyniera</description>
	<lastBuildDate>Tue, 19 Jul 2011 20:45:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Konfiguracja jądra Linux z GPIO</title>
		<link>http://blog.vmario.org/2010/05/14/konfiguracja-jadra-linux-z-gpio/</link>
		<comments>http://blog.vmario.org/2010/05/14/konfiguracja-jadra-linux-z-gpio/#comments</comments>
		<pubDate>Fri, 14 May 2010 16:54:12 +0000</pubDate>
		<dc:creator>vmario</dc:creator>
				<category><![CDATA[Elektronika]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Komputer]]></category>

		<guid isPermaLink="false">http://blog.vmario.org/?p=776</guid>
		<description><![CDATA[Na ogół w systemach wbudowanych potrzebujemy dostępu do GPIO przynajmniej w jednym celu &#8212; do migania diodami, sygnalizującymi stan pracy urządzenia. W gruncie rzeczy błyskanie LED-em jest zresztą pierwszym i podstawowym zadaniem większości urządzeń&#8230; Niestety, opisując proces kompilacji Linuksa dla MMneta1002 zapomniałem o zapewnieniu dostępu do GPIO. Sterowanie pinami na potrzeby migania diodą, załączania przekaźnika [...]]]></description>
			<content:encoded><![CDATA[<p>Na ogół w systemach wbudowanych potrzebujemy dostępu do <abbr title="General Purpose Input/Output">GPIO</abbr> przynajmniej w jednym celu &mdash; do migania diodami, sygnalizującymi stan pracy urządzenia. W gruncie rzeczy błyskanie LED-em jest zresztą pierwszym i podstawowym zadaniem większości urządzeń&hellip;</p>
<p>Niestety, opisując proces <a href="http://blog.vmario.org/2010/03/16/budowa-linuksa-na-mmneta1002/">kompilacji Linuksa dla MMneta1002</a> zapomniałem o zapewnieniu dostępu do <abbr title="General Purpose Input/Output">GPIO</abbr>. Sterowanie pinami na potrzeby migania diodą, załączania przekaźnika czy sprawdzania stanu przełącznika jest jednak bardzo proste &mdash; wymaga tylko włączenia odpowiednich opcji w konfiguracji jądra i wykonywania operacji na plikach reprezentujących poszczególne piny. Dodatkowo mamy możliwość automatycznej obsługi LED-ów przez jądro w celu sygnalizacji np. dostępu do nośników danych.</p>
<p><span id="more-776"></span></p>
<p>Zaczynamy od tego, że w konfiguracji jądra zaznaczamy opcję <i>/sys/class/gpio/&#8230; (sysfs interface)</i> w zakładce <i>GPIO Support</i> (<code>CONFIG_GPIO_SYSFS=y</code>). Warto też włączyć <i>LED Heartbeat Trigger</i> i <i>LED Timer Trigger</i> w <i>LED Support</i> (<code>CONFIG_LEDS_TRIGGER_HEARTBEAT=y</code> i <code>LEDS_TRIGGER_TIMER=y</code>).</p>
<p>Następnie poprawiamy łatkę dla pliku <code>arch/arm/mach-at91/board-sam9260ek.c</code>. W pliku tym definiujemy, które piny będą dostępne dla jądra jako urządzenia LED:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/*
 * LEDs
 */</span>
<span style="color: #993333;">static</span> <span style="color: #993333;">struct</span> gpio_led ek_leds<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #009900;">&#123;</span>	<span style="color: #808080; font-style: italic;">/* &quot;DISK&quot; LED */</span>
		.<span style="color: #202020;">name</span>			<span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;disk&quot;</span><span style="color: #339933;">,</span>
		.<span style="color: #202020;">gpio</span>			<span style="color: #339933;">=</span> AT91_PIN_PC1<span style="color: #339933;">,</span>
		.<span style="color: #202020;">active_low</span>		<span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span>
		.<span style="color: #202020;">default_trigger</span>	<span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;nand-disk&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
	<span style="color: #009900;">&#123;</span>	<span style="color: #808080; font-style: italic;">/* &quot;USR&quot; LED */</span>
		.<span style="color: #202020;">name</span>			<span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;usr&quot;</span><span style="color: #339933;">,</span>
		.<span style="color: #202020;">gpio</span>			<span style="color: #339933;">=</span> AT91_PIN_PC15<span style="color: #339933;">,</span>
		.<span style="color: #202020;">active_low</span>		<span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span>
		.<span style="color: #202020;">default_trigger</span>	<span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;heartbeat&quot;</span><span style="color: #339933;">,</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Gotową łatkę można pobrać tutaj: <a href="http://resources.vmario.org/projects/mmnet1002/linux-2.6.32.9-mmnet1002.patch">linux-2.6.32.9-mmnet1002.patch</a>.</p>
<p>Po rekompilacji jądra dostajemy dostęp do poszczególnych pinów w przestrzeni użytkownika. Przykład: jeżeli chcemy zaświecić diodę podłączoną do pinu <i>PC2</i> (<code>gpio98</code>), najpierw eksportujemy ten pin:</p>
<pre># echo 98 &gt; /sys/class/gpio/export</pre>
<p>a następnie konfigurujemy go jako wyjście w stanie niskim:</p>
<pre># echo "low" &gt; /sys/class/gpio/gpio98/direction</pre>
<p>Oczywiście, jeżeli do tego pinu podłączymy przycisk, możemy sprawdzić jego stan za pomocą dwóch prostych poleceń:</p>
<pre># echo "in" &gt; /sys/class/gpio/gpio98/direction
# cat /sys/class/gpio/gpio98/value</pre>
<p>Szczegóły implementacji <abbr title="General Purpose Input/Output">GPIO</abbr> w Linuksie można znaleźć w <a href="http://www.kernel.org/doc/Documentation/gpio.txt">dokumentacji jądra</a>.</p>
<p>A teraz przyjrzyjmy się diodom podłączonym do <i>PC1</i> i <i>PC15</i>. Pierwsza z nich (nie jest ona wlutowana w płytkę &mdash; dodałem ją samodzielnie na potrzeby własnego projektu) ma ustawiony wyzwalacz <code>nand-disk</code>, co można łatwo sprawdzić:</p>
<pre># cat /sys/class/leds/disk/trigger
none [nand-disk] timer heartbeat default-on</pre>
<p>Oznacza to, że dioda będzie migać, gdy system będzie korzystał z pamięci NANDFlash. Dioda <i>USR</i> (umieszczona obok diody <i>PWR</i>) ma zaś wyzwalacz <code>heartbeat</code>, co oznacza, że imituje bicie serca, a jej &bdquo;tętno&rdquo; zależy od obciążenia systemu (przyśpiesza wyraźnie dopiero, gdy system jest bardzo obciążony).</p>
<p>Oczywiście, plik <code>trigger</code> możemy nadpisywać swoją wartością. Poniższe polecenia sprawią, że dioda będzie cieszyć nasze oczy krótkim błyśnięciem raz na sekundę:</p>
<pre># echo "timer" > /sys/class/leds/usr/trigger
# echo 100 > /sys/class/leds/usr/delay_on
# echo 900 > /sys/class/leds/usr/delay_off</pre>
<p>Szczegóły implementacji urządzeń LED również można znaleźć w <a href="http://www.kernel.org/doc/Documentation/leds-class.txt">dokumentacji jądra</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.vmario.org/2010/05/14/konfiguracja-jadra-linux-z-gpio/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Django na ARM-ie</title>
		<link>http://blog.vmario.org/2010/03/24/django-na-arm-ie/</link>
		<comments>http://blog.vmario.org/2010/03/24/django-na-arm-ie/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 14:11:41 +0000</pubDate>
		<dc:creator>vmario</dc:creator>
				<category><![CDATA[Elektronika]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Komputer]]></category>

		<guid isPermaLink="false">http://blog.vmario.org/?p=766</guid>
		<description><![CDATA[Dziś kontynuuję wątek Linuksa na ARM-ie, a konkretnie na płycie ewaluacyjnej MMnet1002. W projekcie, nad którym pracuję potrzebuję aplikacji webowej, która umożliwi zarządzanie harmonogramami zadań. Ponieważ mam bardzo dobre doświadczenia z frameworkiem Django, postanowiłem zaryzykować i uruchomić go na wspomnianej płycie. Ryzyko wynika z faktu, że Python, w którym jest napisane Django, to język interpretowany [...]]]></description>
			<content:encoded><![CDATA[<p>Dziś kontynuuję wątek <a href="http://blog.vmario.org/2010/03/16/budowa-linuksa-na-mmneta1002/">Linuksa na ARM-ie</a>, a konkretnie na płycie ewaluacyjnej MMnet1002. W projekcie, nad którym pracuję potrzebuję aplikacji webowej, która umożliwi zarządzanie harmonogramami zadań. Ponieważ mam bardzo dobre doświadczenia z frameworkiem <a href="http://www.djangoproject.com/">Django</a>, postanowiłem zaryzykować i uruchomić go na wspomnianej płycie. Ryzyko wynika z faktu, że Python, w którym jest napisane Django, to język interpretowany i można mieć poważne obawy, czy 200MHz-owy mikrokontroler z 64MB RAM-u da sobie radę z tym zadaniem.</p>
<p><a href="http://buildroot.uclibc.org/">Buildroot</a>, z którego korzystam ma w paczkach jedynie Pythona w wersji 2.4. Pomyślałem, że byłoby dobrze mieć nieco świeższą wersję, więc postanowiłem zmodyfikować patche i skompilować wersję 2.6. Nie było to łatwe zadanie, ale łącząc oryginalne patche Buildroota z tym, co <a href="http://randomsplat.com/id5-cross-compiling-python-for-embedded-linux.html">udało mi się wygooglować</a> otrzymałem działające rozwiązanie.</p>
<p><span id="more-766"></span></p>
<p>Oto patch, który należy umieścić w katalogu <code>package/python/</code>: <a href="http://resources.vmario.org/projects/mmnet1002/python-2.6-001-multi.patch">python-2.6-001-multi.patch</a>.</p>
<p>Należy też wyedytować <code>package/python/python.mk</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="make" style="font-family:monospace;">PYTHON_VERSION<span style="color: #004400;">=</span>2<span style="color: #004400;">.</span>6<span style="color: #004400;">.</span>4
PYTHON_VERSION_MAJOR<span style="color: #004400;">=</span><span style="color: #CC2200;">2.6</span></pre></div></div>

<p>w konfiguracji Buildroota należy wybrać Pythona w <i>Package Selection for the target -&gt; Interpreter languages / Scripting</i>. Jeżeli chcemy korzystać z Django należy także pamiętać, że będziemy jeszcze potrzebowali bibliotek dla programistów, czyli <i>python -&gt; development files on target</i>. Należy przy okazji zaznaczyć <i>Build options -&gt; development files in target filesystem</i>, niestety wyraźnie zwiększy to ilość zajętego przez system miejsca, bo Buildroot dołączy mnóstwo plików nagłówkowych. Na koniec należy wybrać jakąś bazę danych. Myślę, że w przypadku aplikacji uruchamianych na systemie wbudowanym w zupełności wystarczy SQLite: <i>Package Selection for the target -&gt; Database -&gt; sqlite</i>.</p>
<p>A tak wyglądają u mnie newralgiczne fragmenty pliku konfiguracyjnego:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;"># BR2_HAVE_MANPAGES is not set
# BR2_HAVE_INFOPAGES is not set
# BR2_HAVE_DOCUMENTATION is not set
<span style="color: #000099;">BR2_HAVE_DEVFILES</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">y</span>
<span style="color: #000099;">BR2_UPDATE_CONFIG</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">y</span>
&nbsp;
<span style="color: #000099;">BR2_PACKAGE_READLINE</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">y</span>
&nbsp;
<span style="color: #000099;">BR2_PACKAGE_SQLITE</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">y</span>
# BR2_PACKAGE_SQLITE_READLINE is not set
&nbsp;
<span style="color: #000099;">BR2_PACKAGE_OPENSSL</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">y</span>
&nbsp;
<span style="color: #000099;">BR2_PACKAGE_NCURSES</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">y</span>
# BR2_PACKAGE_NCURSES_TARGET_PANEL is not set
# BR2_PACKAGE_NCURSES_TARGET_FORM is not set
# BR2_PACKAGE_NCURSES_TARGET_MENU is not set
# BR2_PACKAGE_NEWT is not set
# BR2_PACKAGE_SLANG is not set
&nbsp;
<span style="color: #000099;">BR2_PACKAGE_PYTHON</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">y</span>
<span style="color: #000099;">BR2_PACKAGE_PYTHON_DEV</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">y</span>
# BR2_PACKAGE_PYTHON_PY_ONLY is not set
<span style="color: #000099;">BR2_PACKAGE_PYTHON_PYC_ONLY</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">y</span>
# BR2_PACKAGE_PYTHON_PY_PYC is not set
&nbsp;
# BR2_PACKAGE_PYTHON_BSDDB is not set
# BR2_PACKAGE_PYTHON_CODECSCJK is not set
# BR2_PACKAGE_PYTHON_CURSES is not set
# BR2_PACKAGE_PYTHON_PYEXPAT is not set
<span style="color: #000099;">BR2_PACKAGE_PYTHON_READLINE</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">y</span>
# BR2_PACKAGE_PYTHON_SSL is not set
# BR2_PACKAGE_PYTHON_TKINTER is not set
<span style="color: #000099;">BR2_PACKAGE_PYTHON_UNICODEDATA</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">y</span></pre></div></div>

<p>Po tych zabiegach Python powinien już działać, może jedynie wystąpić błąd podczas uruchamiania powłoki interaktywnej:</p>
<pre># python
Python 2.6.4 (r264:75706, Mar 18 2010, 09:24:08)
[GCC 4.3.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
python: can't resolve symbol 'BC'</pre>
<p>Rozwiązaniem jest dopisanie do <code>target_skeleton/etc/profiles</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># Dla interaktywnego Pythona:</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">LD_PRELOAD</span>=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>libncurses.so</pre></div></div>

<p>Jak dotąd nie napotkałem na żadne inne przeszkody. Django działa i współpracuje z SQLite, choć, rzecz jasna, demonem szybkości nie jest. Uruchomienie <code>python manage.py runserver</code> trwa wieki, ale gdy w końcu serwer wstanie, to działa w miarę sprawnie i zajmuje połowę RAM-u (ok.&nbsp;30MB). Na razie jestem w stanie to zaakceptować, gdyż Django będzie w moim systemie główną aplikacją i nie jest problemem fakt, że pożera większość zasobów. Mam tylko nadzieję, że w połowie pracy nie zostanę zmuszony do przejścia na jakieś inne <abbr title="Common Gateway Interface">CGI</abbr>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.vmario.org/2010/03/24/django-na-arm-ie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Budowa Linuksa na MMneta1002</title>
		<link>http://blog.vmario.org/2010/03/16/budowa-linuksa-na-mmneta1002/</link>
		<comments>http://blog.vmario.org/2010/03/16/budowa-linuksa-na-mmneta1002/#comments</comments>
		<pubDate>Tue, 16 Mar 2010 18:54:48 +0000</pubDate>
		<dc:creator>vmario</dc:creator>
				<category><![CDATA[Elektronika]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Komputer]]></category>

		<guid isPermaLink="false">http://blog.vmario.org/?p=727</guid>
		<description><![CDATA[Płyta ewaluacyjna MMnet1002 firmy Propox jest świetną zabawką dla miłośników Linuksa zainteresowanych jego wykorzystaniem w systemach wbudowanych. Od kilku tygodni eksperymentuję z tą platformą i próbuję zbudować własnego Linuksa z użyciem narzędzi takich jak Buildroot. Płyta jest podobna do atmelowskiej AT91SAM9260-EK, jednak występują pewne różnice, które sprawiają, że nie sposób wykorzystać bez zmian pliki konfiguracyjne [...]]]></description>
			<content:encoded><![CDATA[<p>Płyta ewaluacyjna <a href="http://www.propox.com/products/t_232.html">MMnet1002</a> firmy Propox jest świetną zabawką dla miłośników Linuksa zainteresowanych jego wykorzystaniem w systemach wbudowanych. Od kilku tygodni eksperymentuję z tą platformą i próbuję zbudować własnego Linuksa z użyciem narzędzi takich jak Buildroot. Płyta jest podobna do atmelowskiej AT91SAM9260-EK, jednak występują pewne różnice, które sprawiają, że nie sposób wykorzystać bez zmian pliki konfiguracyjne przewidziane dla AT91SAM9260-EK. Dotyczy to w szczególności MMneta z pamięcią NANDFlash &mdash; 1GiB pamięci nieulotnej to świetna sprawa, ale podstawową i najbardziej popularną konfiguracją jest procesor połączony z pamięcią DataFlash, słusznie należy więc oczekiwać, że czeka nas trochę programistycznej gimnastyki. Nie obędzie się też bez patchowania źródeł, ale w zamian otrzymamy system operacyjny, nad którego każdą częścią będziemy jako-tako panowali i nie będziemy skazani tylko na dostarczaną przez Propox binarną wersję dystrybucji OpenWRT.</p>
<p>Poniższy tutorial nie jest zbyt szczegółowy, zakładam, że Czytelnik pracuje na Linuksie i umie się nim posłużyć w podstawowym zakresie, a także, że zapoznał się z dokumentacją rzeczonej płyty ewaluacyjnej i umie posługiwać się programatorem <abbr title="SAM Boot Assistant">SAM-BA</abbr>.</p>
<p><span id="more-727"></span></p>
<h4>Buildroot</h4>
<p><a href="http://buildroot.uclibc.org/">Buildroot</a> jest zestawem Makefile&#8217;i i patchy, ułatwiających budowę toolchaina z cross-kompilatorem, jądra Linux i głównego systemu plików z BusyBoksem na systemy wbudowane, na których potrzebujemy lekkiego systemu operacyjnego opartego o uClibc w miejsce GNU libc. Eksperymentowałem wprawdzie ze środowiskiem wyrosłym z Buildroota &mdash; <a href="http://wiki.openembedded.net/">OpenEmbedded</a> &mdash; jest ono bardziej rozbudowane, ale dla mnie mniej wygodne. Nie udało mi się zresztą skompilować w nim działającego jądra, zdecydowałem się więc na Buildroota.</p>
<p>Wadą Buildroota są problemy z kompilacją tylko wybranej części systemu. W zasadzie powinniśmy zawsze kompilować wszystkie składniki, łącznie z toolchainem. Niestety, wciąż nie udało mi się wydzielić budowy systemu plików jako oddzielnego zadania; jedynie jądro z powodzeniem udawało mi się rekompilować bez budowania od nowa całości, dzięki czemu proces kompilacji trwał najwyżej kilkanaście zamiast kilkudziesięciu minut.</p>
<h4>Po co nam dwa systemy?</h4>
<p>Ze względu na pewne problemy w działaniu i powolne przesyłanie danych chciałem w miarę możliwości pozbyć się konieczności używania programatora SAM-BA. Poza tym SAM-BA raczej nie nadaje się do flashowania obrazów UBIFS, co wyjaśnię dalej. Zdecydowałem się zatem na następującą metodologię.</p>
<p>Budujemy dwa systemy: pierwszy zawiera tylko podstawowe narzędzia, nie posiada oddzielnego obrazu systemu plików, ale ma wkompilowany intramfs, dzięki czemu całość pracuje tylko w RAM-ie i może swobodnie zarządzać całym obszarem pamięci NANDFlash. Drugi to nasz właściwy system, który zawiera wszystkie narzędzia na obrazie UBIFS, a jego jądro nie posiada ani obrazu initramfs, ani initrd, dlatego może on wstać tylko z pamięci nieulotnej.</p>
<p>Pierwszy system będzie pobierany przez bootloader z sieci lokalnej i uruchamiany tylko po to, by wgrać ten drugi. Taka sytuacja będzie jednak miała miejsce tylko podczas rozwijania naszych projektów &mdash; podczas codziennej pracy od razu będzie uruchamiany drugi system, wstający z pamięci nieulotnej.</p>
<h4>Budowa obu systemów</h4>
<p>Po pobraniu i rozpakowania Buildroota uruchamiamy polecenie</p>
<pre>$ make menuconfig</pre>
<p>Uruchomi się konfigurator, który nas jednak w tej chwili nie interesuje &mdash; chcieliśmy tylko, by zostały utworzone dodatkowe pliki konfiguracyjne, niezbędne do dalszej pracy. Zamykamy więc program, wybierając <i>Exit</i> i nie zapisują zmian. Ścieżkę do Buildroota ustawiamy w zmiennej <code>BUILDROOT</code> w skrypcie <code>Buildroot/build_root</code> z mojego archiwum. Skrypt ten jest protezą, którą stworzyłem w miejsce własnej płytki, którą powinienem był dodać do środowiska Buildroota. Wygodniej mi jednak było wykorzystać pliki konfiguracyjne płytki AT91SAM9260-EK, na które skrypt nanosi pewne poprawki. Poprawki te zgromadzone są w katalogach <code>mmnet1002</code> i <code>mmnet1002-initramfs</code>:</p>
<dl>
<dt><code>config</code></dt>
<dd>główny plik konfiguracyjny zastępujący <code>.config</code> Buildroota.</dd>
<dt><code>linux26-config</code></dt>
<dd>plik konfiguracyjny z wytycznymi kompilacji dla jądra.</dd>
<dt><code>target_skeleton</code></dt>
<dd>katalog z systemem plików (z wyjątkiem urządzeń w <code>/dev</code>).</dd>
<dt><code>device_table.txt</code></dt>
<dd>lista urządzeń, które będą dostępne w <code>/dev</code>.</dd>
<dt><code>ubifs.cfg</code></dt>
<dd>konfiguracja obrazu UBIFS.</dd>
<dt><code>dl</code></dt>
<dd>patche, które zostaną dodane do źródeł w katalogu <code>dl</code> Buildroota.</dd>
</dl>
<p>(Opracowując poprawki bazowałem między innymi na <a href="http://www.on5di.com/~noel/">tutorialu</a>, który opisuje, inne, być może rozsądniejsze, podejście do modyfikacji Buildroota na potrzeby MMneta).</p>
<p>Budowa pierwszego systemu sprowadza się do:</p>
<pre>$ ./build_root all mmnet1002-initramfs</pre>
<p>zaś drugiego do:</p>
<pre>$ ./build_root all mmnet1002</pre>
<p>Po kompilacji trwającej każdorazowo zapewne od 30 do 60 minut, powinniśmy otrzymać obrazy systemów w podkatalogach <code>images-mmnet1002-initramfs</code> i <code>images-mmnet1002</code>, które znajdą się w tym samym katalogu, w którym umieściliśmy skrypt <code>build_root</code>.</p>
<p>Za każdym razem skrypt będzie chciał usunąć podkatalog <code>output</code> w katalogu Buildroota &mdash; należy mu na to zezwolić po upewnieniu się, że nie usuwamy sobie np. home&#8217;a (jedna zbędna spacja w zmiennej <code>BUILDROOT</code> i może dojść do tragedii).</p>
<p>Warto też na początku zastąpić opcję <code>all</code> opcją <code>source</code>, skrypt powinien wtedy tylko pobrać niezbędne źródła, bez budowania ich. Polecam to zwłaszcza użytkownikom powolnych i niepewnych łączy.</p>
<h4>Partycje MTD i woluminy UBIFS</h4>
<p>Na tym etapie warto zwrócić uwagę na plik <code>linux-2.6.32.9-mmnet1002.patch</code> w katalogu <code>dl</code>. Jest to patch, który odpowiada między innymi za podział Flasha na partycje <abbr title="Memory Technology Device">MTD</abbr>. Nie są to partycje w ścisłym tego słowa znaczeniu. Urządzenia MTD, a więc surowe pamięci Flash, w przeciwieństwie do np. kart SD czy pendrive&#8217;ów <a href="http://www.linux-mtd.infradead.org/faq/general.html">nie są urządzeniami blokowymi</a> (raczej czymś pośrednim między urządzeniem blokowym a znakowym) i nie mogą być obsługiwane przez tradycyjne systemy plików. Nie zapisujemy też na nich tablicy partycji &mdash; podział surowej pamięci Flash jest umowny i może być zapisany na stałe w jądrze lub podawany jako argument <code>mtdparts</code> przez bootloader. Wybrałem to pierwsze rozwiązanie, a podział zachowałem taki sam jak w fabrycznej wersji:</p>
<pre>0x00000000-0x00040000 : "bootstrap"
0x00040000-0x00080000 : "u-boot"
0x00080000-0x00200000 : "u-boot-env"
0x00200000-0x00800000 : "kernel"
0x00800000-0x40000000 : "filesystems"</pre>
<p>Jako system plików dla MTD wybrałem UBIFS, również tak, jak w rozwiązaniu fabrycznym, z tym, że poprzestałem na jednym woluminie UBI. Do wygenerowania obrazu UBI niezbędne są programy <code>mkfs.ubifs</code> i <code>ubinize</code>, które użytkownicy Arch Linuksa znajdą w <abbr title="Arch User Repository">AUR</abbr> w pakiecie <code>mtd-utils-git</code>. Pierwszy z tych programów wymaga uprawnień roota (poza tym musimy operować na plikach urządzeń, co też wymaga uprawnień superużytkownika), dlatego też skrypt <code>build_root</code> pyta się o to hasło przed stworzeniem obrazu systemu plików.</p>
<p>Należy pamiętać, że odradza się bezpośrednie flashowanie obrazów UBI, a preferuje się wykorzystanie programu <code>ubiformat</code>, gdyż daje to gwarancję, że system plików poprawnie obsłuży baderaseblocki. Jest to jeden z powodów, dla których starałem się odejść od stosowania SAM-B-y.</p>
<h4>Bootloadery</h4>
<p><a href="http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4093">AT91Bootstrap</a> to bootloader pierwszego stopnia, którego najważniejszym zadaniem jest wczytanie większego i znacznie bardziej funkcjonalnego <a href="http://www.denx.de/wiki/U-Boot">U-Boota</a>. Nie możemy wczytać od razu tego drugiego, ponieważ ROM Boot Program mikrokontrolera może udostępnić bootloaderowi pierwszego stopnia tylko 4KB wbudowanej pamięci RAM. Z tego też względu należy upewnić się, że skompilowany AT91Bootstrap ma mniej niż 4KB!</p>
<p>Do kompilacji obu bootloaderów niezbędny jest cross-kompilator, np. polecany przez twórców U-Boota <a href="http://www.denx.de/wiki/view/DULG/ELDK"><abbr title="Embedded Linux Development Kit">ELDK</abbr></a>. My jednak nie będziemy zaśmiecać sobie dysku i wykorzystamy toolchaina skompilowanego przez Buildroota. W tym celu należy ustawić odpowiednio zmienną <code>PATH</code> w skryptach <code>build_at91bootstrap</code> i <code>build_u-boot</code>. Przy okazji należy zmodyfikować też odpowiednio ścieżki do źródeł obu programów. Źródła z kolei trzeba przed kompilacją spatchować:</p>
<dl>
<dt><code>Bootstrap-v1.15-mmnet1002.patch</code></dt>
<dd>zawiera poprawki uwzględniające różnice między MMnetem1002 a AT91SAM9260-EK (m.in. inną pamięć nieulotną i inny pin <a href="http://blog.vmario.org/2010/03/04/przywracanie-sam-b-y-w-mmnecie1002/">przywracania SAM-B-y</a>).</dd>
<dt><code>u-boot-2009.11.1-mmnet1002.patch</code></dt>
<dd>zawiera poprawki dla interfejsu sieciowego i domyślnych parametrów uruchamiania systemu.</dd>
</dl>
<p>Podobnie jak w przypadku Buildroota, skrypty możemy umieścić w zupełnie innym miejscu niż źródła. Po zbudowaniu obu aplikacji ich obrazy binarne zostaną skopiowane do katalogów, w których znajdują się odpowiednie skrypty.</p>
<h4>SAM-BA</h4>
<p>Mamy już wszystkie obrazy, więc możemy przystąpić do flashowania. W katalogu <code>Flashing</code> znajdziemy skrypt <code>flash_now</code>. Najpierw sprawdźmy, czy zmienna <code>SAMBA</code> wskazuje na plik wykonywalny SAM-B-y. Następnie skopiujmy do wspomnianego katalogu obrazy obu bootloaderów, tj. <code>at91bootstrap.bin</code> i <code>u-boot.bin</code>. Po uruchomieniu skrypt przekaże do SAM-B-y instrukcje zawarte w <code>MMnet1002_prog.tcl</code> i wgra do pamięci NANDFlash oba bootloadery oraz zmienne środowiskowe U-Boota. Należy przy tym zauważyć, że:</p>
<ol>
<li>SAM-BA automatycznie generuje plik z ustawieniami U-Boota (<code>u-boot-env.bin</code>).</li>
<li>SAM-BA, a później U-Boot (dzięki <code>u-boot-env.bin</code>) mają rozmiar drugiego jądra ustawiony na sztywno na 2MiB (0x200000B). Wynika to z tego, iż podczas dalszej pracy nowe jądra będą wgrywane bez udziału SAM-B-y i nie będzie ona mogła aktualizować ustawień U-Boota. Wartość 2MiB dla jądra bez initrafms zawiera spory zapas (przykładowe jądro waży tylko 1,2MiB), a nie ma sensu wczytywanie 6MiB całej partycji, gdyż zauważalnie wydłuża to czas startu systemu.</li>
<li>Do U-Boota zostaje dodane polecenie <code>upgrade</code>, które posłuży do wgrywania nowych wersji systemu.</li>
</ol>
<h4>TFTP</h4>
<p>Przed wgraniem systemu z sieci należy upewnić się, że mamy uruchomiony serwer DHCP i <abbr title="Trivial File Transfer Protocol">TFTP</abbr> pod adresem <code>192.168.42.1</code>, gdzie powinna też być brama sieciowa. U-Boot bowiem będzie szukał obrazów pod adresem bramy sieciowej, zaś skrypt <code>/root/upgrade</code> konkretnie pod wspomnianym IP. Jeżeli chcielibyśmy zastosować inne rozwiązanie (np. hardkodować w obu przypadkach wszystkie adresy sieciowe), należy zmodyfikować polecenie <code>upgrade</code> w U-Boocie i skrypt <code>/root/upgrade</code> w obu wersjach systemu.</p>
<p>W katalogu serwera TFTP na naszym PC-cie (np. <code>/var/tftpboot</code>) należy umieścić te pliki, które będziemy chcieli zaktualizować w systemie. Na początek wgramy wszystko na nowo, skopiujmy więc:</p>
<ul>
<li>z katalogu <code>Flashing</code> lub katalogów odpowiednich bootloaderów: <code>at91bootstrap.bin</code>, <code>u-boot.bin</code>, <code>u-boot-env.bin</code>,</li>
<li>z katalogu <code>images-mmnet1002</code>: <code>uImage</code> i <code>rootfs.ubi</code>,</li>
<li>z katalogu <code>images-mmnet1002-initramfs</code>: <code>uImage</code>, którego nazwy nie zapomnijmy zmienić na <code>uImage-initramfs</code>!</li>
</ul>
<p>Teraz uruchamiamy MMneta. Po chwili U-Boot poskarży się nam, że nie znalazł jądra, jednak nie zważając na to wpiszmy w jego wierszu poleceń:</p>
<pre>U-Boot> run upgrade</pre>
<p>Teraz U-Boot uzyska niezbędne adresy IP z DHCP, pobierze pierwszą wersję systemu (<code>uImage-initramfs</code>), która natychmiast po wystartowaniu uruchomi skrypt <code>/root/upgrade</code>, pobierający i instalujący właściwą, drugą wersję systemu. Po chwili płyta zrestartuje się, a z NANDFlasha powinien wstać nowy system, który po wygenerowaniu kluczy dla Dropbeara będzie gotowy do pracy.</p>
<p>Teraz, gdy mamy system na NANDFlashu, jądro możemy aktualizować za pomocą polecenia:</p>
<pre># /root/upgrade</pre>
<p>Nie da się jednak w ten sposób zaktualizować głównego systemu plików &mdash; należy zrestartować płytę i wywołać polecenie <code>upgrade</code> w U-Boocie.</p>
<h4>Uwagi końcowe</h4>
<p>Jak wspomniałem, powyższe rozwiązanie to raczej partyzantka. Warto byłoby wszystko dodać do Buildroota jako oddzielną płytkę. Także oba bootloadery mógłby budować Buildroot, jednak miał u mnie z tym pewne kłopoty, więc uznałem, że wygodniej będzie to robić ręcznie.</p>
<p>Co do SAM-B-y, to na Arch Linuksie <a href="http://www.elektroda.pl/rtvforum/viewtopic.php?t=1591229&#038;highlight=">nie chciała działać</a>, dlatego zmuszony jestem ją uruchamiać na Xubuntu w wirtualnej maszynie.</p>
<p>W załączonym archiwum znajdziecie skrypty, patche, gotowe obrazy i logi z SAM-B-y oraz startu obu wersji systemu, które mogą pomóc w wyśledzeniu błędów.</p>
<h4>Pliki</h4>
<dl>
<dt><a href="http://resources.vmario.org/projects/mmnet1002/mmnet1002-buildroot-vmario.tar.bz2">mmnet1002-buildroot-vmario.tar.bz2</a></dt>
<dd>archiwum z opisywanymi skryptami i dodatkami.</dd>
</dl>
]]></content:encoded>
			<wfw:commentRss>http://blog.vmario.org/2010/03/16/budowa-linuksa-na-mmneta1002/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Edytor heksadecymalny na Linuksa</title>
		<link>http://blog.vmario.org/2010/03/10/edytor-heksadecymalny-na-linuksa/</link>
		<comments>http://blog.vmario.org/2010/03/10/edytor-heksadecymalny-na-linuksa/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 21:17:53 +0000</pubDate>
		<dc:creator>vmario</dc:creator>
				<category><![CDATA[Elektronika]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Komputer]]></category>

		<guid isPermaLink="false">http://blog.vmario.org/?p=705</guid>
		<description><![CDATA[Nie tylko crackerzy i miłośnicy inżynierii wstecznej potrzebują czasem zajrzeć do jakiejś binarki. Niejeden elektronik potwierdzi, że dobrze jest mieć możliwość odczytu czy nawet edycji tzw. &#8222;wsadów&#8221;, a sam nieraz podglądałem pliki wykonywalne, by sprawdzić, z jakich bibliotek korzystają, w szczególności, gdy programu nie dawało się uruchomić i nie było mowy o skorzystaniu z lsof. [...]]]></description>
			<content:encoded><![CDATA[<p>Nie tylko crackerzy i miłośnicy inżynierii wstecznej potrzebują czasem zajrzeć do jakiejś binarki. Niejeden elektronik potwierdzi, że dobrze jest mieć możliwość odczytu czy nawet edycji tzw. &bdquo;wsadów&rdquo;, a sam nieraz podglądałem pliki wykonywalne, by sprawdzić, z jakich bibliotek korzystają, w szczególności, gdy programu nie dawało się uruchomić i nie było mowy o skorzystaniu z <code>lsof</code>.</p>
<p>Na ogół używałem do tego po prostu mojego ulubionego Vima i to w zwykłym trybie tekstowym. Uruchomienie trybu heksadecymalnego, zwłaszcza z możliwością edycji wymaga zaklęć tak długich i bezecnych, że do dziś boję się je wpisywać.</p>
<p>Zmuszony jednak przez los postanowiłem wyposażyć się w jakiś porządny edytor heksadecymalny, najlepiej działający w X-ach, żeby mieć pełną wygodę użytkowania.</p>
<p><span id="more-705"></span></p>
<p>Na pierwszy ogień poszedł <a href="http://live.gnome.org/Ghex">GHex</a>, ale odpadł w przedbiegach ze względu na stabilność i małe możliwości. Następnie trafiłem na <a href="http://home.gna.org/bless/">Blessa</a>. Szczęśliwie nie zauważyłem, że został napisany w Mono/Gtk# (nie lubię Mono) i dałem mu szansę. Program ma możliwości chyba niewiele większe niż GHex, ale działa całkiem sprawnie.</p>
<p>Z ciekawości sprawdziłem jeszcze, co zaoferuje produkt ze stajni <abbr title="K Desktop Environment">KDE</abbr> &mdash; <a href="http://utils.kde.org/projects/okteta/">Okteta</a>. Pierwsze wrażenie było negatywne &mdash; ot, kobylasta aplikacja o przeładowanym interfejsie, która długo się uruchamia, a na dodatek zdarzyło się jej nawet wyłożyć.</p>
<p>Warto jednak dać temu programowi szansę, gdyż jest to prawdziwy kombajn. Nie nadaje się może do edycji dysków twardych, ale świetnie sprawdza się w pracy z plikami. Z ciekawszych opcji warto wymienić:</p>
<ul>
<li>przeglądanie wielu plików w kartach,</li>
<li>dzielenie okna w pionie i poziomie,</li>
<li>obliczanie wielu rodzajów sum kontrolnych dla wskazanego obszaru,</li>
<li>zapełnianie obszaru wzorcami,</li>
<li>wykonywanie operacji bitowych,</li>
<li>wyszukiwanie łańcuchów znaków (program &bdquo;wyłapuje&rdquo; wewnątrz pliku binarnego całe fragmenty tekstu, pasujące do podanej frazy).</li>
<p>Ponadto wystarczy poświęcić chwilę na zagospodarowanie przestrzeni roboczej, by praca z programem stała się przyjemna i intuicyjna. O ile nie pojawią się problemy ze stabilnością, Okteta stanie się zatem moim podstawowym narzędziem do hackowania plików binarnych. A może Czytelnicy znają jakieś inne dobre hex edytory?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.vmario.org/2010/03/10/edytor-heksadecymalny-na-linuksa/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Minicom jako terminal szeregowy</title>
		<link>http://blog.vmario.org/2010/03/05/minicom-jako-terminal-szeregowy/</link>
		<comments>http://blog.vmario.org/2010/03/05/minicom-jako-terminal-szeregowy/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 21:21:24 +0000</pubDate>
		<dc:creator>vmario</dc:creator>
				<category><![CDATA[Elektronika]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Komputer]]></category>

		<guid isPermaLink="false">http://blog.vmario.org/?p=686</guid>
		<description><![CDATA[Ostatnio dużo pracuję na porcie szeregowym RS-232, przez który obsługuję także linuksową powłokę. Niezbędny jest do tego emulator terminala szeregowego. Dotychczas korzystałem przede wszystkim z programu GTKTerm, znacznie rzadziej z CuteCom. Na dłuższą metę w GTKTermie doskwierają dwie niedogodności. Po pierwsze na moim systemie lubi on wstawiać od czasu puste linie, jest to jednak tylko [...]]]></description>
			<content:encoded><![CDATA[<p>Ostatnio dużo pracuję na porcie szeregowym RS-232, przez który obsługuję także linuksową powłokę. Niezbędny jest do tego emulator terminala szeregowego. Dotychczas korzystałem przede wszystkim z programu <a href="http://sourceforge.net/projects/gtkterm/">GTKTerm</a>, znacznie rzadziej z <a href="http://cutecom.sourceforge.net/">CuteCom</a>. Na dłuższą metę w GTKTermie doskwierają dwie niedogodności. Po pierwsze na moim systemie lubi on wstawiać od czasu puste linie, jest to jednak tylko pewien wizualny mankament. Po drugie GTKTerm nie radzi sobie z edycją już wydrukowanej linii tekstu, przez co przeglądanie historii poleceń powłoki owocuje ciągłym zadrukowywaniem ekranu, nie mówiąc już o różnej maści paskach postępu, które błyskawicznie zapełniają dostępną historię ekranu; w tych warunkach na vi w ogóle nie da się pracować. Po trzecie &mdash; aplikacja ma bardzo krótką historię ekranu, przez co zwykłego dmesg-a trudno obejrzeć w całości.</p>
<p>CuteCom w ogóle jest nieporozumieniem: nie obsługuje kolorów, wejście działa w trybie liniowym a nie znakowym, a jego log potrafi zapchać RAM, zwłaszcza jeżeli będzie monitorował port, na którym działa programator <abbr title="In-system programming">ISP</abbr> (co ma miejsce w ATmedze128). W pewnych zastosowaniach mógłby się sprawdzić, ale na pewno nie jest to wygodny emulator terminala.</p>
<p>Oczywiście, oprócz tych dwóch programów, znałem też <a href="http://alioth.debian.org/projects/minicom/">Minicoma</a>, ale zawsze miałem go za program bardzo nieprzyjazny użytkownikowi i nadający się tylko do współpracy z modemami. Okazuje się jednak, że bardzo prosto jest zmusić go do pracy w roli pełnoprawnego terminala szeregowego. To tylko kwestia dodania kilku opcji w wierszu poleceń:</p>
<pre><code>$ minicom -m -o -w -c on</code></pre>
<p>lub krócej:</p>
<pre><code>$ minicom -mowc on</code></pre>
<p><span id="more-686"></span></p>
<p>Znaczenie poszczególnych opcji:</p>
<ul>
<li><code>-m</code> umożliwia korzystanie ze skrótów klawiaturowych z wykorzystaniem Alta (np. <i>Alt+Q</i> w celu wyjścia z programu),</li>
<li><code>-o</code> wyłącza zupełnie w tym przypadku zbędną inicjalizację modemu,</li>
<li><code>-w</code> zawija wiersze,</li>
<li><code>-c on</code> włącza kolorki.</li>
</ul>
<p>Jeżeli nie chcemy za każdym razem wpisywać wszystkich przełączników, wystarczy dopisać do <code>~/.bashrc</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">MINICOM</span>=<span style="color: #ff0000;">&quot;-m -o -w -c on&quot;</span></pre></div></div>

<p>i uruchamiać <code>minicom</code> bez ręcznego dopisywania tych opcji.</p>
<div style="text-align: center"><a href="http://www.flickr.com/photos/vmario/4408844751/" title="Minicom by vmario, on Flickr"><img class="vmnormalny" src="http://farm5.static.flickr.com/4013/4408844751_003a8bed19_m.jpg" width="240" height="184" alt="Minicom" /></a></div>
<p>Po starcie pod <i>Alt+Z</i> zobaczymy wykaz komend, z których najbardziej będzie nas interesować <i>Alt+O</i>, czyli konfiguracja. Należy pamiętać, by w ustawieniach portu szeregowego wyłączyć kontrolę przepływu, a w ustawieniach ekranu dobrać odpowiedni dla nas schemat kolorów (czerwony pasek stanu to moim zdaniem przesada).</p>
<p>Zdaje mi się, że podczas zmiany konfiguracji portu program lubi zawiesić połączenie. Na szczęście rzadko muszę zmieniać parametry portu, zresztą wystarczy wtedy ponownie uruchomić Minicoma. Inny problem, który zauważyłem, to nieprawidłowe wyświetlanie polskich znaków. Znaki dwubajtowe wprawdzie wyświetlają się, ale są poprzedzone znakiem zapytania. Próbowałem korzystać z opcji <code>-L</code>, <code>-l</code>, <code>-8</code> i zmieniać tablicę znaków, ale nie udało mi się z tym uporać. Brakuje mi też trybu szesnastkowego, dlatego nie mogę całkowicie zrezygnować z GTKTerma.</p>
<p>Niemniej Minicom okazał się całkiem niezłą aplikacją, a jego zaletą jest popularność (nie powinno być problemów ze znalezieniem go w repozytorium) i możliwość pracy bez środowiska graficznego.</p>
<p>PS Miłośnikom programu PuTTY warto przypomnieć, że radzi on sobie całkiem nieźle także z RS-232!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.vmario.org/2010/03/05/minicom-jako-terminal-szeregowy/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Przywracanie SAM-B-y w MMnecie1002</title>
		<link>http://blog.vmario.org/2010/03/04/przywracanie-sam-b-y-w-mmnecie1002/</link>
		<comments>http://blog.vmario.org/2010/03/04/przywracanie-sam-b-y-w-mmnecie1002/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 15:04:48 +0000</pubDate>
		<dc:creator>vmario</dc:creator>
				<category><![CDATA[Elektronika]]></category>

		<guid isPermaLink="false">http://blog.vmario.org/?p=671</guid>
		<description><![CDATA[Eksperymentując z bootloaderami i jądrami Linuksa na AT91SAM9260 zablokowałem sobie w pewnym momencie moduł MMnet1002. Mikrokontroler programowany jest przez atmelowski interfejs ISP o nazwie SAM-BA (SAM Boot Assistant), który jest bardzo wygodny, bo nie wymaga żadnego sprzętowego programatora &#8212; wystarczy podłączyć się przez USB do ARM-a i użyć oprogramowania dostarczonego przez Atmela. Niestety, nie jest [...]]]></description>
			<content:encoded><![CDATA[<p>Eksperymentując z bootloaderami i jądrami Linuksa na AT91SAM9260 zablokowałem sobie w pewnym momencie <a href="http://www.propox.com/products/t_232.html">moduł MMnet1002</a>. Mikrokontroler programowany jest przez atmelowski interfejs <abbr title="In-system Programmer">ISP</abbr> o nazwie SAM-BA (SAM Boot Assistant), który jest bardzo wygodny, bo nie wymaga żadnego sprzętowego programatora &mdash; wystarczy podłączyć się przez USB do ARM-a i użyć oprogramowania dostarczonego przez Atmela.</p>
<p>Niestety, nie jest tak, że tryb programowania włącza podanie odpowiedniego stanu na jakiś pin i restart mikrokontrolera. SAM-BA znajduje się na samym końcu sekwencji startowej i jest uruchamiana tylko wtedy, gdy nie uda się wczytać programu z pamięci DataFlash i NANDFlash. Wprawdzie na płytce MMnet1002 znajduje się zworka <i>SAMBA</i> podłączona do pinu PC15 (<i>NWAIT</i>), której założenie w połączeniu z dwukrotnym restartem wprowadza system w stan programowania, ale ta tajemnicza metoda nie zawsze skutkuje. W szczególności, gdy doprowadzimy system do takiego stanu, że będzie w stanie wczytać z pamięci wadliwy program, utkniemy w miejsu &mdash; algorytm startowy stwierdzi, że program wczytano i nie ma potrzeby uruchamiania SAM-B-y, nawet gdy program będzie błędny. W efekcie na konsoli <code>DBGU</code> zobaczymy tylko smutne:</p>
<pre><code>RomBOOT
&gt;</code></pre>
<p><span id="more-671"></span></p>
<p>Jak się ratować w takiej sytuacji? Szereg rozwiązań znajdziemy w nocie Atmela <a href="http://www.atmel.com/dyn/resources/prod_documents/doc6281.pdf">AT91SAM9260-EK SAM-BA Recovery</a>. Przede wszystkim bootloader AT91Bootstrap może być skompilowany tak, że podczas startu monitoruje stan wskazanego pinu i w razie żądania (zwarcia pinu do masy), czyści pierwszy blok pamięci NANDFlash, co uniemożliwia wczytanie z niej programu, a w konsekwencji wywołanie SAM-B-y. Nota mówi o pinie <del>PB4</del> <ins>PA31 (chodzi o przycisk BP4 na płytce ewaluacyjnej AT91SAM9260-EK, podłączony do pinu PA31)</ins>, ale dla MMneta1002 powinien to być PC15, podłączony do zworki <i>SAMBA</i>. Trick ten jednak nie pomoże nam, jeżeli majstrowaliśmy przy AT91Bootstrapie.</p>
<p>Podobne rozwiązanie stosuje aplikacja AT91bootstrap-recovery, którą można wgrać na kartę DataFlash, trzeba jednak najpierw mieć taką kartę i możliwość jej podłączenia do systemu. Zatem to rozwiązanie odpada, tak samo jak użycie programatora SAM-ICE, którego nie posiadam.</p>
<p>Na szczęście jest prosta metoda sprzętowa, odradzana przez Atmela, ale moim zdaniem najlepsza. Wystarczy odciąć pamięć nieulotną od mikrokontrolera, choćby na krótką chwilę podczas startu. Zostanie uruchomiona SAM-BA, a wtedy wystarczy z powrotem podłączyć pamięć i programować.</p>
<p>Moja płytka wyposażona jest w pamięć NANDFlash, którą można w prosty sposób odciąć, wylutowywując rezystor R48 (0&#x2126;) i zastępując go zworką w pozycji <i>NF</i> (możliwe, że niektóre płytki domyślnie są przygotowane właśnie w taki sposób &mdash; wtedy nie trzeba nawet wyciągać lutownicy i można od razu przejść do kolejnego kroku). Na poniższych zdjęciach zaznaczyłem, który rezystor należy usunąć i którą zworka nas interesuje.</p>
<div style="text-align: center">
<a href="http://www.flickr.com/photos/vmario/4406382170/" title="MMnet1002: usunięcie rezystora by vmario, on Flickr"><img class="vmnormalny" src="http://farm5.static.flickr.com/4032/4406382170_a6d341f198_t.jpg" width="100" height="75" alt="MMnet1002: usunięcie rezystora" /></a> <a href="http://www.flickr.com/photos/vmario/4405618383/" title="MMnet1002: opcjonalne zworki by vmario, on Flickr"><img class="vmnormalny" src="http://farm5.static.flickr.com/4014/4405618383_f5f6db4680_t.jpg" width="100" height="75" alt="MMnet1002: opcjonalne zworki" /></a>
</div>
<p>Teraz, aby zaprogramować mikrokontroler, wystarczy zdjąć zworkę <i>NF</i>, zrestartować system i założyć zworkę z powrotem.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.vmario.org/2010/03/04/przywracanie-sam-b-y-w-mmnecie1002/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JTAG do ATmegi w wersji USB</title>
		<link>http://blog.vmario.org/2010/01/20/jtag-do-atmegi-w-wersji-usb/</link>
		<comments>http://blog.vmario.org/2010/01/20/jtag-do-atmegi-w-wersji-usb/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 18:25:52 +0000</pubDate>
		<dc:creator>vmario</dc:creator>
				<category><![CDATA[Elektronika]]></category>

		<guid isPermaLink="false">http://blog.vmario.org/?p=635</guid>
		<description><![CDATA[Jakiś czas temu przedstawiałem prosty układ elektroniczny pełniący rolę JTAG-a dla mikrokontrolerów ATmega. Był to znaleziony w Sieci klon firmowego JTAGICE, który to klon mimo prostej budowy znakomicie pełni swoją rolę. Jedyną istotną jego wadą jest sterowanie przez port szeregowy RS-232. Port ten jest już rzadkością w komputerach, co wymusza stosowanie przejściówek USB&#60;&#8211;&#62;RS-232. Z mojego [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/vmario/4290418383/" title="AVR JTAGICE USB clone by vmario, on Flickr"><img class="vmprawa" src="http://farm3.static.flickr.com/2793/4290418383_55e2a59554_t.jpg" width="100" height="75" alt="AVR JTAGICE USB clone" /></a>Jakiś czas temu przedstawiałem prosty układ elektroniczny pełniący rolę <a href="http://blog.vmario.org/2009/04/29/jtag-vs-fuse-bity-atmegi128/"><abbr title="Joint Test Action Group">JTAG</abbr>-a dla mikrokontrolerów ATmega</a>. Był to znaleziony w Sieci klon firmowego JTAGICE, który to klon mimo prostej budowy znakomicie pełni swoją rolę. Jedyną istotną jego wadą jest sterowanie przez port szeregowy RS-232. Port ten jest już rzadkością w komputerach, co wymusza stosowanie przejściówek USB&lt;&ndash;&gt;RS-232. Z mojego doświadczenia wynika, że przejściówki takie często sprawiają wiele kłopotów, dlatego doszedłem do wniosku, że czas ulepszyć <abbr title="Joint Test Action Group">JTAG</abbr>-a, a przy okazji dorobić się wreszcie czegoś konkretnego w miejsce poprzedniej <a href="http://www.flickr.com/photos/vmario/3487121562/">prowizorki</a>.</p>
<p>Tak naprawdę nie czekało mnie wiele pracy &mdash; musiałem tylko dodać do układu jakąś przejściówkę USB&lt;&ndash;&gt;RS-232 i zaprojektować płytkę, najlepiej pod elementy SMD. W roli konwertera postanowiłem wykorzystać układ scalony firmy FTDI &mdash; <a href="http://www.ftdichip.com/Products/FT232R.htm">FT232RL</a>. Kosztuje on wprawdzie kilkanaście złotych, ale ma wbudowany zegar i do działania nie potrzebuje prawie żadnych elementów zewnętrznych.</p>
<p><span id="more-635"></span></p>
<h4>Opis układu</h4>
<p>Schemat ideowy można obejrzeć na poniższym rysunku.</p>
<div style="text-align:center"><a href="/wp-content/uploads/avr_jtagice_usb_clone.pdf"><img src="/wp-content/uploads/avr_jtagice_usb_clone.png" alt="Schemat ideowy" width="400" height="281" class="vmnormalny" /></a></div>
<p>Do ATmegi16 dodałem złącze J3, służące do wgrywania firmware’u, a MAX232 zastąpiłem wspomnianym FT232RL. Ponieważ chciałem wykorzystać możliwość zasilania <abbr title="Joint Test Action Group">JTAG</abbr>-a i debugowanego systemu z portu USB, musiałem również zastosować automatyczny przełącznik zasilania w postaci tranzystora T1 z obwodem <i>soft start</i> (R1, C5). Specyfikacja USB uwzględnia różne tryby zasilania i korzystające z tej magistrali urządzenia powinny w odpowiedni sposób ograniczać swój prąd. Oczywiście FT232RL potrafi przejść w odpowiedni tryb, powiadamiając przy tym zewnętrzne urządzenia, np. po skonfigurowaniu wyjścia SLEEP#, ale takie rozwiązanie nie sprawdziłoby się we współpracy z dołączonym urządzeniem debugowanym. Dlatego zastosowałem polecany przez notę aplikacyjną tranzystor sterowany sygnałem PWREN# (tu: nóżka CBUS3). W razie potrzeby tranzystor odcina zasilanie i całość przechodzi w stan uśpienia.</p>
<p>Diody D1, D2 i D3 mogą być pomocne w diagnozowaniu problemów z <abbr title="Joint Test Action Group">JTAG</abbr>-iem. D2 informuje o tym, iż port USB przyznał nam zasilanie, D1, iż zachodzi komunikacja z komputerem, zaś D3 mówi o pracy samego interfejsu <abbr title="Joint Test Action Group">JTAG</abbr>.</p>
<h4>Montaż i uruchomienie</h4>
<p>Płytkę drukowaną zaprojektowałem z myślą o jej wykonaniu w warunkach domowych, stąd dość duże przelotki i brak ścieżek prowadzonych do złącz po stronie elementów.</p>
<p>Podczas montażu musimy zwrócić szczególną uwagę na układ FT232RL. Jest on wykonany w stosunkowo drobnym rastrze i przy jego lutowaniu warto wspomóc się topnikiem. Ja używałem RF800.</p>
<p>Jeżeli sami wykonywaliśmy płytkę i musimy lutować przelotki, należy pamiętać, iż kilka z nich znajduje się pod złączem J2. Nie jest to zbyt eleganckie rozwiązanie, ale nie chciało mi się poprawiać tego fragmentu PCB.</p>
<p>Po sprawdzeniu poprawności montażu możemy podłączyć urządzenie do portu USB (stan zworek J4 i J5 jest na razie nieistotny). Teraz należy uruchomić program <a href="http://www.ftdichip.com/Resources/Utilities.htm#FT_Prog">FT_PROG</a> i skonfigurować układ FT232RL. W zakładce <i>USB_Config_Descriptor</i> zaznaczamy opcje <i>Bus Powered</i>, <i>USB Remote Wakeup</i> i <i>Pull Down IO Pins in USB Suspend</i> zaś wartość <i>Max Bus Power</i> ustawiamy na 500mA. Nazwę urządzenia w <i>USB_String_Descriptors</i> ustawiamy wedle własnego widzimisię. W zakładce <i>Hardware_Specific</i> &ndash;&gt; IO_Controls ustawiamy funkcje pinów IO:</p>
<table>
<thead>
<tr>
<th>Property</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<tr>
<td>C0</td>
<td>TX &amp; RXLED#</td>
</tr>
<tr>
<td>C3</td>
<td>PWRON#</td>
</tr>
</tbody>
</table>
<p>Następnie programujemy wprowadzone zmiany. Po zamknięciu FT_PROG-a i ponownym podłączeniu urządzenia powinniśmy zobaczyć dodatkowy port COM w systemie (lub prośbę o doinstalowanie sterowników).</p>
<p>Teraz ustawiamy zworkę J5 w pozycji <i>PROG</i>, programujemy ATmegę i wgrywamy firmware zgodnie z opisem pierwotnej wersji urządzenia (linki we wspomnianym wcześniej <a href="http://blog.vmario.org/2009/04/29/jtag-vs-fuse-bity-atmegi128/">wpisie</a>).</p>
<p>Po wgraniu firmware’u zworkę J5 ustawiamy w pozycję <i>WORK</i>, zaś J4 wedle potrzeby &mdash; <i>USB PWR</i>, jeżeli debugowany układ ma być zasilany z portu USB lub <i>DEVICE PWR</i>, jeżeli dysponuje on własnym zasilaniem. Teraz <abbr title="Joint Test Action Group">JTAG</abbr> jest gotowy do pracy.</p>
<h4>Możliwości zmian</h4>
<p>Zgodnie z zaleceniem noty aplikacyjnej zastosowałem przeciwzakłóceniowy koralik ferrytowy FB1 na dodatniej linii zasilania USB. Nie jest on niezbędny &mdash; można go zastąpić jakimś dławikiem lub po prostu zworą. Jeżeli będziemy mieli wyjątkowego pecha może to jednak wiązać się z zakłóceniami pracy magistrali USB.</p>
<p>Podobnie bezpiecznik polimerowy F1 nie jest niezbędny, zwłaszcza, że porty USB są wyposażone we własne bezpieczniki. Taki bezpiecznik jednak kosztuje niewiele a zwiększa nieco bezpieczeństwo naszego komputera.</p>
<p>Mimo iż układ w całości został zaprojektowany na Linuksie, uruchomiłem go na Windowsie ze względu na aplikację FT_PROG. Za to próbowałem korzystać z <abbr title="Joint Test Action Group">JTAG</abbr>-a na Linuksie, posługując się programem AVaRICE. Niestety, mimo iż program zdawał się wgrywać kod na mikrokontroler, to debugowanie kończyło się niepowodzeniem. Na razie pozostałem więc przy AVR Studio w środowisku Windows. Zresztą AVR Studio ma tę przewagę nad wszystkimi innymi rozwiązaniami, iż udostępnia świetny graficzny monitor zasobów mikrokontrolera.</p>
<h4>Wykaz elementów</h4>
<p>Półprzewodniki:</p>
<ul>
<li>1 &times; FT232RL</li>
<li>1 &times; ATMEGA16-16AU</li>
<li>1 &times; IRLM6402 (użyłem IRLM6302)</li>
<li>1 &times; LED SMD 1206 zielona</li>
<li>1 &times; LED SMD 1206 zółta</li>
<li>1 &times; LED SMD 1206 czerwona</li>
</ul>
<p>Kondensatory SMD 0805:</p>
<ul>
<li>2 &times; 22pF</li>
</ul>
<p>Kondensatory SMD 1206:</p>
<ul>
<li>4 &times; 100nF</li>
<li>1 &times; 10nF</li>
<li>1 &times; 4,7&micro;F</li>
<li>1 &times; 10uF</li>
</ul>
<p>Rezystory SMD 1206:</p>
<ul>
<li>3 &times; 270&#x2126;</li>
<li>2 &times; 1k&#x2126;</li>
<li>1 &times; 4,7k&#x2126;</li>
<li>2 &times; 10k&#x2126;</li>
<li>1 &times; 36k&#x2126; (użyłem 33k&#x2126;)</li>
<li>1 &times; 150k&#x2126;</li>
</ul>
<p>Elementy stykowe:</p>
<ul>
<li>2 &times; jumperek</li>
<li>1 &times; gniazdo USB B kątowe do druku przewlekane</li>
<li>1 &times; gniazdo męskie proste IDC10 do druku przewlekane</li>
<li>1 &times; goldpin 2&#215;3</li>
<li>2 &times; goldpin 1&#215;3</li>
</ul>
<p>Pozostałe:</p>
<ul>
<li>1 &times; rezonator kwarcowy 7.3728MHz SMD (oznaczany czasem w katalogach jako 7.372MHz)</li>
<li>1 &times; LCBA-601 (koralik przeciwzakłóceniowy) &#8212; może być 1206, 0805 lub 0603</li>
<li>1 &times; bezpiecznik polimerowy 0,5A SMD 1812</li>
</ul>
<h4>Pliki</h4>
<p>W <a href="/wp-content/uploads/avr_jtagice_usb_clone.zip">spakowanym archiwum</a> dostępne są schematy w formacie programu KiCad oraz w formacie PostScript.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.vmario.org/2010/01/20/jtag-do-atmegi-w-wersji-usb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sage policzy to za Ciebie</title>
		<link>http://blog.vmario.org/2009/05/21/sage-policzy-to-za-ciebie/</link>
		<comments>http://blog.vmario.org/2009/05/21/sage-policzy-to-za-ciebie/#comments</comments>
		<pubDate>Thu, 21 May 2009 18:07:57 +0000</pubDate>
		<dc:creator>vmario</dc:creator>
				<category><![CDATA[Elektronika]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Komputer]]></category>
		<category><![CDATA[Recenzje]]></category>

		<guid isPermaLink="false">http://blog.vmario.org/?p=535</guid>
		<description><![CDATA[Z pewnym żalem obserwuję czasem wśród moich kolegów z uczelni prawie że kompletny brak umiejętności posługiwania się oprogramowaniem matematycznym. Rozumiem jednak niechęć do MATLAB-a, a nawet do samej matematyki; ze wstydem przyznaję też, że sam, po blisko czterech latach na politechnice, posiadam wciąż bardzo ubogi aparat matematyczny i z trudem udaje mi się zmusić komputer [...]]]></description>
			<content:encoded><![CDATA[<p>Z pewnym żalem obserwuję czasem wśród moich kolegów z uczelni prawie że kompletny brak umiejętności posługiwania się oprogramowaniem matematycznym. Rozumiem jednak niechęć do <abbr title="MATrix LABoratory">MATLAB</abbr>-a, a nawet do samej matematyki; ze wstydem przyznaję też, że sam, po blisko czterech latach na politechnice, posiadam wciąż bardzo ubogi aparat matematyczny i z trudem udaje mi się zmusić komputer do tego, do czego został stworzony, czyli do&hellip; liczenia.</p>
<p>Chcąc nie chcąc, uczyłem się w ramach zajęć na <abbr title="Elektronika, Telekomunikacji i Informatyka">ETI</abbr> wykorzystywać <abbr title="MATrix LABoratory">MATLAB</abbr>-a, a więc przy okazji i Octave&#8217;a, do podstawowych obliczeń, szybko jednak zapominałem pokręconą składnię tego środowiska. Brakowało mi też wsparcia dla obliczeń analitycznych i możliwości pisania programów z użyciem wygodnej składni. Potrzebowałem czegoś, co pozwoli mi zarówno policzyć analitycznie całkę, z którą nie poradzi sobie mój kalkulator (Casio Algebra FX 2.0 Plus), wykreślić przebieg dowolnej funkcji, wyznaczyć <abbr title="Discrete Fourier Transform">DFT</abbr> sygnału, jak i szybko zaimplementować jakiś własny algorytm.</p>
<p>Cóż więc mi pozostawało? SciPy, Maxima, Scilab? A może coś jeszcze innego? W końcu trafiłem na środowisko <a href="http://www.sagemath.org/">Sage</a>.</p>
<p><span id="more-535"></span></p>
<p>Powiedzieć, że Sage jest programem matematycznym, to nieścisłość. Określić go jako zgrabne środowisko do wszelkiego rodzaju obliczeń to nadużycie, przynajmniej jeżeli chodzi o mój pogląd na piękno. Uważam, że tutaj najbardziej pasuje określenie &bdquo;<a href="http://pl.wikipedia.org/wiki/Srebrna_ta%C5%9Bma_klej%C4%85ca">duct tape</a>&rdquo;. Jeżeli jesteś matematykiem lub cenisz eleganckie rozwiązania programistyczne (albo miejsce na twardym dysku&hellip;), Sage może nie wzbudzić Twojego zachwytu. Jeżeli jednak masz w sobie ducha MacGyveryzmu, Sage może okazać się świetnym rozwiązaniem wielu problemów.</p>
<p>Sage jest zbiorem programów i bibliotek matematycznych, takich jak Maxima, SciPy czy <abbr title="GNU Scientific Library">GSL</abbr>, powiązanych Pythonem i okraszonych interfejsem <abbr title="Command-line interface">CLI</abbr> i dziwacznym <abbr title="Graphical user interface">GUI</abbr> w postaci&hellip; strony WWW. Jego niewątpliwą zaletą jest darmowość i otwartość (możemy więc poznać sposób, w jaki przeprowadzane są obliczenia).</p>
<p>Korzystam z Arch Linuksa, gdzie Sage dostępny jest w repozytorium <abbr title="ArchLinux User-community Repository">AUR</abbr> jako <code>sage-mathematics</code> i <code>sage-mathematics-bin</code>. Pierwszy pakiet chyba nie chciał mi się kompilować, a w każdym razie miałem z nim jakiś problem, ściągnąłem więc źródła bezpośrednio ze strony programu i próbowałem sam go zbudować. Niestety, udało mi się rozwiązać tylko część problemów i w końcu zakończyłem na błędzie po dwóch czy trzech godzinach kompilacji. Zrezygnowany sięgnąłem po binarkę. Pomijając fakt, że pobrałem bodaj 400MB, instalacja przebiegła bezboleśnie. Co prawda z dysku zniknęło mi 1,2GB, ale nie byłem zdziwiony &mdash; o ile dobrze zauważyłem, Sage zawiera w sobie wszystkie niezbędne biblioteki i programy, więc mam teraz zdublowanego Pythona, Maximę, SciPy i pewnie sporo innych rzeczy&hellip;</p>
<p>Przejdźmy jednak do meritum. Po uruchomieniu program może krzyczeć o odpowiednie uprawnienia do katalogu konfiguracyjnego. Poniższa komenda powinna rozwiązać problem:</p>
<pre><code># chmod +x ~/.sage/ipython</code></pre>
<p>Teraz odpalamy powłokę Sage&#8217;a i możemy przystępować do liczenia. Jednak od interfejsu linii poleceń znacznie wygodniejszy jest interfejs webowy, uruchamiany poleceniem <code>notebook()</code>. Jego działanie polega na wystartowaniu serwera WWW i przeglądarki z aplikacją webową. Jest to rozwiązanie w takim samym stopniu dziwne, co wygodne. Zgodnie z nazwą, serwuje nam ono coś w rodzaju notesów, w których możemy zapisywać obliczenia i ich wyniki. Przyznaję, że jest to bardzo intuicyjne rozwiązanie. Niestety, jesteśmy pozbawieni jakiegoś zgrabnego <abbr title="Integrated Development Environment">IDE</abbr>, pozwalającego wykorzystać możliwości Sage&#8217;a do pisania dłuższych skryptów czy programów. Może to i lepiej&hellip;</p>
<p>Odłóżmy jednak na bok ironiczne uwagi i przyjrzyjmy się bliżej <i>notebookowi</i>. <a href="http://www.sagemath.org/help-video.html">Screencasty</a> pokazują bogate możliwości tego interfejsu. W szczególności należy zwrócić uwagę na <a href="http://wiki.sagemath.org/interact">tryb interaktywny</a> &mdash; możliwość szybkiego napisania skryptu, który na bieżąco wizualizuje parametry ustawiane suwakiem, zrobiła na mnie wrażenie. To aż się prosi o wykorzystanie w szkołach czy na uczelniach!</p>
<p>Wykresy są całkiem estetyczne, do wypisywania wzorów można wykorzystać składnię LaTeX-a, a możliwość zapisania stanu pracy i powrotu w każdej chwili do obliczeń jest bardzo wygodna. Brakuje mi tylko skrótu klawiaturowego, który obliczałby wyrażenie bez przenoszenia do kolejnego wiersza (a tak działa <i>Shift + Enter</i>). Może jednak to tylko mój brak znajomości klawiszologii.</p>
<p>Jako podsumowanie cisną mi się na usta słowa: &bdquo;To jest naprawdę świetne narzędzie, <strong>ale&hellip;</strong>&rdquo;. Owych &bdquo;ale&rdquo; jest, niestety, sporo: od samej idei zlepienia różnych programów matematycznych, przez duże rozmiary aplikacji po dziwny interfejs. W zamian jednak otrzymujemy ogromne możliwości, pomysłowy tryb interaktywny i w sumie niegłupią ideę <i>notebooków</i>. Warto zatem instalować? Szczerze mówiąc, gdyby projekt <a href="http://www.wolframalpha.com/">Wolfram|Alpha</a> wystartował trochę wcześniej, to pewnie nie sięgnąłbym po Sega&#8217;a, w każdym razie nie po to, by policzyć analitycznie kilka całek czy wykreślić przebieg funkcji. Myślę jednak, że warto spróbować przygody z tą aplikacją czy to przez LiveCD, czy przez instalację binarki. W mojej krótkiej recenzji nie zabrakło złośliwości, ale nie mam zamiaru usuwać w najbliższym czasie programu z dysku &mdash; czas pokaże, czy to narzędzie rzeczywiście okaże się niezastąpione.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.vmario.org/2009/05/21/sage-policzy-to-za-ciebie/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Nut/OS na Linuksie i MMnet104</title>
		<link>http://blog.vmario.org/2009/05/06/nutos-na-linuksie-i-mmnet104/</link>
		<comments>http://blog.vmario.org/2009/05/06/nutos-na-linuksie-i-mmnet104/#comments</comments>
		<pubDate>Wed, 06 May 2009 19:29:57 +0000</pubDate>
		<dc:creator>vmario</dc:creator>
				<category><![CDATA[Elektronika]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Komputer]]></category>

		<guid isPermaLink="false">http://blog.vmario.org/?p=479</guid>
		<description><![CDATA[Tydzień temu pisałem o przywróceniu do życia modułu MMnet104. Dziś opiszę krótko instalację i uruchomienie środowiska, które pozwoli oprogramować ten moduł pod Linuksem z użyciem systemu operacyjnego Nut/OS. Nut/OS jest modularnym systemem operacyjnym czasu rzeczywistego (RTOS) opracowanym w ramach projektu Ethernut. Ethernut jest projektem typu &#8222;open source hardware&#8221;, mającym na celu udostępnienie systemów wbudowanych obsługujących [...]]]></description>
			<content:encoded><![CDATA[<p>Tydzień temu pisałem o <a href="http://blog.vmario.org/2009/04/29/jtag-vs-fuse-bity-atmegi128/">przywróceniu do życia</a> modułu <a href="http://www.propox.com/products/t_130.html">MMnet104</a>. Dziś opiszę krótko instalację i uruchomienie środowiska, które pozwoli oprogramować ten moduł pod Linuksem z użyciem systemu operacyjnego Nut/OS.</p>
<p><a href="http://www.ethernut.de/en/firmware/nutos.html">Nut/OS</a> jest modularnym systemem operacyjnym czasu rzeczywistego (<abbr title="Real-Time Operating System">RTOS</abbr>) opracowanym w ramach projektu <a href="http://www.ethernut.de/index.html">Ethernut</a>. Ethernut jest projektem typu &bdquo;open source hardware&rdquo;, mającym na celu udostępnienie systemów wbudowanych obsługujących Ethernet.</p>
<p><span id="more-479"></span></p>
<p>Nas w tej chwili interesuje jednak tylko część software&#8217;owa tego projektu, czyli Nut/OS, udostępniający gotowy stos <abbr title="Transmission Control Protocol/Internet Protocol">TCP/IP</abbr> i obsługę protokołów takich jak <abbr title="Dynamic Host Configuration Protocol">DHCP</abbr>, <abbr title="Domain Name System">DNS</abbr>, <abbr title="Simple Mail Transfer Protocol">SMTP</abbr>, a nawet <abbr title="Hypertext Transfer Protocol">HTTP</abbr> czy <abbr title="File Transfer Protocol">FTP</abbr>. Nut/OS bardzo dobrze wspiera kompilator AVR-GCC, a poza tym autorzy projektu przewidzieli możliwość pracy na Linuksie, więc czas przystąpić do dzieła.</p>
<p>Zaczynamy od ściągnięcia źródeł, rozpakowania i uruchomienia konfiguracji:</p>
<pre><code>$ tar jxvf ethernut-4.8.2.tar.bz2
$ cd ethernut-4.8.2
$ ./configure</code></pre>
<p>Powinniśmy zobaczyć m.in.:</p>
<pre><code>configure: nutconfgui is enabled</code></pre>
<p>co oznacza, że będziemy mogli skorzystać z konfiguratora graficznego. W innym wypadku zapewne będziemy musieli doinstalować <a href="http://www.wxwidgets.org/">wxWidgets</a> lub inną bibliotekę, której brak wskaże nam konfigurator.</p>
<p>Ja napotkałem inny problem, związany ze specjalną biblioteką <a href="http://wxpropgrid.sourceforge.net/cgi-bin/index">wxPropertyGrid</a>, wymaganą przez narzędzie <code>nutdisc</code>, czyli Discoverera:</p>
<pre><code>configure: WARNING: wxpropgrid not found
[&hellip;]
configure: nutdisc requires propgrid</code></pre>
<p>Discoverer nie jest na szczęście niezbędny, jest to dodatkowy program, umożliwiający odnalezienie w sieci Ethernet nie do końca skonfigurowanych hostów, pracujących pod kontrolą Nut/OS-a.</p>
<p>Niestety, u mnie Ethernut najpierw nie widział skompilowanej biblioteki, a po wprowadzeniu zmian w <code>configure</code> i tak kończył kompilację z błędem. Koniec końców zignorowałem więc brak Discoverera i odpaliłem:</p>
<pre><code>$ make
$ make check
$ su -c "make install"</code></pre>
<p>Podczas kompilacji może nas jednak spotkać kolejna przykra niespodzianka: proces przerwie się niespodziewanie, sypiąc błędami, zapoczątkowanymi przez komunikat</p>
<pre><code>error: wx/setup.h: Nie ma takiego pliku ani katalogu</code></pre>
<p>Na szczęście i na to jest prosta rada:</p>
<pre><code># ln -s /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h /usr/include/wx-2.8/wx/setup.h</code></pre>
<p>Teraz <code>make clean</code> i jazda od nowa z kompilacją!</p>
<p>Po zainstalowaniu nie zmieniamy katalogu, tylko uruchamiamy <code>nutconf</code> i wybieramy plik konfiguracyjny <code>MMnet104.conf</code>.</p>
<p>Następnie klikamy <i>Edit -&gt; Settings</i>. W zakładce <i>Build</i> <i>Source Directory</i> powinien wskazywać na katalog, do którego rozpakowaliśmy źródła, zaś <i>Platform</i> powinien mieć wartość <code>avr-gcc</code>. Jako <i>Build Directory</i> podałem katalog <code>~/test/build</code>, zaś jako <i>Install Directory</i> &mdash; <code>~/test/build/lib</code>. W zakładce <i>Samples</i> wskazałem <code>~/test/samples</code>.</p>
<p>Teraz klikamy <i>Build -&gt; Build Nut/OS</i> i <i>Build -&gt; Create Sample Directory</i>. W efekcie uzyskujemy gotowe środowisko pracy: jądro <abbr title="Real-Time Operating System">RTOS</abbr>, liczne biblioteki i przykładowe aplikacje. Możemy zacząć np. od serwera <abbr title="Hypertext Transfer Protocol">HTTP</abbr> &mdash; po wydaniu komendy <code>make</code> w katalogu <code>samples/httpd</code> powinniśmy otrzymać HEX-a gotowego do wgrania do naszego mikrokontrolera.</p>
<p>Przy okazji wspomnę, iż warto skorzystać z debugowania za pomocą interfejsu RS232. Interfejs ten coraz rzadziej spotyka się w komputerach, jeżeli jednak korzystamy z płytki wyposażonej w konwerter RS232&lt;-&gt;USB na bazie układu scalonego <a href="http://www.ftdichip.com/">FTDI</a>, Linux powinien nam automatycznie wykryć port i przypisać go do urządzenia <code>/dev/ttyUSB0</code>. Na PC-cie wystarczy uruchomić terminal RS232, np. <a href="http://sourceforge.net/projects/gtkterm/">GTKTerm</a> czy <a href="http://cutecom.sourceforge.net/">CuteCom</a> (baudrate odczytamy z kodu źródłowego; w moim przypadku parametry transmisji wynosiły <code>115200, 8N1</code>), a w kodzie programu mikrokontrolera umieścić wywołania <code>printf()</code> czy <code>puts()</code>, raportujące stan urządzenia.</p>
<p>Jedyną niedogodnością jest fakt, iż po odłączeniu kabla lub zasilania płytki oba terminale zawieszają się, zajmując przy okazji całą moc CPU PC-ta. Dlatego w takich sytuacjach warto pamiętać o wcześniejszym rozłączeniu połączenia w terminalu.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.vmario.org/2009/05/06/nutos-na-linuksie-i-mmnet104/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JTAG vs. fuse bity ATmegi128</title>
		<link>http://blog.vmario.org/2009/04/29/jtag-vs-fuse-bity-atmegi128/</link>
		<comments>http://blog.vmario.org/2009/04/29/jtag-vs-fuse-bity-atmegi128/#comments</comments>
		<pubDate>Wed, 29 Apr 2009 20:38:59 +0000</pubDate>
		<dc:creator>vmario</dc:creator>
				<category><![CDATA[Elektronika]]></category>

		<guid isPermaLink="false">http://blog.vmario.org/?p=498</guid>
		<description><![CDATA[W naszym projekcie grupowym na ETI korzystamy z modułu MMnet104 z mikrokontrolerem ATmega128. W wyniku bliżej nieokreślonych manipulacji procesor przestał odpowiadać na próby komunikacji po SPI za pomocą programatorów ISP. Po konsultacjach uzgodniliśmy, że przed dramatyczną próbą wybebeszenia ATmegi i potraktowania ją programatorem równoległym spróbujemy użyć JTAG-a. Szczęśliwie okazało się, że da się w miarę [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/vmario/3487121562/" title="AVR JTAG by vmario, on Flickr"><img class="vmlewa" src="http://farm4.static.flickr.com/3414/3487121562_5deb72b0e9_t.jpg" width="75" height="100" alt="AVR JTAG" /></a>W naszym projekcie grupowym na <abbr title="Elektronika, Telekomunikacja i Informatyka">ETI</abbr> korzystamy z modułu <a href="http://www.propox.com/products/t_130.html">MMnet104</a> z mikrokontrolerem ATmega128. W wyniku bliżej nieokreślonych manipulacji procesor przestał odpowiadać na próby komunikacji po <abbr title="Serial Peripheral Interface">SPI</abbr> za pomocą programatorów <abbr title="In-System Programming">ISP</abbr>.</p>
<p>Po konsultacjach uzgodniliśmy, że przed dramatyczną próbą wybebeszenia ATmegi i potraktowania ją programatorem równoległym spróbujemy użyć <abbr title="Joint Test Action Group">JTAG</abbr>-a. Szczęśliwie okazało się, że da się w miarę prosto zbudować taki programator w warunkach domowych.</p>
<p><span id="more-498"></span></p>
<p>W Internecie nietrudno natrafić na <a href="http://www.scienceprog.com/build-your-own-avr-jtagice-clone/">opisy</a> wykonania <abbr title="Joint Test Action Group">JTAG</abbr>-a, także <a href="http://liku.sdfpau.org/artykuly.php?a=avrjtag">w języku polskim</a>. Jak widać, schemat ideowy jest całkiem prosty, a elementy dosyć popularne i łatwe do zdobycia. Wyjątkiem jest oscylator kwarcowy o częstotliwości 7,3728MHz. Ja znalazłem go dopiero w czwartym sklepie (jeżeli ktoś mieszka w trójmieście, radzę od razu odwiedzić sklep Jacktronic). Warto też pamiętać, by kupić dwie ATmegi16, dzięki czemu będziemy mieli jeden czysty mikrokontroler, który posłuży do sprawdzenia poprawności działania <abbr title="Joint Test Action Group">JTAG</abbr>-a.</p>
<p>Postępując zgodnie z opisem powinniśmy uruchomić całość w miarę szybko i sprawnie. Ja napotkałem tylko na problem z wgraniem bootloadera za pomocą programatora AVR USBasp, który <a href="http://blog.vmario.org/2008/10/22/programator-avr-usbasp-na-linuksie/">opisywałem</a> kilka miesięcy temu. Programator ciągle przerywał pracę, strasząc jakimś &bdquo;broken pipe&rdquo;. Nie udało mi się znaleźć wytłumaczenia tego problemu &mdash; być może jest to kwestia zakłóceń, powstających na skutek montażu na płytce stykowej. W każdym razie wystarczy odrobina cierpliwości i wgrywanie wsadu aż do skutku (w trybie spowolnionego programowania, które wlecze się niemiłosiernie, ale w końcu odnosi skutek). Co do samego wsadu, to radzę zastosować <a href="http://liku.sdfpau.org/files/avrboot.hex">gotowy</a> (u mnie samodzielna kompilacja nie zaowocowała działającą binarką).</p>
<p>Jeżeli komuś nie chce się przeliczać fuse bitów dla ATmegi16 w <abbr title="Joint Test Action Group">JTAG</abbr>-u, poniżej podaję gotową komendę dla <code>avrdude</code> (<i>Fuse Low Byte</i> równy <code>0xFF</code> i <i>Fuse High Byte</i> równy <code>0xD8</code>).</p>
<pre><code>$ avrdude -p m16 -c usbasp -v -U lfuse:w:0xFF:m -U hfuse:w:0xD8:m</code></pre>
<p>Przypominam, że należy starannie zaciskać złącza IDC10 na taśmie programującej, a w przypadku użycia scrossowanego kabla RS232 należy zamienić odpowiednie końcówki w gnieździe.</p>
<p>Jeżeli ktoś chciałby uruchomić cały programator pod Linuksem, to, niestety, nie jestem w stanie służyć pomocą. Pod Linuksem wgrałem tylko bootloader, a resztę załatwiło AVR Studio pod Windowsem.</p>
<p>Co do naszej nieszczęsnej ATmegi128 &mdash; za pomocą JTAG-a odblokowałem lock bity, ustawiłem poprawną konfigurację oscylatora i wyłączyłem flagę <i>WDTON</i>, która niepotrzebnie włączała watchdoga, dzięki czemu moduł w końcu ruszył.</p>
<p><ins>PS Zapraszam do zapoznania się z nowszym rozwiązaniem &mdash; tym samym <abbr title="Joint Test Action Group">JTAG</abbr>-iem <a href="/2010/01/20/jtag-do-atmegi-w-wersji-usb/">w wersji USB</a>.</ins></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.vmario.org/2009/04/29/jtag-vs-fuse-bity-atmegi128/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

