<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0"
   xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
<channel>
    <title>Pylone Blog</title>
    <link>http://pylone.jp/blog</link>
    <description>製品情報や開発者向け情報</description>
    <language>ja</language>
    <copyright>Copyright 2008 Pylone, Inc.</copyright>
    <ttl>60</ttl>
    <pubDate>Tue, 08 May 2012 09:50 GMT</pubDate>
    <managingEditor>webmaster@pylone.jp (Pylone, Inc.)</managingEditor>
    <generator>PyBlosxom http://pyblosxom.sourceforge.net/ 1.3.2 2/13/2006</generator>
    <image>
        <url>http://pylone.jp/i/microbar.png</url>
        <title>Pylone Blog</title>
        <link>http://pylone.jp/blog</link>
        <description>製品情報や開発者向け情報</description>
    </image>
<item>
   <title>mruby を Ash エミュレータ上の Linux (uClinux) 環境で動かしてみる</title>
   <guid isPermaLink="false">mruby_on_qemu_ash</guid>
   <link>http://pylone.jp/blog/mruby_on_qemu_ash</link>
   <description><![CDATA[


<p>mruby とは、<a href="http://www.ruby-lang.org/">オブジェクト指向スクリプト言語 Ruby</a> の軽量版であり、小規模な組込みシステムもターゲットとして開発が行われているそうで、
先日、そのソースコードが公開されました。</p>
<p>今回この mruby を、MMU を持たない CPU (SH-2/SH7619) を搭載したボードのエミュレータである <a href="http://pylone.jp/ash/docs/qemu-ash-manual.html">Ash エミュレータ</a> 上の Linux 環境 (uClinux と uClibc) で
動作を確認することができたので、その手順を紹介したいと思います。</p>
<p>尚、確認を行ったホスト環境は Ubuntu 11.10 (32bit) です。</p>
<p class="info">本エントリの内容は実験的なものです。Ash ボード、及び Ash エミュレータ上での mruby の動作を保障するものではありません。</p>
<h4 id="mruby_on_qemu_ash-E3.82.AF.E3.83.AD.E3.82.B9.E3.83.84.E3.83.BC.E3.83.AB.E3.83.81.E3.82.A7.E3.82.A4.E3.83.B3.E3.81.AE.E3.82.A4.E3.83.B3.E3.82.B9.E3.83.88.E3.83.BC.E3.83.AB">クロスツールチェインのインストール</h4>
<p><a href="http://pylone.jp/ash/docs/how_to_install_cross_toolchain.html">こちらの手順</a>に従い、mruby をビルドするための SH-2 用クロスツールチェインをインストールします。</p>
<p>インストールするツールチェインは、2012.02-pylone5.tar.bz2 以降のバージョンとしてください。</p>
<p>尚、以降の手順では、インストールしたクロスツールチェインにパスが通っていることを前提としています。</p>
<h4 id="mruby_on_qemu_ash-41.73.68.20.E3.82.A8.E3.83.9F.E3.83.A5.E3.83.AC.E3.83.BC.E3.82.BF.E3.81.AE.E6.BA.96.E5.82.99.E3.80.81.E8.B5.B7.E5.8B.95.E3.81.BE.E3.81.A7">Ash エミュレータの準備、起動まで</h4>
<p>以下の手順で Ash エミュレータをビルド、起動を行います。
 </p>
<pre>
(Ash エミュレータのビルドに必要。環境に合わせてインストール)
# <span class="cmdline">apt-get install libglib2.0-dev</span>

(Ash エミュレータのビルド)
% <span class="cmdline">wget http://downloads.pylone.jp/ash/src/qemu-ash-0.15.1-pylone2.tar.bz2</span>
% <span class="cmdline">tar xf qemu-ash-0.15.1-pylone2.tar.bz2 </span>
% <span class="cmdline">cd qemu-ash-0.15.1-pylone2</span>
% <span class="cmdline">./configure --target-list=sh2-softmmu,sh2-linux-user</span>
% <span class="cmdline">make</span>

(Linux 環境のダウンロード)
% <span class="cmdline">wget http://downloads.pylone.jp/ash/images/20120419/ash_flash_linux.bin</span>

(Ash エミュレータの起動)
% <span class="cmdline">./sh2-softmmu/qemu-system-sh2 \
  -nographic \
  -drive if=pflash,cache=writeback,file=ash_flash_linux.bin \
  -tftp /tmp</span>
</pre>
<p>Ash エミュレータの擬似 TFTP サーバの公開ディレクトリ指定(-tftp オプション) に /tmp を指定しますが、これは後述の mruby の各バイナリファイルを転送するための一時的なディレクトリです
(/tmp 以外でも可)。</p>
<p>ブートローダからの起動を経て、Linux の起動後、ログインプロンプトまでたどり着いたら、root でログインします(初回起動時はログインプロンプトまで時間がかかります)。</p>
<pre>
(ログイン)
ash login: <span class="cmdline">root</span>
</pre>
<p>尚、Ash エミュレータを終了するには、起動した shell を閉じるか、または同 shell 上で &lt;Ctrl-a x&gt; と 入力してください。</p>
<h4 id="mruby_on_qemu_ash-6D.72.75.62.79.20.E3.81.AE.E3.82.AF.E3.83.AD.E3.82.B9.E3.83.93.E3.83.AB.E3.83.89">mruby のクロスビルド</h4>
<p>ホストPC 上の 別の shell から、以下の手順で SH-2 向けに mruby をクロスビルドします。</p>
<pre>
(以降の手順に必要。環境に合わせてインストール)
# <span class="cmdline">apt-get install git bison</span>

(GitHub より、mruby の ソースを取得)
% <span class="cmdline">git clone https://github.com/mruby/mruby.git</span>

(mruby の ビルド)
% <span class="cmdline">cd mruby</span>
% <span class="cmdline">make \
  CC=sh2-linux-gcc \
  LL="sh2-linux-gcc -Wl,-elf2flt=-ra" \
  AR=sh2-linux-ar \
  MRBC="(Ash エミュレータを展開したディレクトリ)/qemu-ash-0.15.1-pylone2/sh2-linux-user/qemu-sh2 -L /opt/pylone/ash/host/usr/sh2-linux ../bin/mrbc.gdb"</span>
</pre>
<p>尚、今回取得した mruby は以下の時点のものです。</p>
<pre>
% <span class="cmdline">git --no-pager show --pretty=oneline</span>
b666b7d112b0c558fcec14ec1d36ceae2efc0a9b Merge pull request #102 from MobiRuby/add_const
</pre>
<p>生成されたバイナリファイルを、Ash エミュレータの擬似 TFTP サーバの公開ディレクトリとした /tmp にコピーしておきます</p>
<pre>
% <span class="cmdline">cp bin/{mruby,mrbc} /tmp</span>
</pre>
<h4 id="mruby_on_qemu_ash-6D.72.75.62.79.20.E3.81.AE.E5.AE.9F.E8.A1.8C">mruby の実行</h4>
<p>tftp コマンドによって Ash エミュレータの擬似 TFTP サーバから mruby の各バイナリファイルを取得し、実行権限を付与します
(以降、Ash エミュレータ上の操作になります)。</p>
<pre>
(mruby、mrbc を取得し実行権限を付与)
# <span class="cmdline">tftp -g -r mruby 10.0.2.2</span>
# <span class="cmdline">tftp -g -r mrbc 10.0.2.2</span>
# <span class="cmdline">chmod +x mruby mrbc</span>
</pre>
<p>mruby が動作するか確認してみます。</p>
<pre>
# <span class="cmdline">./mruby -e 'p "Hello, world!"'</span>
"Hello, world!"
</pre>
<p>mrbc (コンパイラ) が動作するか確認してみます。</p>
<pre>
# <span class="cmdline">vi a.rb</span>
[1,2,3].each {|x|
 p x
}
# <span class="cmdline">./mrbc a.rb</span>
# <span class="cmdline">./mruby -b a.mrb</span>
1
2
3
</pre>
<h4 id="mruby_on_qemu_ash-E7.B5.84.E8.BE.BC.E3.81.BF.E3.82.B9.E3.82.AF.E3.83.AA.E3.83.97.E3.83.88.E3.81.AE.E7.A2.BA.E8.AA.8D">組込みスクリプトの確認</h4>
<p>例として、以下のようなソースコードを ホストPC 上で準備します(ファイル名は a.c とします)。</p>
<div class="highlight"><pre><span class="cp">#include &lt;mruby.h&gt;</span>
<span class="cp">#include &lt;mruby/proc.h&gt;</span>
<span class="cp">#include &lt;compile.h&gt;</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
<span class="p">{</span>
  <span class="kt">int</span> <span class="n">n</span><span class="p">;</span>
  <span class="n">mrb_state</span><span class="o">*</span> <span class="n">mrb</span><span class="p">;</span>
  <span class="k">struct</span> <span class="n">mrb_parser_state</span><span class="o">*</span> <span class="n">st</span><span class="p">;</span>
  <span class="kt">char</span><span class="o">*</span> <span class="n">code</span> <span class="o">=</span><span class="s">&quot;\</span>
<span class="s">[1,2,3].each {|x|</span><span class="se">\n</span><span class="s">\</span>
<span class="s">  p x</span><span class="se">\n</span><span class="s">\</span>
<span class="s">}</span><span class="se">\n</span><span class="s">\</span>
<span class="s">&quot;</span><span class="p">;</span>

  <span class="n">mrb</span> <span class="o">=</span> <span class="n">mrb_open</span><span class="p">();</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">mrb</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span>
    <span class="k">goto</span> <span class="n">out</span><span class="p">;</span>

  <span class="n">st</span> <span class="o">=</span> <span class="n">mrb_parse_string</span><span class="p">(</span><span class="n">mrb</span><span class="p">,</span> <span class="n">code</span><span class="p">);</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">st</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span>
    <span class="k">goto</span> <span class="n">out</span><span class="p">;</span>

  <span class="n">n</span> <span class="o">=</span> <span class="n">mrb_generate_code</span><span class="p">(</span><span class="n">mrb</span><span class="p">,</span> <span class="n">st</span><span class="o">-&gt;</span><span class="n">tree</span><span class="p">);</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">n</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span>
    <span class="k">goto</span> <span class="n">out</span><span class="p">;</span>

  <span class="n">mrb_pool_close</span><span class="p">(</span><span class="n">st</span><span class="o">-&gt;</span><span class="n">pool</span><span class="p">);</span>
  <span class="n">mrb_run</span><span class="p">(</span><span class="n">mrb</span><span class="p">,</span> <span class="n">mrb_proc_new</span><span class="p">(</span><span class="n">mrb</span><span class="p">,</span> <span class="n">mrb</span><span class="o">-&gt;</span><span class="n">irep</span><span class="p">[</span><span class="n">n</span><span class="p">]),</span> <span class="n">mrb_nil_value</span><span class="p">());</span>
  
<span class="nl">out:</span>
  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>

<p>上記をホスト PC 上にて、下記のコマンドラインでビルドします。</p>
<pre>
% <span class="cmdline">sh2-linux-gcc \
  -I(mruby のディレクトリ)/include \
  -I(mruby のディレクトリ)/src \
  -Wl,-elf2flt=-ra \
  a.c \
  (mruby のディレクトリ)/lib/libmruby.a \
  -lm</span>
</pre>
<p>出力された a.out を、擬似 TFTP 転送のため、/tmp のディレクトリにコピーします。</p>
<pre>
% <span class="cmdline">cp a.out /tmp</span>
</pre>
<p>Ash エミュレータが起動していない場合は、前述と同じ方法で Ash エミュレータを起動し、ログインした状態まで進めます。</p>
<p>その後、以下のようにして動作を確認できます
(以降、Ash エミュレータ上の操作になります)。</p>
<pre>
# <span class="cmdline">tftp -g -r a.out 10.0.2.2</span>
# <span class="cmdline">chmod +x a.out</span>
# <span class="cmdline">./a.out</span>
1
2
3
</pre>
<h4 id="mruby_on_qemu_ash-6D.72.75.62.79.20.E3.83.93.E3.83.AB.E3.83.89.E3.81.AE.E8.A3.9C.E8.B6.B3">mruby ビルドの補足</h4>
<p>前述の手順で mruby を make する際、コマンドラインからいくつかの変数を指定していますが、それらは各 Makefile 中で設定される変数です。
その中にはクロスコンパイラ等のツール以外の変数も含まれます。その変数と目的を以下に示します。</p>
<h5 id="mruby_on_qemu_ash-4D.52.42.43">MRBC</h5>
<p>mruby では、全体のビルドプロセスの中で、mrblib (ライブラリ) をビルドするために、予めビルドが行われる mrbc を実行します。
しかし、SH-2 をターゲットとする今回においては mrbc もクロスビルドを行うため、ホストPC 上で直接 mrbc を 実行することは出来ません。</p>
<p>そこで、<a href="http://pylone.jp/blog/qemu_ash_user_space">前回の記事</a>で紹介した、Ash エミュレータのユーザスペース・エミュレーションを利用し、
SH-2 向けにクロスビルドされた mrbc をホスト PC 上で実行できるように MRBC 変数を変更します。</p>
<p>MRBC 変数は mrblib の Makefile にて、 以下のように mrbc へのパスが設定されています。</p>
<div class="highlight"><pre><span class="c"># mruby compiler</span>
<span class="cp">ifeq ($(OS),Windows_NT)</span>
<span class="nv">MRBC</span> <span class="o">=</span> ../bin/mrbc.exe
<span class="cp">else</span>
<span class="nv">MRBC</span> <span class="o">=</span> ../bin/mrbc
<span class="cp">endif</span>
</pre></div>

<p>これを、Ash エミュレータを介して mrbc を実行するコマンドラインへと変更しています。</p>
<h4 id="mruby_on_qemu_ash-E3.81.8A.E3.82.8F.E3.82.8A.E3.81.AB">おわりに</h4>
<p>NOMMU 環境ではアプリケーションの制約が多く、MMU 環境で動作しているものを移植しようとしても、
そのままではビルドすら不可能なケースもあります。</p>
<p>しかし、現時点の mruby では、SH-2 向けにクロスビルドも可能で、簡単なスクリプト内容であれば 
エミュレータ上ではありますが、その動作することが確認できました。</p>
<p>ここまで確認することが出来たため、もう少し複雑なスクリプトや実機上で動作確認も行ってみたいですが、
長くなってしまったため、今回はここまでにしたいと思います。</p>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Tue, 15 May 2012 07:06 GMT</pubDate>
</item>
<item>
   <title>Ash エミュレータへのユーザスペース・エミュレーションの追加</title>
   <guid isPermaLink="false">qemu_ash_user_space</guid>
   <link>http://pylone.jp/blog/qemu_ash_user_space</link>
   <description><![CDATA[


<p>Ash エミュレータ(以下、QEMU-Ash) のベースとなっている QEMU には、2つのエミュレーション・モードが存在します。
簡単に説明しますと、</p>
<dl>
<dt>システム・エミュレーション</dt>
<dd>CPU と周辺デバイスを含めたシステム全体をエミュレートするモード</dd>
<dt>ユーザスペース・エミュレーション</dt>
<dd>別アーキテクチャ用にビルドしたユーザ・バイナリを起動するためのモード</dd>
<dd>Linux、BSD 等のシステムコールをエミュレート</dd>
</dl>
<p>です。</p>
<p>後者が役に立つ場面は Linux のユーザランドの構築など、手順の過程でクロス・ビルドが必要になるようなケースです。
システム・エミュレーションや実機などでセルフ・ビルドを行うより効率的です。</p>
<p>現在公開している QEMU-Ash は、システム・エミュレーションのみ可能でしたが、
Hello, World プログラムの起動が確認できる程度に、ユーザスペース・エミュレーション に対応してみました。</p>
<h4 id="qemu_ash_user_space-E3.83.A6.E3.83.BC.E3.82.B6.E3.82.B9.E3.83.9A.E3.83.BC.E3.82.B9.E3.83.BB.E3.82.A8.E3.83.9F.E3.83.A5.E3.83.AC.E3.83.BC.E3.82.BF.E3.81.AE.E3.83.93.E3.83.AB.E3.83.89">ユーザスペース・エミュレータのビルド</h4>
<p>以下に Ubuntu 11.10 での手順を示します。</p>
<pre>
(QEMU-Ash のビルドに glib2.0-dev が必要。環境に応じてインストール)
# <span class="cmdline">apt-get install libglib2.0-dev</span>
(QEMU-Ash のダウンロード、ユーザスペース・エミュレータのビルド)
% <span class="cmdline">wget http://downloads.pylone.jp/ash/src/qemu-ash-0.15.1-pylone1.tar.bz2</span>
% <span class="cmdline">wget http://pylone.jp/static/qemu_ash_user_space/qemu-ash-0.15.1-pylone1-user-space.patch</span>
% <span class="cmdline">tar xf qemu-ash-0.15.1-pylone1.tar.bz2 </span>
% <span class="cmdline">cd qemu-ash-0.15.1-pylone1</span>
% <span class="cmdline">patch -p1 &lt; ../qemu-ash-0.15.1-pylone1-user-space.patch</span>
% <span class="cmdline">./configure --target-list=sh2-linux-user</span>
% <span class="cmdline">make</span>
</pre>
<h4 id="qemu_ash_user_space-48.65.6C.6C.6F.20.57.6F.72.6C.64.20.E3.83.97.E3.83.AD.E3.82.B0.E3.83.A9.E3.83.A0.E3.81.AE.E3.83.93.E3.83.AB.E3.83.89">Hello World プログラムのビルド</h4>
<p><a href="http://pylone.jp/ash/docs/dev-app.html">アプリケーション開発ガイド</a>を参考に Hello World プログラムをビルドします。</p>
<h4 id="qemu_ash_user_space-E5.AE.9F.E8.A1.8C">実行</h4>
<p>Hello World プログラムの ELF ファイルを ユーザスペース・エミュレータ で起動します。</p>
<pre>
% <span class="cmdline">/(QEMU-Ash を展開したディレクトリ)/qemu-ash-0.15.1-pylone1/sh2-linux-user/qemu-sh2 -L /opt/pylone/ash/host/usr/sh2-linux hello.gdb </span>
Hello, World!
</pre>
<p>QEMU では ユーザスペース・エミュレータにフラットバイナリ(bFLT) のロード機能も実装されていますが、
SH2 用の bFLAT はロードに失敗しました。
(詳しい原因は未調査)</p>
<h4 id="qemu_ash_user_space-E3.81.8A.E3.82.8F.E3.82.8A.E3.81.AB">おわりに</h4>
<p>本家 QEMU のSH4 のユーザスペース・エミュレーションの実装をそのまま流用しているため完成度はまだまだ低いですが、
使い方によっては有用ではないかと思います。</p>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Tue, 08 May 2012 13:02 GMT</pubDate>
</item>
<item>
   <title>Ash 応用例 - キャラクタ LCD の利用</title>
   <guid isPermaLink="false">ash-cookbook-char-lcd</guid>
   <link>http://pylone.jp/blog/ash-cookbook-char-lcd</link>
   <description><![CDATA[


<p class=""><a href="http://www.flickr.com/photos/pylonejp/6972006974/in/photostream/lightbox/" title="flickr:写真"><img src="http://farm8.staticflickr.com/7224/6972006974_d084d49f55_z.jpg" width="640" height="427" alt="写真" /></a></p>
<p><a href="http://pylone.jp/ash/">Ash</a> にキャラクタ LCD モジュール <a href="http://akizukidenshi.com/catalog/g/gP-05693/">ACM1602NI-FLW-FBW</a> を接続し文字を出力してみたり、最終的には時刻を表示する簡易的な時計を作成してみたいと思います。</p>
<h4 id="ash-cookbook-char-lcd-E3.82.AD.E3.83.A3.E3.83.A9.E3.82.AF.E3.82.BF.20.4C.43.44.20.E3.83.A2.E3.82.B8.E3.83.A5.E3.83.BC.E3.83.AB.E3.81.AE.E6.8E.A5.E7.B6.9A">キャラクタ LCD モジュールの接続</h4>
<p>このキャラクタ LCD モジュールのインターフェイスは I2C です。
Ash には I2C バスが外部に出ていませんが、今回は GPIO ポートを利用して I2C バスを擬似的に作成（I2C_GPIO）し接続します。</p>
<p>各ピンの割り振りは以下のようにしました。</p>
<table><tr><th>Ash コネクタ:ピン番号</th><th>SH7619 ポート</th><th>Function</th></tr><tr><td>J2:3</td><td>PC08</td><td>SCL</td></tr><tr><td>J2:4</td><td>PC09</td><td>SDA</td></tr><tr><td>J2:13</td><td>-</td><td>GND</td></tr></table>
<iframe src="http://docs.google.com/viewer?url=http%3A%2F%2Fpylone.jp%2Fstatic%2Fash-cookbook-char-lcd%2Fash-char-lcd.pdf&amp;embedded=true" style="width:640px;height:530px;border:none;"></iframe>
<h4 id="ash-cookbook-char-lcd-4C.69.6E.75.78.20.E3.82.AB.E3.83.BC.E3.83.8D.E3.83.AB.E3.81.AE.E5.A4.89.E6.9B.B4">Linux カーネルの変更</h4>
<p>今回は専用のドライバを作成せず、ユーザーランドから直接 I2C デバイスを操作する方法を採ります。</p>
<p>まず、その仕組みを提供する i2c-dev という機能を有効にします。</p>
<pre>Device Drivers  ---&gt;
  &lt;*&gt; I2C support  ---&gt;
  &lt;*&gt;   I2C device interface</pre>
<p>次に、ボード初期化処理で GPIO ポートを I2C バスとして登録するパッチ <a href="http://pylone.jp/static/ash-cookbook-char-lcd/ash_ext_i2c.patch">ash_ext_i2c.patch</a> を適用します。</p>
<p>以上の変更をしたカーネルを <a href="http://pylone.jp/ash/docs/how_to_build_linux.html">ビルド</a> します。</p>
<h4 id="ash-cookbook-char-lcd-E3.83.AB.E3.83.BC.E3.83.88.E3.83.95.E3.82.A1.E3.82.A4.E3.83.AB.E3.82.B7.E3.82.B9.E3.83.86.E3.83.A0.E3.81.AE.E5.A4.89.E6.9B.B4">ルートファイルシステムの変更</h4>
<p>I2C 信号の送受信をユーザーランドから操作できる i2c-tools を buildroot から <a href="http://pylone.jp/ash/docs/how_to_use_buildroot.html">導入</a> します。</p>
<pre>Package Selection for the target  ---&gt;
  Hardware handling  ---&gt;
    [*] i2c-tools</pre>
<p>i2c-tools に含まれるコマンドはデバイスファイル /dev/i2c-&lt;BUS_ID&gt; を経由して i2c-dev とやり取りします。</p>
<h4 id="ash-cookbook-char-lcd-41.53.43.49.49.20.E6.96.87.E5.AD.97.E3.81.AE.E5.87.BA.E5.8A.9B">ASCII 文字の出力</h4>
<p>このキャラクタ LCD モジュールは英数字・記号・カタカナなど(8bit 分)のキャラクタが出力できます。詳細は製品サイトのデータシートを参照してください。</p>
<p>幸いなことに ASCII 文字部分に関しては制御文字を除いて ASCII コードと一致している為 ASCII 文字の出力に限っては変換テーブルを用意する必要はなさそうです。</p>
<p>ディスプレイの初期化手順等の説明は省きますが、例えば "a"(0x61) を出力する場合はスレーブアドレス 0x50 とデータを意味する 0x80 に続き 0x61 を I2C バス上に送信します。</p>
<p>これを i2c-tools に含まれる i2cset コマンドで実現するには以下のようにします。</p>
<pre>
# <span class="cmdline">i2cset -y 1 0x50 0x80 0x61</span>
</pre>
<p>i2cset コマンドの使い方は man を参照してください。引数の簡単な説明は以下の通りです。</p>
<ul><li>-y: インタラクティブ・モードを無効化</li><li>1: I2C バス ID</li></ul>
<h4 id="ash-cookbook-char-lcd-E6.99.82.E5.88.BB.E3.81.AE.E8.A1.A8.E7.A4.BA">時刻の表示</h4>
<p>コマンドの出力結果をキャラクタ LCD に出力するシェルスクリプト <a href="http://pylone.jp/static/ash-cookbook-char-lcd/acm1602_print.sh">acm1602_print.sh</a> を作成しました。</p>
<p class="info">Ash がサポートするのシェルは hush です。bash 等の拡張機能やビルトインコマンドの一部は使用できません。</p>
<p>date コマンドを使用すれば現在時刻をキャラクタ LCD に出力できます。</p>
<pre>
# <span class="cmdline">date '+%F (%a) %H:%M:%S' | sh acm1602_print.sh</span>
</pre>
<p>このスクリプトの仕様は以下の通りです。</p>
<ul><li>制御文字（改行コードも含む）を除く ASCII 文字が対象</li><li>32文字まで（最初の16文字が上段、次の16文字が下段に表示）</li><li>33文字目以降は出力されない</li></ul>
<p>今回は時刻表示でしたが <a href="http://pylone.jp/blog/ash-cookbook-spi-adc">Ash 応用例 - SPI に接続した A/D コンバータを制御</a> の記事で紹介した温度センサーと組み合わせて、温度を出力してみても面白いかもしれません。</p>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Wed, 09 May 2012 15:56 GMT</pubDate>
</item>
<item>
   <title>Ash 応用例 - SPI に接続した A/D コンバータを制御</title>
   <guid isPermaLink="false">ash-cookbook-spi-adc</guid>
   <link>http://pylone.jp/blog/ash-cookbook-spi-adc</link>
   <description><![CDATA[


<p class=""><a href="http://www.flickr.com/photos/pylonejp/6963076298/in/photostream/lightbox/" title="flickr:写真"><img src="http://farm8.staticflickr.com/7254/6963076298_dc641d5835_z.jpg" width="640" height="427" alt="写真" /></a></p>
<p>SPI 接続の A/D コンバータを <a href="http://pylone.jp/ash/">Ash</a> の Linux システム上で使ってみます。</p>
<p>今回、 A/D コンバータとして <a href="http://www.microchip.com/">Microchip Technology</a> 社の <a href="http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en010528">MCP3002</a> を、
アナログ入力として <a href="http://www.ti.com/">Texas Instruments</a> 社の温度センサ <a href="http://www.ti.com/product/lm60">LM60</a> を用います。</p>
<h4 id="ash-cookbook-spi-adc-41.73.68.20.E3.81.A8.E3.81.AE.E6.8E.A5.E7.B6.9A">Ash との接続</h4>
<p>以下は Ash と MCP3002 の接続図です。</p>
<iframe src="http://docs.google.com/viewer?url=http%3A%2F%2Fpylone.jp%2Fstatic%2Fash-cookbook-spi-adc%2Fash-spi-adc.pdf&amp;embedded=true" style="width:640px;height:530px;border:none;"></iframe>
<h4 id="ash-cookbook-spi-adc-E3.83.89.E3.83.A9.E3.82.A4.E3.83.90.E3.81.AE.E7.B5.84.E3.81.BF.E8.BE.BC.E3.81.BF">ドライバの組み込み</h4>
<p>Linux カーネルにパッチを適用します。以下は linux-3.2.15-pylone1-ash に対応したパッチです。</p>
<p>パッチ: <a href="http://pylone.jp/static/ash-cookbook-spi-adc/sample-spi-adc-mcp300x.patch">sample-spi-adc-mcp300x.patch</a></p>
<p class="info">MCP3001, MCP3004 及び MCP3008 にも対応する形で実装していますが、動作は未確認です。</p>
<p>カーネルコンフィギュレーションで mcp300x ドライバを有効にします (CONFIG_HWMON, CONFIG_SENSORS_MCP300X)。</p>
<pre>Device Drivers  ---&gt;
  &lt;*&gt; Hardware Monitoring support  ---&gt;
    &lt;*&gt;   Microchip MCP300X A/D converter</pre>
<p>make を実行し、作成されたカーネルイメージを Ash に書き込んでください。</p>
<h4 id="ash-cookbook-spi-adc-6D.63.70.33.30.30.78.20.E3.83.89.E3.83.A9.E3.82.A4.E3.83.90.E3.82.A4.E3.83.B3.E3.82.BF.E3.83.BC.E3.83.95.E3.82.A7.E3.83.BC.E3.82.B9">mcp300x ドライバインターフェース</h4>
<p>sysfs インターフェースで A/D コンバータの入力値を読み出すことができます。</p>
<p>以下に関連するファイルを挙げます。
単位はいずれもミリボルト (mV) です。</p>
<table><tr><th>ディレクトリ</th><th>ファイル</th><th>R/W</th><th>説明</th></tr><tr><td rowspan="4">/sys/class/hwmon/hwmon{ID}/device/</td><td>in_max</td><td>RW</td><td>最大入力値 (デフォルト: 3300)。リファレンス電圧に一致。</td></tr><tr><td>in_min</td><td>RO</td><td>最小入力値 (0 固定)</td></tr><tr><td>in0_input</td><td>RO</td><td>チャンネル 0 の入力値</td></tr><tr><td>in1_input</td><td>RO</td><td>チャンネル 1 の入力値</td></tr></table>
<p class="info">リファレンス電圧が 3.3V ではない場合は、in_max を適切な値に設定してください。</p>
<h4 id="ash-cookbook-spi-adc-4C.4D.36.30.20.E3.81.AB.E3.82.88.E3.82.8B.E6.B8.A9.E5.BA.A6.E3.81.AE.E6.B8.AC.E5.AE.9A">LM60 による温度の測定</h4>
<p>温度 T°C の時の LM60 の出力電圧は以下のようになります。</p>
<pre>Vo = (+6.25mV/°C x T°C) + 424mV</pre>
<p>例えば、チャンネル 0 に接続された LM60 からの入力値が</p>
<pre>
# <span class="cmdline">cat /sys/class/hwmon/hwmon0/device/in0_input</span>
580
</pre>
<p>の場合、温度 T°C は</p>
<pre>T = (580 - 424) / 6.25 = 約 25°C</pre>
<p>となります。</p>
<h4 id="ash-cookbook-spi-adc-73.79.73.66.73.20.E3.82.A4.E3.83.B3.E3.82.BF.E3.83.BC.E3.83.95.E3.82.A7.E3.83.BC.E3.82.B9.E3.81.AE.E3.83.81.E3.83.A3.E3.83.B3.E3.83.8D.E3.83.AB.E5.85.A5.E5.8A.9B.E5.80.A4.E3.81.AB.E9.96.A2.E3.81.99.E3.82.8B.E6.B3.A8.E6.84.8F.E7.82.B9">sysfs インターフェースのチャンネル入力値に関する注意点</h4>
<p>mcp300x ドライバにおいて、sysfs インターフェースで読み出すことができる各チャンネルの入力値は、 MCP300X の 10 ビットデジタル出力コードとリファレンス電圧を基に以下の計算で求めています。</p>
<pre>10 ビットデジタル出力コード x リファレンス電圧 (mV) / 1024</pre>
<p>例えば、リファレンス電圧 3.3V で 出力コード 0000000001b の時、入力値は約 3.2mV ですが、Linux カーネルでは浮動小数点は使えないため、
sysfs インターフェースで読み出す値は 3mV になることに注意してください。</p>
<p>また、in_max を 1024 に設定することで sysfs インターフェースで読み出す値は MCP300X のデジタル出力コードになります。</p>
<p>したがって、in_max を 1024 に設定し、アプリケーションが直接 MCP300X のデジタル出力コードを処理する (浮動小数点演算を行う) ことで、
(元のアナログ入力の精度や回路の作りにも依りますが) より正確な値が得られる場合もあると思います。</p>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Tue, 08 May 2012 07:59 GMT</pubDate>
</item>
<item>
   <title>Ash 応用例 - SPI に接続した LCD を制御</title>
   <guid isPermaLink="false">ash-cookbook-spi-lcd</guid>
   <link>http://pylone.jp/blog/ash-cookbook-spi-lcd</link>
   <description><![CDATA[


<p class=""><a href="http://www.flickr.com/photos/pylonejp/6943123104/in/photostream/lightbox/" title="flickr:写真"><img src="http://farm6.staticflickr.com/5334/6943123104_e6a6f40f9e_z.jpg" width="640" height="426" alt="写真" /></a></p>
<p><a href="http://www.aitendo.com/">aitendo</a> さんから発売されている SPI 接続の液晶モジュール「<a href="http://www.aitendo.com/product/3858">1.8インチ液晶モジュール（SPI）［M018C7735SPI］</a>」を <a href="http://pylone.jp/ash/">Ash</a> で使ってみます。</p>
<p>M018C7735SPI はコントローラーとして ST7735R が使われていますが、<a href="http://www.adafruit.com/">Adafruit</a> さんから発売されている液晶モジュール「<a href="http://www.adafruit.com/products/358">1.8" 18-bit color TFT LCD display with microSD card breakout - ST7735R</a>」は同じ ST7735R が使われており、Linux カーネル用ドライバ (以後、st7735fb ドライバと呼びます) が Matt Porter 氏によって<a href="http://elinux.org/images/1/19/Passing_Time_With_SPI_Framebuffer_Driver.pdf">開発</a>されています。</p>
<h4 id="ash-cookbook-spi-lcd-41.73.68.20.E3.81.A7.E3.81.AE.E5.88.B6.E7.B4.84">Ash での制約</h4>
<p>今回、st7735fb ドライバを流用しますが、Ash として以下の大きな制約があります。</p>
<ul><li>アプリケーションは fsync を実行する必要がある</li></ul>
<p>st7735fb ドライバは <a href="http://kernel.org/doc/Documentation/fb/deferred_io.txt">Deferred IO</a> を使っています。Deferred IO は MMU のページフォルトを利用しているため、Ash の非 MMU 環境では期待した動作をしません。
具体的にはアプリケーションが描画処理を行っても、ドライバ内の仮想画面が更新されるだけで、実際の画面には反映されません。</p>
<p>但し、幸いにも Deferred IO が fsync をサポートしているため、アプリケーションが fsync を実行することで、仮想画面を実際の画面に反映させることができます。
逆に言えば fsync を実行しなくてはいけないため、既存のフレームバッファを使用したアプリケーションを使う場合はソースコードを修正する必要があります。</p>
<p>このような制約はありますが、ちょっとした表示を行いたい場合には役に立つでしょう。</p>
<h4 id="ash-cookbook-spi-lcd-41.73.68.20.E3.81.A8.E3.81.AE.E6.8E.A5.E7.B6.9A">Ash との接続</h4>
<p>以下は Ash と M018C7735SPI の接続図です。</p>
<iframe src="http://docs.google.com/viewer?url=http%3A%2F%2Fpylone.jp%2Fstatic%2Fash-cookbook-spi-lcd%2Fash-spi-lcd.pdf&amp;embedded=true" style="width:640px;height:530px;border:none;"></iframe>
<p>なお、M018C7735SPI は 3V 単一電源ですが、今回は Ash の 3.3V 外部出力をそのまま用いています。とりあえず動作していますが、弊社で保証するものではありません。</p>
<h4 id="ash-cookbook-spi-lcd-73.74.37.37.33.35.66.62.20.E3.83.89.E3.83.A9.E3.82.A4.E3.83.90.E3.81.AE.E7.B5.84.E3.81.BF.E8.BE.BC.E3.81.BF">st7735fb ドライバの組み込み</h4>
<p>Linux カーネルにパッチを適用します。以下は linux-3.2.15-pylone1-ash に対応したパッチです。</p>
<p>パッチ: <a href="http://pylone.jp/static/ash-cookbook-spi-lcd/sample-spi-lcd.patch">sample-spi-lcd.patch</a></p>
<p>カーネルコンフィギュレーションで st7735fb ドライバを有効にします (CONFIG_FB, CONFIG_FB_ST7735)。</p>
<pre>Device Drivers  ---&gt;
  Graphics support  ---&gt;
    &lt;*&gt; Support for frame buffer devices  ---&gt;
      &lt;*&gt;   ST7735 framebuffer support</pre>
<p>make を実行し、作成されたカーネルイメージを Ash に書き込んでください。</p>
<h4 id="ash-cookbook-spi-lcd-E3.82.B5.E3.83.B3.E3.83.97.E3.83.AB.E3.82.A2.E3.83.97.E3.83.AA.E3.82.B1.E3.83.BC.E3.82.B7.E3.83.A7.E3.83.B3">サンプルアプリケーション</h4>
<p>今回、サンプルアプリケーションとして fbv (FrameBuffer Viewer) を使います。fbv は BMP, JPEG, PNG 及び GIF 形式の画像を表示することができる画像ビューワーです。</p>
<h5 id="ash-cookbook-spi-lcd-66.62.76.20.E3.81.AE.E7.B5.84.E3.81.BF.E8.BE.BC.E3.81.BF">fbv の組み込み</h5>
<p>fbv は Buildroot にパッケージとして含まれていますので、fbv を組み込んだ rootfs を作成することにします (Buildroot を使うことで、libjpeg 等の必要なライブラリも自動的に組み込まれます)。</p>
<p>先に述べたように、fbv のソースコードを修正する必要があります。以下は buildroot-2012.02-pylone3-ash に含まれる fbv に対応したパッチです。</p>
<p>パッチ: <a href="http://pylone.jp/static/ash-cookbook-spi-lcd/fbv-1.0b-ash.patch">fbv-1.0b-ash.patch</a></p>
<p>Buildroot ではパッチを所定のディレクトリに置くことで自動的にパッチを適用する仕組みがあります。
fbv の場合は buildroot-2012.02-pylone3-ash/package/fbv/ にパッチを置いてください。</p>
<p>Buildroot のコンフィギュレーションで fbv を選択します (BR2_PACKAGE_FBV)。</p>
<pre>Package Selection for the target  ---&gt;
  Graphic libraries and applications (graphic/text)  ---&gt;
    [*] fbv</pre>
<p>make を実行し、作成された rootfs イメージを Ash に書き込んでください。</p>
<h5 id="ash-cookbook-spi-lcd-66.62.76.20.E3.81.AE.E5.AE.9F.E8.A1.8C">fbv の実行</h5>
<p>パッチを適用した Linux カーネルと fbv を組み込んだ rootfs を書き込んだ Ash を起動し、
コンソールから画像ファイルを指定して fbv コマンドを実行してください。</p>
<pre>
# <span class="cmdline">fbv /PATH/TO/IMAGE.FILE</span> 
</pre>
<p>fbv は画像のパンやリサイズといった機能もあります。詳しくは fbv のヘルプを参照してください。</p>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Sun, 06 May 2012 11:33 GMT</pubDate>
</item>
<item>
   <title>Ash 応用例 - SD カードの利用</title>
   <guid isPermaLink="false">ash-cookbook-sdcard</guid>
   <link>http://pylone.jp/blog/ash-cookbook-sdcard</link>
   <description><![CDATA[


<p class=""><a href="http://www.flickr.com/photos/pylonejp/6946522280/in/photostream/lightbox/" title="flickr:写真"><img src="http://farm6.staticflickr.com/5192/6946522280_1dcc67e09c_z.jpg" width="640" height="426" alt="写真" /></a></p>
<p><a href="http://pylone.jp/ash/">Ash</a> に microSD カード・スロットを接続し microSD カードを利用してみます。</p>
<h4 id="ash-cookbook-sdcard-6D.69.63.72.6F.53.44.20.E3.82.AB.E3.83.BC.E3.83.89.E3.83.BB.E3.82.B9.E3.83.AD.E3.83.83.E3.83.88.E3.81.AE.E6.8E.A5.E7.B6.9A">microSD カード・スロットの接続</h4>
<p>Ash の SPI バスにカードスロットを接続します（SPI モード）。</p>
<table><tr><th>Ash コネクタ:ピン番号</th><th>SH7619 ポート</th><th>SPI Function</th></tr><tr><td>J1:6</td><td>PE00</td><td>SCK</td></tr><tr><td>J1:7</td><td>PE06</td><td>SS0</td></tr><tr><td>J1:8</td><td>PE04</td><td>MOSI</td></tr><tr><td>J1:9</td><td>PE02</td><td>MISO</td></tr><tr><td>J1:10</td><td>-</td><td>GND</td></tr></table>
<iframe src="http://docs.google.com/viewer?url=http%3A%2F%2Fpylone.jp%2Fstatic%2Fash-cookbook-sdcard%2Fash-sd.pdf&amp;embedded=true" style="width:640px;height:530px;border:none;"></iframe>
<h4 id="ash-cookbook-sdcard-4C.69.6E.75.78.20.E3.82.AB.E3.83.BC.E3.83.8D.E3.83.AB.E3.81.AE.E5.A4.89.E6.9B.B4">Linux カーネルの変更</h4>
<p>MMC_SPI 関連のオプションを有効にします。</p>
<pre>Device Drivers  ---&gt;
  &lt;*&gt; MMC/SD/SDIO card support  ---&gt;
  &lt;*&gt;   MMC block device driver (NEW)
  (8)     Number of minors per block device (NEW)
  [*]     Use bounce buffer for simple hosts (NEW)
  &lt;*&gt;   MMC/SD/SDIO over SPI</pre>
<p>VFAT 関連のオプションを有効にします。</p>
<pre>File systems  ---&gt;
  DOS/FAT/NT Filesystems  ---&gt;
    &lt; &gt; MSDOS fs support
    &lt;*&gt; VFAT (Windows-95) fs support
    (437) Default codepage for FAT
    (iso8859-1) Default iocharset for FAT
    &lt; &gt; NTFS file system support
  Native language support  ---&gt;
    (iso8859-1) Default NLS Option
    &lt;*&gt;   Codepage 437 (United States, Canada)
    ....
    &lt;*&gt;   NLS ISO 8859-1  (Latin 1; Western European Languages)
    ....</pre>
<p>ボード初期化処理で SPI デバイスを登録するパッチ <a href="http://pylone.jp/static/ash-cookbook-sdcard/ash_mmc_spi.patch">ash_mmc_spi.patch</a> を適用します。</p>
<p>以上の変更をしたカーネルを<a href="http://pylone.jp/ash/docs/how_to_build_linux.html">ビルド</a>します。</p>
<h4 id="ash-cookbook-sdcard-6D.69.63.72.6F.53.44.20.E3.82.AB.E3.83.BC.E3.83.89.E3.82.92.E3.83.9E.E3.82.A6.E3.83.B3.E3.83.88">microSD カードをマウント</h4>
<p>上記の変更したカーネルで起動して、
microSD カードを挿入するとシリアル・コンソールに以下のようなメッセージが出力されます。</p>
<pre>mmc0: host does not support reading read-only switch. assuming write-enable.
mmc0: new SD card on SPI
mmcblk0: mmc0:0000 00000 1.86 GiB
 mmcblk0: p1</pre>
<p>この状態で以下のコマンドを実行しマウントします。</p>
<pre>
# <span class="cmdline">mount /dev/mmcblk0p1 /mnt</span>
</pre>
<p>df コマンドで使用状況を確認してみます。</p>
<pre>
# <span class="cmdline">df</span>
Filesystem           1K-blocks      Used Available Use% Mounted on
ubi0_0                    9952      1848      8104  19% /
/dev/mmcblk0p1         1954496    103840   1850656   5% /mnt
</pre>
<p>以下のコマンドでアンマウントします。</p>
<pre>
# <span class="cmdline">umount /mnt</span>
</pre>
<p>microSD カードを抜くと以下のメッセージがシリアル・コンソールに出力されます。</p>
<pre>mmc0: SPI card removed</pre>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Wed, 09 May 2012 15:56 GMT</pubDate>
</item>
<item>
   <title>Ash 応用例 - シェルスクリプトで XML をパース</title>
   <guid isPermaLink="false">ash-cookbook-parse-xml-in-shell-script</guid>
   <link>http://pylone.jp/blog/ash-cookbook-parse-xml-in-shell-script</link>
   <description><![CDATA[


<p><a href="http://pylone.jp/ash/">Ash</a> で XML をパースする方法のひとつとして、libxml2 に含まれる xmllint コマンドを使う方法を紹介します。シェルスクリプトで済ませられるので、ちょっとしたプロトタイピングなど手間をかけたくない場合に役立つのではないでしょうか。</p>
<p>パース対象の XML として、<a href="http://weather.livedoor.com/weather_hacks/">Weather Hacks</a> の「お天気 Web サービス」で配信されている XML データを使用します。</p>
<p>Ash 固有の機能やハードウェアなどには依存しないので、まずは開発ホストで試してみるのがいいでしょう。</p>
<h4 id="ash-cookbook-parse-xml-in-shell-script-57.65.61.74.68.65.72.20.48.61.63.6B.73.20.E3.81.AE.20.58.4D.4C.20.E3.82.92.E5.8F.96.E5.BE.97.E3.81.99.E3.82.8B">Weather Hacks の XML を取得する</h4>
<p><a href="http://weather.livedoor.com/weather_hacks/webservice.html">お天気 Web サービスの仕様</a> に従って XML データを取得します。</p>
<p>「東京の明日」であれば、リクエスト URL は</p>
<pre>http://weather.livedoor.com/forecast/webservice/rest/v1?city=63&amp;day=tomorrow</pre>
<p>となります。city=63 が「東京」、day=tomorrow が「明日」を指定するパラメータです。詳しくは <a href="http://weather.livedoor.com/weather_hacks/webservice.html">お天気 Web サービスの仕様</a>を参照してください。</p>
<p>リクエストして取得した XML データを weather-tokyo-tomorrow.xml に保存するとしたら以下のようにすればよいでしょう。</p>
<pre>
$ <span class="cmdline">wget -q -O - "http://weather.livedoor.com/forecast/webservice/rest/v1?city=63&amp;day=tomorrow" &gt; weather-tokyo-tomorrow.xml</span>
</pre>
<h4 id="ash-cookbook-parse-xml-in-shell-script-78.6D.6C.6C.69.6E.74.20.E3.81.A7.E3.83.91.E3.83.BC.E3.82.B9">xmllint でパース</h4>
<p>取得した XML データ weather-tokyo-tomorrow.xml の内容は</p>
<div class="highlight"><pre><span class="nt">&lt;lwws</span> <span class="na">version=</span><span class="s">&quot;livedoor Weather Web Service 1.0&quot;</span><span class="nt">&gt;</span>
    <span class="nt">&lt;author&gt;</span>livedoor Weather Team.<span class="nt">&lt;/author&gt;</span>
    <span class="nt">&lt;location</span> <span class="na">area=</span><span class="s">&quot;関東&quot;</span> <span class="na">pref=</span><span class="s">&quot;東京都&quot;</span> <span class="na">city=</span><span class="s">&quot;東京&quot;</span> <span class="nt">/&gt;</span>
    ...
    <span class="nt">&lt;telop&gt;</span>曇時々晴<span class="nt">&lt;/telop&gt;</span>
    ...
<span class="nt">&lt;/lwws&gt;</span>
</pre></div>

<p>のようになっているはずです。</p>
<p>これを xmllint でパースし、&lt;telop/&gt; のテキストノードを取得してみます。</p>
<p>--shell オプションによりxmllint を対話型モードで実行すると、xmllint 組込みシェルコマンドの入力待ち状態となります。</p>
<pre>
$ <span class="cmdline">xmllint --shell weather-tokyo-tomorrow.xml</span>
/ &gt;
</pre>
<p>xmllint のシェルコマンドには色々ありますが、ここでは cat を使って &lt;telop/&gt; のテキストノードを表示してみます。</p>
<p>cat は対象を XPath で指定できます。欲しいのは &lt;telop/&gt; のテキストノードです。
XPath で表すと /lwws/telop/text() になりますので、cat の実行は以下のようになります。</p>
<pre>
/ &gt; <span class="cmdline">cat /lwws/telop/text()</span>
 -------
曇時々晴
/ &gt;
</pre>
<p>シェルのコマンドは標準入力から流し込むこともできます。</p>
<pre>
$ <span class="cmdline">echo "cat /lwws/telop/text()" | xmllint --shell weather-tokyo-tomorrow.xml</span>
/ &gt; cat /lwws/telop/text()
 -------
曇時々晴
/ &gt;
</pre>
<p>プロンプトなど不要な行を除いて「曇時々晴」だけを取り出してみます。</p>
<pre>
$ <span class="cmdline">echo "cat /lwws/telop/text()" | xmllint --shell weather-tokyo-tomorrow.xml | tail -2 | head -1</span>
曇時々晴
</pre>
<h4 id="ash-cookbook-parse-xml-in-shell-script-E3.82.B7.E3.82.A7.E3.83.AB.E3.82.B9.E3.82.AF.E3.83.AA.E3.83.97.E3.83.88.E3.81.AB.E3.81.99.E3.82.8B">シェルスクリプトにする</h4>
<p>XML を取得する処理とパースする処理を組み合わせてシェルスクリプト weather-tokyo-tomorrow.sh を作成します。</p>
<div class="highlight"><pre><span class="c">#!/bin/sh</span>
<span class="c"># weather-tokyo-tomorrow.sh - 天気予報（東京の明日）を表示する</span>
wget -q -O - <span class="s2">&quot;http://weather.livedoor.com/forecast/webservice/rest/v1?city=63&amp;day=tomorrow&quot;</span> &gt; weather-tokyo-tomorrow.xml
<span class="nb">echo</span> <span class="s2">&quot;cat /lwws/telop/text()&quot;</span> | xmllint --shell weather-tokyo-tomorrow.xml | tail -2 | head -1
</pre></div>

<h4 id="ash-cookbook-parse-xml-in-shell-script-41.73.68.20.E3.81.A7.E3.82.B7.E3.82.A7.E3.83.AB.E3.82.B9.E3.82.AF.E3.83.AA.E3.83.97.E3.83.88.E3.82.92.E5.AE.9F.E8.A1.8C">Ash でシェルスクリプトを実行</h4>
<p>Ash 向けに xmllint を含んだルートファイルシステムを buildroot で構築します。</p>
<p>buildroot の menuconfig で libxml2 を追加したルートファイルシステムを作ります。</p>
<pre>
$ <span class="cmdline">cd (buildroot のディレクトリ)</span>
$ <span class="cmdline">make menuconfig</span>
Package Selection for the target  --->
  Libraries  --->
    JSON/XML  --->
      [*] libxml2
$ <span class="cmdline">make</span>
</pre>
<p>作成したルートファイルシステムで起動した Ash に、シェルスクリプト weather-tokyo-tomorrow.sh を転送し実行します。</p>
<pre>
# <span class="cmdline">./weather-tokyo-tomorrow.sh</span>
曇時々晴
</pre>
<h4 id="ash-cookbook-parse-xml-in-shell-script-E3.83.AA.E3.83.B3.E3.82.AF">リンク</h4>
<ul><li><a href="http://xmlsoft.org/">The XML C parser and toolkit of Gnome</a></li><li><a href="http://xmlsoft.org/xmllint.html">xmllint</a></li></ul>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Thu, 19 Apr 2012 05:44 GMT</pubDate>
</item>
<item>
   <title>Ash 応用例 - HTTP で GPIO を制御</title>
   <guid isPermaLink="false">ash-cookbook-libmicrohttpd</guid>
   <link>http://pylone.jp/blog/ash-cookbook-libmicrohttpd</link>
   <description><![CDATA[


<p class=""><a href="http://www.flickr.com/photos/pylonejp/6926442366/in/photostream/lightbox/" title="flickr:写真"><img src="http://farm8.staticflickr.com/7258/6926442366_4c200e8e3d_z.jpg" width="640" height="426" alt="写真" /></a></p>
<p>外部から HTTP で GPIO を制御する簡単な HTTP サーバを <a href="http://pylone.jp/ash/">Ash</a> で動かしてみます。
HTTP サーバの実装には <a href="http://www.gnu.org/software/libmicrohttpd/">libmicrohttpd</a> を使用します。</p>
<p>写真は GPIO に LED をつなげて Web ブラウザからの制御を確認しているところです。</p>
<h4 id="ash-cookbook-libmicrohttpd-6C.69.62.6D.69.63.72.6F.68.74.74.70.64.20.E3.82.92.E4.BD.BF.E3.81.A3.E3.81.A6.E3.81.BF.E3.82.8B">libmicrohttpd を使ってみる</h4>
<p>GPIO を制御する前に <a href="http://www.gnu.org/software/libmicrohttpd/tutorial.html"> A tutorial for GNU libmicrohttpd</a> の <a href="http://www.gnu.org/software/libmicrohttpd/tutorial.html#Hello-browser-example">Hello browser example</a> を Ash で動かしてみます。</p>
<p>ソースコード: <a href="http://pylone.jp/static/ash-cookbook-libmicrohttpd/hellobrowser.c">hellobrowser.c</a></p>
<p>まず、buildroot で libmicrohttpd をビルドします。</p>
<pre>Package Selection for the target  ---&gt;
  Libraries  ---&gt;
    Networking  ---&gt;
      [*] libmicrohttpd
      [ ]   https support (NEW)</pre>
<p><a href="http://pylone.jp/static/ash-cookbook-libmicrohttpd/hellobrowser.c">hellobrowser.c</a> をダウンロードして Ash 向けにクロスコンパイルします。</p>
<pre>
(ダウンロード)
$ <span class="cmdline">wget http://pylone.jp/static/ash-cookbook-libmicrohttpd/hellobrowser.c</span>
(クロスコンパイル)
$ <span class="cmdline">sh2-linux-gcc \
  -Wl,-elf2flt=-ra \
  -I(buildroot のパス)/output/staging/usr/include \
  -L(buildroot のパス)/output/staging/usr/lib/ \
  hellobrowser.c -o hellobrowser \
  -lmicrohttpd -lpthread</span>
</pre>
<p>実行ファイル hellobrowser を Ash に転送し、Ash 上で実行します。</p>
<pre>
# <span class="cmdline">./hellobrowser</span>
</pre>
<p>外部から Web ブラウザで http://(Ash の IP アドレス):8888/ を開きます。</p>
<p>ブラウザに Hello, browser! と表示される筈です。</p>
<h4 id="ash-cookbook-libmicrohttpd-48.54.54.50.20.E3.81.A7.20.47.50.49.4F.20.E3.82.92.E5.88.B6.E5.BE.A1">HTTP で GPIO を制御</h4>
<p>hellobrowser.c に GPIO を制御する処理を追加してみます。</p>
<p>ソースコード: <a href="http://pylone.jp/static/ash-cookbook-libmicrohttpd/gpio.c">gpio.c</a></p>
<p>動作としては、</p>
<ul><li>http://(Ash の IP アドレス):8888/on を開くと GPIO (J2-3) が H</li><li>http://(Ash の IP アドレス):8888/off を開くと GPIO (J2-3) が L</li></ul>
<p>という単純なものです。</p>
<p>GPIO を制御するには <a href="http://pylone.jp/blog/ash-cookbook-gpio-led">Ash 応用例 - GPIO に接続した LED を制御</a> 
で紹介した
<a href="http://pylone.jp/blog/ash-cookbook-gpio-led#ash-cookbook-gpio-led-E6.96.B9.E6.B3.95.20.31.3A.20.73.79.73.66.73.20.E3.82.A4.E3.83.B3.E3.82.BF.E3.83.BC.E3.83.95.E3.82.A7.E3.83.BC.E3.82.B9.E3.81.A7.47.50.49.4F.E3.82.92.E5.88.B6.E5.BE.A1">方法 1: sysfs インターフェースでGPIOを制御</a>
を使いますので、CONFIG_GPIO_SYSFS を有効にしたカーネルを用意します。</p>
<pre>Device Drivers  ---&gt;
  [*] GPIO Support  ---&gt;
    [*]   /sys/class/gpio/... (sysfs interface)</pre>
<p><a href="http://pylone.jp/static/ash-cookbook-libmicrohttpd/gpio.c">gpio.c</a> をダウンロードして Ash 向けにクロスコンパイルします。</p>
<pre>
(ダウンロード)
$ <span class="cmdline">wget http://pylone.jp/static/ash-cookbook-libmicrohttpd/gpio.c</span>
(クロスコンパイル)
$ <span class="cmdline">sh2-linux-gcc \
  -Wl,-elf2flt=-ra \
  -I(buildroot のパス)/output/staging/usr/include \
  -L(buildroot のパス)/output/staging/usr/lib/ \
  gpio.c -o gpio \
  -lmicrohttpd -lpthread</span>
</pre>
<p>CONFIG_GPIO_SYSFS を有効にしたカーネルで動作する Ash に実行ファイル gpio を転送し、GPIO の設定を行ってから実行します。</p>
<pre>
# <span class="cmdline">echo 36 &gt; /sys/class/gpio/export</span> (J2-3 を GPIO として有効にする)
# <span class="cmdline">echo out &gt; /sys/class/gpio/gpio36/direction</span> (出力設定)
# <span class="cmdline">./gpio</span>
</pre>
<p>Web ブラウザで http://(Ash の IP アドレス):8888/on または http://(Ash の IP アドレス):8888/off を開くと GPIO が制御できる筈です。</p>
<h4 id="ash-cookbook-libmicrohttpd-E3.83.AA.E3.83.B3.E3.82.AF">リンク</h4>
<ul><li><a href="http://www.gnu.org/software/libmicrohttpd/tutorial.html">A tutorial for GNU libmicrohttpd</a></li></ul>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Wed, 18 Apr 2012 05:10 GMT</pubDate>
</item>
<item>
   <title>Ash 応用例 - GPIO に接続した LED を制御</title>
   <guid isPermaLink="false">ash-cookbook-gpio-led</guid>
   <link>http://pylone.jp/blog/ash-cookbook-gpio-led</link>
   <description><![CDATA[


<p class=""><a href="http://www.flickr.com/photos/pylonejp/7082546339/in/photostream/lightbox/" title="flickr:写真"><img src="http://farm6.staticflickr.com/5443/7082546339_86b5bcdcf9_z.jpg" width="640" height="426" alt="写真" /></a></p>
<p><a href="http://pylone.jp/ash/">Ash</a> の GPIO に LED を接続して、Linux システムのユーザー空間から制御してみます。</p>
<p>ここでは2つの方法を紹介します。</p>
<ol><li>Linux カーネルにはユーザー空間から sysfs インターフェースで GPIO を制御するための機能があり、それを利用する方法</li><li>Linux カーネルには GPIO 接続の LED を制御するためのドライバ（leds-gpio）があり、それを利用する方法</li></ol>
<h4 id="ash-cookbook-gpio-led-E6.96.B9.E6.B3.95.20.31.3A.20.73.79.73.66.73.20.E3.82.A4.E3.83.B3.E3.82.BF.E3.83.BC.E3.83.95.E3.82.A7.E3.83.BC.E3.82.B9.E3.81.A7.47.50.49.4F.E3.82.92.E5.88.B6.E5.BE.A1">方法 1: sysfs インターフェースでGPIOを制御</h4>
<p>Ash の Linux カーネルのデフォルトコンフィギュレーションでは機能が無効になっているため、有効にする必要があります（CONFIG_GPIO_SYSFS）。</p>
<pre>Device Drivers  ---&gt;
  [*] GPIO Support  ---&gt;
    [*]   /sys/class/gpio/... (sysfs interface)</pre>
<p>機能を有効にしたカーネルを起動して、制御したい GPIO 番号を /sys/class/gpio/export に書き込みます。</p>
<p>ここで GPIO 番号は Linux カーネルで定義された値で、Ash では以下のようになります。</p>
<table><tr><th>Ash コネクタ-ピン番号</th><th>SH7619 ポート</th><th>Ash Linux カーネル内定義</th><th>値 (GPIO 番号)</th></tr><tr><td>J2-3</td><td>PC08</td><td>GPIO_PC08</td><td>36</td></tr><tr><td>J2-4</td><td>PC09</td><td>GPIO_PC09</td><td>35</td></tr><tr><td>J2-5</td><td>PC10</td><td>GPIO_PC10</td><td>34</td></tr><tr><td>J2-6</td><td>PC11</td><td>GPIO_PC11</td><td>33</td></tr><tr><td>J2-7</td><td>PC12</td><td>GPIO_PC12</td><td>32</td></tr><tr><td>J2-8</td><td>PC13</td><td>GPIO_PC13</td><td>31</td></tr><tr><td>J2-9</td><td>PC14</td><td>GPIO_PC14</td><td>30</td></tr><tr><td>J2-10</td><td>PC15</td><td>GPIO_PC15</td><td>29</td></tr></table>
<p>次に入出力方向を設定します。/sys/class/gpio/gpio{GPIO番号}/direction に "in" または "out" を書き込みます。
/sys/class/gpio/gpio{GPIO番号}/value に 0 もしくは非 0 を書き込むことで、それぞれ low、high を出力します。それによって LED が消灯、点灯します。</p>
<p>例えば、J2-3 の場合、</p>
<pre>
# <span class="cmdline">echo 36 &gt; /sys/class/gpio/export</span> (J2-3をGPIOとして有効にする)
# <span class="cmdline">echo out &gt; /sys/class/gpio/gpio36/direction</span> (出力設定)
# <span class="cmdline">echo 1 &gt; /sys/class/gpio/gpio36/value</span> (点灯)
# <span class="cmdline">echo 0 &gt; /sys/class/gpio/gpio36/value</span> (消灯)
</pre>
<p>となります。</p>
<h4 id="ash-cookbook-gpio-led-E6.96.B9.E6.B3.95.32.3A.20.6C.65.64.73.2D.67.70.69.6F.20.E3.83.89.E3.83.A9.E3.82.A4.E3.83.90">方法2: leds-gpio ドライバ</h4>
<p>Ash の Linux カーネルのデフォルトコンフィギュレーションではドライバは無効になっているため、有効にする必要があります（CONFIG_NEW_LEDS, CONFIG_LEDS_CLASS, CONFIG_LEDS_GPIO）。</p>
<pre>Device Drivers  ---&gt;
  [*] LED Support  ---&gt;
    --- LED Support
    [*]   LED Class Support
    ...
    &lt;*&gt;   LED Support for GPIO connected LEDs</pre>
<p>また、ドライバに対応したデバイスを登録する必要があります。そのためにソースコードの修正が必要です。
以下のパッチは修正例です。各 LED の名前は区別できれば何でも構いません。</p>
<p>パッチ: <a href="http://pylone.jp/static/ash-cookbook-gpio-led/sample-gpio-led.patch">sample-gpio-led.patch</a></p>
<p>ドライバを有効にし、デバイスの登録を行うようにしたカーネルを起動します。
/sys/class/leds/{名前}/brightness に 0 以上の値を書き込むことでLEDの制御ができます。0 は消灯、それ以外は点灯です。</p>
<p>例えば、J2-3に接続された LED の場合（LED の名前はパッチを適用したものを仮定しています)、</p>
<pre>
# <span class="cmdline">echo 1 &gt; /sys/class/leds/J2-3/brightness</span> (点灯)
# <span class="cmdline">echo 0 &gt; /sys/class/leds/J2-3/brightness</span> (消灯)
</pre>
<p>カーネル空間で GPIO 接続の LED を扱いたい場合にも、leds-gpio ドライバ（及び LED トリガー）を用いることで柔軟な制御ができます。</p>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Mon, 16 Apr 2012 03:00 GMT</pubDate>
</item>
<item>
   <title>TOPPERS/ASPカーネル for Ash</title>
   <guid isPermaLink="false">toppers_asp_ash</guid>
   <link>http://pylone.jp/blog/toppers_asp_ash</link>
   <description><![CDATA[


<p>すでに公開されております、SH-2 搭載 Linux 対応小型 CPU ボード <a href="http://pylone.jp/ash">Ash</a> 向け TOPPERS/ASP カーネルついてのお知らせです。</p>
<p>Ash 向け TOPPERS/ASP の詳しい使い方については下記のドキュメントを参照してください。
また先日お知らせいたしました Ash エミュレータ上でも起動を確認することが出来ます。</p>
<p>尚、本ソフトウェアは株式会社パイロンが独自に配布する非公式なバージョンです。</p>
<h4 id="toppers_asp_ash-E3.83.89.E3.82.AD.E3.83.A5.E3.83.A1.E3.83.B3.E3.83.88">ドキュメント</h4>
<ul><li><a href="http://pylone.jp/ash/docs/toppers-asp-manual.html">TOPPERS/ASP カーネル for Ash マニュアル</a></li><li><a href="http://pylone.jp/ash/docs/qemu-ash-manual.html">Ash エミュレータマニュアル</a></li></ul>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Wed, 28 Mar 2012 00:53 GMT</pubDate>
</item>
<item>
   <title>Interface 5月号への寄稿について</title>
   <guid isPermaLink="false">interface_201205</guid>
   <link>http://pylone.jp/blog/interface_201205</link>
   <description><![CDATA[


<p>先日発売されました、<a href="http://www.cqpub.co.jp/">CQ 出版社</a> <a href="http://interface.cqpub.co.jp/">Interface</a> 2012年5月号に寄稿させていただきました。</p>

<div class="amz clearfix">
<div class="amz-l">
<a href="http://amazon.jp/o/ASIN/B007HA8YI6/pylone-22">
<img src="http://images-jp.amazon.com/images/P/B007HA8YI6.09._SX180_SCLZZZZZZZ_.jpg" width="180" alt="表示画像"/>
</a>
</div>
<div class="amz-r">
<span class="amz-title"><a href="http://amazon.jp/o/ASIN/B007HA8YI6/pylone-22">Interface (インターフェース) 2012年 05月号 [雑誌]</a></span><br/>
<span class="amz-price-label">価格:</span><span class="amz-price">￥980</span><br/>
<span class="amz-icon"><a href="http://amazon.jp/o/ASIN/B007HA8YI6/pylone-22"><img src="http://pylone.jp/i/icons/amz.gif" alt="Amazon.co.jp で詳細を見る" width="109" height="28"/></a></span>
</div>
</div>

<p>特集内容はシミュレータやエミュレータを使用した実機を伴わない組込み開発についてで、
今回は 「SH-2エミュレータでLinuxとTOPPERSを起動しよう」と題し、Ash エミュレータの使い方についての記事を執筆しました。</p>
<p>今月号では他にも QEMU の概要から詳しい使い方、さらには内部構造についても触れており、
組込み開発向けに QEMU を色濃く取り上げた内容となっています。</p>
<p>尚、記事内容の補足については本エントリに順次追記していきます。</p>
<h4 id="interface_201205-E8.A8.98.E4.BA.8B.E5.86.85.E5.AE.B9.E3.81.AE.E8.A3.9C.E8.B6.B3">記事内容の補足</h4>
<h5 id="interface_201205-45.58.54.34.20.E4.B8.8A.E3.81.A7.E5.8B.95.E4.BD.9C.E3.81.8C.E9.81.85.E3.81.84">EXT4 上で動作が遅い</h5>
<p>EXT4 ファイルシステムを利用したLinux ホスト環境下で、記事の手順にて QEMU-Ash を起動すると、ゲストソフトウェアによっては QEMU-Ash の動作が極端に遅くなる場合があります。
詳細な原因と解決方法は下記のリンク先を参照してください。</p>
<ul><li><a href="http://pylone.jp/ash/docs/qemu-ash-manual.html#g1-45.58.54.34.20.E4.B8.8A.E3.81.A7.E5.8B.95.E4.BD.9C.E3.81.8C.E9.81.85.E3.81.84">Ash エミュレータマニュアル: EXT4 上で動作が遅い</a></li></ul>
<h4 id="interface_201205-E9.96.A2.E9.80.A3.E3.83.9A.E3.83.BC.E3.82.B8">関連ページ</h4>
<ul><li><a href="http://pylone.jp/ash/docs/qemu-ash-manual.html">Ash エミュレータマニュアル</a></li><li><a href="http://pylone.jp/blog/tags/qemu+ash">Ashエミュレータに関するブログ記事</a></li></ul>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Tue, 27 Mar 2012 13:20 GMT</pubDate>
</item>
<item>
   <title>Ash エミュレータ</title>
   <guid isPermaLink="false">qemu_ash_0.15.1_pylone1</guid>
   <link>http://pylone.jp/blog/qemu_ash_0.15.1_pylone1</link>
   <description><![CDATA[


<p>すでに公開されております、Ash エミュレータについてのお知らせです。</p>
<p>Ash エミュレータとは、先日発売しました SH-2 搭載 Linux 対応小型 CPU ボード <a href="http://pylone.jp/ash/">Ash</a> のエミュレータで、
Ash 用にパイロンが公開した各種ソフトウェアの起動の確認を PC 上で行って頂く事を主な目的としています。</p>
<p>Ash エミュレータの詳しい使い方については下記のドキュメントを参照してください。</p>
<h4 id="qemu_ash_0.15.1_pylone1-E3.83.89.E3.82.AD.E3.83.A5.E3.83.A1.E3.83.B3.E3.83.88">ドキュメント</h4>
<ul><li><a href="http://pylone.jp/ash/docs/qemu-ash-manual.html">Ash エミュレータマニュアル</a></li></ul>
<h4 id="qemu_ash_0.15.1_pylone1-E3.83.80.E3.82.A6.E3.83.B3.E3.83.AD.E3.83.BC.E3.83.89">ダウンロード</h4>
<table class="downloads"><tr class="title"><td colspan="4">Ash エミュレータ</td></tr><tr class="odd"><td>qemu-ash-0.15.1-pylone1.tar.bz2<br /><span class="desc">Linux ホスト環境用ソースコード</span></td><td>0.15.1-pylone1</td><td class="dl"><a href="http://downloads.pylone.jp/ash/src/qemu-ash-0.15.1-pylone1.tar.bz2">ダウンロード</a></td><td>4.4MB</td></tr><tr class="even"><td>qemu-ash-0.15.1-pylone1-win32.zip<br /><span class="desc">Windows ホスト環境用アーカイヴ</span></td><td>0.15.1-pylone1</td><td class="dl"><a href="http://downloads.pylone.jp/ash/qemu/qemu-ash-0.15.1-pylone1-win32.zip">ダウンロード</a></td><td>6.7MB</td></tr></table>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Sun, 25 Mar 2012 03:23 GMT</pubDate>
</item>
<item>
   <title>Ashの発売について</title>
   <guid isPermaLink="false">ash_announcement_sales</guid>
   <link>http://pylone.jp/blog/ash_announcement_sales</link>
   <description><![CDATA[


<p class="flickr"><a href="http://www.flickr.com/photos/pylonejp/7063872849/in/photostream/lightbox/" title="flickr:写真"><img src="http://farm8.staticflickr.com/7237/7063872849_686052f20c_z.jpg" width="640" height="426" alt="写真" /></a></p>
<p>SH-2搭載Linux対応小型CPUボード<a href="http://pylone.jp/ash/">Ash</a>の発売についてご案内いたします。</p>
<h4 id="ash_announcement_sales-E8.A3.BD.E5.93.81.E6.A6.82.E8.A6.81">製品概要</h4>
<h5 id="ash_announcement_sales-E3.83.8F.E3.83.BC.E3.83.89.E3.82.A6.E3.82.A7.E3.82.A2">ハードウェア</h5>
<ul><li><a href="http://japan.renesas.com/products/mpumcu/superh/shether/sh7619/">ルネサスエレクトロニクス SH7619</a>（コアクロック:117MHz）</li><li>32MB SDRAM</li><li>16MB NOR Flash ROM</li><li>10/100Base-TX Ethernet（CPU 内蔵 PHY）</li><li>デバッグ用シリアル I/F（USB-シリアルコンバータ内蔵）</li><li>外部 I/O: SPIx1, UARTx1, GPIOx8, RTC バックアップ電源, 外部電源</li><li>汎用 DIP スイッチ: 3ビット</li><li>RTC: SII S−35190A（電気二重層コンデンサにて約 650 時間のバックアップ）</li><li>消費電力: 最大約400mA</li><li>基板寸法: 85mm x 35mm</li><li>温度範囲: 0-50℃</li><li>電源: USB コネクタまたは外部電源より DC+5V</li></ul>
<h5 id="ash_announcement_sales-E3.82.BD.E3.83.95.E3.83.88.E3.82.A6.E3.82.A7.E3.82.A2.EF.BC.88.4C.69.6E.75.78.EF.BC.89">ソフトウェア（Linux）</h5>
<p>プリインストールされるのはLinuxです。</p>
<ul><li><a href="http://kernel.org">Linux</a> 3.2.0</li><li><a href="http://www.denx.de/wiki/U-Boot">u-boot</a> v2011.09</li><li><a href="http://buildroot.uclibc.org/">buildroot</a> v2012.02</li><li><a href="http://www.uclibc.org/">uClibc</a> 0.9.31</li><li><a href="http://busybox.net">busybox</a> 1.19.4</li><li>gcc 4.6.2</li><li><a href="http://www.qemu.org/">QEMU</a> 0.15.1</li></ul>
<h5 id="ash_announcement_sales-E3.82.BD.E3.83.95.E3.83.88.E3.82.A6.E3.82.A7.E3.82.A2.EF.BC.88.54.4F.50.50.45.52.53.EF.BC.89">ソフトウェア（TOPPERS）</h5>
<ul><li><a href="http://www.toppers.jp/asp-kernel.html">TOPPERS/ASPカーネル</a> 1.7.0</li></ul>
<h4 id="ash_announcement_sales-E4.BE.A1.E6.A0.BC">価格</h4>
<table style="text-align:center">
  <tr>
    <th style="width:8em;">型番</th>
    <th>価格（税込・送料別）</th>
  </tr><tr>
    <td>PE-501</td>
    <td><span style="font-size:130%;">23,100</span>円</td>
  </tr>
</table>
<h4 id="ash_announcement_sales-E7.99.BA.E5.A3.B2.E6.97.A5">発売日</h4>
<p>2012年3月24日</p>
<h4 id="ash_announcement_sales-E8.B3.BC.E5.85.A5.E6.96.B9.E6.B3.95">購入方法</h4>
<p><a href="http://pylone.jp/ash/order.html">弊社の通信販売</a>でお求め頂けます。</p>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Tue, 10 Apr 2012 09:25 GMT</pubDate>
</item>
<item>
   <title>再帰実行しないmakefile</title>
   <guid isPermaLink="false">tips_non_recursive_make</guid>
   <link>http://pylone.jp/blog/tips_non_recursive_make</link>
   <description><![CDATA[


<p>この記事ではmakeの再帰呼びだしに頼らないmakefileを書くためのtipsを紹介します。
社内勉強会向けに作成した資料をベースとして、公開用に再構成しました。</p>
<p>ある程度の規模のプロジェクトのビルドを効率化したり、
LinuxカーネルやAndroid、OpenJDKなどで使われている（<a href="http://kbuild.sourceforge.net/">kbuild</a>)ビルド機構を理解するのに役立つでしょう。
記述は<a href="http://www.gnu.org/s/make/">GNU Make</a>の拡張機能が使えることを前提としていますが、BSD系のmakeでも類似の技法は機能するはずです。</p>
<h4 id="tips_non_recursive_make-52.65.63.75.72.73.69.76.65.20.4D.61.6B.65.20.43.6F.6E.73.69.64.65.72.65.64.20.48.61.72.6D.66.75.6C">Recursive Make Considered Harmful</h4>
<p>過去にはよく使われたmakefileの書きかたとして、makefileのルールから別のmakeを (recursiveに) 呼びだす、というものがありました。
そのようなmakeの使い方は</p>
<ul><li>なぜかビルドにとても時間がかかる</li><li>ときどきファイルが正しく再生成されない</li></ul>
<p>といった問題を起こすので<a href="http://miller.emu.id.au/pmiller/books/rmch/">やめるべき</a>といわれて10年以上たちますが、いまだにそのような構成のプロジェクトはよく見られます。
makefileを適当に動くものを雛形にして作るなら、できるだけ内容を理解して適切なコピー元を選びましょう。</p>
<h4 id="tips_non_recursive_make-E3.82.B5.E3.83.B3.E3.83.97.E3.83.AB.E3.83.97.E3.83.AD.E3.82.B8.E3.82.A7.E3.82.AF.E3.83.88">サンプルプロジェクト</h4>
<p>以降では例としてソースファイルの構成が</p>
<pre>- (toplevel)
  - src/
      main.c
  - parser/
      parser.grammar</pre>
<p>ビルド手順は</p>
<ol><li>parser.grammarからパーサジェネレータ(<a href="http://www.hwaci.com/sw/lemon/">lemon</a>)でparser.cとparser.hを生成</li><li>parser.cをコンパイルしてparser.oを生成</li><li>parser.hとmain.cからmain.oを生成</li><li>main.oとparser.oをリンクして実行ファイルappを生成</li></ol>
<p>という場合を想定したmakefile群の書き方を考えます。</p>
<h4 id="tips_non_recursive_make-E5.88.86.E5.89.B2.E3.81.97.E3.81.AA.E3.81.84.E5.A0.B4.E5.90.88">分割しない場合</h4>
<p>今回の例のサイズであれば、単一のmakefileに全ての依存関係を書く：</p>
<div class="highlight"><pre><span class="nf">all</span><span class="o">:</span> <span class="m">app</span>

<span class="nf">src/main.o</span><span class="o">:</span> <span class="m">src/main.c parser/parser.h</span>

<span class="nf">parser/parser.o</span><span class="o">:</span> <span class="m">parser/parser.c</span>
<span class="nf">parser/parser.c parser/parser.h</span><span class="o">:</span> <span class="m">parser/parser.grammar</span>
        lemon <span class="nv">$&lt;</span>

<span class="nf">app</span><span class="o">:</span> <span class="m">src/main.o parser/parser.o</span>
        <span class="k">$(</span>CC<span class="k">)</span> <span class="k">$(</span>LDFLAGS<span class="k">)</span> -o <span class="nv">$@</span> <span class="nv">$+</span>
</pre></div>

<p>ことも十分可能です。</p>
<p>しかし、現実的なサイズのプロジェクトを単一のmakefileでビルドするのは難しいでしょう。</p>
<h4 id="tips_non_recursive_make-E5.86.8D.E5.B8.B0.E3.83.90.E3.83.BC.E3.82.B8.E3.83.A7.E3.83.B3">再帰バージョン</h4>
<p>旧い方法に従うと、</p>
<ol><li>サブディレクトリのためのmakefile群 (parser/Makefile, src/Makefile) を用意する</li><li>トップレベルのMakefileのルールとして、サブディレクトリでmakeを実行する</li></ol>
<p>ということになります。</p>
<h5 id="tips_non_recursive_make-E3.83.88.E3.83.83.E3.83.97.E3.83.AC.E3.83.99.E3.83.AB.E3.81.AE.4D.61.6B.65.66.69.6C.65">トップレベルのMakefile</h5>
<p>parser/、src/それぞれのディレクトリでmakeコマンドを起動することになります。</p>
<div class="highlight"><pre><span class="c">#Makefile</span>
<span class="nv">SUBDIRS</span> <span class="o">:=</span> parser src
all: <span class="k">$(</span>SUBDIRS<span class="k">)</span> app

<span class="k">$(</span>SUBDIRS<span class="k">)</span>:
        <span class="k">$(</span>MAKE<span class="k">)</span> -C <span class="nv">$@</span>

app: src/main.o parser/parser.o
        <span class="k">$(</span>CC<span class="k">)</span> <span class="k">$(</span>LDFLAGS<span class="k">)</span> -o <span class="nv">$@</span> <span class="nv">$+</span>

.PHONY: all <span class="k">$(</span>SUBDIRS<span class="k">)</span>
</pre></div>

<h5 id="tips_non_recursive_make-E3.82.B5.E3.83.96.E3.83.87.E3.82.A3.E3.83.AC.E3.82.AF.E3.83.88.E3.83.AA.E3.81.AE.6D.61.6B.65.66.69.6C.65">サブディレクトリのmakefile</h5>
<p>関連するファイルの生成規則だけを含むように分割すると</p>
<div class="highlight"><pre><span class="c">#parser/Makefile</span>
<span class="nf">parser.o</span><span class="o">:</span> <span class="m">parser.c</span>
<span class="nf">parser.h parser.c</span><span class="o">:</span> <span class="m">parser.grammar</span>
        lemon <span class="nv">$&lt;</span>
</pre></div>

<div class="highlight"><pre><span class="c">#src/Makefile</span>
<span class="nf">main.o</span><span class="o">:</span> <span class="m">main.c ../parser/parser.h</span>
</pre></div>

<p>となるでしょう。</p>
<h5 id="tips_non_recursive_make-E5.86.8D.E5.B8.B0.E7.9A.84.6D.61.6B.65.E3.81.AE.E5.95.8F.E9.A1.8C.E7.82.B9">再帰的makeの問題点</h5>
<p>とりあえず使える程度の動作はしますが、</p>
<ul><li>必要がなくても下位makeプロセスが起動されるので遅い</li><li>makeに平行処理を許した (たとえば make -j3) 場合はビルドに失敗することがある</li></ul>
<p>といった問題を解決するのは困難です。</p>
<h4 id="tips_non_recursive_make-E9.9D.9E.E5.86.8D.E5.B8.B0.E3.83.90.E3.83.BC.E3.82.B8.E3.83.A7.E3.83.B3.20.28.69.6E.63.6C.75.64.65.20.64.69.72.65.63.74.69.76.65.29">非再帰バージョン (include directive)</h4>
<p>GNU Makeの、makefile内に別のファイルを読み込む拡張機能(<a href="http://www.gnu.org/s/make/manual/html_node/Include.html">include directive</a>)を使えばmakefileの一部を別のファイルへと分割可能です。</p>
<p>この例の場合、src/、parser/以下の依存関係を</p>
<div class="highlight"><pre><span class="c">#src/build.mk</span>
<span class="nf">src/main.o</span><span class="o">:</span> <span class="m">src/main.o parser/parser.h</span>
</pre></div>

<p>および</p>
<div class="highlight"><pre><span class="c">#parser/build.mk</span>
<span class="nf">parser/parser.o</span><span class="o">:</span> <span class="m">parser/parser.c</span>
<span class="nf">parser/parser.h parser/parser.c</span><span class="o">:</span> <span class="m">parser/parser.grammar</span>
        lemon <span class="nv">$&lt;</span>
</pre></div>

<p>として抜きだして、トップレベルのMakefileからそれぞれを読みこむ</p>
<div class="highlight"><pre><span class="c">#Makefile</span>
<span class="nf">all</span><span class="o">:</span> <span class="m">main</span>

<span class="nf">main</span><span class="o">:</span> <span class="m">src/main.o parser/parser.o</span>
        <span class="k">$(</span>CC<span class="k">)</span> <span class="k">$(</span>LDFLAGS<span class="k">)</span> -o <span class="nv">$@</span> <span class="nv">$+</span>

<span class="cp">include src/build.mk</span>
<span class="cp">include parser/build.mk</span>
</pre></div>

<p>ようにできます。</p>
<h4 id="tips_non_recursive_make-E9.9D.9E.E5.86.8D.E5.B8.B0.E3.83.90.E3.83.BC.E3.82.B8.E3.83.A7.E3.83.B3.20.28.E4.B8.8B.E4.BD.8D.E3.81.B8.E3.81.AE.E3.83.91.E3.83.A9.E3.83.A1.E3.83.BC.E3.82.BF.E6.B8.A1.E3.81.97.29">非再帰バージョン (下位へのパラメータ渡し)</h4>
<p>前の例ではincludeされるファイル内で明示的にディレクトリ名 (src/、parser/) を都度書いていますが、もしこれを修正することになるとかなりの手間がかかります。
makeの変数を使ってincludeする側から渡すようにして、ディレクトリ名に依存してしまう要素を減らしましょう。</p>
<p>makeの変数RELに対象ディレクトリ名が格納されるようにすれば、(ディレクトリ名を$(REL)に置きかえることで) src/build.mkを</p>
<div class="highlight"><pre><span class="k">$(</span>REL<span class="k">)</span>main.o: <span class="k">$(</span>REL<span class="k">)</span>main.c parser/parser.h
</pre></div>

<p>parser/build.mk を</p>
<div class="highlight"><pre><span class="k">$(</span>REL<span class="k">)</span>parser.o: <span class="k">$(</span>REL<span class="k">)</span>parser.c
<span class="k">$(</span>REL<span class="k">)</span>parser.c <span class="k">$(</span>REL<span class="k">)</span>parser.h: <span class="k">$(</span>REL<span class="k">)</span>parser.grammar
        lemon <span class="nv">$&lt;</span>
</pre></div>

<p>のように書きなおすことができます。</p>
<p>この場合、トップレベルのmakefile側でincludeする前にRELを設定しておく</p>
<div class="highlight"><pre><span class="nf">all</span><span class="o">:</span> <span class="m">app</span>

<span class="nv">REL</span> <span class="o">:=</span> src/
<span class="cp">include $(REL)build.mk</span>

REL :<span class="o">=</span> parser/
<span class="cp">include $(REL)build.mk</span>

app: src/main.o parser/parser.o
        <span class="k">$(</span>CC<span class="k">)</span> <span class="k">$(</span>LDFLAGS<span class="k">)</span> -o <span class="nv">$@</span> <span class="nv">$+</span>
</pre></div>

<p>ことになります。
なお、includeされるファイル毎に値を変えたいRELは<a href="http://www.gnu.org/s/hello/manual/make/Flavors.html">simply-expanded</a>
な (:=を用いた) 変数にしないと、最後の定義によって全ての$(REL)の値が上書きされてしまうことに注意してください。</p>
<h4 id="tips_non_recursive_make-E9.9D.9E.E5.86.8D.E5.B8.B0.E3.83.90.E3.83.BC.E3.82.B8.E3.83.A7.E3.83.B3.20.28.E4.B8.8A.E4.BD.8D.E3.81.B8.E3.81.AE.E3.83.91.E3.83.A9.E3.83.A1.E3.83.BC.E3.82.BF.E6.B8.A1.E3.81.97.29">非再帰バージョン (上位へのパラメータ渡し)</h4>
<p>関連するオブジェクトファイルが多くなる場合、すべてを手作業で列挙するのは危険なので、includeされる側でファイルのリストを構築した方がよいでしょう。</p>
<p>トップレベルのmakefileを(simply-expandedな)変数OBJSを利用するように：</p>
<div class="highlight"><pre><span class="nf">all</span><span class="o">:</span> <span class="m">app</span>
<span class="nv">OBJS</span> <span class="o">:=</span>

REL :<span class="o">=</span> src/
<span class="cp">include $(REL)build.mk</span>

REL :<span class="o">=</span> parser/
<span class="cp">include $(REL)build.mk</span>

app: <span class="k">$(</span>OBJS<span class="k">)</span>
        <span class="k">$(</span>CC<span class="k">)</span> <span class="k">$(</span>LDFLAGS<span class="k">)</span> -o <span class="nv">$@</span> <span class="nv">$+</span>
</pre></div>

<p>書いておくと、OBJSはmakefile全体で共有されるため、
src/build.mk、parser/build.mk内でOBJSへ加えた変更がトップレベルの "app" のルール処理に反映されます。</p>
<p>src/build.mk、parser/build.mk 内では、</p>
<div class="highlight"><pre><span class="c"># src/build.mk</span>
<span class="nv">OBJS</span> <span class="o">+=</span> <span class="k">$(</span>REL<span class="k">)</span>main.o
</pre></div>

<div class="highlight"><pre><span class="c"># parser/build.mk</span>
<span class="nv">OBJS</span> <span class="o">+=</span> <span class="k">$(</span>REL<span class="k">)</span>parser.o
</pre></div>

<p>のようにして、必要なオブジェクトファイルを順に追加していけばよいでしょう。</p>
<p>ただし、includeされる側で行なう操作はリストへの追加だけにするべきです。リスト自体を上書きしてしまう (「+=」ではなく「:=」を使う)</p>
<div class="highlight"><pre><span class="nv">OBJS</span> <span class="o">:=</span> <span class="k">$(</span>REL<span class="k">)</span>foo.o
</pre></div>

<p>と、グローバルなOBJSの内容は破壊されます。
下位のmakefileの作成者が信用できないなら、OBJSへの操作を (includeされる側には委ねないで) 上位側に移した方がよいかもしれません。</p>
<h4 id="tips_non_recursive_make-E9.9D.9E.E5.86.8D.E5.B8.B0.E3.83.90.E3.83.BC.E3.82.B8.E3.83.A7.E3.83.B3.20.28.E8.87.AA.E5.8B.95.69.6E.63.6C.75.64.65.29">非再帰バージョン (自動include)</h4>
<p>下位ディレクトリが多数存在し、それぞれに対する個々のincludeをトップレベルに書きたくない場合、GNU Make自身に等価な記述を生成させることができます。</p>
<p>下位のmakefileの名前をbuild.mkとしたとき、build.mkが存在する下位ディレクトリのリストは</p>
<div class="highlight"><pre><span class="k">$(</span>dir <span class="k">$(</span>wildcard */build.mk<span class="k">))</span>
</pre></div>

<p>で得られます。これと</p>
<ul>
  <li>引数を与えると
    <pre class="highlight">
      <span class="nv">REL</span> <span class="o">:=</span> [引数のディレクトリ名]
      <span class="cp">include $(REL)build.mk</span></pre>
    を生成するmakeのユーザー定義関数</li>
  <li>組み込み関数<a href="http://www.gnu.org/s/hello/manual/make/Foreach-Function.html">foreach</a>によるリスト要素への関数適用</li>
</ul>
<p>を組み合わせれば、下位ディレクトリのbuild.mkを自動的にincludeするmakefileを</p>
<div class="highlight"><pre><span class="nf">all</span><span class="o">:</span> <span class="m">app</span>

<span class="nv">SUBDIRS</span> <span class="o">:=</span> <span class="k">$(</span>dir <span class="k">$(</span>wildcard */build.mk<span class="k">))</span>
OBJS :<span class="o">=</span>

<span class="cp">define include_fragment</span>
 REL:<span class="o">=</span> <span class="k">$(</span>1<span class="k">)</span>
<span class="cp"> include $(1)build.mk</span>
<span class="cp">endef</span>

<span class="k">$(</span>foreach i, <span class="k">$(</span>SUBDIRS<span class="k">)</span>, <span class="se">\</span>
        <span class="k">$(</span><span class="nb">eval</span> <span class="k">$(</span>call include_fragment, <span class="k">$(</span>i<span class="k">))))</span>

app: <span class="k">$(</span>OBJS<span class="k">)</span>
        <span class="k">$(</span>CC<span class="k">)</span> <span class="k">$(</span>LDFLAGS<span class="k">)</span> -o <span class="nv">$@</span> <span class="nv">$+</span>
</pre></div>

<p>のように書くことができます。</p>
<p>こうしておけば、下位ディレクトリを追加した際にはbuild.mkを置くだけでトップレベルのmakefileから自動的に読みこまれます。
あとからmakefileを解読するのは難しくなってしまいますが、目的によっては便利に使えるのではないでしょうか。</p>
<h4 id="tips_non_recursive_make-E3.82.BF.E3.83.BC.E3.82.B2.E3.83.83.E3.83.88.E3.81.94.E3.81.A8.E3.81.AB.E5.A4.89.E6.95.B0.E5.80.A4.E3.82.92.E8.A8.AD.E5.AE.9A">ターゲットごとに変数値を設定</h4>
<p>includeを使ってmakefileを合成する場合、makeの変数は全体で共有されます。
しかし、一部のターゲットについてだけCFLAGS、LDFLAGSといった変数の値を変更したい場合もあるでしょう。</p>
<p>幸いGNU Makeには</p>
<div class="highlight"><pre><span class="nf">ターゲット </span><span class="o">:</span> <span class="m">変数定義</span>
</pre></div>

<p>とすることで、ターゲットごとの変数値を設定する機能 (<a href="http://www.gnu.org/s/hello/manual/make/Target_002dspecific.html">target-specific variable value</a>) が存在します。</p>
<p>たとえば main.o の生成規則を</p>
<div class="highlight"><pre><span class="k">$(</span>REL<span class="k">)</span>main.o: <span class="k">$(</span>REL<span class="k">)</span>main.c parser/parser.h
</pre></div>

<p>として定義していたとき、</p>
<div class="highlight"><pre><span class="k">$(</span>REL<span class="k">)</span>main.o: CFLAGS +<span class="o">=</span> -I parser/
<span class="k">$(</span>REL<span class="k">)</span>main.o: <span class="k">$(</span>REL<span class="k">)</span>main.c parser/parser.h
</pre></div>

<p>のように定義を追加することで、このルールを実行する時だけ CFLAGS に「-I parser/」が追加されます。</p>
<p>この機能はincludeディレクティブによって展開された時点の変数の値を保存しておくのにも使えるので、makefile自体のデバッグにも役立ちます。たとえば</p>
<div class="highlight"><pre><span class="k">$(</span>REL<span class="k">)</span>parser.o: LOCAL_REL :<span class="o">=</span> <span class="k">$(</span>REL<span class="k">)</span>
<span class="k">$(</span>REL<span class="k">)</span>parser.o: <span class="k">$(</span>REL<span class="k">)</span>parser.c
        @echo <span class="s2">&quot;LOCAL_REL=&quot;</span> <span class="k">$(</span>LOCAL_REL<span class="k">)</span>
        <span class="k">$(</span>CC<span class="k">)</span> <span class="k">$(</span>CFLAGS<span class="k">)</span> -c -o <span class="nv">$@</span> <span class="nv">$&lt;</span>
</pre></div>

<p>とすれば、上書きされてしまう前にRELを保存しておいて確認することもできるでしょう。</p>
<h4 id="tips_non_recursive_make-E3.81.BE.E3.81.A8.E3.82.81">まとめ</h4>
<p>新しく作るmakefileでは「$(MAKE) -C」を止めて「include」を使いましょう。</p>
<p>makefileを書くとき、makeの出力に大量の「Entering directory」「Leaving directory」(残念な環境では「入りますディレクトリ」) といったメッセージが含まれるようなプロジェクトを参考にするのは避けるべきです。</p>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Sun, 08 Apr 2012 09:52 GMT</pubDate>
</item>
<item>
   <title>年末年始休業のお知らせ</title>
   <guid isPermaLink="false">announce_20111206</guid>
   <link>http://pylone.jp/blog/announce_20111206</link>
   <description><![CDATA[
<p>
誠に勝手ではございますが、株式会社パイロンは2011年12月27日から2012年1月5日の間を休業とさせていただきます。ご迷惑をおかけいたしますが、よろしくお願いいたします。
</p>


]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Tue, 06 Dec 2011 11:00 GMT</pubDate>
</item>
<item>
   <title>ロジック・アナライザ Logic Cube</title>
   <guid isPermaLink="false">logic_cube</guid>
   <link>http://pylone.jp/blog/logic_cube</link>
   <description><![CDATA[


<p class=""><a href="http://farm7.static.flickr.com/6037/6334282306_0339ed6c93_b.jpg" title="flickr:photo1"><img src="http://farm7.static.flickr.com/6037/6334282306_0339ed6c93.jpg" width="500" height="333" alt="photo1" /></a></p>
<h4 id="logic_cube-4C.6F.67.69.63.20.43.75.62.65.20.4C.41.50.2D.43.28.31.36.30.33.32.29">Logic Cube LAP-C(16032)</h4>
<p><a href="http://www.zeroplus.com.tw/">ZEROPLUS</a> 社製 ロジックアナライザ Logic Cube を紹介します。
Logic Cube にはいくつかのラインナップがありますが、本記事で紹介するのはローエンドモデルの <a href="http://www.zeroplus.com.tw/logic-analyzer_en/products.php?pdn=1&amp;product_id=253">LAP-C(16032)</a> です。</p>
<p>パイロンでは、カスタムボードにブートローダや OS を移植する際やデバイスドライバ開発のデバッグに大変重宝しています。また、コンパクトでUSBバスパワーで動作するので客先出張デバッグでも役立っています。</p>
<p>リンク先のサイトを見て頂ければわかる通り、実に様々なプロトコルに対応しています。
標準で添付される、7-SEGMENT LED, I2C, SPI, UART(RS-232C/422/485) に加えて、オプションとしてライセンス購入によりプロトコルが追加できます。</p>
<p>パイロンでは <a href="http://strawberry-linux.com/catalog/items?code=64001">ストロベリー・リナックス</a> さんから購入しました。</p>
<p class="info">本記事執筆時点ではプロトコル解析が30本無料となっているようです。</p>
<h4 id="logic_cube-E3.83.AD.E3.82.B8.E3.83.83.E3.82.AF.E3.83.BB.E3.82.A2.E3.83.8A.E3.83.A9.E3.82.A4.E3.82.B6">ロジック・アナライザ</h4>
<p>バスタイミングの設定やドライバ開発のデバッグにおいて</p>
<ul><li>バスタイミングに従った波形が出ているか</li><li>(その波形から)プロトコルが成立しているか</li></ul>
<p>この2点が確認できればざっくりとした問題の切り分けが可能になります。</p>
<p>ロジアナでは波形の確認もさることながら、その波形からプロトコルを解析しグラフィカルに表示してくれるので容易にプロトコルの確認が行えます。</p>
<p>RTC(via I2C)のデバッグを例にとると、RTCが動作しない場合はI2CドライバとRTCドライバの両方を疑う必要があります。</p>
<ol><li>そこでまず、I2Cコントローラを制御しきちんとした波形が出ていることが確認できればI2Cドライバは問題なさそうと判断できます。</li><li>次に、その波形からプロトコルを読み取ることができれば、RTCドライバのどの箇所が問題なのかが判明します。</li></ol>
<p>といった具合にロジアナがあるとデバッグがグッと楽になります。</p>
<h4 id="logic_cube-53.42.43.36.30.30.30.58.E4.B8.8A.E3.81.A7.E3.81.AE.E4.BD.BF.E7.94.A8">SBC6000X上での使用</h4>
<p>では実際に SBC6000X で使用してみます。</p>
<p>RTCをプローブしI2Cバス上の通信を見てみます。I2CではSDAとSDLとGNDの3本をプローブします。
RTCチップは基板上のU32のRX8025SAです。</p>
<p>各ピン配置は以下のようになっています。</p>
<table><tr><th>Pin Function</th><th>Pin No.</th><th>アプリの識別子</th></tr><tr><td>SDA</td><td>Pin 13</td><td>A0(茶色線)</td></tr><tr><td>SDL</td><td>Pin 4</td><td>A1(赤色線)</td></tr><tr><td>GND</td><td>Pin 11</td><td>GND(黒色線)</td></tr></table>
<p>よって、写真のように付属のクリップ(白と黒)を使って茶色線(A0)をPin13に、赤色線(A0)をPin4に、黒色線(GND)をPin11に接続します。</p>
<p class=""><a href="http://farm7.static.flickr.com/6235/6347079664_6b36a99324_b.jpg" title="flickr:photo2"><img src="http://farm7.static.flickr.com/6235/6347079664_6b36a99324.jpg" width="500" height="375" alt="photo2" /></a></p>
<p>アプリの設定方法は省略しますがアプリ設定後、本体のボタンを押すかアプリのRun[F5]を押したらhwclockコマンドを実行しRTCとの通信を発生させます。</p>
<p>すると以下のようなスクリーンショットの結果が得られます。</p>
<p class=""><a href="http://farm7.static.flickr.com/6039/6333210271_16dfafdc26_b.jpg" title="flickr:screenshot"><img src="http://farm7.static.flickr.com/6039/6333210271_16dfafdc26.jpg" width="500" height="287" alt="screenshot" /></a></p>
<p>RTCのI2Cアドレスである0x32に対して</p>
<ol><li>(時刻)データを要求(write)し</li><li>(時刻)データの応答(read)</li></ol>
<p>があるのが見て取れると思います。</p>
<h4 id="logic_cube-E6.9C.80.E5.BE.8C.E3.81.AB">最後に</h4>
<p>組込み系のデバッグではロジアナによる可視化が問題の切り分けの手助けになることがあります。</p>
<p>通常のロジアナはオシロのようにモニタを有し単体で動作するものが一般的ですが、その中で Logic Cube は画面出力をPCのモニタに任せることによりコンパクトでかつ低価格な製品になっています。</p>
<p>昨今のAndroidブームで評価ボードを個人で所有されている方もいるかと思います。デバッグのお供にこの Logic Cube も所有してみても面白いのではないでしょうか。
個人的にはLinuxから使えれば満点をあげたい製品です。</p>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Mon, 28 Nov 2011 12:07 GMT</pubDate>
</item>
<item>
   <title>SBC6000X エミュレータ</title>
   <guid isPermaLink="false">qemu_sbc6000x_0.15.1_pylone1</guid>
   <link>http://pylone.jp/blog/qemu_sbc6000x_0.15.1_pylone1</link>
   <description><![CDATA[


<p>先日発売いたしました、組込みLinux開発用CPUボード <a href="http://pylone.jp/sbc6000x/">SBC6000X</a> を <a href="http://qemu.org">QEMU</a> でサポートしましたので公開します。</p>
<p>ベースにした QEMU のバージョンは 0.15.1 です。</p>
<table class="downloads"><tr class="title"><td colspan="4">SBC6000X エミュレータ</td></tr><tr class="odd"><td>qemu-sbc6000x-0.15.1-pylone1.tar.bz2<br /><span class="desc">ソースコード</span></td><td>0.15.1-pylone1</td><td class="dl"><a href="http://downloads.pylone.jp/sbc6000x/src/qemu-sbc6000x-0.15.1-pylone1.tar.bz2">ダウンロード</a></td><td>4.6MB</td></tr></table>
<h4 id="qemu_sbc6000x_0.15.1_pylone1-E6.A6.82.E8.A6.81">概要</h4>
<p>ARM926 は本家 QEMU でサポートされているため、同コア の SoC を搭載したプラットフォームがいくつかサポートされています。
しかし、同コアを使用した SBC6000X のマイクロプロセッサである <a href="http://www.atmel.com/dyn/products/product_card.asp?part_id=3638">AT91SAM9261</a> は今のところサポートされていません。</p>
<p>そこで、Linux の起動に必要となる周辺デバイスのエミュレーションを追加しました。</p>
<h4 id="qemu_sbc6000x_0.15.1_pylone1-E7.8F.BE.E7.8A.B6">現状</h4>
<p>SBC6000X 用 Linux が起動できる必要最小限のエミュレーションを目標にしたため、実機を完全にエミュレート出来るまでに至っていません。</p>
<h4 id="qemu_sbc6000x_0.15.1_pylone1-E3.82.AF.E3.82.A4.E3.83.83.E3.82.AF.E3.82.B9.E3.82.BF.E3.83.BC.E3.83.88">クイックスタート</h4>
<p>ホスト OS として Debian GNU/Linux Squeeze を例に説明します。</p>
<p>SBC6000X 用の <a href="http://pylone.jp/sbc6000x/docs/how_to_buildroot.html">Buildroot を用いたビルド</a> にて環境一式が整っていることを前提とします
(以降、SBC6000X 用 Buildroot のディレクトリを ~/buildroot-sbc6000x とします)。</p>
<p>現時点では、NAND デバイスをまだエミュレートできないため、ここでは、rootfs に NFS を使用します。
以下の設定を追加し、反映します (以降、NFS として export するディレクトリを /opt/sbc6000x とします)。</p>
<pre>
# <span class="cmdline">vi /etc/exports</span>
/opt/sbc6000x    127.0.0.1(rw,sync,subtree_check,no_root_squash,insecure)
# <span class="cmdline">exportfs -a</span>
</pre>
<p>次に、QEMU をビルドするためのライブラリ (開発版パッケージ) をインストールします。
既にインストール済みの場合は不要です。</p>
<pre>
# <span class="cmdline">apt-get install libglib2.0-dev</span>
# <span class="cmdline">apt-get install zlib1g-dev</span>
# <span class="cmdline">apt-get install libsdl1.2-dev</span>
</pre>
<p>最後に、ビルドして実行するまでの手順です。</p>
<pre>
$ <span class="cmdline">mkdir ~/qemu-sbc6000x</span>
$ <span class="cmdline">cd ~/qemu-sbc6000x</span>
$ <span class="cmdline">wget http://downloads.pylone.jp/sbc6000x/src/qemu-sbc6000x-0.15.1-pylone1.tar.bz2</span>
$ <span class="cmdline">tar xjf qemu-sbc6000x-0.15.1-pylone1.tar.bz2</span>
$ <span class="cmdline">cd qemu-sbc6000x-0.15.1-pylone1</span>
$ <span class="cmdline">./configure --target-list=arm-softmmu</span>
$ <span class="cmdline">make</span>
$ <span class="cmdline">./arm-softmmu/qemu-system-arm \</span>
  <span class="cmdline">    -M sbc6000x \</span>
  <span class="cmdline">    -m 256 \</span>
  <span class="cmdline">    -serial stdio \</span>
  <span class="cmdline">    -kernel ~/buildroot-sbc6000x/output/images/uImage \</span>
  <span class="cmdline">    -append "console=ttyS0 root=/dev/nfs rw nfsroot=10.0.2.2:/opt/sbc6000x ip=dhcp"</span>
</pre>
<p>起動後にログイン可能なユーザーは "root"、または "default" (一般ユーザ) です (何れもパスワードはありません)。</p>
<p>終了するには、QEMU ウィンドウを閉じるか、起動した端末上で Ctrl-C を発行して QEMU を終了してください。</p>
<p>その他の詳しい使い方については <a href="http://pylone.jp/sbc6000x/docs/qemu-sbc6000x-manual.html">SBC6000X エミュレータマニュアル</a> を参照してください。</p>
<h4 id="qemu_sbc6000x_0.15.1_pylone1-E6.97.A2.E7.9F.A5.E3.81.AE.E5.95.8F.E9.A1.8C.E7.82.B9">既知の問題点</h4>
<p>起動中、まれに、</p>
<pre>mmc0: host doesn't support card's voltages
mmc0: error -22 whilst initialising SDIO card
mmc0: host doesn't support card's voltages
mmc0: error -22 whilst initialising MMC card
mmc0: host doesn't support card's voltages
mmc0: error -22 whilst initialising SDIO card
mmc0: host doesn't support card's voltages
mmc0: error -22 whilst initialising MMC card</pre>
<p>というタイミングで起動が停止してしまいますが、終了して再起動してみてください。</p>
<h4 id="qemu_sbc6000x_0.15.1_pylone1-E3.81.8A.E3.82.8F.E3.82.8A.E3.81.AB">おわりに</h4>
<p>QEMU に対して追加実装した部分の完成度はまだ低いですが、Linux の基本的な動作は確認できると思います。
SBC6000X のソフトウェアの検討や、組み込み Linux 開発の入門を目的とした使い方をしていただければ幸いです。</p>
<h4 id="qemu_sbc6000x_0.15.1_pylone1-E3.83.89.E3.82.AD.E3.83.A5.E3.83.A1.E3.83.B3.E3.83.88">ドキュメント</h4>
<ul><li><a href="http://pylone.jp/sbc6000x/docs/qemu-sbc6000x-manual.html">SBC6000X エミュレータマニュアル</a></li><li><a href="http://pylone.jp/sbc6000x/spec-software.html#g1-3">ソフトウェア仕様</a></li></ul>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Tue, 01 Nov 2011 08:18 GMT</pubDate>
</item>
<item>
   <title>SBC6000X の発売について</title>
   <guid isPermaLink="false">sbc6000x_announcement_sales</guid>
   <link>http://pylone.jp/blog/sbc6000x_announcement_sales</link>
   <description><![CDATA[


<p class="flickr"><a href="http://www.flickr.com/photos/pylonejp/6152413272/sizes/l/" title="flickr:写真"><img src="http://farm7.static.flickr.com/6175/6152413272_f0f11ac8cf.jpg" width="500" height="333" alt="写真" /></a></p>
<p>組込み Linux 開発用 CPU ボード <a href="http://pylone.jp/sbc6000x/">SBC6000X</a>
の発売についてご案内いたします。</p>
<h4 id="sbc6000x_announcement_sales-E6.9C.AC.E8.A3.BD.E5.93.81.E3.81.AB.E3.81.A4.E3.81.84.E3.81.A6">本製品について</h4>
<p><a href="http://pylone.jp/sbc6000x/">SBC6000X</a> は <a href="http://www.armkits.com/">Embest</a> 社が製造販売している
CPU ボードです。輸入元の <a href="http://www.icp-nmr.com/">株式会社エヌ･エム･アール</a> 様のご協力のもと、付属するソフトウェアを弊社で開発したソフトウェアに置き換えて提供させていただきます。</p>
<h4 id="sbc6000x_announcement_sales-E4.BE.A1.E6.A0.BC">価格</h4>
<table style="text-align:center">
  <tr>
    <th style="width:8em;">型番</th>
    <th>価格 (税込・送料別)</th>
  </tr><tr>
    <td>SBC6000X</td>
    <td><span style="font-size:130%;">28,350</span>円</td>
  </tr>
</table>
<h4 id="sbc6000x_announcement_sales-E7.99.BA.E5.A3.B2.E6.97.A5">発売日</h4>
<p>2011年10月24日</p>
<h4 id="sbc6000x_announcement_sales-E8.B3.BC.E5.85.A5.E6.96.B9.E6.B3.95">購入方法</h4>
<p><a href="http://pylone.jp/sbc6000x/order.html">弊社の通信販売</a>でお求め頂けます。</p>
<h4 id="sbc6000x_announcement_sales-E8.A3.BD.E5.93.81.E6.A6.82.E8.A6.81">製品概要</h4>
<h5 id="sbc6000x_announcement_sales-E3.83.8F.E3.83.BC.E3.83.89.E3.82.A6.E3.82.A7.E3.82.A2">ハードウェア</h5>
<ul><li>Atmel AT91SAM9261 SoC (16KB I-Cache, 16KB D-Cache, MMU)</li><li>64MB SDRAM</li><li>128MB NAND Flash</li><li>SD (SD Host interace version 1.0)</li><li>USB 2.0(Full Speed) Host x2</li><li>USB 2.0(Full Speed) Device x1</li><li>100Base-T Ethernet x1</li><li>UART x2</li><li>Audio (CODEC: TSC2301)</li><li>RTC</li><li>20ビットバス x1</li><li>SPI x1</li><li>USB x1</li><li>UART x1</li></ul>
<h5 id="sbc6000x_announcement_sales-E3.82.BD.E3.83.95.E3.83.88.E3.82.A6.E3.82.A7.E3.82.A2">ソフトウェア</h5>
<ul><li>u-boot-2010.09</li><li>linux-3.0.4</li><li>buildroot-2011.08</li><li>uClibc-0.9.32</li><li>gcc-4.5.3</li></ul>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Sun, 23 Oct 2011 08:52 GMT</pubDate>
</item>
<item>
   <title>年末年始休業のお知らせ</title>
   <guid isPermaLink="false">announce_20101220</guid>
   <link>http://pylone.jp/blog/announce_20101220</link>
   <description><![CDATA[
<p>
誠に勝手ではございますが、株式会社パイロンは2010年12月25日から2011年1月4日の間を休業とさせていただきます。ご迷惑をおかけいたしますが、よろしくお願いいたします。
</p>


]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Wed, 16 Mar 2011 11:36 GMT</pubDate>
</item>
<item>
   <title>クロス開発環境のRPMパッケージ (gcc-4.4)</title>
   <guid isPermaLink="false">cross_toolchain_201011_rpm</guid>
   <link>http://pylone.jp/blog/cross_toolchain_201011_rpm</link>
   <description><![CDATA[

<p>
<a href="http://pylone.jp/blog/cross_toolchain_201011_deb">クロス開発環境のDebianパッケージ (gcc-4.4)</a>
を
<a href="http://kitenet.net/~joey/code/alien/">alien</a>
で変換したRPMパッケージを
<a href="http://downloads.pylone.jp/cross-toolchain/squeeze/rpm/">公開</a>します。
</p>

<h4>概要</h4>

<p>
<a href="http://pylone.jp/blog/cross_toolchain_201011_deb">クロス開発環境のDebianパッケージ (gcc-4.4)</a>
を参照してください。
</p>

<h4>対応状況</h4>

<p>
<a href="http://pylone.jp/blog/cross_toolchain_201011_deb">クロス開発環境のDebianパッケージ (gcc-4.4)</a>
を参照してください。
</p>

<h4>yumによるインストール (Fedora)</h4>

<p>
以下の内容で/etc/yum.repos.d/pylone-jp.repoを作成して、yumレポジトリを追加します。
</p>

<pre>
[cross-toolchain]
name=Cross Toolchain
baseurl=http://downloads.pylone.jp/cross-toolchain/squeeze/rpm/
enabled=1
gpgcheck=0
</pre>

<p>
必要なツールをインストールします。
<span class="example">TARGET-SUFFIX</span>
は arm-linux-gnueabi、mipsel-linux-gnu、sh4-linux-gnu、powerpc-linux-gnu の何れかに置き換えてください。
</p>

<h5>gcc-4.4</h5>
<pre>
# <span class="cmdline">yum install gcc-4.4-<span class="example">TARGET-SUFFIX</span>-linux-gnu</span>
</pre>

<h5>g++-4.4</h5>

<pre>
# <span class="cmdline">yum install g++-4.4-<span class="example">TARGET-SUFFIX</span>-linux-gnu</span>
</pre>

<h5>gdb</h5>

<pre>
# <span class="cmdline">yum install gdb-<span class="example">TARGET-SUFFIX</span>-linux-gnu</span>
</pre>

<h4>依存関係について</h4>

<p>
alienによる変換ではパッケージ間の依存関係が一部われますが、本パッケージではspecファイルを修正して依存関係を追加しています。
</p>

<h4>更新履歴</h4>

<ul>
  <li>2010/11/22: 公開</li>
</ul>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Sun, 28 Nov 2010 02:04 GMT</pubDate>
</item>
<item>
   <title>クロス開発環境のDebianパッケージ (gcc-4.4)</title>
   <guid isPermaLink="false">cross_toolchain_201011_deb</guid>
   <link>http://pylone.jp/blog/cross_toolchain_201011_deb</link>
   <description><![CDATA[

<p>
社内で使っているクロス開発環境の Debian パッケージを<a href="http://downloads.pylone.jp/cross-toolchain/squeeze/deb/">公開</a>します。
</p>

<h4>更新履歴</h4>

<ul>
  <li>2010/11/16: 公開</li>
  <li>2010/12/17: powerpcspeを追加</li>
</ul>

<h4>概要</h4>

<ul>
  <li>ホストアーキテクチャ: i386</li>
  <li>ターゲットアーキテクチャ: armel, mipsel, powerpc, sh4, powerpcspe<sup style="color:red;font-size:xx-small;margin-left:0.2em;">New!</sup></li>
  <li>コンパイラ: gcc-4.4, g++-4.4</li>
  <li>ターゲットのlibc: <a href="http://packages.debian.org/squeeze/eglibc-source">testing (squeeze) の eglibc</a></li>
  <li>biarch: 無効</li>
</ul>

<p>
基本的には (2010/11/11時点の) squeeze の binutils と gcc-4.4 を
debian/README.cross 等の手順にそってビルドしたものですが、
依存するパッケージを調整するなどして、lenny にもインストールできるようにしてあります。
</p>

<p class="info">
powerpcspe だけは sid/squeeze でないとインストールできません。
</p>

<h4>対応状況</h4>

<table style="text-align:center;">
  <tr>
    <th></th>
    <th>gcc-4.4</th>
    <th>g++-4.4</th>
  </tr><tr>
    <th>armel</th>
    <td class="unstable">△</td>
    <td class="unstable">△</td>
  </tr><tr>
    <th>mipsel</th>
    <td class="unstable">△</td>
    <td class="unstable">△</td>
  </tr><tr>
    <th>powerpc</th>
    <td class="stable">○</td>
    <td class="unstable">△</td>
  </tr><tr>
    <th>powerpcspe<sup style="color:red;font-size:xx-small;margin-left:0.2em;">New!</sup></th>
    <td class="stable">○</td>
    <td class="unstable">△</td>
  </tr><tr>
    <th>sh4</th>
    <td class="stable">○</td>
    <td class="unstable">△</td>
  </tr>
</table>

<ul>
  <li>○:動作を確認済み</li>
  <li>△:パッケージはあるが、まだ動作が確認できていないもの</li>
</ul>

<h4>インストール</h4>

<p><a href="http://www.debian.org/doc/manuals/apt-howto/ch-basico.ja.html#s-sources.list">sources.list (5)</a> に以下の apt line を加えます。</p>

<pre>
deb http://downloads.pylone.jp/cross-toolchain/squeeze/deb ./
</pre>

<p>(まだ行っていなければ) pylone.jp の鍵を導入します。</p>

<pre>
# <span class="cmdline">wget http://pylone.jp/pubkey.asc -O - | apt-key add -</span>
</pre>

<p>パッケージ情報を更新します。</p>

<pre>
# <span class="cmdline">apt-get update</span>
</pre>

<p>必要なツールをインストールします。<span class="example">TARGET-SUFFIX</span> は arm-linux-gnueabi, mipsel-linux-gnu, sh4-linux-gnu, powerpc-linux-gnu, powerpc-linux-gnuspe の何れかに置き換えてください。</p>

<h5>gcc-4.4</h5>
<pre>
# <span class="cmdline">apt-get install gcc-4.4-<span class="example">TARGET-SUFFIX</span></span>
</pre>

<h5>g++-4.4</h5>

<pre>
# <span class="cmdline">apt-get install g++-4.4-<span class="example">TARGET-SUFFIX</span></span>
</pre>

<h5>gdb</h5>

<pre>
# <span class="cmdline">apt-get install gdb-<span class="example">TARGET-SUFFIX</span></span>
</pre>

<h4>リンク</h4>

<ul>
  <li><a href="http://www.emdebian.org/tools/crossdev.html">Embedded Debian Cross Development Environments</a></li>
  <li><a href="http://pylone.jp/blog/cross_toolchain_deb">クロス開発環境のDebianパッケージ (gcc-3.4, gcc-4.1)</a></li>
</ul>


]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Fri, 17 Dec 2010 11:03 GMT</pubDate>
</item>
<item>
   <title>本社移転のお知らせ</title>
   <guid isPermaLink="false">announce_20100806</guid>
   <link>http://pylone.jp/blog/announce_20100806</link>
   <description><![CDATA[
<p>平素より格別のお引き立てを賜り誠にありがとうございます。</p>

<p>さて、この度弊社では業務拡大に伴い、下記に本社移転することになりましたのでご案内申し上げます。</p>

<p>これを機に、皆様の信頼にお応えできるよう倍旧の努力をしてまいる所存でございます。今後とも一層のご支援ご指導のほどお願い申し上げます。</p>

<h4>新住所</h4>
<p>〒160-0023 東京都新宿区西新宿7-11-3 平田ビル4F</p>

<div id="announce_20100806_map" style="width:100%;height:25em;"></div>


]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Thu, 19 Apr 2012 09:55 GMT</pubDate>
</item>
<item>
   <title>PE-201B販売終了について</title>
   <guid isPermaLink="false">bishop_announcement_eol_201b</guid>
   <link>http://pylone.jp/blog/bishop_announcement_eol_201b</link>
   <description><![CDATA[

<p>
平素より、弊社製品をお引き立ていただき厚く御礼申し上げます。
</p>

<p>
2010年6月8日をもちまして組込みLinux開発用CPUボード
<a href="http://pylone.jp/bishop/">Bishop</a>
6.4インチLCDタイプPE-201Bの販売を終了致します。
</p>

<p>
なお、4インチLCDタイプPE-201Aは引き続き販売を継続いたします。
</p>

<p>
今後とも、弊社ならびに弊社製品をご愛顧賜りますよう、お願い申しあげます。
</p>

<h4>本件に関するお問い合わせ</h4>

<p>E-mail: <a href="mailto:sales@pylone.jp">sales@pylone.jp</a></p>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Mon, 07 Jun 2010 16:37 GMT</pubDate>
</item>
<item>
   <title>年末年始休業のお知らせ</title>
   <guid isPermaLink="false">announce_20091211</guid>
   <link>http://pylone.jp/blog/announce_20091211</link>
   <description><![CDATA[
<p>
誠に勝手ではございますが、株式会社パイロンは2009年12月27日から2010年1月4日の間を休業とさせていただきます。ご迷惑をおかけいたしますが、よろしくお願いいたします。
</p>


]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Fri, 11 Dec 2009 09:46 GMT</pubDate>
</item>
<item>
   <title>PowerPCボードADS512101へのLinuxカーネルの移植</title>
   <guid isPermaLink="false">linux_for_ads512101</guid>
   <link>http://pylone.jp/blog/linux_for_ads512101</link>
   <description><![CDATA[


<p>Freescale社製PowerPCボード<a href="http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=ADS512101&amp;amp;tid=t32pspMPC512Xgst">ADS512101</a>へLinuxカーネルを移植する手順を紹介します。 </p>
<p>Freescale社ではADS512101用のLinuxBSPを公開しており、ソースコードから環境を構築することが可能ですが、Linuxカーネルのバージョンが2.6.24と若干古いため、比較的新しいバージョンを移植することが目的です。</p>
<p>予め</p>
<ul><li>PowerPC向けクロス開発ツール</li><li>tftpサーバ</li></ul>
<p>をインストールした環境を前提とします。</p>
<p>尚、使用するU-Boot、及びLinuxカーネルのバージョンは以下のとおりです。</p>
<ul><li>U-Boot 2009.1 </li><li>Linuxカーネル 2.6.28</li></ul>
<h4 id="linux_for_ads512101-55.2D.42.6F.6F.74.E3.81.AE.E3.83.93.E3.83.AB.E3.83.89">U-Bootのビルド</h4>
<p>オフィシャルサイトからソースコードを取得し、展開します。</p>
<pre>
% <span class="cmdline">wget ftp://ftp.denx.de/pub/u-boot/u-boot-2009.01.tar.bz2</span>
% <span class="cmdline">tar xjfv u-boot-2009.01.tar.bz2</span>
</pre>
<p>ターゲットにADS5121を指定してビルドします。</p>
<pre>
% <span class="cmdline">cd u-boot-2009.01</span>
% <span class="cmdline">make ads5121_config</span>
% <span class="cmdline">CROSS_COMPILE=powerpc-linux-gnu- make</span>
</pre>
<h4 id="linux_for_ads512101-4C.69.6E.75.78.E3.82.AB.E3.83.BC.E3.83.8D.E3.83.AB.E3.81.AE.E3.83.93.E3.83.AB.E3.83.89">Linuxカーネルのビルド</h4>
<p>オフィシャルサイトからソースコードを取得し、展開します。</p>
<pre>
% <span class="cmdline">wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.28.tar.bz2</span>
% <span class="cmdline">tar xjfv linux-2.6.28.tar.bz2</span>
</pre>
<p>ADS5121ボード用(v2.6.28向け)のパイロン製パッチを取得・適用します</p>
<pre>
% <span class="cmdline">wget http://code.pylone.jp/hg/linux-2.6-ads5121-mq/raw-file/tip/ads5121</span>
% <span class="cmdline">cd linux-2.6.28</span>
% <span class="cmdline">patch -p1 &lt; ../ads5121</span>
</pre>
<p>カーネル設定ファイルを設置後、必要に応じて設定を変更しビルドします(デフォルトでU-Boot形式が生成されます)。</p>
<pre>
% <span class="cmdline">cp arch/powerpc/configs/ads5121_defconfig .config</span>
% <span class="cmdline">ARCH=powerpc CROSS_COMPILE=powerpc-linux-gnu- make menuconfig</span>
% <span class="cmdline">ARCH=powerpc CROSS_COMPILE=powerpc-linux-gnu- make</span>
</pre>
<h4 id="linux_for_ads512101-E3.83.87.E3.83.90.E3.82.A4.E3.82.B9.E3.83.84.E3.83.AA.E3.83.BC.E3.81.AE.E3.83.93.E3.83.AB.E3.83.89">デバイスツリーのビルド</h4>
<p>デバイスツリーとは簡単に説明すると、</p>
<ul><li><a href="http://penguinppc.org/">PowerPC/Linux</a>固有の仕組みで、ボード依存のデバイス情報(I/Oアドレス等)を定義したもの</li><li>デバイスツリーを定義したソースファイル(*.dts)をコンパイラ(dtc)にてコンパイルしバイナリファイル(*.dtb)を得る</li><li>*.dtbファイルはLinuxカーネルイメージとは別にメモリ上に置かれ、Linuxカーネルはその内容からボードに関する各デバイス情報を把握する</li></ul>
<p>といったものです。</p>
<p>デバイスツリーコンパイラはLinuxカーネルに含まれているため、以下の様にしてADS5121向けデバイスツリーソースをコンパイルします。</p>
<pre>
% <span class="cmdline">cd (Linuxカーネルのディレクトリ)/arch/powerpc/boot</span>
% <span class="cmdline">./dtc -O dtb -o ads5121.dtb dts/mpc5121ads.dts</span>
</pre>
<h4 id="linux_for_ads512101-46.6C.61.73.68.E6.9B.B4.E6.96.B0">Flash更新</h4>
<p>tftpに備えて、これまで生成したバイナリファイルを、tftpサーバのディレクトリ(/srv/tftp/とします)にコピーしておきます。</p>
<pre>
# <span class="cmdline">cp (U-Bootのディレクトリ)/u-boot.bin /srv/tftp/</span>
# <span class="cmdline">cp (Linuxカーネルのディレクトリ)/arch/powerpc/boot/uImage /srv/tftp/</span>
# <span class="cmdline">cp (Linuxカーネルのディレクトリ)/arch/powerpc/boot/ads5121.dtb /srv/tftp/</span>
</pre>
<p>シリアルコンソールとしてシリアルクロスケーブルをHostPCとボードを接続します。通信設定は以下のとおりです。</p>
<table><tr><th style="width:30%;">ボーレート</th><td>115200</td></tr><tr><th>ビット長</th><td>8</td></tr><tr><th>フロー制御</th><td>なし</td></tr><tr><th>ストップビット</th><td>1</td></tr></table>
<p>ボードの電源を投入後、SW1を押下しボード標準のU-Bootを起動します。このとき、</p>
<pre>
Hit any key to stop autoboot:  
</pre>
<p>のカウントダウンが開始されたらキャンセルします。</p>
<p>tftpに備え、必要に応じて環境変数を設定します。
 (ここでは、tftpサーバとなるHostPCのIPアドレスを192.168.0.26、ボードのIPアドレスを192.168.0.120とします)</p>
<pre>
=&gt; <span class="cmdline">setenv netmask=255.255.255.0</span>
=&gt; <span class="cmdline">setenv ipaddr=192.168.0.120</span>
=&gt; <span class="cmdline">setenv serverip=192.168.0.26</span>
</pre>
<p>先ほどビルドしたU-BootをFlashに書き込みます。FlashのI/O開始アドレスは 0xFC000000 で、内容は以下の様になっています。</p>
<table><tr><th>アドレス</th><th>セクタ番号</th><th>内容</th></tr><tr><td>FC000000</td><td>0</td><td>Protected</td></tr><tr><td>FC040000</td><td>1</td><td>File system</td></tr><tr><td>FFC40000</td><td>241</td><td>Linux カーネル</td></tr><tr><td>FFEC0000</td><td>251</td><td>Device tree</td></tr><tr><td>FFF00000</td><td>252</td><td>U-Boot</td></tr><tr><td>FFF40000</td><td>253</td><td>U-Boot 環境変数</td></tr></table>
<p>まず、更新するU-BootをRAM上のダウンロード領域(0x20000000)へダウンロードします。</p>
<pre>
=&gt; <span class="cmdline">tftp 2000000 u-boot.bin</span>
Using FEC ETHERNET device
TFTP from server 192.168.0.26; our IP address is 192.168.0.120
Filename 'u-boot.bin'.
Load address: 0x2000000
Loading: ################################################
done
Bytes transferred = 241680 (3b010 hex)
</pre>
<p>そして、Flashのライトプロテクトを解除、該当のセクタを消去し、書き込みます。</p>
<pre>
=&gt; <span class="cmdline">protect off bank 1</span>
=&gt; <span class="cmdline">erase 1:252-252</span>
=&gt; <span class="cmdline">cp.b 2000000 fff00000 3b010</span>
</pre>
<p>上記cpコマンドのサイズ(0x3b010)はtftpコマンドで実際に転送されたサイズを指定しています</p>
<p>Linuxカーネルを更新する場合も同様の手順になります。</p>
<pre>
=&gt; <span class="cmdline">tftp 2000000 uImage</span>
=&gt; <span class="cmdline">protect off bank 1</span>
=&gt; <span class="cmdline">erase 1:241-250</span>
=&gt; <span class="cmdline">cp.b 2000000 FFC40000 &lt;size&gt;</span>
</pre>
<p class="info">FlashのライトプロテクトはU-Boot更新時に解除していますので続けて更新する場合は不要です。</p>
<p>デバイスファイルも同様の手順です。</p>
<pre>
=&gt; <span class="cmdline">tftp 2000000 mpc5121ads.dtb</span>
=&gt; <span class="cmdline">protect off bank 1</span>
=&gt; <span class="cmdline">erase 1:251-251</span>
=&gt; <span class="cmdline">cp.b 2000000 FFEC0000 &lt;size&gt;</span>
</pre>
<h4 id="linux_for_ads512101-E8.B5.B7.E5.8B.95">起動</h4>
<p>ボード標準のU-Boot起動コマンドでFlash上のrootfsから起動するには以下の様にします。</p>
<pre>
=&gt; <span class="cmdline">run jffs2boot</span>
</pre>
<p>カーネルコマンドラインを指定して起動する場合は以下の様にします</p>
<pre>
=&gt; <span class="cmdline">set bootargs console=ttyPSC0,115200 root=/dev/mtdblock1 rw rootfstype=jffs2 mem=256M</span>
=&gt; <span class="cmdline">bootm ffc40000 - ffec0000</span>
</pre>
<p>bootmコマンドの引数はそれぞれ、</p>
<ul><li>ffc40000 : カーネルのアドレス</li><li>- : initial ramdiskのアドレス(未使用なので省略を示す'-')</li><li>ffec0000 : デバイスツリーのアドレス</li></ul>
<p>と言う意味になります。</p>
<h4 id="linux_for_ads512101-46.6C.61.73.68.E3.82.92.E6.9B.B4.E6.96.B0.E3.81.9B.E3.81.9A.E3.81.AB.52.41.4D.E3.81.8B.E3.82.89.E8.B5.B7.E5.8B.95.E3.81.99.E3.82.8B.E5.A0.B4.E5.90.88">Flashを更新せずにRAMから起動する場合</h4>
<p>デバッグ段階などで、Linuxカーネルやデバイスツリーを頻繁に更新するようなケースで、毎回Flashに書き込みをしていては非効率です。そこで両ファイルをFlashに書き込まずにRAMから起動する場合は以下の様にします。</p>
<pre>
=&gt; <span class="cmdline">tftp 2000000 uImage</span>
=&gt; <span class="cmdline">tftp 3000000 ads5121.dtb</span>
=&gt; <span class="cmdline">set bootargs console=ttyPSC0,115200 root=/dev/mtdblock1 rw rootfstype=jffs2 mem=256M</span>
=&gt; <span class="cmdline">bootm 2000000 - 3000000</span>
</pre>
<p>または、Flash上のデバイスツリーファイルを使用する場合は、最後のbootmコマンドのデバイスツリーファイルのアドレスを、</p>
<pre>
=&gt; <span class="cmdline">bootm 2000000 - ffec0000</span>
</pre>
<p>とします。</p>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Tue, 30 Mar 2010 17:28 GMT</pubDate>
</item>
<item>
   <title>jffs2イメージをloopback mount</title>
   <guid isPermaLink="false">tips_jffs2_loopback_mount</guid>
   <link>http://pylone.jp/blog/tips_jffs2_loopback_mount</link>
   <description><![CDATA[

<p>block2mtdドライバを使えば、jffs2イメージファイルをloopbackでmountできます。</p>

<h4>erasesize 128K (131072) のrootfs.jffs2を/mntにmountする場合</h4>

<p>mount:</p>

<pre>
# <span class="cmdline">modprobe jffs2</span>
# <span class="cmdline">modprobe mtdblock</span>
# <span class="cmdline">losetup /dev/loop0 <span class="example">rootfs.jffs2</span></span>
# <span class="cmdline">modprobe block2mtd block2mtd=/dev/loop0,<span class="example">131072</span></span>
# <span class="cmdline">mount -t jffs2 -o ro /dev/mtdblock0 <span class="example">/mnt</span></span>
</pre>

<p>umount:</p>

<pre>
# <span class="cmdline">umount <span class="example">/mnt</span></span>
# <span class="cmdline">rmmod block2mtd</span>
# <span class="cmdline">losetup -d /dev/loop0</span>
</pre>


]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Thu, 12 Mar 2009 01:39 GMT</pubDate>
</item>
<item>
   <title>TOPPERS/JSPカーネル for Bishop</title>
   <guid isPermaLink="false">toppers_jsp_bishop</guid>
   <link>http://pylone.jp/blog/toppers_jsp_bishop</link>
   <description><![CDATA[


<p>組込みLinux開発用CPUボード<a href="http://pylone.jp/bishop/">Bishop</a>向けに移植したTOPPERS/JSPカーネルを公開します。使用したTOPPERS/JSPカーネルのバージョンは 1.4.3 です。</p>
<p>TOPPERS/JSPカーネルとは、μITRON4.0仕様に準拠したリアルタイムカーネルで、TOPPERSプロジェクトの開発成果です。 TOPPERS/JSPカーネルの詳細については<a href="http://www.toppers.jp/">TOPPERSプロジェクトサイト</a>を参照してください。</p>
<p class="alert">株式会社パイロンが独自に配布する非公式なバージョンです。本ソフトウェアについてTOPPERSプロジェクトへの質問はお控えください。</p>
<p class="alert">今回の移植は実験的なものです。実用レベルに達していないことを予めご了承ください。</p>
<table class="downloads"><tr class="title"><td colspan="4">TOPPERS/JSP カーネル for Bishop</td></tr><tr class="odd"><td>toppers-jsp-bishop-1.4.3-pylone0.tar.bz2<br /><span class="desc">ソースコード</span></td><td>1.4.3-pylone0</td><td class="dl"><a href="http://downloads.pylone.jp/src/toppers/toppers-jsp-bishop-1.4.3-pylone0.tar.bz2">ダウンロード</a></td><td>996.4KB</td></tr><tr class="even"><td>toppers-jsp-bishop-1.4.3-pylone0.bin<br /><span class="desc">ROMバイナリ</span></td><td>1.4.3-pylone0</td><td class="dl"><a href="http://downloads.pylone.jp/bishop/toppers/toppers-jsp-bishop-1.4.3-pylone0.bin">ダウンロード</a></td><td>28.0KB</td></tr></table>
<h4 id="toppers_jsp_bishop-E7.A7.BB.E6.A4.8D.E6.A6.82.E8.A6.81">移植概要</h4>
<p>ゼロからの移植ではなく、標準TOPPERS/JSPカーネルに既に含まれる同一のCPUコアを持つシステムをベースにして移植を行いました。 BishopのCPUコアはARM920Tであるため、ベースにするシステムはIntegrator/AP+CM920Tとしました。 </p>
<p>また、サポートしたデバイスは、TOPPERS/JSPカーネルの動作が最低限確認出来るものとして、 </p>
<ul><li>インターバルタイマ</li><li>UART</li></ul>
<p>のみとしました。</p>
<h4 id="toppers_jsp_bishop-42.69.73.68.6F.70.E3.82.A8.E3.83.9F.E3.83.A5.E3.83.AC.E3.83.BC.E3.82.BF.E3.81.AB.E3.82.88.E3.82.8B.E5.AE.9F.E8.A1.8C">Bishopエミュレータによる実行</h4>
<p><a href="http://pylone.jp/blog/tags/qemu+bishop">Bishopエミュレータ</a>にて実行する手順です。 予めBishopエミュレータをインストールしたLinux環境を想定しています。</p>
<p class="info">Windows上のBishopエミュレータでの実行手順、及びBishopボードでの実行手順に関しては後述の関連リンクを参照してください。</p>
<p>前述のTOPPERS/JSPカーネルのROMバイナリファイルをダウンロードして、ダウンロードしたディレクトリに移動後、</p>
<pre>
$ <span class="cmdline">mv toppers-jsp-bishop-1.4.3-pylone0.bin u-boot.bin</span>
</pre>
<p>としてファイル名称を変更して、</p>
<pre>
$ <span class="cmdline">qemu-bishop -M pe201a -serial stdio -kernel dummy -mtdblock /dev/null -nographic</span>
</pre>
<p>としてqemu-bishopを起動します。この時、</p>
<pre>failed to open: led.img
failed to open: led.img
failed to open: led.img
failed to open: led.img
failed to open: pe201a.img
bishop_reset: splash image splash480.bmp.gz was not found
bishop_reset: failed to load a kernel image file</pre>
<p>と、qemu-bishopがメッセージを出力しますがTOPPERS/JSPカーネルの動作に影響はありません。</p>
<p>次いで、</p>
<pre>TOPPERS/JSP Kernel Release 1.4 (patchlevel = 3) for ARM - Pylone Bishop board (Feb 24 2009, 15:21:58)
Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
                            Toyohashi Univ. of Technology, JAPAN
Copyright (C) 2004-2006 by Embedded and Real-Time Systems Laboratory
            Graduate School of Information Science, Nagoya Univ., JAPAN

System logging task is started on port 1.
Sample program starts (exinf = 0).
task1 is running (001).   |
task1 is running (002).   |
task1 is running (003).   |</pre>
<p>とTOPPERS/JSPカーネルのバナー、及びTOPPERS/JSP付属のサンプルプログラムからのシリアル出力が表示されると思います。</p>
<p>サンプルプログラムは起動中の3つのタスクに関する指示を与えられるようになっており、 例えばレディーキューを回転する'r'を入力すると、task1からtask2へと実行状態のタスクが切り替わります。</p>
<pre>Sample program starts (exinf = 0).
task1 is running (001).   |
task1 is running (002).   |
task1 is running (003).   |
#rot_rdq(three priorities)
task2 is running (001).     +
task2 is running (002).     +
task2 is running (003).     +</pre>
<p>サンプルプログラムの詳細に関しては、TOPPERS/JSPカーネルソースコード内の sample/sample1.c 冒頭のコメント文を参照してください。</p>
<p>TOPPERS/JSPカーネルに標準で付属するWindows上で動作するシミュレータでもタスクの状態を検証する事が出来ると思いますが、今回のBishopエミュレータによる実行も併用すれば、実機によるデバッグをさらに軽減することが出来ると思います。</p>
<h4 id="toppers_jsp_bishop-E9.96.A2.E9.80.A3.E3.83.AA.E3.83.B3.E3.82.AF">関連リンク</h4>
<ul><li><a href="http://pylone.jp/bishop/docs/toppers-jsp-manual.html">TOPPERS/JSP カーネル for Bishop マニュアル</a></li><li><a href="http://pylone.jp/bishop/docs/qemu-bishop-manual.html">Bishop エミュレータマニュアル</a></li></ul>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Wed, 25 Feb 2009 08:46 GMT</pubDate>
</item>
<item>
   <title>seq_fileの使い方</title>
   <guid isPermaLink="false">tips_seq_file</guid>
   <link>http://pylone.jp/blog/tips_seq_file</link>
   <description><![CDATA[


<p>Linuxカーネルが持つ、疑似ファイルの実装を補助する機構を紹介します。</p>
<p>カーネルからユーザ空間へデータを渡す手段としては、
/proc や /sys 以下に作成した疑似ファイルを使うことが多いでしょう。</p>
<p>渡したい値が単純な型の場合はカーネル組込みのヘルパ関数を使えば十分(<a href="http://pylone.jp/blog/tips_modparams_via_sysfs">sysfs 経由でモジュールパラメータにアクセス</a>、<a href="http://pylone.jp/blog/tips_modparams_via_sysfs_2">sysfs 経由でモジュールパラメータにアクセス (2)</a>)ですが、
より複雑なデータを渡すならば:</p>
<ul><li>疑似ファイルの内容となるテキスト量が大きい場合、カーネル空間に全体を保持たくない。</li><li>データ構造を操作に時間がかかる場合、ユーザ空間から要求された部分だけを処理することが望ましい。</li><li>同時に複数の読み手が存在したり、読み出し途中でデータが変更される場合の排他が必要。</li></ul>
<p>などの点を考慮するべきです。</p>
<p>本記事では、シーケンシャルな疑似ファイルを実装するために用意されている補助関数群について解説します。
カーネル内でも広く使われている機構なので、知っておくとコードを読む際にも役立つでしょう。</p>
<h4 id="tips_seq_file-73.65.71.5F.66.69.6C.65">seq_file</h4>
<p>VFSの層ではファイル中の位置はバイト単位で扱われます。固定長のバッファで扱える程度のデータ量ならよいのですが、
疑似ファイル内容を一括生成・保持できない場合、自力で出力済のバイト数管理やバイト単位でのシークを実装するのは手間がかかります。</p>
<p>fs/seq_file.cには出力したいデータが</p>
<ul><li>通し番号が付けられる(配列や木などの)要素の集合として表現できる </li><li>要素の番号がわかれば、その要素の文字列表現が得られる</li></ul>
<p>という条件を満たすとき、各要素へのアクセスをイテレータ操作として抽象化する仕組みが用意されています。</p>
<p>これを使うと、所定のアクセサを作成するだけで、VFSに登録する struct file_operations のメンバのほとんどをカーネルから提供される汎用関数でまかなうことができます。</p>
<h5 id="tips_seq_file-E4.BD.BF.E7.94.A8.E4.BE.8B">使用例</h5>
<p>サンプルとして、全ttyについてdebugfs上の疑似ファイル経由として
termios状態を一覧するカーネルモジュールのソース<a href="http://pylone.jp/static/tips_seq_file/termios_dumper.c">termios_dumper.c</a>を用意しました。</p>
<p>個別のttyの状態取得ならtcgetattr()でも十分なのですが、システム上で
現在activeな全てのttyをリストするために、カーネル内部のデータ構造を直接読んでいます。</p>
<h5 id="tips_seq_file-E7.96.91.E4.BC.BC.E3.83.95.E3.82.A1.E3.82.A4.E3.83.AB.E3.81.AE.E7.99.BB.E9.8C.B2">疑似ファイルの登録</h5>
<p>seq_fileを使用する場合でも、ファイルシステムへの疑似ファイルの登録は通常のまま</p>
<ol><li>struct file_operationsを作成</li><li>ファイルシステム毎の登録関数の呼び出し</li></ol>
<p>という手順で行います。</p>
<p>ただし、VFSに渡すstruct file_operationsのうち、読みこみ可能な疑似ファイルを実装するために必要な</p>
<ul><li>open</li><li>read</li><li>llseek</li><li>release</li></ul>
<p>のうちread, llseek, releaseとしては、seq_fileで実装されているseq_read, seq_lseek, seq_releaseをそのまま使用できます。</p>
<p>.openに登録する関数では、</p>
<ul><li>open()されたファイルに対して、seq_open()を呼んでハンドラを登録。</li><li>必要ならリソースの確保/ロック</li></ul>
<p>を行ないます。</p>
<p>サンプルでは登録先のファイルシステムをdebugfsとしたので、以下のようにしています。</p>
<div class="highlight"><pre><span class="k">static</span> <span class="k">const</span> <span class="k">struct</span> <span class="n">file_operations</span> <span class="n">fops</span> <span class="o">=</span> <span class="p">{</span>
    <span class="p">.</span><span class="n">open</span>    <span class="o">=</span> <span class="n">termios_dumper_open</span><span class="p">,</span>
    <span class="p">.</span><span class="n">read</span>    <span class="o">=</span> <span class="n">seq_read</span><span class="p">,</span>
    <span class="p">.</span><span class="n">llseek</span>  <span class="o">=</span> <span class="n">seq_lseek</span><span class="p">,</span>
    <span class="p">.</span><span class="n">release</span> <span class="o">=</span> <span class="n">seq_release</span><span class="p">,</span>
<span class="p">};</span>

<span class="p">...</span>

<span class="k">static</span> <span class="kt">int</span> <span class="n">__init</span> <span class="n">termios_dumper_init</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
<span class="p">{</span>
<span class="p">...</span>
    <span class="k">if</span><span class="p">(</span><span class="n">IS_ERR</span><span class="p">(</span><span class="n">fs_root</span> <span class="o">=</span> <span class="n">debugfs_create_dir</span><span class="p">(</span><span class="n">KBUILD_BASENAME</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">)))</span>
        <span class="k">return</span> <span class="n">PTR_ERR</span><span class="p">(</span><span class="n">fs_root</span><span class="p">);</span>

    <span class="k">if</span><span class="p">(</span><span class="n">IS_ERR</span><span class="p">(</span><span class="n">fs_file</span> <span class="o">=</span> <span class="n">debugfs_create_file</span><span class="p">(</span><span class="s">&quot;state&quot;</span><span class="p">,</span> <span class="mo">0444</span><span class="p">,</span> <span class="n">fs_root</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span>
                                            <span class="o">&amp;</span><span class="n">fops</span><span class="p">)))</span>
        <span class="k">return</span> <span class="n">PTR_ERR</span><span class="p">(</span><span class="n">fs_file</span><span class="p">);</span>
</pre></div>

<p>この例では、特にリソースの初期化が必要ないため、.openに登録したtest_seqfile_openの実装はseq_open()の呼び出しだけです。</p>
<div class="highlight"><pre><span class="k">static</span> <span class="kt">int</span> <span class="nf">test_seqfile_open</span><span class="p">(</span><span class="k">struct</span> <span class="n">inode</span> <span class="o">*</span><span class="n">inode</span><span class="p">,</span> <span class="k">struct</span> <span class="n">file</span> <span class="o">*</span><span class="n">file</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">return</span> <span class="n">seq_open</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">seqfile_ops</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>

<h4 id="tips_seq_file-73.65.71.5F.6F.70.65.72.61.74.69.6F.6E.73">seq_operations</h4>
<p>読み出し用のイテレータに必要な操作:</p>
<ul><li>初期化</li><li>終了処理</li><li>「次」の要素に移動</li><li>値（文字列表現）の取得</li></ul>
<p>は、</p>
<div class="highlight"><pre><span class="k">struct</span> <span class="n">seq_operations</span> <span class="p">{</span>
        <span class="kt">void</span> <span class="o">*</span> <span class="p">(</span><span class="o">*</span><span class="n">start</span><span class="p">)</span> <span class="p">(</span><span class="k">struct</span> <span class="n">seq_file</span> <span class="o">*</span><span class="n">m</span><span class="p">,</span> <span class="n">loff_t</span> <span class="o">*</span><span class="n">pos</span><span class="p">);</span>
        <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">stop</span><span class="p">)</span> <span class="p">(</span><span class="k">struct</span> <span class="n">seq_file</span> <span class="o">*</span><span class="n">m</span><span class="p">,</span> <span class="kt">void</span> <span class="o">*</span><span class="n">v</span><span class="p">);</span>
        <span class="kt">void</span> <span class="o">*</span> <span class="p">(</span><span class="o">*</span><span class="n">next</span><span class="p">)</span> <span class="p">(</span><span class="k">struct</span> <span class="n">seq_file</span> <span class="o">*</span><span class="n">m</span><span class="p">,</span> <span class="kt">void</span> <span class="o">*</span><span class="n">v</span><span class="p">,</span> <span class="n">loff_t</span> <span class="o">*</span><span class="n">pos</span><span class="p">);</span>
        <span class="kt">int</span> <span class="p">(</span><span class="o">*</span><span class="n">show</span><span class="p">)</span> <span class="p">(</span><span class="k">struct</span> <span class="n">seq_file</span> <span class="o">*</span><span class="n">m</span><span class="p">,</span> <span class="kt">void</span> <span class="o">*</span><span class="n">v</span><span class="p">);</span>
<span class="p">};</span>
</pre></div>

<p>の各メンバとして登録されます。</p>
<h5 id="tips_seq_file-73.74.61.72.74">start</h5>
<p>seq_file用のファイルがopen()された時に呼ばれます。</p>
<ul><li>使用するリソースの確保</li><li>イテレータの初期化</li></ul>
<p>を行ない、成功した場合には初期化済みのイテレータ、失敗した場合はNULLを返すことになるでしょう。</p>
<p>引数*posが0より大きい場合には、その位置を指すようにしたイテレータが返却されるべきです。</p>
<p>※ イテレータの更新処理は、(pos)ではなく、(*pos)を使います。</p>
<p>イテレータを進める処理は、next()からの処理でも必要となるため、共通化してもよいでしょう。サンプルでは update_iterator()としています。</p>
<h5 id="tips_seq_file-6E.65.78.74">next</h5>
<p>seq_fileが、現在のイテレータからのデータを消費し終えた時、
現在のイテレータと次に指すべき位置を引数として呼ばれます。</p>
<p>読み手のread()に対応していると考えてよいでしょう。
ただし、カーネルによる先読み処理の対象となるため、read()の度にかならず呼ばれるわけではありあせん。
また、読み手が小量のデータしが要求していなくても、さらに先まで要求されることがあります。</p>
<p>指定位置を指すイテレータを用意して、それへのポインタを返します。
この場合返却したポインタは後述するshow()への引数として使われます。</p>
<p>処理に失敗した場合はNULLを返却します。このとき、続いてstop()が呼ばれますが、stop()の引数にはNULLしか渡らないため、リソースの開放にイテレータが必要なら、next()内で済ませておく必要があります。</p>
<h5 id="tips_seq_file-73.74.6F.70">stop</h5>
<p>読み手に十分なテキストが渡ったか、next()からデータがもうないことを通知した(NULLを返した)後に呼びだされます。</p>
<p>リソースの開放を行なうべきですが、引数として渡されるポインタはNULLの場合があることに注意が必要です。</p>
<h5 id="tips_seq_file-73.68.6F.77">show</h5>
<p>引数として渡されたイテレータから、読み手に渡す（疑似ファイルの内容となる）文字列を構築します。</p>
<p>構築にはseq_printf(), seq_puts()などのヘルパ関数を使用します。これらのヘルパは繰替えし呼ぶこともでき(追記されます)、最終的な長さは自動的に管理されるので、成功時には0を返せば適切に処理されます。</p>
<p>ただし、一度に構築できる文字列の全長はPAGE_SIZE程度なので、長くなりすぎる場合はイテレータの構造を変える必要があるでしょう。</p>
<p>サンプルコードでは、現在のイテレータが指しているtermiosの情報を、seq_printf()経由でgrepしやすい書式に変換しています。</p>
<h4 id="tips_seq_file-E3.82.B5.E3.83.B3.E3.83.97.E3.83.AB.74.65.72.6D.69.6F.73.5F.64.75.6D.70.65.72.2E.63.E3.81.AB.E3.81.A4.E3.81.84.E3.81.A6.E3.81.AE.E8.A3.9C.E8.B6.B3">サンプルtermios_dumper.cについての補足</h4>
<p>サンプルとして使用したコードtermios_dumper.cでは、カーネルから公開されていはいttyドライバのリストの先頭要素のアドレスを知るために、struct tty_driverのmagic要素を用いて検索していますが、これは低い確率ですが(メモリ中の値が偶然TTY_MAGICと一致したり、get_current_tty()が呼べない場合に)失敗する可能性のある処理です。
確実を期すなら、カーネルの公開シンボルにtty coreのtty_driversを追加するか、専用のアクセサを追加するべきでしょう。</p>
<p>また、ttyサブシステム内の構造体を辿る処理はttyのmutexを取得した上で行うべきなのですが、</p>
<ul><li>tty_mutexを占有すると副作用が大きい(ロック中に新規にttyを開こうとした他のプロセス全てが停止するため）</li><li>改造して失敗したときにシステムをロックしてしまう</li><li>今回のサンプルでは読み出ししかおこなわないため、整合性が崩れても大きな問題にならない</li></ul>
<p>ため、デモ目的では不要と判断してコメントアウトしてあります。
このため、疑似ファイルからの読出し途中でttyが増減すると、表示の一貫性が崩れることがあるでしょう。
同様の理由で、kobjectの参照数カウントについても省略しています。</p>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Fri, 23 Apr 2010 02:37 GMT</pubDate>
</item>
<item>
   <title>Bishopバージョンアップのお知らせ</title>
   <guid isPermaLink="false">bishop_rev2</guid>
   <link>http://pylone.jp/blog/bishop_rev2</link>
   <description><![CDATA[


<p>組込みLinux開発用CPUボード<a href="http://pylone.jp/bishop/">Bishop</a>に同梱されるソフトウェアのバージョンアップを実施いたします。</p>
<table><tr><th style="width:30%;"></th><th>旧バージョン</th><th>新バージョン</th></tr><tr><th>U-Boot</th><td style="text-align:center;" colspan="2">1.2.0-pylone5 (変更なし)</td></tr><tr><th>Linuxカーネル</th><td style="text-align:center;">2.6.22.1-pylone0</td><td style="text-align:center;">2.6.26.8-pylone0</td></tr><tr><th>ルートファイルシステム</th><td style="text-align:center;">Debian GNU/Linux etch 4.0r3</td><td style="text-align:center;">Debian GNU/Linux etch 4.0r5</td></tr></table>
<p>2009年1月以降にご注文いただいた分から新バージョンにて出荷いたします。</p>
<h4 id="bishop_rev2-E6.97.A2.E3.81.AB.E3.81.94.E8.B3.BC.E5.85.A5.E3.81.84.E3.81.9F.E3.81.A0.E3.81.84.E3.81.9F.E3.81.8A.E5.AE.A2.E6.A7.98.E3.81.B8">既にご購入いただいたお客様へ</h4>
<p>2008年12月までにご購入いただいたお客様につきましては、別途バージョンアップ手順をご案内いたします。</p>
<ul><li><a href="http://pylone.jp/bishop/docs/update_to_rev2.html">バージョンアップ手順</a></li></ul>
<h4 id="bishop_rev2-E9.96.A2.E9.80.A3.E3.83.AA.E3.83.B3.E3.82.AF">関連リンク</h4>
<ul><li><a href="http://pylone.jp/bishop/spec-software.html">Bishop - ソフトウェア仕様</a></li></ul>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Sun, 15 Feb 2009 03:50 GMT</pubDate>
</item>
<item>
   <title>Bishopエミュレータ正式版リリース</title>
   <guid isPermaLink="false">qemu_bishop_0.9.1_pylone1</guid>
   <link>http://pylone.jp/blog/qemu_bishop_0.9.1_pylone1</link>
   <description><![CDATA[


<p>組込みLinux開発用CPUボード<a href="http://pylone.jp/bishop/">Bishop</a>エミュレータの正式版をリリースしました。</p>
<p class=""><a href="http://farm4.static.flickr.com/3224/3124050495_734a0ed9ba_o.png" title="flickr:スクリーンショット"><img src="http://farm4.static.flickr.com/3224/3124050495_0f2b581105.jpg" width="500" height="411" alt="スクリーンショット" /></a></p>
<h4 id="qemu_bishop_0.9.1_pylone1-E3.83.89.E3.82.AD.E3.83.A5.E3.83.A1.E3.83.B3.E3.83.88">ドキュメント</h4>
<ul><li><a href="http://pylone.jp/bishop/docs/qemu-bishop-manual.html">Bishop エミュレータマニュアル</a></li><li><a href="http://pylone.jp/bishop/spec-software.html#g1-3">ソフトウェア仕様</a></li></ul>
<h4 id="qemu_bishop_0.9.1_pylone1-E3.83.80.E3.82.A6.E3.83.B3.E3.83.AD.E3.83.BC.E3.83.89">ダウンロード</h4>
<table class="downloads"><tr class="title"><td colspan="4">Bishopエミュレータ</td></tr><tr class="odd"><td>qemu-bishop-0.9.1-pylone1.tar.bz2<br /><span class="desc">ソースコード</span></td><td>0.9.1-pylone1</td><td class="dl"><a href="http://downloads.pylone.jp/src/qemu-bishop-0.9.1-pylone1.tar.bz2">ダウンロード</a></td><td>2.3MB</td></tr><tr class="even"><td>qemu-bishop-0.9.1-pylone1-setup.exe<br /><span class="desc">win32 installer</span></td><td>0.9.1-pylone1</td><td class="dl"><a href="http://downloads.pylone.jp/bishop/qemu-bishop-0.9.1-pylone1-setup.exe">ダウンロード</a></td><td>1.7MB</td></tr><tr class="odd"><td>qemu-bishop_0.9.1-pylone1-1_i386.deb<br /><span class="desc">deb</span></td><td>0.9.1-pylone1-1</td><td class="dl"><a href="http://downloads.pylone.jp/tools/deb/qemu-bishop_0.9.1-pylone1-1_i386.deb">ダウンロード</a></td><td>461.0KB</td></tr><tr class="even"><td>qemu-bishop-0.9.1_pylone1-1.i386.rpm<br /><span class="desc">rpm</span></td><td>0.9.1-pylone1-1</td><td class="dl"><a href="http://downloads.pylone.jp/tools/rpm/qemu-bishop-0.9.1_pylone1-1.i386.rpm">ダウンロード</a></td><td>462.8KB</td></tr></table>
<h4 id="qemu_bishop_0.9.1_pylone1-E9.96.A2.E9.80.A3.E8.A8.98.E4.BA.8B">関連記事</h4>
<ul><li><a href="http://pylone.jp/blog/tags/qemu+bishop">Bishopエミュレータに関する記事</a></li></ul>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Mon, 26 Apr 2010 18:56 GMT</pubDate>
</item>
<item>
   <title>Code Stage用S3C2440Aペリフェラル定義ファイルの公開</title>
   <guid isPermaLink="false">codestage_s3c2440a_peri</guid>
   <link>http://pylone.jp/blog/codestage_s3c2440a_peri</link>
   <description><![CDATA[


<p class=""><a href="http://farm4.static.flickr.com/3265/3117956236_4fc02ea499_z.jpg?zz=1" title="flickr:codestage-s3c2440"><img src="http://farm4.static.flickr.com/3265/3117956236_4fc02ea499_m.jpg" width="240" height="183" alt="codestage-s3c2440" /></a></p>
<p><a href="http://www.bitran.co.jp/">ビットラン</a> JTAGエミュレータ Code Debugger のデバッガソフト
<a href="http://www.bitran.co.jp/ice/codestage.html">Code Stage</a>
用 S3C2440Aペリフェラル定義ファイルを
<a href="http://pylone.jp/bishop/docs/dr01_s3c2440a_pri.html">公開</a>
します。</p>
<p>定義ファイルをデバッガソフトに追加することによって、
直感的なユーザインタフェースでS3C2440Aのペリフェラルレジスタへアクセスできます。</p>
<p>入手方法や使い方については
「<a href="http://pylone.jp/bishop/docs/dr01_s3c2440a_pri.html">DR-01用S3C2440Aペリフェラル定義ファイル</a>」
を参照してください。</p>
<h4 id="codestage_s3c2440a_peri-E9.96.A2.E9.80.A3.E8.A8.98.E4.BA.8B">関連記事</h4>
<ul><li><a href="http://pylone.jp/blog/dr01_s3c2440a_pri">DR-01用S3C2440Aペリフェラル定義ファイルの公開</a></li></ul>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Mon, 21 Mar 2011 06:36 GMT</pubDate>
</item>
<item>
   <title>Bishop向けLinuxカーネルのテスト版 - 2.6.26.8</title>
   <guid isPermaLink="false">bishop_linux-2.6.26.8</guid>
   <link>http://pylone.jp/blog/bishop_linux-2.6.26.8</link>
   <description><![CDATA[


<p class="info">正式版を公開しました - 記事: <a href="http://pylone.jp/blog/bishop_rev2">Bishopバージョンアップのお知らせ</a></p>
<p><a href="http://pylone.jp/bishop/">Bishop</a> 向け Linux カーネルのテスト版 (2.6.26.8) を公開します。</p>
<table class="downloads"><tr class="title"><td colspan="4">Linux-2.6.26.8-pylone0</td></tr><tr class="odd"><td>linux-2.6.26.8-pylone0.tar.gz<br /><span class="desc">ソースコード</span></td><td>2.6.26.8-pylone0</td><td class="dl"><a href="http://downloads.pylone.jp/src/linux-2.6.26.8-pylone0.tar.gz">ダウンロード</a></td><td>61.4MB</td></tr><tr class="even"><td>uImage<br /><span class="desc">バイナリ</span></td><td>2.6.26.8-pylone0</td><td class="dl"><a href="http://downloads.pylone.jp/bishop/romimages-20081216/uImage">ダウンロード</a></td><td>1.7MB</td></tr></table>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Sun, 15 Feb 2009 03:50 GMT</pubDate>
</item>
<item>
   <title>年末年始休業のお知らせ</title>
   <guid isPermaLink="false">announce_20081215</guid>
   <link>http://pylone.jp/blog/announce_20081215</link>
   <description><![CDATA[
<p>
誠に勝手ではございますが、株式会社パイロンは平成20年12月27日から平成21年1月4日の間を休業とさせていただきます。ご迷惑をおかけいたしますが、よろしくお願いいたします。
</p>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Sat, 14 Feb 2009 15:45 GMT</pubDate>
</item>
<item>
   <title>sysfs 経由でモジュールパラメータにアクセス (2)</title>
   <guid isPermaLink="false">tips_modparams_via_sysfs_2</guid>
   <link>http://pylone.jp/blog/tips_modparams_via_sysfs_2</link>
   <description><![CDATA[


<p><a href="http://pylone.jp/blog/tips_modparams_via_sysfs">以前の記事</a>で sysfs からモジュールパラメータにアクセスする簡単な方法を紹介しましたが、今回はパラメータの型を独自に定義する例として <a href="http://en.wikipedia.org/wiki/Base_36">Base36</a> のパラメータを持つ簡単なモジュールを紹介します。</p>
<h4 id="tips_modparams_via_sysfs_2-E3.82.B3.E3.83.BC.E3.83.89">コード</h4>
<p>base36param.c:</p>
<div class="highlight"><pre><span class="cp">#include &lt;linux/init.h&gt;</span>
<span class="cp">#include &lt;linux/module.h&gt;</span>
<span class="cp">#include &lt;linux/moduleparam.h&gt;</span>
<span class="cp">#include &lt;linux/kernel.h&gt;</span>

<span class="k">static</span> <span class="kt">int</span> <span class="n">stored_value</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

<span class="k">static</span> <span class="kt">int</span> <span class="nf">param_set_base36</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">val</span><span class="p">,</span> <span class="k">struct</span> <span class="n">kernel_param</span> <span class="o">*</span><span class="n">kp</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">if</span> <span class="p">((</span><span class="sc">&#39;0&#39;</span> <span class="o">&lt;=</span> <span class="n">val</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">val</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="sc">&#39;9&#39;</span><span class="p">))</span> <span class="p">{</span>
            <span class="n">stored_value</span> <span class="o">=</span> <span class="n">val</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">-</span><span class="sc">&#39;0&#39;</span><span class="p">;</span>
            <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">if</span> <span class="p">((</span><span class="sc">&#39;a&#39;</span> <span class="o">&lt;=</span> <span class="n">val</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">val</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="sc">&#39;z&#39;</span><span class="p">))</span> <span class="p">{</span>
            <span class="n">stored_value</span> <span class="o">=</span> <span class="n">val</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">-</span><span class="sc">&#39;a&#39;</span> <span class="o">+</span><span class="mi">10</span><span class="p">;</span>
            <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">if</span> <span class="p">((</span><span class="sc">&#39;A&#39;</span> <span class="o">&lt;=</span> <span class="n">val</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">val</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="sc">&#39;Z&#39;</span><span class="p">))</span> <span class="p">{</span>
            <span class="n">stored_value</span> <span class="o">=</span> <span class="n">val</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">-</span><span class="sc">&#39;A&#39;</span> <span class="o">+</span><span class="mi">10</span><span class="p">;</span>
            <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="o">-</span><span class="n">EINVAL</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">static</span> <span class="kt">int</span> <span class="nf">param_get_base36</span><span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="n">buffer</span><span class="p">,</span> <span class="k">struct</span> <span class="n">kernel_param</span> <span class="o">*</span><span class="n">kp</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">stored_value</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="o">||</span> <span class="mi">36</span> <span class="o">&lt;</span> <span class="n">stored_value</span><span class="p">)</span>
        <span class="k">return</span> <span class="o">-</span><span class="n">EINVAL</span><span class="p">;</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">stored_value</span> <span class="o">&lt;</span> <span class="mi">10</span><span class="p">)</span>
        <span class="n">buffer</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="sc">&#39;0&#39;</span> <span class="o">+</span> <span class="n">stored_value</span><span class="p">;</span>
    <span class="k">else</span>
        <span class="n">buffer</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="sc">&#39;A&#39;</span> <span class="o">+</span> <span class="n">stored_value</span> <span class="o">-</span> <span class="mi">10</span><span class="p">;</span>

    <span class="n">buffer</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="sc">&#39;\0&#39;</span><span class="p">;</span>

    <span class="k">return</span> <span class="mi">2</span><span class="p">;</span>
<span class="p">}</span>

<span class="cm">/* dummy checker */</span>
<span class="cp">#define param_check_base36(name, p) __param_check(name, p, void);</span>

<span class="k">static</span> <span class="kt">int</span> <span class="n">__init</span> <span class="nf">base36param_init</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
<span class="p">{</span>
    <span class="n">printk</span><span class="p">(</span><span class="n">KERN_INFO</span> <span class="s">&quot;%s called</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">__func__</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="cm">/* succeeded */</span>
<span class="p">}</span>

<span class="k">static</span> <span class="kt">void</span> <span class="n">__exit</span> <span class="nf">base36param_cleanup</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
<span class="p">{</span>
    <span class="n">printk</span><span class="p">(</span><span class="n">KERN_INFO</span> <span class="s">&quot;%s called</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">__func__</span><span class="p">);</span>
    <span class="k">return</span><span class="p">;</span>
<span class="p">}</span>

<span class="n">module_init</span><span class="p">(</span><span class="n">base36param_init</span><span class="p">);</span>
<span class="n">module_exit</span><span class="p">(</span><span class="n">base36param_cleanup</span><span class="p">);</span>

<span class="n">module_param</span><span class="p">(</span><span class="n">stored_value</span><span class="p">,</span> <span class="n">base36</span><span class="p">,</span> <span class="mo">0644</span><span class="p">);</span>
<span class="n">MODULE_PARM_DESC</span><span class="p">(</span><span class="n">stored_value</span><span class="p">,</span> <span class="s">&quot;can write [0-9A-Za-z], read as [0-9A-Z].&quot;</span><span class="p">);</span>

<span class="n">MODULE_LICENSE</span><span class="p">(</span><span class="s">&quot;GPL&quot;</span><span class="p">);</span>
<span class="n">MODULE_AUTHOR</span><span class="p">(</span><span class="s">&quot;MINAMI Hirokazu&quot;</span><span class="p">);</span>
<span class="n">MODULE_DESCRIPTION</span><span class="p">(</span><span class="s">&quot;sample module which has a custom typed parameter&quot;</span><span class="p">);</span>
</pre></div>

<p>Makefile:</p>
<div class="highlight"><pre><span class="nv">KERNEL_SRC</span> <span class="o">=</span> /lib/modules/<span class="k">$(</span>shell uname -r<span class="k">)</span>/build
<span class="c">#CROSS_COMPILE =</span>
<span class="c">#ARCH =</span>
BUILD_DIR :<span class="o">=</span> <span class="k">$(</span>shell <span class="nb">pwd</span><span class="k">)</span>
<span class="nv">VERBOSE</span> <span class="o">=</span> 0

obj-m :<span class="o">=</span> base36param.o

all:
	make -C <span class="k">$(</span>KERNEL_SRC<span class="k">)</span> <span class="nv">SUBDIRS</span><span class="o">=</span><span class="k">$(</span>BUILD_DIR<span class="k">)</span> <span class="nv">KBUILD_VERBOSE</span><span class="o">=</span><span class="k">$(</span>VERBOSE<span class="k">)</span> modules

clean:
	rm -rf *.o *.ko *.mod.c .*.cmd .tmp_versions *~ Module.symvers
</pre></div>

<h4 id="tips_modparams_via_sysfs_2-E3.83.93.E3.83.AB.E3.83.89">ビルド</h4>
<p>環境に応じて Makefile の KERNEL_SRC, CROSS_COMPILE, ARCH を修正し、make を実行します。</p>
<h4 id="tips_modparams_via_sysfs_2-E4.BD.BF.E3.81.84.E6.96.B9">使い方</h4>
<p>値 (Base36) をパラメータに書き込む:</p>
<pre>
# <span class="cmdline">echo '<span class="example">h</span>' &gt; /sys/module/base36param/parameters/stored_value</span>
</pre>
<p>パラメータを読み込む:</p>
<pre>
# <span class="cmdline">cat /sys/module/base36param/parameters/stored_value</span>
<span class="example">H</span>
</pre>
<h4 id="tips_modparams_via_sysfs_2-E8.A7.A3.E8.AA.AC">解説</h4>
<p>モジュールパラメータに独自の型を持たせるためには、
module_param を使います。</p>
<div class="highlight"><pre><span class="n">module_param</span><span class="p">(</span><span class="n">stored_value</span><span class="p">,</span> <span class="n">base36</span><span class="p">,</span> <span class="mo">0644</span><span class="p">);</span>
</pre></div>

<p>module_param は以下のようなマクロです。</p>
<pre>
/* Helper functions: type is byte, short, ushort, int, uint, long,
   ulong, charp, bool or invbool, or XXX if you define param_get_XXX,
   param_set_XXX and param_check_XXX. */
#define module_param_named(name, value, type, perm)			   \
	param_check_##type(name, &amp;(value));				   \
	module_param_call(name, <span class="example">param_set_##type</span>, <span class="example">param_get_##type</span>, &amp;value, perm); \
	__MODULE_PARM_TYPE(name, #type)

#define module_param(name, type, perm)				\
	module_param_named(name, name, type, perm)
</pre>
<p>param_set_##type と param_get_##type が肝です。
sysfs 経由でパラメータが読み書きされると、ここで登録される
param_set_##type と param_get_##type が呼ばれます。
(module_param_call の説明は省きます)</p>
<p>base36param.c の場合、プリプロセッサによってマクロ展開された
param_set_base36 と param_get_base36 が登録されることになります。</p>
<p>マクロのコメントにある通り、 独自の型ではなく int などの場合は
あらかじめ用意されているヘルパー関数群が使われるので
自前で用意する必要はありません。</p>
<p>先日公開した <a href="http://pylone.jp/blog/virtual_battery">仮想バッテリドライバ</a> はこれの応用です。
ファイルとして読み書きできるので
ユーザ空間のプログラムとヘッダを共有する必要がない点は ioctl() より使い勝手がよいかもしれません。</p>
<h4 id="tips_modparams_via_sysfs_2-E9.96.A2.E9.80.A3.E8.A8.98.E4.BA.8B">関連記事</h4>
<ul><li><a href="http://pylone.jp/blog/tips_modparams_via_sysfs">sysfs 経由でモジュールパラメータにアクセス</a></li><li><a href="http://pylone.jp/blog/virtual_battery">Virtual Battery Driver</a></li></ul>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Sun, 08 Apr 2012 11:29 GMT</pubDate>
</item>
<item>
   <title>Virtual Battery Driver</title>
   <guid isPermaLink="false">virtual_battery</guid>
   <link>http://pylone.jp/blog/virtual_battery</link>
   <description><![CDATA[

<p>
Linux kernel の機能の一部である Power supply class を利用した、仮想バッテリドライバを<a href="http://downloads.pylone.jp/src/virtual_battery/">公開</a>します。
</p>

<h4>概要</h4>
<p>
Power supply class は、sysfs 、及び uevent によってユーザースペースから電源状態に関するイベントの監視を可能にする仕組みですが、
本ドライバはその仕組みを利用して、コマンドラインからAC電源、バッテリに関するイベントを生成し、
電源状態の変化を仮想的に再現するためのものです。
</p>
<p>
パイロンでは、バッテリを持たないカスタムボードへ <a href="http://www.android.com/">Android</a> を移植する際に使用しています。
</p>

<h4>前提</h4>
<p>
本ドライバを使用するには、Linux kernel 2.6.25 以降を、
</p>
<ul>
<li>CONFIG_POWER_SUPPLY</li>
</ul>
<p>
を有効にしてコンパイルした環境が必要です。
</p>
<p>
また、Android で Power supply class から uevent を受けとるには、
</p>
<ul>
<li>CONFIG_SYSFS_DEPRECATED_V2</li>
</ul>

<p>
も有効にする必要があります。
</p>
<h4>導入手順</h4>

<ol>
<li> アーカイブを展開して、Makefile 中の各変数である、
<ul>
<li>組み込むカーネルのソースへのパス(本Makefileでは'KERNEL_SRC'としています)</li>
<li>ARCH</li>
<li>CROSS_COMPILE</li>
</ul>
の内容を利用する環境に合わせて修正し、
<pre>
# <span class="cmdline">make</span>
</pre>
します。(または、各変数をコマンドラインから直接、定義します)
</li>

<li>生成したモジュールを、対象のカーネルに組み込みます。
<pre>
# <span class="cmdline">insmod virtual_battery.ko</span>
</pre>
<p class="alert">
予め他のPower supply classドライバがロードされている状態で本ドライバを登録すると、Kernel Panic が起きてしまう点にご注意ください。
</p>
</li>
</ol>

<p>
以上の手順を実行すると、sysfs のプラットフォームデバイスディレクトリ（/sys/devices/platform/） に、
「virtual_battery.0」というディレクトリが生成されいるはずです。
</p>
<pre>
$ <span class="cmdline">ls /sys/devices/platform/virtual_battery.0/</span>
bus                   power_supply:ac       uevent
modalias              power_supply:battery
power                 subsystem
</pre>

<p>
また、sysfs のモジュールパラメータのディレクトリにも以下のようなディレクトリパスと仮想ファイル群が生成されているはずです。
</p>
<pre>
$ <span class="cmdline">ls /sys/module/virtual_battery/parameters/</span>
ac_status           battery_health      battery_status
battery_capacity    battery_present     battery_technology
</pre>

<h4>使用方法</h4>

<p>
電源状態を変更するには、sysfs に生成されたモジュールパラメータを使用します。
</p>
<p>
各仮想ファイルの使用方法は以下の通りです。
</p>
<table>
<tr>
<th></th><th>パラメータ</th><th>初期状態</th><th>説明</th>
</tr><tr>

<th>ac_status</th>
<td>on<br />off</td>
<td>on</td>
<td>AC 接続の状態を変更します。</td>
</tr><tr>
<th>battery_status</th>
<td>charging<br />discharging<br />not-charging<br />full</td>
<td>charging</td>
<td>バッテリの状態を変更します。</td>
</tr><tr>

<th>battery_health</th>
<td>good<br />overheat<br />dead<br />overvoltage<br />failure</td>
<td>good</td>
<td>バッテリの劣化状態を変更します。</td>

</tr><tr>
<th>battery_present</th>
<td>true<br />false</td>
<td>true</td>
<td>バッテリの装着状態を変更します。</td>

</tr><tr>
<th>battery_technology</th>
<td>NiMH<br />LION<br />LIPO<br />LiFe<br />NiCd<br />LiMn</td>
<td>LION</td>
<td>バッテリの種類を変更します。</td>

</tr><tr>
<th>battery_capacity</th>
<td>0から100</td>
<td>50</td>
<td>バッテリの残容量を変更します。</td>
</tr>
</table>

<h5>使用例</h5>
<p>
まずは現在の各値を確認してみます。sysfs の class ディレクトリ以下に、power_supply ディレクトリがあるので、
そこの uevent を利用すると一覧を取得することができます。
</p>
<pre>
# <span class="cmdline">cat  /sys/class/power_supply/uevent</span>
PHYSDEVPATH=/devices/platform/virtual_battery.0
PHYSDEVBUS=platform
POWER_SUPPLY_NAME=battery
POWER_SUPPLY_TYPE=Battery
POWER_SUPPLY_STATUS=Charging
POWER_SUPPLY_HEALTH=Good
POWER_SUPPLY_PRESENT=1
POWER_SUPPLY_TECHNOLOGY=Li-ion
POWER_SUPPLY_CAPACITY=50
</pre>
<p>
バッテリ容量とバッテリ状態を変更してみます。
</p>

<pre>
# <span class="cmdline">echo 30 &gt; /sys/module/virtual_battery/parameters/battery_capacity</span>
# <span class="cmdline">echo discharging &gt; /sys/module/virtual_battery/parameters/battery_status</span>
</pre>
<p>
変更されているか確認してみます。
</p>
<pre>
# <span class="cmdline">cat /sys/module/virtual_battery/parameters/battery_capacity</span>
30
# <span class="cmdline">cat /sys/module/virtual_battery/parameters/battery_status</span>
discharging
</pre>
<p>
変更したタイミングで uevent が発生するので、バッテリの状況を動的に把握することが可能です。
</p>
<p>
組み込み用途向けのカスタムボードでは、バッテリを搭載していない事も多いと思いますが、
そのような環境においても、本ドライバを利用することによって、ユーザスペースにおける電源管理の評価を行えるのではないでしょうか。
</p>

<h4>リンク</h4>

<ul>
  <li><a href="http://blog.sola-dolphin-1.net/archives/4042751.html">Test power driver（Virtual Battery Driver）について</a></li>
</ul>


]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Wed, 09 May 2012 15:56 GMT</pubDate>
</item>
<item>
   <title>BishopエミュレータBeta4リリース</title>
   <guid isPermaLink="false">qemu_bishop_beta4</guid>
   <link>http://pylone.jp/blog/qemu_bishop_beta4</link>
   <description><![CDATA[


<p class="info">正式版を公開しました - 記事: <a href="http://pylone.jp/blog/qemu_bishop_0.9.1_pylone1">Bishopエミュレータ正式版リリース</a></p>
<p>組込みLinux開発用CPUボード<a href="http://pylone.jp/bishop/">Bishop</a>エミュレータBeta4を公開します。</p>
<h4 id="qemu_bishop_beta4-E6.9B.B4.E6.96.B0.E5.B1.A5.E6.AD.B4">更新履歴</h4>
<ul><li>2008/9/26: 初版公開</li></ul>
<h4 id="qemu_bishop_beta4-42.65.74.61.33.E3.81.8B.E3.82.89.E3.81.AE.E5.A4.89.E6.9B.B4.E7.82.B9">Beta3からの変更点</h4>
<h5 id="qemu_bishop_beta4-E3.83.9C.E3.83.BC.E3.83.89.E7.94.BB.E5.83.8F.2F.4C.45.44.E7.8A.B6.E6.85.8B.E8.A1.A8.E7.A4.BA.E3.81.AE.E3.82.B5.E3.83.9D.E3.83.BC.E3.83.88">ボード画像/LED状態表示のサポート</h5>
<p>Bishopの実機では、GPIOポートに対して出力を行うことで、基板上でLED5/LED4/LED8/LED7とラベルされたLEDを制御することができます。</p>
<p>QEMUウィンドウ内にLCDの内容だけでなく、これらのLED状態も表示されるようにしました。起動初期段階のデバッグ等に利用できます。</p>
<h4 id="qemu_bishop_beta4-E3.83.AA.E3.83.AA.E3.83.BC.E3.82.B9.E5.86.85.E5.AE.B9">リリース内容</h4>
<p>本エミュレータは、オープンソースのプロセッサエミュレータ
<a href="http://www.qemu.org/">QEMU</a>の開発版をベースに、Bishop向けの機能を追加したものです。
本リリースでは <a href="http://pylone.jp/blog/qemu_bishop_beta3">Beta3</a>
と比較してエミュレーション可能な機能自体に変更はありません。</p>
<h5 id="qemu_bishop_beta4-E5.90.84.E7.A8.AE.E3.83.9A.E3.83.AA.E3.83.95.E3.82.A7.E3.83.A9.E3.83.AB.E3.81.AE.E3.82.B5.E3.83.9D.E3.83.BC.E3.83.88.E7.8A.B6.E6.B3.81">各種ペリフェラルのサポート状況</h5>
<table><tr><th colspan="2">ペリフェラル</th><th>状況</th><th>注</th></tr><tr><th colspan="2">NOR</th><td class="unstable" style="text-align:center">△</td><td>ROMとして表現され、NORとしてのコマンドには応答しません。</td></tr><tr><th colspan="2">NAND</th><td class="stable" style="text-align:center">○</td><td></td></tr><tr><th colspan="2">LCD</th><td class="stable" style="text-align:center">○</td><td></td></tr><tr><th colspan="2">RTC</th><td class="stable" style="text-align:center">○</td><td></td></tr><tr><th colspan="2">シリアルポート</th><td class="stable" style="text-align:center">○</td><td></td></tr><tr><th colspan="2">イーサネット</th><td class="stable" style="text-align:center">○</td><td></td></tr><tr><th>GPIO</th><th>LED</th><td class="stable" style="text-align:center">○</td><td>PE-201QにはLEDが存在しないため、201A,201Bエミュレーション時のみ表示されます。</td></tr><tr><th rowspan="3">USB(OHCI)</th><th class="weaksplit">マスストレージ</th><td class="unstable weaksplit" style="text-align:center">△</td><td class="weaksplit">高負荷時に不安定になる場合があります。</td></tr><tr><th class="weaksplit">キーボード</th><td class="unstable weaksplit" style="text-align:center">△</td><td class="weaksplit">ホストのキーボードが英語配列でない環境では、一部のキーが正しく解釈されません。</td></tr><tr><th class="weaksplit">マウス</th><td class="stable weaksplit" style="text-align:center">○</td><td class="weaksplit"></td></tr><tr><th colspan="2">サウンド</th><td class="unstable" style="text-align:center">△</td><td>再生のみです。</td></tr><tr><th colspan="2">タッチスクリーン</th><td class="stable" style="text-align:center">○</td><td></td></tr><tr><th colspan="2">SD/MMC</th><td class="stable" style="text-align:center">○</td><td></td></tr><tr><th colspan="2">カメラ</th><td class="broken" style="text-align:center">×</td><td></td></tr></table>
<h4 id="qemu_bishop_beta4-E3.82.B3.E3.83.B3.E3.83.91.E3.82.A4.E3.83.AB.E6.89.8B.E9.A0.86">コンパイル手順</h4>
<p>本バージョンでは、ソースコード
(<a href="http://downloads.pylone.jp/src/qemu-bishop-0.9.1-pylone0rc4.tar.bz2">qemu-bishop-0.9.1-pylone0rc4.tar.bz2</a>)
のみを公開しています。以下の手順でコンパイルすることができます。</p>
<h5 id="qemu_bishop_beta4-E5.BF.85.E8.A6.81.E3.81.AA.E3.82.82.E3.81.AE">必要なもの</h5>
<ul><li>gcc-3.4 (4.x では動作しません)</li><li>zlib</li><li><a href="http://www.libsdl.org/">SDL 1.2</a></li></ul>
<h5 id="qemu_bishop_beta4-E6.89.8B.E9.A0.86">手順</h5>
<pre>
$ <span class="cmdline">./configure --target-list=arm-softmmu --enable-alsa</span>
$ <span class="cmdline">make</span>
</pre>
<h4 id="qemu_bishop_beta4-E5.AE.9F.E8.A1.8C">実行</h4>
<p>まず、以下のイメージファイルをダウンロードします。画像データ以外のファイルは、従来バージョンで使用していたものがあればそのまま使用できます。</p>
<ul><li><a href="http://downloads.pylone.jp/bishop/romimages-latest/u-boot.bin">U-Boot</a></li><li><a href="http://downloads.pylone.jp/bishop/romimages-latest/uImage">Linuxカーネル</a></li><li><a href="http://downloads.pylone.jp/bishop/romimages-latest/initrd.uimg">initrd</a></li><li><a href="http://downloads.pylone.jp/bishop/romimages-latest/nand-bishop.img">ファイルシステム (NAND)</a></li><li><a href="http://downloads.pylone.jp/bishop/romimages-latest/splash640.bmp.gz">NOR上スプラッシュ画像領域イメージ</a></li><li><a href="http://downloads.pylone.jp/bishop/miscimages-20080926/pe201a.img">PE-201Aエミュレーション画像データ</a></li><li><a href="http://downloads.pylone.jp/bishop/miscimages-20080926/pe201b.img">PE-201Bエミュレーション画像データ</a></li><li><a href="http://downloads.pylone.jp/bishop/miscimages-20080926/led.img">LED状態表示画像データ</a></li></ul>
<p>イメージファイルが置かれたディレクトリでqemuを</p>
<pre>
$ <span class="cmdline">qemu-system-arm -M pe201a -serial stdio -kernel dummy -usbdevice keyboard -mtdblock nand-bishop.img</span>
</pre>
<pre>
$ <span class="cmdline">qemu-system-arm -M pe201b -serial stdio -kernel dummy -usbdevice keyboard -mtdblock nand-bishop.img</span>
</pre>
<p>のように起動してください。</p>
<p>-M オプションに指定された値（pe201a または pe201b） に従って、QEMUウィンドウ内にLCDの内容だけでなく、ボード画像/LED状態も表示されます。</p>
<p>Bishop標準のLinuxカーネルで起動した場合、実機と同様にHeartBeatの処理が開始されるとLEDの表示が変化します。</p>
<p>LEDはGPIOポートバンク'B'の 5,6,7,8 ビットに接続されているので、アドレス0x56000014に値を書くと（対応するピンが出力用に設定されていれば）反映されます。
なお、論理は負、0 から数えたビット番号とLEDの対応は以下となります。
 </p>
<table><tr><th>ビット番号</th><th>LED</th></tr><tr><td>5</td><td>LED5</td></tr><tr><td>6</td><td>LED4</td></tr><tr><td>7</td><td>LED7</td></tr><tr><td>8</td><td>LED6</td></tr></table>
<p>例として、U-Bootプロンプトから4つのLEDすべてを消灯/点灯するには以下のようにします。</p>
<pre>
# <span class="cmdline">mw.l 56000014 1e0</span>
# <span class="cmdline">mw.l 56000014 000</span>
</pre>
<p>なお、QEMU上では 1e0 に代わりに ffff などの値を書いても同様の結果が得られますが、実機では 0x1E0 以外の値を設定すると他デバイスの動作に干渉してしまいます。 </p>
<h4 id="qemu_bishop_beta4-E9.96.A2.E9.80.A3.E8.A8.98.E4.BA.8B">関連記事</h4>
<ul><li><a href="http://pylone.jp/blog/tags/qemu+bishop">Bishopエミュレータに関する記事</a></li></ul>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Sat, 17 Apr 2010 17:36 GMT</pubDate>
</item>
<item>
   <title>usbmon</title>
   <guid isPermaLink="false">tips_usbmon</guid>
   <link>http://pylone.jp/blog/tips_usbmon</link>
   <description><![CDATA[

<p>
Linux kernel 組込みの USB サブシステムをモニタする仕組み(usbmon)について紹介します。
debugfs の活用例としても参考になるのではないでしょうか。
</p>

<h4>前提</h4>
<p>
Linux kernel 2.6.21以降を
</p>

<ul>
 <li>CONFIG_USBMON</li>
 <li>CONFIG_DEBUGFS</li>
</ul>

<p>
を有効にしてコンパイルした環境が必要です。
</p>

<h4>準備</h4>

<ol>
<li> debugfsがまだマウントされていなければマウントします。
一般的に /sys/kernel/debug/ にマウントされるため、
<pre>
# <span class="cmdline">mount -t debugfs none <span class="example">/sys/kernel/debug</span></span>
</pre>
すればよいでしょう。
</li>
<li>usbmon をモジュールとして作成していた場合、カーネルに組み込みます。
<pre>
# <span class="cmdline">modprobe usbmon</span>
</pre>
</li>
</ol>

<p>
以上の手順を実行すると、debugfs の下（/sys/kernel/debug/usbmon/） に、
「番号 ＋ "s"/"t"/"u"」 という仮想ファイル群が生成されているはずです。
</p>

<pre>
$ <span class="cmdline">ls /sys/kernel/debug/usbmon/</span>
0s  0u  1t  2s  2u  3t  4s  4u  5t  6s  6u
0t  1s  1u  2t  3s  3u  4t  5s  5u  6t
</pre>

<p class="info">
実際に何個のファイルが見えるかは、システム構成によります。
</p>

<h4>キャプチャ</h4>


<p>「USBバス番号 ＋ 'u'」という名前のファイルに、
USBの通信内容が配送されます。</p>

<p>
とりあえずバス番号に 0 を指定して("<span class="example">0u</span>"を使って)、全通信を監視してみるとよいでしょう。
</p>

<pre>
# <span class="cmdline">cat  /sys/kernel/debug/usbmon/<span class="example">0u</span></span>
dfaac8c0 2557329542 S Bo:5:004:2 -115 31 = 55534243 214b0100 00000000 00000600 00000000 00000000 00000000 000000
dfaac8c0 2557329639 C Bo:5:004:2 0 31 &gt;
dfaac8c0 2557329649 S Bi:5:004:2 -115 13 &lt;
dfaac8c0 2557331148 C Bi:5:004:2 0 13 = 55534253 214b0100 00000000 01
dfaac8c0 2557331171 S Bo:5:004:2 -115 31 = 55534243 224b0100 12000000 80000603 00000012 00000000 00000000 000000
dfaac8c0 2557331388 C Bo:5:004:2 0 31 &gt;
</pre>

<p>
行の内容は以下のようになっています。
</p>

<ul>
<li>URB Tag</li>
<li>timestamp</li>
<li>Event Type (S - submission, C - callback, E - error)</li>
<li>通信種類([CZIB][io]): バス番号 : Device address : Endpoint number</li>
<li>URB Status word</li>
<li>データ長さ</li>
<li>データ内容</li>
</ul>

<p>特定のデバイスだけを監視したい場合、lsusb の結果を参考にするとよいでしょう。たとえば
</p>

<pre>
$ <span class="cmdline">lsusb |grep PL2303</span>
Bus <span class="example">005</span> Device 005: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
</pre>

<p>
のようになっていた場合、 PL2303（USB-シリアルコンバータ）が5番に接続されているので、<span class="example">5u</span>を使えばよいことがわかります。
</p>


<h4>その他の情報</h4>

<p>
疑似ファイルには他に 't'/'s'でおわるものがあります。
</p>

<h5>'t'でおわるもの</h5>

<p>'*t' は互換性のために残されている古い書式の疑似ファイルなので、
通常使用する必要はないでしょう。</p>

<h5>'s'でおわるもの</h5>

<p>'*s' からは usbmon 自体の動作状況を読むことができます。たとえば</p>

<pre>
# <span class="cmdline">cat /sys/kernel/debug/usbmon/<span class="example">5s</span></span>
nreaders 1 events 350 text_lost 0
</pre>

<p>
なら、
</p>

<ul>
<li>現在 1つのプロセスが バス#5 を監視して中</li>
<li>いままでに 350 個のURBが読み出された</li>
<li>読まれる前にバッファから溢れてしまった URB はない</li>
</ul>

<p>ことがわかります。</p>

<p class="alert">
's' で終わるファイル群の処理では排他制御が考慮されないため、
このインターフェース経由に高負荷をかける場合は何をしているのかよく理解した上で行なってください。
</p>


]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Wed, 15 Apr 2009 12:33 GMT</pubDate>
</item>
<item>
   <title>Bishop サンプルコード</title>
   <guid isPermaLink="false">demo-programs</guid>
   <link>http://pylone.jp/blog/demo-programs</link>
   <description><![CDATA[

<p>
<img src="http://pylone.jp/i/bishop/freetype-thumb.jpg" alt="freetype スクリーンショット" width="161" height="98" style="float:left;margin-right:0.5em;"/>
組込み Linux 開発用 CPU ボード <a href="http://pylone.jp/bishop/">Bishop</a> の
<a href="http://pylone.jp/bishop/docs/">ドキュメント</a>に
<a href="http://pylone.jp/bishop/docs/demo-programs.html">サンプルコード</a>を追加しました。
<br class="endofcontents" />
</p>


]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Mon, 02 Apr 2012 02:52 GMT</pubDate>
</item>
<item>
   <title>distcc による Linux カーネルのクロスコンパイル</title>
   <guid isPermaLink="false">cross-distcc-linux</guid>
   <link>http://pylone.jp/blog/cross-distcc-linux</link>
   <description><![CDATA[


<p><a href="http://pylone.jp/bishop/">Bishop</a>
のカーネルを
<a href="http://pylone.jp/bishop/docs/how_to_use_distcc.html">distcc による分散クロスコンパイル環境</a>
でクロスコンパイルしてみました。</p>
<p><a href="http://distcc.googlecode.com/svn/trunk/doc/web/faq.html">distcc の FAQ</a> によると</p>
<blockquote>
<p>
You should use about twice the total number of CPUs available, but it depends
on your network, program being compiled, available memory, etc. Experiment
with different values.
</p>
</blockquote>
<p>とのことなので、 とりあえず -j をプロセッサ・コア数の2倍にします。</p>
<p>まずは localhost 1台で計ってみます。
(Xeon 2.40GHz x2, コア x4)</p>
<pre>
$ <span class="cmdline">time make -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnu- uImage</span>
real    4m0.051s
user    13m14.462s
sys     1m12.329s
</pre>
<p>ホストを一台追加します。
(host2: Pentium D 3.0GHz, コア x2)</p>
<pre>
$ <span class="cmdline">export DISTCC_HOSTS="localhost <span class="example">host2</span>"</span>
$ <span class="cmdline">time make -j12 ARCH=arm CROSS_COMPILE=arm-linux-gnu- CC="distcc arm-linux-gnu-gcc-4.1" uImage</span>
real    2m4.114s
user    4m38.933s
sys     0m57.964s
</pre>
<p>もう一台追加します。
(host3: Core 2 Duo E6600 2.4GHz, コア x2)</p>
<pre>
$ <span class="cmdline">export DISTCC_HOSTS="localhost host2 <span class="example">host3</span>"</span>
$ <span class="cmdline">time make -j16 ARCH=arm CROSS_COMPILE=arm-linux-gnu- CC="distcc arm-linux-gnu-gcc-4.1" uImage</span>
real    1m32.039s
user    3m41.718s
sys     1m0.260s
</pre>
<p>さらにもう一台追加します。
(host4: Celeron M 520 1.60GHz, コア x1)</p>
<pre>
$ <span class="cmdline">export DISTCC_HOSTS="localhost host2 host3 <span class="example">host4</span>"</span>
$ <span class="cmdline">time make -j18 ARCH=arm CROSS_COMPILE=arm-linux-gnu- CC="distcc arm-linux-gnu-gcc-4.1" uImage</span>
real    1m22.078s
user    3m17.572s
sys     1m2.056s
</pre>
<h4 id="cross-distcc-linux-E3.82.B0.E3.83.A9.E3.83.95">グラフ</h4>
<img src="http://chart.apis.google.com/chart?cht=lxy&amp;chs=480x320&amp;chd=t:4,6,8,9%7C240.051,124.114,92.039,82.078&amp;chds=3,10,0,300&amp;chxt=x,y&amp;chxl=0:%7C%7C4%7C%7C6%7C%7C8%7C9%7Cprocessors%7C1:%7C0%7C%7C2%7C%7C4%7Cmin.&amp;chg=100,20&amp;chm=s,FF9900,0,0,6.0%7Cs,FF9900,0,1,6.0%7Cs,FF9900,0,2,6.0%7Cs,FF9900,0,3,6.0" alt="グラフ" width="480" height="320" />
<h4 id="cross-distcc-linux-E3.83.AA.E3.83.B3.E3.82.AF">リンク</h4>
<ul><li><a href="http://code.google.com/p/distcc/">distcc: a fast, free distributed C/C++ compiler</a></li><li><a href="http://pylone.jp/bishop/docs/how_to_use_distcc.html">distcc による分散クロスコンパイル環境</a></li></ul>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Wed, 09 May 2012 15:56 GMT</pubDate>
</item>
<item>
   <title>DR-01用S3C2440Aペリフェラル定義ファイルの公開</title>
   <guid isPermaLink="false">dr01_s3c2440a_pri</guid>
   <link>http://pylone.jp/blog/dr01_s3c2440a_pri</link>
   <description><![CDATA[


<p class="info">新しいデバッガソフト Code Stage に対応したペリフェラル定義ファイルを公開しました。記事: <a href="http://pylone.jp/blog/codestage_s3c2440a_peri">Code Stage用S3C2440Aペリフェラル定義ファイルの公開</a></p>
<p class="flickr"><a href="http://www.flickr.com/photos/pylonejp/2550285207/sizes/o/" title="flickr:bitxneo-s3c2440"><img src="http://farm4.static.flickr.com/3001/2550285207_b001017028_m.jpg" width="240" height="168" alt="bitxneo-s3c2440" /></a></p>
<p><a href="http://www.bitran.co.jp/ice/dr01.html">ビットラン DR-01</a> の
<a href="http://www.bitran.co.jp/ice/neo.html">共通デバッガソフト</a>用
S3C2440Aペリフェラル定義ファイルを
<a href="http://pylone.jp/bishop/docs/dr01_s3c2440a_pri.html">公開</a>
します。</p>
<p>定義ファイルをデバッガソフトに追加することによって、
直感的なユーザインタフェースでS3C2440Aの
ペリフェラルレジスタへアクセスできます。</p>
<p>入手方法や使い方については
「<a href="http://pylone.jp/bishop/docs/dr01_s3c2440a_pri.html">DR-01用S3C2440Aペリフェラル定義ファイル</a>」
を参照してください。</p>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Sat, 14 Feb 2009 15:45 GMT</pubDate>
</item>
<item>
   <title>BishopエミュレータBeta3リリース</title>
   <guid isPermaLink="false">qemu_bishop_beta3</guid>
   <link>http://pylone.jp/blog/qemu_bishop_beta3</link>
   <description><![CDATA[


<p class="info">正式版を公開しました - 記事: <a href="http://pylone.jp/blog/qemu_bishop_0.9.1_pylone1">Bishopエミュレータ正式版リリース</a></p>
<p>組込みLinux開発用CPUボード<a href="http://pylone.jp/bishop/">Bishop</a>エミュレータBeta3を公開します。</p>
<h4 id="qemu_bishop_beta3-E6.9B.B4.E6.96.B0.E5.B1.A5.E6.AD.B4">更新履歴</h4>
<ul><li>2008/5/23: 初版公開</li></ul>
<h4 id="qemu_bishop_beta3-42.65.74.61.32.20.E3.81.8B.E3.82.89.E3.81.AE.E5.A4.89.E6.9B.B4.E7.82.B9">Beta2 からの変更点</h4>
<h5 id="qemu_bishop_beta3-E3.82.AA.E3.83.BC.E3.83.87.E3.82.A3.E3.82.AA.E3.82.B5.E3.83.9D.E3.83.BC.E3.83.88">オーディオサポート</h5>
<p>再生のみですが、オーディオに対応しました。</p>
<h5 id="qemu_bishop_beta3-53.44.2F.4D.4D.43.20.E3.82.B5.E3.83.9D.E3.83.BC.E3.83.88">SD/MMC サポート</h5>
<p>SD/MMCに対応しました。
-sd オプションで指定したディスクイメージファイルをSDカードとして扱うことができます。
ディスクイメージの作成方法は「<a href="http://pylone.jp/blog/tips_diskimage_partitioning">ディスクイメージのホスト側での操作方法</a>」を参照してください。</p>
<h5 id="qemu_bishop_beta3-E3.83.90.E3.82.A4.E3.83.8A.E3.83.AA.E3.83.91.E3.83.83.E3.82.B1.E3.83.BC.E3.82.B8">バイナリパッケージ</h5>
<p>debianパッケージ、RPM、Windows インストーラを用意しました。</p>
<h4 id="qemu_bishop_beta3-E3.83.AA.E3.83.AA.E3.83.BC.E3.82.B9.E5.86.85.E5.AE.B9">リリース内容</h4>
<p>本エミュレータは、オープンソースのプロセッサエミュレータ
<a href="http://www.qemu.org/">QEMU</a>の開発版をベースに、Bishop向けの機能を追加したものです。
<a href="http://pylone.jp/blog/qemu_bishop_beta1">Beta1</a>
や
<a href="http://pylone.jp/blog/qemu_bishop_beta2">Beta2</a>
と比較してエミュレーションの精度が向上していますが、まだ実機に存在する全ての周辺機器を正しくエミュレートできるわけではありません。</p>
<h5 id="qemu_bishop_beta3-E5.90.84.E7.A8.AE.E3.83.9A.E3.83.AA.E3.83.95.E3.82.A7.E3.83.A9.E3.83.AB.E3.81.AE.E3.82.B5.E3.83.9D.E3.83.BC.E3.83.88.E7.8A.B6.E6.B3.81">各種ペリフェラルのサポート状況</h5>
<table><tr><th colspan="2">ペリフェラル</th><th>状況</th><th>注</th></tr><tr><th colspan="2">NOR</th><td class="unstable" style="text-align:center">△</td><td>ROMとして表現され、NORとしてのコマンドには応答しません。</td></tr><tr><th colspan="2">NAND</th><td class="stable" style="text-align:center">○</td><td></td></tr><tr><th colspan="2">LCD</th><td class="stable" style="text-align:center">○</td><td></td></tr><tr><th colspan="2">RTC</th><td class="stable" style="text-align:center">○</td><td></td></tr><tr><th colspan="2">シリアルポート</th><td class="stable" style="text-align:center">○</td><td></td></tr><tr><th colspan="2">イーサネット</th><td class="stable" style="text-align:center">○</td><td></td></tr><tr><th>GPIO</th><th>LED</th><td class="unstable" style="text-align:center">△</td><td>状態の設定は可能ですが、表示はおこなわれません。</td></tr><tr><th rowspan="3">USB(OHCI)</th><th class="weaksplit">マスストレージ</th><td class="unstable weaksplit" style="text-align:center">△</td><td class="weaksplit">高負荷時に不安定になる場合があります。</td></tr><tr><th class="weaksplit">キーボード</th><td class="unstable weaksplit" style="text-align:center">△</td><td class="weaksplit">ホストのキーボードが英語配列でない環境では、一部のキーが正しく解釈されません。</td></tr><tr><th class="weaksplit">マウス</th><td class="stable weaksplit" style="text-align:center">○</td><td class="weaksplit"></td></tr><tr><th colspan="2">サウンド</th><td class="unstable" style="text-align:center">△</td><td>再生のみです。</td></tr><tr><th colspan="2">タッチスクリーン</th><td class="stable" style="text-align:center">○</td><td></td></tr><tr><th colspan="2">SD/MMC</th><td class="stable" style="text-align:center">○</td><td></td></tr><tr><th colspan="2">カメラ</th><td class="broken" style="text-align:center">×</td><td></td></tr></table>
<h4 id="qemu_bishop_beta3-E3.82.A4.E3.83.B3.E3.82.B9.E3.83.88.E3.83.BC.E3.83.AB">インストール</h4>
<h5 id="qemu_bishop_beta3-install-on-debian">Debian</h5>
<p>/etc/apt/sources.list に以下の apt-line を加えます。</p>
<pre>deb http://downloads.pylone.jp/tools/deb ./</pre>
<p>入手可能なパッケージの一覧を更新します。</p>
<pre>
# <span class="cmdline">aptitude update</span>
</pre>
<p>qemu-bishop パッケージをインストールします。</p>
<pre>
# <span class="cmdline">aptitude install qemu-bishop</span>
</pre>
<h5 id="qemu_bishop_beta3-install-on-fedora">Fedora</h5>
<p>/etc/yum.repos.d/pylone-jp.repo に yum レポジトリを追加します。</p>
<pre>[tools]
name=Tools
baseurl=http://downloads.pylone.jp/tools/rpm/
enabled=1
gpgcheck=0</pre>
<p>リポジトリ情報を更新します。</p>
<pre>
# <span class="cmdline">yum update</span>
</pre>
<p>qemu-bishopパッケージをインストールします。</p>
<pre>
# <span class="cmdline">yum install qemu-bishop</span>
</pre>
<h5 id="qemu_bishop_beta3-install-on-win">Windows</h5>
<p>インストーラ
(<a href="http://downloads.pylone.jp/bishop/qemu-bishop-0.9.1-pylone0rc3-setup.exe">qemu-bishop-0.9.1-pylone0rc3-setup.exe</a>)
をダウンロードして実行してください。</p>
<h4 id="qemu_bishop_beta3-E5.AE.9F.E8.A1.8C">実行</h4>
<h5 id="qemu_bishop_beta3-run-on-linux">Linux</h5>
<p>まず、以下のイメージファイルをダウンロードします。</p>
<ul><li><a href="http://downloads.pylone.jp/bishop/romimages-latest/u-boot.bin">U-Boot</a></li><li><a href="http://downloads.pylone.jp/bishop/romimages-latest/uImage">Linuxカーネル</a></li><li><a href="http://downloads.pylone.jp/bishop/romimages-latest/initrd.uimg">initrd</a></li><li><a href="http://downloads.pylone.jp/bishop/romimages-latest/nand-bishop.img">ファイルシステム (NAND)</a></li><li><a href="http://downloads.pylone.jp/bishop/romimages-latest/splash640.bmp.gz">スプラッシュイメージ</a></li></ul>
<p>イメージファイルが置かれたディレクトリでqemu-bishopコマンドを</p>
<pre>
$ <span class="cmdline">qemu-bishop -M pe201b -serial stdio -kernel dummy -usbdevice keyboard -mtdblock nand-bishop.img</span>
</pre>
<p>として起動してください。</p>
<ol><li>U-Bootがメモリに読みこまれて起動</li><li>U-BootがLinuxカーネルを読みこみ</li><li>LinuxカーネルがNANDのファイルシステムイメージをマウント</li></ol>
<p>の順で実行されます。</p>
<p>-M オプションには、従来の pe201a と pe201b に加えて pe201q を指定することができます。</p>
<h5 id="qemu_bishop_beta3-run-on-win">Windows</h5>
<p>「スタート」 → 「すべてのプログラム」 → 「qemu-bishop」</p>
<h4 id="qemu_bishop_beta3-E3.82.B3.E3.83.B3.E3.83.91.E3.82.A4.E3.83.AB.E6.89.8B.E9.A0.86">コンパイル手順</h4>
<p>ソースコード
(<a href="http://downloads.pylone.jp/src/qemu-bishop-0.9.1-pylone0rc3.tar.bz2">qemu-bishop-0.9.1-pylone0rc3.tar.bz2</a>)
からビルドする場合の手順です。</p>
<h5 id="qemu_bishop_beta3-E5.BF.85.E8.A6.81.E3.81.AA.E3.82.82.E3.81.AE">必要なもの</h5>
<ul><li>gcc-3.4 (4.x では動作しません)</li><li>zlib</li><li><a href="http://www.libsdl.org/">SDL 1.2</a></li></ul>
<h5 id="qemu_bishop_beta3-E6.89.8B.E9.A0.86">手順</h5>
<pre>
$ <span class="cmdline">./configure --target-list=arm-softmmu --enable-alsa</span>
$ <span class="cmdline">make</span>
</pre>
<h4 id="qemu_bishop_beta3-E9.96.A2.E9.80.A3.E8.A8.98.E4.BA.8B">関連記事</h4>
<ul><li><a href="http://pylone.jp/blog/tags/qemu+bishop">Bishopエミュレータに関する記事</a></li></ul>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Sun, 08 Apr 2012 09:10 GMT</pubDate>
</item>
<item>
   <title>busybox-staticによるinitramfs</title>
   <guid isPermaLink="false">tips_initramfs_using_busybox</guid>
   <link>http://pylone.jp/blog/tips_initramfs_using_busybox</link>
   <description><![CDATA[


<p>カスタムボードへのLinuxカーネル移植の初期段階で
とりあえずのrootfsが必要になる場合は多いと思います。
とりあえずのものにそれほど手間はかけたくないですが、
カーネルのデバッグや動作確認のために機能はそれなりに欲しいところです。</p>
<p>方法は色々あると思いますが、パイロンではDebianの
<a href="http://packages.debian.org/busybox-static">busybox-staticパッケージ</a>と
<a href="http://linuxjf.sourceforge.jp/JFdocs/kernel-docs-2.6/filesystems/ramfs-rootfs-initramfs.txt.html">initramfs</a>を使うことが多いです。
手順は以下の通りです。</p>
<p>(例としてrootfsのディレクトリを/PATH/TO/ROOTFS/とします)</p>
<ol><li>busybox-staticパッケージをdpkg -xでばらしてbin/busyboxを/PATH/TO/ROOTFS/bin/busyboxにコピー</li><li>/PATH/TO/ROOTFS/bin/busyboxへのシンボリックリンクPATH/TO/ROOTFS/initを追加</li><li>mkdir /PATH/TO/ROOTFS/{dev,etc,proc}</li><li>mknod /PATH/TO/ROOTFS/dev/console c 5 1</li></ol>
<p>busyboxのinitは/etc/init.d/rcSを読み込むので起動直後の処理はrcSに加えます。最低でも/procのマウントさえしておけばよいでしょう。</p>
<p>/PATH/TO/ROOTFS/etc/init.d/rcS:</p>
<pre>#!/bin/sh
mount -t proc proc proc</pre>
<p>カーネルにinitramfsとして組み込むにはCONFIG_BLK_DEV_INITRDとCONFIG_INITRAMFS_SOURCEを指定します。</p>
<pre>CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE=/PATH/TO/ROOTFS/</pre>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Sun, 08 Apr 2012 11:29 GMT</pubDate>
</item>
<item>
   <title>debootstrapの前半部分をホストで、後半をターゲットで行う手順</title>
   <guid isPermaLink="false">tips_debootstrap_cross</guid>
   <link>http://pylone.jp/blog/tips_debootstrap_cross</link>
   <description><![CDATA[

<p>
何もインストールされていないターゲット向けに
Debian基本システムを作る手順です。
Debianの作法的に正しいかどうかはわかりません。
</p>

<h4>ホスト側で前半部分を実行</h4>

<p>NFS-Rootのホスト側ディレクトリを/nfsroot/etch-<span class="example">ARCH</span> として説明します。</p>

<p class="info"><span class="example">ARCH</span>はアーキテクチャ(arm, mipsel, powerpcなど)に置き換えてください。</p>

<p>debootstrapを--foreignオプションで実行します。</p>

<pre>
# <span class="cmdline">debootstrap --foreign --arch <span class="example">ARCH</span> etch /nfsroot/etch-<span class="example">ARCH</span> http://ftp.debian.org/debian/</span>
</pre>

<p>NFS-Root用の/etc/fstabを用意します。</p>

<pre>
# <span class="cmdline">echo "proc /proc proc defaults 0 0" &gt; /nfsroot/etch-<span class="example">ARCH</span>/etc/fstab</span>
# <span class="cmdline">echo "ホストのIPアドレス:/nfsroot/etch-<span class="example">ARCH</span> / nfs defaults 0 1" &gt;&gt; /nfsroot/etch-<span class="example">ARCH</span>/etc/fstab</span>
</pre>

<p>/dev/consoleを作ります。</p>

<pre>
# <span class="cmdline">mknod /nfsroot/etch-<span class="example">ARCH</span>/dev/console c 5 1</span>
</pre>

<h4>NFS-Rootでターゲットを起動</h4>

<p class="info">NFSサーバの設定については触れません。</p>

<p>カーネルパラメータでホストの/nfsroot/etch-ARCHをNFS-Rootとして指定してカーネルを起動します。</p>

<p>カーネルパラメータの例:</p>

<pre>
console=ttyS0,115200n8 root=/dev/nfs nfsroot=ホストのIPアドレス:/nfsroot/etch-ARCH/ ip=ホストのIPアドレス:::サブネットマスク::eth0: init=/bin/sh
</pre>

<h4>ターゲットで後半部分を実行</h4>

debootstrapを実行するための準備をします。

<pre>
# <span class="cmdline">mount -n -o remount,rw /</span>
# <span class="cmdline">mount -n /proc</span>
# <span class="cmdline">export PATH=/bin:/sbin:/usr/bin:/usr/sbin</span>
# <span class="cmdline">date -s "2008-2-27 18:33"</span>
</pre>

debootstrapを--second-stageオプションで実行します。

<pre>
# <span class="cmdline">/debootstrap/debootstrap --second-stage --no-resolve-deps</span>
</pre>

<h4>ターゲット向けの設定について</h4>

<p>
上記手順で作成したDebian基本システムをターゲットのNANDやCFなどに
インストールして使う場合、
事前にターゲットの環境に合わせて設定が必要になります。
</p>

<p>よくある設定としては</p>

<ul>
  <li>/etc/inittab</li>
  <li>/etc/fstab</li>
  <li>/etc/securetty</li>
  <li>/etc/resolv.conf</li>
  <li>/etc/network/interfaces</li>
</ul>

<p>といったところでしょうか。</p>

<p>シリアルコンソールであればttySnも作っておくといいかもしれません。</p>

<pre>
# <span class="cmdline">cd /nfsroot/etch-<span class="example">ARCH</span>/dev</span>
# <span class="cmdline">./MAKEDEV ttyS</span>
</pre>

<h4>リンク</h4>

<ul>
  <li><a href="http://wiki.debian.org/EmDebian/CrossDebootstrap">Cross-installing Debian using debootstrap</a></li>
</ul>


]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Wed, 21 Dec 2011 11:05 GMT</pubDate>
</item>
<item>
   <title>dpkg-crossの&#45;&#45;exclude オプション</title>
   <guid isPermaLink="false">tips_dpkgcross_exclude_opt</guid>
   <link>http://pylone.jp/blog/tips_dpkgcross_exclude_opt</link>
   <description><![CDATA[

<p class="info">dpkg-crossの基本的な使い方を知っている方向けの記事です。</p>

<p><a href="http://dpkg-cross.alioth.debian.org/">dpkg-cross</a>の--excludeオプションはクロスへ変換する際にDependsから特定のパッケージを取り除くオプションです。
最近追加されたらしいのですが、使ってみたら便利だったので紹介します。</p>

<p>こんな感じです。</p>

<p>普通にクロスパッケージ化すると</p>

<pre>
$ <span class="cmdline">dpkg -f lib64gcc1_4.1.1-21_powerpc.deb | grep Depends</span>
Depends: <span class="example">gcc-4.1-base (= 4.1.1-21)</span>, libc6-ppc64 (&gt;= 2.3.6-7)
$ <span class="cmdline">dpkg-cross -a powerpc -b lib64gcc1_4.1.1-21_powerpc.deb</span>
Building lib64gcc1-powerpc-cross_4.1.1-21_all.deb
$ <span class="cmdline">dpkg -f lib64gcc1-powerpc-cross_4.1.1-21_all.deb | grep Depends</span>
Depends: <span class="example">gcc-4.1-base (= 4.1.1-21)</span>, libc6-ppc64-powerpc-cross (&gt;= 2.3.6-7), libc6-ppc64-powerpc-dcv1
</pre>

<p>となります。</p>

<p>--excludeを使ってgcc-4.1-baseへの依存を削ると</p>

<pre>
$ <span class="cmdline">dpkg-cross -a powerpc -b --exclude gcc-4.1-base lib64gcc1_4.1.1-21_powerpc.deb</span>
Building lib64gcc1-powerpc-cross_4.1.1-21_all.deb
$ <span class="cmdline">dpkg -f lib64gcc1-powerpc-cross_4.1.1-21_all.deb | grep Depends</span>
Depends: libc6-ppc64-powerpc-cross (&gt;= 2.3.6-7), libc6-ppc64-powerpc-dcv1
</pre>

<p>となります。</p>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Sun, 08 Apr 2012 07:23 GMT</pubDate>
</item>
<item>
   <title>BishopエミュレータBeta2リリース</title>
   <guid isPermaLink="false">qemu_bishop_beta2</guid>
   <link>http://pylone.jp/blog/qemu_bishop_beta2</link>
   <description><![CDATA[

<p class="info">
正式版を公開しました - 記事: <a href="http://pylone.jp/blog/qemu_bishop_0.9.1_pylone1">Bishopエミュレータ正式版リリース</a>
</p>

<p>
組込みLinux開発用CPUボード<a href="http://pylone.jp/bishop/">Bishop</a>のエミュレータのBeta2版を公開します。
</p>

<h4>更新履歴</h4>

<ul>
  <li>2007/12/28: 初版公開</li>
  <li>2008/1/18: ソースコードを qemu 0.9.1 に追従して更新</li>
</ul>

<h4>Beta1からの変更点</h4>

<h5>開発用仮想ターゲットPE-201Q</h5>

<p>
エミュレートする環境として提供される仮想ターゲットPE-201Qを追加しました。
実機より大きな画面(640x1024)および豊富なNOR領域(128MBytes)が利用可能となるので、開発環境としての利便性が向上します。
</p>

<h5>タッチスクリーンのサポート</h5>

<p>
エミュレータウィンドウ上のポインタ操作を、タッチスクリーンへの入力として変換するようにしました。
PE-201A/Bとしてエミュレーションを行う場合、タッチスクリーンはキャリブレーション済の状態で起動します。
PE-201Qでは変換係数の初期値に意図的にある程度の誤差を残してあります。
キャリブレータの動作確認にはPE-201Qを使用してください。
</p>

<h5>-appendオプション</h5>

<p>QEMU起動時に-appendオプションが付加された場合に、U-Bootの環境変数"bootargs"へ反映するようにしました。
この環境変数はLinuxカーネルの起動時の引数として渡されます。
</p>

<p>
-append を指定しないか、空("")とした場合、bootargsの内容は
</p>

<pre>
bootargs=console=ttySAC0,115200 console=tty0 preinit=/pylone root=/dev/mtdblock5 nfsroot=10.0.2.2:/ROOTFS/ ip=10.0.2.15::10.0.2.2:255.255.255.0:::</pre>

<p>
となります。この場合、特に操作しなければルートファイルシステムとしてNANDが使用されます。
</p>

<p>-appendに"xxx=yyy"のような値を指定した場合、bootargsの内容の後半が書き換えられて</p>

<pre>bootargs=console=ttySAC0,115200 console=tty0 preinit=/pylone xxx=yyy</pre>

<p>となります(この例のままでは"root="が指定されなくなるため、起動に失敗します)。</p>

<pre>-append "root=/dev/nfs nfsroot=xx.xx.xx.xx:/XXXXX ip=10.0.2.15::10.0.2.2:255.255.255.0:::"</pre>

<p>
のように有効な"root="と付加情報を設定すれば、指定に従って起動します（この例の場合は nfs サーバxx.xx.xx.xx の /XXXXX をルートとして）。
</p>

<h5>コード変換バッファ領域のサイズ変更</h5>

<p>QEMU がエミュレーションのために使用するコード変換バッファ領域のサイズを増やしました。
エミュレータ上で複雑な処理をおこなわせた場合の速度低下が軽減されています。</p>

<p class="info">
QEMUのメモリ消費量が<a href="http://pylone.jp/blog/qemu_bishop_beta1">Beta1</a>と比較して増加しているため、十分なメモリを確保しての使用をお勧めします。
</p>

<h4>ダウンロード</h4>

<p>
今回のリリースでは、ソースコードのみ提供します。以下のリンク先から取得してください：
</p>
<dl>
<dt>ソースコード:</dt>
<dd><a href="http://downloads.pylone.jp/src/qemu-bishop-0.9.1-pylone0rc2.tar.bz2">
qemu-bishop-0.9.1-pylone0rc2.tar.bz2</a>
</dd>
</dl>
<p>
今後
</p>
<ul>
<li>Debianパッケージ</li>
<li>Windowsインストーラ</li>
</ul>
<p>
も準備する予定です。
</p>

<h4>リリース内容</h4>
<p>本エミュレータは、オープンソースのプロセッサエミュレータ<a href="http://www.qemu.org/">QEMU</a>の開発版をベースに、Bishop向けの機能を追加したものです。Beta2ではBata1に比較してエミュレーションの精度が向上していますが、まだ実機に存在する全ての周辺機器を正しくエミュレートできるわけではありません。
</p>
<h5>各種ペリフェラルのサポート状況</h5>
<table>
 <thead>
  <tr>
   <th colspan="2">ペリフェラル
   </th>
   <th>状況
   </th>
   <th>注
   </th>
  </tr>
 </thead>
<tbody>
<tr>    <th colspan="2">        NOR     </th> <td style="text-align:center;" class="unstable">      △       </td><td>       ROMとして表現され、NORとしてのコマンドには応答しません。 </td></tr>
<tr>    <th colspan="2">        NAND    </th> <td style="text-align:center;" class="stable">        ○       </td><td>               </td></tr>
<tr>    <th colspan="2">        LCD     </th> <td style="text-align:center;" class="stable">        ○       </td><td>               </td></tr>
<tr>    <th colspan="2">        RTC     </th> <td style="text-align:center;" class="stable">        ○       </td><td>               </td></tr>
<tr>    <th colspan="2">        シリアルポート </th> <td style="text-align:center;" class="stable">        ○       </td><td>               </td></tr>
<tr>    <th colspan="2">        イーサネット  </th> <td style="text-align:center;" class="stable">        ○       </td><td>               </td></tr>
<tr>    <th>    GPIO    </th><th>       LED     </th><td style="text-align:center;" class="unstable">       △       </td><td>       状態の設定は可能ですが、表示はおこなわれません。        </td></tr>
<tr class="weaksplit">  <th rowspan="3">        USB(OHCI)       </th><th>       マスストレージ </th><td style="text-align:center;" class="unstable">       △       </td><td>       高負荷時に不安定になる場合があります。     </td></tr>
<tr class="weaksplit">   <th>   キーボード   </th><td style="text-align:center;" class="unstable">       △       </td><td>       ホストのキーボードが英語配列でない環境では、一部のキーが正しく解釈されません。 </td></tr>
<tr class="weaksplit">   <th>   マウス     </th><td style="text-align:center;" class="stable"> ○       </td><td>               </td></tr>
<tr>    <th colspan="2">        サウンド    </th> <td style="text-align:center;" class="broken">        ×       </td><td>               </td></tr>
<tr>    <th colspan="2">        タッチスクリーン        </th> <td style="text-align:center;" class="stable">        ○       </td><td>               </td></tr>
<tr>    <th colspan="2">        MMC     </th> <td style="text-align:center;" class="broken">        ×       </td><td>               </td></tr>
<tr>    <th colspan="2">        カメラ     </th> <td style="text-align:center;" class="broken">        ×       </td><td>               </td></tr>
                                                
</tbody>
</table>

<h4>ソースコードからのインストール</h4>

<h5>必要な環境</h5>
<ul>
<li>gcc-3.4 (4.x では動作しません)</li>
<li><a href="http://www.libsdl.org/">SDL 1.2</a></li>
</ul>
<p class="info">
Debian環境では、
<kbd># apt-get build-dep qemu</kbd> を実行することで、必要なパッケージを一括してインストールすることもできます。
</p>
<h5>構築手順</h5>
<p>
ソースコードを展開したディレクトリ内で以下の手順を行うことで、実行可能ファイル ./arm-softmmu/qemu-system-arm が生成されます。
</p>
<dl>
<dt>configure の実行</dt>
<dd>
<kbd>$ ./configure --target-list=arm-softmmu</kbd>
</dd>
<dt>コンパイル</dt>
<dd>
<kbd>$ make</kbd>
</dd>
</dl>
<h4>エミュレータの実行</h4>
<p>
Bishopエミュレータに実機出荷状態と同様の動作をさせるためには、
</p>
<ul>
<li><a href="http://downloads.pylone.jp/bishop/romimages-latest/u-boot.bin">
U-Bootイメージ</a></li>
<li><a href="http://downloads.pylone.jp/bishop/romimages-latest/uImage">
Linuxカーネルイメージ</a></li>
<li><a href="http://downloads.pylone.jp/bishop/romimages-latest/initrd.uimg">
initrdイメージ</a></li>
<li><a href="http://downloads.pylone.jp/bishop/romimages-latest/nand-bishop.img">
ファイルシステムイメージ</a></li>
<li><a href="http://downloads.pylone.jp/bishop/romimages-latest/splash640.bmp.gz">
スプラッシュイメージ</a></li>
</ul>
<p>
を与える必要があります。それぞれのファイルをリンク先からダウンロードし、ソースコードのトップディレクトリに置いた状態で
</p>
<p>
<kbd>
$ ./arm-softmmu/qemu-system-arm -M pe201b -serial stdio -kernel dummy -usbdevice keyboard -mtdblock nand-bishop.img
</kbd>
</p>
<p>
として起動してください。
</p>
<ol>
<li>U-Bootがメモリに読みこまれて起動</li>
<li>U-BootがLinuxカーネルを読みこみ</li>
<li>LinuxカーネルがNANDのファイルシステムイメージをマウント</li>
</ol>
<p>
の順で実行されます。
</p>
<p>
オプション”-M”には、従来の"pe-201a"と"pe-201b"に加えて"pe-201q"を指定することができます。
</p>
<p>
カーネルイメージを<a href="http://pylone.jp/blog/bishop_linux-2.6.24-rc6">最新のBishop向けカーネル</a>に差し替えると、<a href="http://pylone.jp/blog/bishop_klibc_based_initramfs">起動時にタッチスクリーンからルートファイルシステムを選択</a>することができます。
</p>

<h4>関連記事</h4>

<ul>
  <li><a href="http://pylone.jp/blog/tags/qemu+bishop">Bishopエミュレータに関する記事</a></li>
</ul>


]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Wed, 09 May 2012 03:11 GMT</pubDate>
</item>
<item>
   <title>Bishop向けLinuxカーネルのテスト版 - 2.6.24-rc6</title>
   <guid isPermaLink="false">bishop_linux-2.6.24-rc6</guid>
   <link>http://pylone.jp/blog/bishop_linux-2.6.24-rc6</link>
   <description><![CDATA[
<p>
<a href="http://pylone.jp/bishop/">Bishop</a>向けLinuxカーネルのテスト版 (2.6.24-rc6) を公開します。
</p>

<p class="info">
最新版は2.6.26.8です。記事: <a href="http://pylone.jp/blog/bishop_linux-2.6.26.8">Bishop向けLinuxカーネルのテスト版 - 2.6.26.8</a>
</p>

<ul>
  <li>ソースコード:<a href="http://downloads.pylone.jp/src/linux-2.6.24-rc6-pylone0.tar.gz">linux-2.6.24-rc6-pylone0.tar.gz</a></li>
  <li>バイナリ:<a href="http://downloads.pylone.jp/bishop/romimages-20071228/uImage">uImage</a></li>
</ul>

<p>主な変更点は以下の通りです。</p>

<ul>
  <li>2.6.22.1から2.6.24-rc6へ</li>
  <li>initrdから<a href="http://pylone.jp/blog/bishop_klibc_based_initramfs">initramfs</a>へ変更</li>
  <li>エミュレータ上の開発用仮想ターゲットPE-201Qに対応</li>
</ul>

<p>
本カーネルは近日中に正式リリースされる予定です。
今後出荷するBishopにもプリインストールされます。
これまでご購入いただいたお客様につきましては、
アップデート手順をご案内させていただきます。
</p>

<h4>関連記事</h4>

<ul>
  <li><a href="http://pylone.jp/blog/bishop_klibc_based_initramfs">klibcベースのinitramfs</a></li>
</ul>


]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Sat, 14 Feb 2009 15:45 GMT</pubDate>
</item>
<item>
   <title>klibcベースのinitramfs</title>
   <guid isPermaLink="false">bishop_klibc_based_initramfs</guid>
   <link>http://pylone.jp/blog/bishop_klibc_based_initramfs</link>
   <description><![CDATA[

<p>
<img src="http://pylone.jp/i/blog/rootfs_chooser_screenshot.jpg" alt="写真" />
</p>

<p>
<a href="http://pylone.jp/bishop/">Bishop</a>にプリインストールされている
uClibcベースのinitrdを
<a href="ftp://ftp.kernel.org/pub/linux/libs/klibc/">klibc</a>によるinitramfsに変更する予定です。
</p>

<p>
klibcやinitramfsについては、カーネル付属文書Documentation/early-userspace/READMEを参照してください。JFプロジェクトによる<a href="http://linuxjf.sourceforge.jp/JFdocs/kernel-docs-2.6/early-userspace/README.html">日本語訳</a>もあります。
</p>

<p>
klibcのサンプル実装として、起動時にタッチスクリーンからルートファイルシステムを選択する仕組みを用意しました。
</p>

<p>
起動時に表示される画面上のアイコンをタッチすることにより、NAND、NFS、USBマスストレージ、SDカードの何れかからルートファイルシステムを選択できます。
</p>

<p>
近日中にリリース予定のBishop向けカーネルでは、このカスタムinitramfsも
含まれます。
</p>


]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Sun, 08 Apr 2012 11:29 GMT</pubDate>
</item>
<item>
   <title>年末年始休業のお知らせ</title>
   <guid isPermaLink="false">announce_20071220</guid>
   <link>http://pylone.jp/blog/announce_20071220</link>
   <description><![CDATA[
<p>
誠に勝手ではございますが、株式会社パイロンは平成19年12月29日から平成20年1月6日の間を休業とさせていただきます。ご迷惑をおかけいたしますが、よろしくお願いいたします。
</p>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Sat, 14 Feb 2009 15:45 GMT</pubDate>
</item>
<item>
   <title>クロス開発環境のRPMパッケージ (gcc-3.4, gcc-4.1)</title>
   <guid isPermaLink="false">cross_toolchain_rpm</guid>
   <link>http://pylone.jp/blog/cross_toolchain_rpm</link>
   <description><![CDATA[

<p class="info">
gcc-4.4を公開しました - 記事: <a href="http://pylone.jp/blog/cross_toolchain_201011_rpm">クロス開発環境のRPMパッケージ (gcc-4.4)</a>
</p>

<p>
<a href="http://pylone.jp/blog/cross_toolchain_deb">クロス開発環境のDebianパッケージ (gcc-3.4, gcc-4.1)</a>
を
<a href="http://kitenet.net/~joey/code/alien/">alien</a>
で変換したRPMパッケージを
<a href="http://downloads.pylone.jp/cross-toolchain/rpm/">公開</a>します。
</p>

<h4>概要</h4>

<p>
<a href="http://pylone.jp/blog/cross_toolchain_deb">クロス開発環境のDebianパッケージ</a>
を参照してください。
</p>

<h4>対応状況</h4>

<p>
<a href="http://pylone.jp/blog/cross_toolchain_deb">クロス開発環境のDebianパッケージ</a>
を参照してください。
</p>

<h4>yumによるインストール (Fedora)</h4>

<p>
以下の内容で/etc/yum.repos.d/pylone-jp.repoを作成して、yumレポジトリを追加します。
</p>

<pre>
[cross-toolchain]
name=Cross Toolchain
baseurl=http://downloads.pylone.jp/cross-toolchain/rpm/
enabled=1
gpgcheck=0
</pre>

<p>
必要なツールをインストールします。
<span class="example">ARCH</span>
は arm、mipsel、sh4、powerpc の何れかに置き換えてください。
</p>

<h5>gcc-3.4</h5>
<pre>
# <span class="cmdline">yum install gcc-3.4-<span class="example">ARCH</span>-linux-gnu</span>
</pre>

<h5>gcc-4.1</h5>
<pre>
# <span class="cmdline">yum install gcc-4.1-<span class="example">ARCH</span>-linux-gnu</span>
</pre>

<h5>g++-4.1</h5>

<pre>
# <span class="cmdline">yum install g++-4.1-<span class="example">ARCH</span>-linux-gnu</span>
</pre>

<h5>gdb</h5>

<pre>
# <span class="cmdline">yum install gdb-<span class="example">ARCH</span>-linux-gnu</span>
</pre>

<h4>依存関係について</h4>

<p>
alienによる変換ではパッケージ間の依存関係が失われますが、 本パッケージではspecファイルを修正して依存関係を追加しています。
</p>

<h4>更新履歴</h4>

<ul>
  <li>2007/12/12: 公開</li>
</ul>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Mon, 22 Nov 2010 06:23 GMT</pubDate>
</item>
<item>
   <title>initramfs作成支援スクリプト</title>
   <guid isPermaLink="false">gen_init_cpio_conf</guid>
   <link>http://pylone.jp/blog/gen_init_cpio_conf</link>
   <description><![CDATA[


<h4>About</h4>
<p>
Linux起動時にinitramfsを使用するためには、
以下のいずれかを用意する必要があります。
</p>
<ul>
<li>所定の形式のcpioアーカイブ</li>
<li>展開済みのディレクトリ</li>
<li>usr/gen_init_cpio 用の設定スクリプト</li>
</ul>
<p>
このうち「usr/gen_init_cpio用の設定スクリプト」を使えると、ユーザ権限で作業ができるため、作業環境の扱いが簡単になります。
</p>
<p>
しかし、きちんと（間接的に必要となるライブラリ等まで考慮して）スクリプトを記述するのはそれなりの手間がかかり、使いこなすには経験が必要でした。
</p>
<p>
この作業の支援用として、実行可能ファイルに必要なライブラリ等の情報を抽出して設定スクリプトの雛形を生成するツールを公開します。
</p>

<h4>使いかた</h4>
<h5>ダウンロード</h5>
<p>
以下のリンク先から取得してください：</p>
<a href="http://downloads.pylone.jp/tools/gen_init_cpio_conf.py">gen_init_cpio_conf.py</a>
<p class="info">実行には python および binutils が必要です。</p>

<h5>前準備</h5>
<p>
適当なディレクトリ以下に、initramfsに含めたいファイルを全て展開します。この段階では不要なファイルが含まれていても構わないので、手順としては
</p>
<ol>
<li>関連するパッケージを dpkg -x で展開</li>
<li>その他のファイルをコピー</li>
</ol>
<p>
などとすればよいでしょう。
</p>
<h5>設定ファイル作成</h5>
<p>
最終的にinitramfsに含めたいファイルのリストを用意します。
</p> 
<p>
例）FOO.def として
</p>
<pre>
/bin/busybox
/bin/brcrl
</pre>
<p class="info">
誤認識されないなら、パスのディレクトリ部分（/usr/bin）は省略することができます。
</p>
<pre>
busybox
brctl
</pre>

<h5>スクリプトの実行</h5>
<p>
本スクリプトを「-l」 オプションにファイルリスト、続けて作業用の（ファイル一式を展開しておいた）ディレクトリのフルパスを指定して実行すると
、initramfs用の設定内容が作成されます。</p>
<pre>
$ <span class="cmdline">gen_init_cpip_conf.py -l <span class="example">FOO.def /path/to/work/dir</span>  > <span class="example">initramfs_script</span></span>
</pre>
<p class="info">
作業用ディレクトリには、Linuxカーネル構築時に正しく参照が解決できるなら、相対パスを使用することもできます。
</p>

<h4>可視化</h4>
<p>
例えば、busybox, Xサーバ, matchbox について、実行に必要なライブラリとシンボリックリンクの関係は以下のようになりました。
</p>
<img src="http://pylone.jp/i/blog/gen_init_cpio_conf/deptree.png" alt="[image]"/>
<p>
<a href="http://pylone.jp/i/blog/gen_init_cpio_conf/deptree_orig.png">高解像度版 (PNG)</a>
<a href="http://pylone.jp/i/blog/gen_init_cpio_conf/deptree_orig.svg">原図 (SVG)</a>
</p>


]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Wed, 18 Apr 2012 05:05 GMT</pubDate>
</item>
<item>
   <title>クロス開発環境のDebianパッケージ (gcc-3.4, gcc-4.1)</title>
   <guid isPermaLink="false">cross_toolchain_deb</guid>
   <link>http://pylone.jp/blog/cross_toolchain_deb</link>
   <description><![CDATA[

<p class="info">
gcc-4.4を公開しました - 記事: <a href="http://pylone.jp/blog/cross_toolchain_201011_deb">クロス開発環境のDebianパッケージ (gcc-4.4)</a>
</p>

<p>
社内で使っているクロス開発環境のDebianパッケージを<a href="http://downloads.pylone.jp/cross-toolchain/deb/">公開</a>します。
</p>

<h4>更新履歴</h4>

<ul>
  <li>2007/11/09: 公開</li>
  <li>2007/12/15: apt-lineのtypoを修正</li>
  <li>2008/02/26: update-alternativesについての記述を追加</li>
  <li>2008/07/04: mipsel で gcc-4.1 の動作を確認</li>
  <li>2008/12/22: アーカイブの鍵についての記述を追加</li>
  <li>2009/03/09: powerpc で動作を確認</li>
</ul>

<h4>概要</h4>

<ul>
  <li>ホストアーキテクチャ: i386</li>
  <li>ターゲットアーキテクチャ: arm, mipsel, powerpc, sh4</li>
  <li>コンパイラ: gcc-3.4, gcc-4.1, g++-4.1</li>
  <li>glibc: 2.3.6 (etch の glibc)</li>
  <li>ssp: 無効</li>
</ul>

<p>
基本的にはetchのbinutils, gccを
debian/README.cross等の手順通りにビルドしたものですが、
etchとsidの両方にインストールできるように依存関係を調整するなど
若干の変更を加えています。
</p>

<h4>対応状況</h4>


<table style="text-align:center;">
  <tr>
    <th></th>
    <th>gcc-3.4</th>
    <th>gcc-4.1</th>
    <th>g++-4.1</th>
  </tr><tr>
    <th>arm</th>
    <td class="stable">○</td>
    <td class="stable">○</td>
    <td class="stable">○</td>
  </tr><tr>
    <th>mipsel</th>
    <td class="unstable">△</td>
    <td class="stable">○</td>
    <td class="unstable">△</td>
  </tr><tr>
    <th>powerpc</th>
    <td class="stable">○</td>
    <td class="broken">×</td>
    <td class="broken">×</td>
  </tr><tr>
    <th>sh4</th>
    <td class="stable">○</td>
    <td class="stable">○</td>
    <td class="unstable">△</td>
  </tr>
</table>

<ul>
  <li>○:動作を確認したもの</li>
  <li>△:パッケージはあるが、まだ動作が確認できていないもの</li>
  <li>×:まだパッケージが用意できていないもの</li>
</ul>

<h4>インストール</h4>

<p>
etchかsidであればインストールできる筈です。
</p>

<p>
/etc/apt/sources.listに以下のapt lineを加えます。
</p>

<pre>
deb http://downloads.pylone.jp/cross-toolchain/deb ./
</pre>

<p>
(まだ行っていなければ) pylone.jp の鍵を導入します。
</p>

<pre>
# wget http://pylone.jp/pubkey.asc -O - | apt-key add -
</pre>

<p>
パッケージ情報を更新します。
</p>

<pre>
# <span class="cmdline">aptitude update</span>
</pre>

<p>
必要なツールをインストールします。
ARCHはarm、mipsel、sh4、powerpcの何れかに置き換えてください。
</p>

<h5>gcc-3.4</h5>
<pre>
# <span class="cmdline">aptitude install gcc-3.4-<span class="example">ARCH</span>-linux-gnu</span>
</pre>

<h5>gcc-4.1</h5>
<pre>
# <span class="cmdline">aptitude install gcc-4.1-<span class="example">ARCH</span>-linux-gnu</span>
</pre>

<h5>g++-4.1</h5>

<pre>
# <span class="cmdline">aptitude install g++-4.1-<span class="example">ARCH</span>-linux-gnu</span>
</pre>

※ powerpc用g++はまだ用意できていません。

<h5>gdb</h5>

<pre>
# <span class="cmdline">aptitude install gdb-<span class="example">ARCH</span>-linux-gnu</span>
</pre>

<h5>gcc-3.4とgcc-4.1の切り替え</h5>

<pre>
# <span class="cmdline">update-alternatives --config <span class="example">ARCH</span>-linux-gnu-gcc</span>
</pre>

<h4>リンク</h4>

<ul>
  <li><a href="http://www.emdebian.org/tools/crossdev.html">Embedded Debian Cross Development Environments</a></li>
  <li><a href="http://wiki.debian.org/SH4/CrossToolchain">Debian Wiki - SH4/CrossToolchain</a></li>
  <li><a href="http://psas.pdx.edu/DebianCrossCompilerHowto/">DebianCrossCompilerHowto</a></li>
</ul>

<h4>謝辞</h4>

<p>
sh4 用 glibc をビルドするにあたって、<a href="http://www.si-linux.co.jp/">シリコンリナックス株式会社</a>様が公開されていた glibc パッケージ の debian/patches/sh/*.diff を使わせて頂きました。
</p>


]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Sun, 08 Apr 2012 11:29 GMT</pubDate>
</item>
<item>
   <title>ディスクイメージのホスト側での操作方法</title>
   <guid isPermaLink="false">tips_diskimage_partitioning</guid>
   <link>http://pylone.jp/blog/tips_diskimage_partitioning</link>
   <description><![CDATA[

<p>
<a href="http://www.qemu.org">QEMU</a>などのシステムエミュレータでは、エミュレートされるシステムに対して仮想的なデバイスを見せることができます。
ハードディスクなどの記憶装置を模擬する場合、ディスクイメージをファイルとして作成して使うことが多いでしょう。
</p>
<p>
今回は、このディスクイメージを仮想環境の外側で作成/操作する手段について紹介します。
</p>
<p class="info">
作業環境としてはLinuxを想定しています。
</p>

<h4>イメージの作成</h4>
<p>
希望の構成のディスクイメージを、ホスト環境で作成する手順を説明します。
</p>
<h5>ファイル作成</h5>
<p>
まず希望のデバイスサイズのファイルを用意します。
</p>
<p>
サイズさえ十分ならどのようにしても構いませんが、ddで作ることをおすすめします。例えば 512 MBytes のものを作りたいなら
</p>
<pre>
$ <span class="cmdline">dd if=/dev/zero of=<span class="example">FILENAME</span> bs=1 count=1 seek=<span class="example">536870911</span></span>
</pre>
<p>
とするとよいでしょう。
(seek= の値は、512 MBytes = 524288 KBytes = 536870912 Byte なので、536870912-1 を指定しています)
</p>

<p>
素朴に /dev/zero からコピーして
</p>
<pre>
$ <span class="cmdline">dd if=/dev/zero of=<span class="example">FILENAME</span> bs=1M count=<span class="example">512</span></span>
</pre>
<p>
としてもよいのですが、近代的な（ファイルにholeが作れる）ファイルシステムで作業しているならseek させた方が
終了が早く、実ディスク消費も抑えられます。
</p>

<h5>パーティション作成</h5>
<p>
エミュレーションされる環境を実際の環境に近付けるために、ディスクイメージ上にはパーティションが作成されている状態を用意できると便利です。そこで、ループバックデバイスを用いてファイルをブロックデバイスとして見せ、fdisk などの対象に取れるようにする方法について説明します。
</p>
<p class="info">
パーティションを作成する必要がないなら、ディスクイメージに対してmkfsを実行すれば十分なので、この節の内容は不要です。
</p>

<p>
まず、losetupを用いてファイルをループバックデバイスに結びつけます。この操作にはroot権限が必要です。
</p>
<pre>
# <span class="cmdline">losetup /dev/loop0 <span class="example">FILENAME</span></span>
</pre>
<p>
losetupに成功すると、/dev/loop0が<span class="example">FILENAME</span>を内容とするブロックデバイスとして振る舞うようになります。</p>
<p class="info">
何らかの理由でloop0が使用中の場合は、適宜loop1などに読みかえてください。
</p>

<p>
ループバックデバイスに対してfdiskを実行します。後の作業で各パーティションの開始セクタ番号が必要になるので、-uオプションを付けておきます。
</p>
<pre>
<span class="cmdline"
># fdisk -u /dev/loop0</span>
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0xaf87fef0.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
</pre>
<p>
パーティションを作成します。この例では一つだけ作ります。
</p>
<pre>
Command (m for help): <span class="cmdline">n</span>
First sector (63-1048575, default 63):
Using default value 63
Last sector or +size or +sizeM or +sizeK (63-1048575, default 1048575):
Using default value 1048575
</pre>
<p>
パーティションを作成したら、状態を確認します。
</p>
<pre>
Command (m for help): <span class="cmdline">p</span>

Disk /dev/loop0: 536 MB, 536870912 bytes
255 heads, 63 sectors/track, 65 cylinders, total 1048576 sectors
Units = sectors of 1 * 512 = 512 bytes
Disk identifier: 0xaf87fef0

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1              63     1048575      524256+  83  Linux
Partition 1 does not end on cylinder boundary.
</pre>
<p>
表示される値のうち、「Units」の値（ここでは 512 bytes）と「Start」の値（ここでは63）を覚えておきます。
</p>
<p>
作成結果に問題なければ変更をイメージに書き戻して終了します。
</p>
<pre>
Command (m for help): <span class="cmdline">w</span>
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 22: Invalid argument.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.
Command (m for help): <span class="cmdline">q</span>
</pre>
<p>
使いおわったらループバックデバイスを開放します。
</p>
<pre>
# <span class="cmdline">losetup -d /dev/loop0</span>
</pre>

<h5>イメージ内のパーティションをフォーマット</h5>
<p>
ここまでの作業でディスクイメージにパーティションを作成できましたが、まだ個々のパーティションにはファイルシステムが書かれていません。
個別のパーティションに対してmkfsを実行するための手順を説明します。
</p>

<p>
mkfsの対象とするためには、（ディスクイメージ全体ではなく）対象となるパーティションの部分を取り出す必要があります。
</p>
<p>
losetupの-oオプションを使用することで、ファイルの途中からをループバックデバイスに結びつけます。
</p>
<p>
先ほどの例では 開始位置が 63、Unit が 512 bytes だったので、パーティション#1のオフセットとして63*512=32256バイトを設定します。
</p>
<pre>
# <span class="cmdline">losetup -o <span class="example">32256</span> /dev/loop0 <span class="example">FILENAME</span></span>
</pre>

<p>
losetupに成功したら、好みのファイルシステムを作成できます。
</p>
<pre>
# <span class="cmdline">mkfs.ext2 /dev/loop0</span>
</pre>
<p>
使いおわったらループバックデバイスを開放します。
</p>
<pre>
# <span class="cmdline">losetup -d /dev/loop0</span>
</pre>

<h4>イメージ内のパーティションに外からアクセス</h4>
<p>
既にファイルシステムが作られているイメージ（上記の手順で作成したものや、仮想環境で使っていたrawイメージなど）を扱う場合、
mountの"loop"オプションを使用することで、イメージ内部のパーティションを直接ホスト環境にマウントすることができます。
</p>
<p>
この例の場合、loopのoffsetに開始位置（32256）を指定する：
</p>
<pre>
# <span class="cmdline">mount -o loop,offset=<span class="example">32256</span> FILENAME /mnt/</span>
</pre>
<p>
と、/mnt経由で先ほど作成したパーティションの内容を操作することができるようになります。
</p>
<p>
作業が終わったら通常のmountと同じように
</p>
<pre>
# <span class="cmdline">umount /mnt/</span>
</pre>
<p>
します。
</p>

<h4>注意</h4>
仮想環境で使用中のイメージファイルをホスト側環境から同時に操作すると、データを失う可能性があります。


]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Wed, 18 Apr 2012 05:05 GMT</pubDate>
</item>
<item>
   <title>sysfs 経由でモジュールパラメータにアクセス</title>
   <guid isPermaLink="false">tips_modparams_via_sysfs</guid>
   <link>http://pylone.jp/blog/tips_modparams_via_sysfs</link>
   <description><![CDATA[


<p>sysfs経由でモジュールパラメータにアクセスする方法を紹介します。</p>
<p>Linux-2.6でモジュールパラメータを定義するマクロがMODULE_PARMからmodule_paramに変更されました。</p>
<p>Linux-2.4のMODULE_PARM:</p>
<div class="highlight"><pre><span class="cm">/* パラメータparamをint型で宣言 */</span>
<span class="k">static</span> <span class="kt">int</span> <span class="n">param</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="n">MODULE_PARM</span><span class="p">(</span><span class="n">param</span><span class="p">,</span> <span class="s">&quot;i&quot;</span><span class="p">);</span>
<span class="n">MODULE_PARM_DESC</span><span class="p">(</span><span class="n">param</span><span class="p">,</span> <span class="s">&quot;Description&quot;</span><span class="p">);</span>
</pre></div>

<p>Linux-2.6のmodule_param:</p>
<div class="highlight"><pre><span class="cm">/* パラメータparamをint型で宣言 */</span>
<span class="k">static</span> <span class="kt">int</span> <span class="n">param</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="n">module_param</span><span class="p">(</span><span class="n">param</span><span class="p">,</span> <span class="kt">int</span><span class="p">,</span> <span class="n">S_IRUGO</span> <span class="o">|</span> <span class="n">S_IWUSR</span><span class="p">);</span>
<span class="n">MODULE_PARM_DESC</span><span class="p">(</span><span class="n">param</span><span class="p">,</span> <span class="s">&quot;Description&quot;</span><span class="p">);</span>
</pre></div>

<p>insmodの引数として指定できるパラメータであることは同じですが、module_paramではsysfsからもパラメータにアクセスできます。</p>
<pre>
# <span class="cmdline">echo 1 > /sys/module/<span class="example">モジュール名</span>/parameters/param</span>
</pre>
<p>似たようなことはprocfsでもできますが面倒です。
module_paramであればsysfsの詳細を知らなくても定義するだけでモジュール内の変数をパラメータとしてユーザ空間にexportできます。
デバッグ時など、ioctlを使うまでもない場合には便利じゃないでしょうか?</p>
<p class="info">モジュールではなくカーネルにstaticリンクされててもアクセスできます。</p>
<p class="info">sysfsによってファイルとして見えるパラメータのパーミッションはmodule_paramの引数で指定します。</p>
<p class="info">パラメータとして使う変数が文字列の場合、module_param_string を使います。</p>
<h4 id="tips_modparams_via_sysfs-E9.96.A2.E9.80.A3.E8.A8.98.E4.BA.8B">関連記事</h4>
<ul><li><a href="http://pylone.jp/blog/tips_modparams_via_sysfs_2">sysfs 経由でモジュールパラメータにアクセス (2)</a></li></ul>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Sat, 14 Feb 2009 15:45 GMT</pubDate>
</item>
<item>
   <title>BishopエミュレータBeta1リリース</title>
   <guid isPermaLink="false">qemu_bishop_beta1</guid>
   <link>http://pylone.jp/blog/qemu_bishop_beta1</link>
   <description><![CDATA[

<p class="info">
正式版を公開しました - 記事: <a href="http://pylone.jp/blog/qemu_bishop_0.9.1_pylone1">Bishopエミュレータ正式版リリース</a>
</p>

<p>
Bishopエミュレータのベータ版を公開しました。
</p>

<p>
<object type="application/x-shockwave-flash" data="http://www.youtube.com/v/uaXr-1DMxMw&amp;rel=0&amp;color1=0xd6d6d6&amp;color2=0xf0f0f0&amp;border=0" width="425" height="355">
  <param name="movie" value="http://www.youtube.com/v/uaXr-1DMxMw&amp;rel=0&amp;color1=0xd6d6d6&amp;color2=0xf0f0f0&amp;border=0" />
  <param name="wmode" value="transparent" />
</object>
</p>

<p>
パイロンでは組込みLinux開発用CPUボード<a href="http://pylone.jp/bishop/">Bishop</a>のエミュレータを開発しています。主要な構成要素についてエミュレーションの実装が終了したので、Beta1として公開します。
</p>
<p>
今回のリリースでは、ソースコードとWindows向けインストーラの形式で提供します。以下のリンク先から取得してください：
</p>
<dl>
<dt>ソースコード:</dt>
<dd><a href="http://downloads.pylone.jp/src/qemu-bishop-0.9.0cvs20071001-pylone0rc1.tar.bz2">
qemu-bishop-0.9.0cvs20071001-pylone0rc1.tar.bz2</a>
</dd>
<dt>Windows向けインストーラ:</dt>
<dd><a href="http://downloads.pylone.jp/bishop/qemu-bishop-0.9.0cvs20071001-pylone0rc1-setup.exe">
qemu-bishop-0.9.0cvs20071001-pylone0rc1-setup.exe</a>
</dd>
</dl>
<p>
今後
</p>
<ul>
<li>Debianパッケージ</li>
</ul>
<p>
についても準備していく予定です。
</p>

<h4>リリース内容</h4>
<p>本エミュレータは、オープンソースのプロセッサエミュレータ<a href="http://www.qemu.org/">QEMU</a>の開発版をベースに、Bishop向けの機能を追加したものです。Bata1の段階では、まだ実機に存在する全ての周辺機器を正しくエミュレートできるわけではありません。
</p>
<h5>各種ペリフェラルのサポート状況</h5>
<table>
 <thead>
  <tr>
   <th colspan="2">ペリフェラル
   </th>
   <th>状況
   </th>
   <th>注
   </th>
  </tr>
 </thead>
<tbody>
<tr>	<th colspan="2">	NOR	</th> <td style="text-align:center;" class="unstable">	△	</td><td>	ROMとして表現され、NORとしてのコマンドには応答しません。	</td></tr>
<tr>	<th colspan="2">	NAND	</th> <td style="text-align:center;" class="stable">	○	</td><td>		</td></tr>
<tr>	<th colspan="2">	LCD	</th> <td style="text-align:center;" class="stable">	○	</td><td>		</td></tr>
<tr>	<th colspan="2">	RTC	</th> <td style="text-align:center;" class="stable">	○	</td><td>		</td></tr>
<tr>	<th colspan="2">	シリアルポート	</th> <td style="text-align:center;" class="stable">	○	</td><td>		</td></tr>
<tr>	<th colspan="2">	イーサネット	</th> <td style="text-align:center;" class="stable">	○	</td><td>		</td></tr>
<tr>	<th>	GPIO	</th><th>	LED	</th><td style="text-align:center;" class="unstable">	△	</td><td>	状態の設定は可能ですが、表示はおこなわれません。	</td></tr>
<tr class="weaksplit">	<th rowspan="3">	USB(OHCI)	</th><th>	マスストレージ	</th><td style="text-align:center;" class="unstable">	△	</td><td>	高負荷時に不安定になる場合があります。	</td></tr>
<tr class="weaksplit">	 <th>	キーボード	</th><td style="text-align:center;" class="unstable">	△	</td><td>	ホストのキーボードが英語配列でない環境では、一部のキーが正しく解釈されません。	</td></tr>
<tr class="weaksplit">	 <th>	マウス	</th><td style="text-align:center;" class="stable">	○	</td><td>		</td></tr>
<tr>	<th colspan="2">	サウンド	</th> <td style="text-align:center;" class="broken">	×	</td><td>		</td></tr>
<tr>	<th colspan="2">	タッチスクリーン	</th> <td style="text-align:center;" class="broken">	×	</td><td>		</td></tr>
<tr>	<th colspan="2">	MMC	</th> <td style="text-align:center;" class="broken">	×	</td><td>		</td></tr>
<tr>	<th colspan="2">	カメラ	</th> <td style="text-align:center;" class="broken">	×	</td><td>		</td></tr>
						
</tbody>
</table>

<h4>ソースコードからのインストール</h4>

<h5>必要な環境</h5>
<ul>
<li>gcc-3.4 (4.x では動作しません)</li>
<li><a href="http://www.libsdl.org/">SDL 1.2</a></li>
</ul>
<p>
※Debian環境では、
<kbd># apt-get build-dep qemu</kbd> を実行することで、必要なパッケージを一括してインストールすることもできます。
</p>
<h5>構築手順</h5>
<p>
ソースコードを展開したディレクトリ内で以下の手順を行うことで、実行可能ファイル ./arm-softmmu/qemu-system-arm が生成されます。
</p>
<dl>
<dt>configure の実行</dt>
<dd>
<kbd>$ ./configure --target-list=arm-softmmu</kbd>
</dd>
<dt>コンパイル</dt>
<dd>
<kbd>$ make</kbd>
</dd>
</dl>
<h4>エミュレータの実行</h4>
<p>
Bishopエミュレータに実機出荷状態と同様の動作をさせるためには、
</p>
<ul>
<li><a href="http://downloads.pylone.jp/bishop/romimages-latest/u-boot.bin">
U-Bootイメージ</a></li>
<li><a href="http://downloads.pylone.jp/bishop/romimages-latest/uImage">
Linuxカーネルイメージ</a></li>
<li><a href="http://downloads.pylone.jp/bishop/romimages-latest/initrd.uimg">
initrdイメージ</a></li>
<li><a href="http://downloads.pylone.jp/bishop/romimages-latest/nand-bishop.img">
ファイルシステムイメージ</a></li>
<li><a href="http://downloads.pylone.jp/bishop/romimages-latest/splash640.bmp.gz">
スプラッシュイメージ</a></li>
</ul>
<p>
を与える必要があります。それぞれのファイルをリンク先からダウンロードし、ソースコードのトップディレクトリに置いた状態で
</p>
<p>
<kbd>
$ ./arm-softmmu/qemu-system-arm -M pe201b -serial stdio -kernel dummy -usbdevice keyboard -mtdblock nand-bishop.img
</kbd>
</p>
<p>
として起動してください。
</p>
<ol>
<li>U-Bootがメモリに読みこまれて起動</li>
<li>U-BootがLinuxカーネルを読みこみ</li>
<li>LinuxカーネルがNANDのファイルシステムイメージをマウント</li>
</ol>
<p>
の順で実行されて、最終的にログインプロンプトが表示されます。
</p>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Wed, 09 May 2012 03:11 GMT</pubDate>
</item>
<item>
   <title>QEMUによるBishop エミュレーション</title>
   <guid isPermaLink="false">qemu_bishop</guid>
   <link>http://pylone.jp/blog/qemu_bishop</link>
   <description><![CDATA[

<p>
<img src="http://pylone.jp/i/blog/qemu_screenshot.png" alt="スクリーンショット" />
</p>

<p>
このスクリーンショットは現在パイロンで開発中の<a href="http://pylone.jp/bishop/">Bishop</a>エミュレータです。オープンソースのプロセッサエミュレータ<a href="http://www.qemu.org/">QEMU</a>をベースにしています。ちょっと試しにやってみるかという軽い動機で始めたのですが、作業が進み QEMU への理解が深まるにつれて組込みソフトウェア開発ツールとしての可能性を感じるようになりました。まだ具体的な活用をご提案できるまでには至っていませんが、何か役にたつ使い方があれば紹介していきたいと考えています。
</p>

<dl>
<dt>2007/10/12:</dt>
<dd><a href="http://pylone.jp/blog/qemu_bishop_beta1">Beta1をリリース</a>しました。</dd>
<dt>2007/12/28:</dt>
<dd><a href="http://pylone.jp/blog/qemu_bishop_beta2">Beta2をリリース</a>しました。</dd>
<dt>2008/5/23:</dt>
<dd><a href="http://pylone.jp/blog/qemu_bishop_beta3">Beta3をリリース</a>しました。</dd>
<dt>2008/9/26:</dt>
<dd><a href="http://pylone.jp/blog/qemu_bishop_beta4">Beta4をリリース</a>しました。</dd>
<dt>2008/12/21:</dt>
<dd><a href="http://pylone.jp/blog/qemu_bishop_0.9.1_pylone1">正式版をリリース</a>しました。</dd>
</dl>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Thu, 08 Apr 2010 15:32 GMT</pubDate>
</item>
<item>
   <title>Linux 起動ロゴの変更</title>
   <guid isPermaLink="false">tips_fblogo</guid>
   <link>http://pylone.jp/blog/tips_fblogo</link>
   <description><![CDATA[


<p>フレームバッファに表示される起動時のロゴ画像を変更する方法を紹介します。</p>
<p><img src="http://pylone.jp/i/blog/fdo_logo_screenshot.jpg" alt="screenshot" /></p>
<p>以前はピクセル値が配列にベタ書きされたヘッダファイルを用意する必要がありましたが、Linux-2.6でフレームバッファ周辺が書き直されて PNM を直接ソースツリーに置けるようになりました。</p>
<p><img src="http://pylone.jp/i/blog/fdo_logo.png" alt="ロゴ画像" /></p>
<p>例として、この<a href="http://www.freedesktop.org/">freedesktop.org</a>のロゴ画像 (PNG, 80x80) を224色の起動ロゴにしてみます。</p>
<p>まず、画像をPNMに変換します。</p>
<pre>$ convert -colors 224 fdo_logo.png fdo_logo.pnm</pre>
<p><a href="http://projects.itri.aist.go.jp/etlcdb/util/p2a.htm">pnm2asc</a>で
ピクセル値がASCIIのPNMに変換して、drivers/video/logo/ に放り込みます。</p>
<pre>$ pnm2asc fdo_logo.pnm &gt; drivers/video/logo/logo_fdo_clut224.ppm</pre>
<p>drivers/video/logo/Makefileに以下を追加します。</p>
<pre>obj-$(CONFIG_LOGO_FDO_CLUT224) += logo_fdo_clut224.o</pre>
<p>drivers/video/logo/Kconfig に以下を追加します。</p>
<pre>config LOGO_FDO_CLUT224
        bool "224-color freedesktop.org logo"
        depends on LOGO
        default y</pre>
<p>drivers/video/logo/logo.cに追加したロゴ画像のプロトタイプ宣言を加えます。</p>
<div class="highlight"><pre><span class="k">extern</span> <span class="k">const</span> <span class="k">struct</span> <span class="n">linux_logo</span> <span class="n">logo_fdo_clut224</span><span class="p">;</span>
</pre></div>

<p>drivers/video/logo/logo.c:fb_find_logo()の
if (depth &gt;=4) { } の最後に以下を追加します。</p>
<div class="highlight"><pre><span class="cp">#ifdef CONFIG_LOGO_FDO_CLUT224</span>
                <span class="n">logo</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">logo_fdo_clut224</span><span class="p">;</span>
<span class="cp">#endif</span>
</pre></div>

<p>あとは、CONFIG_LOGO_FDO_CLUT224=yでカーネルをリビルドするだけです。</p>
<p>drivers/video/logo/{Makefile,Kconfig,logo.c}を弄りたくなければ、
既存のロゴを上書きするだけでもいいと思います。</p>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Sun, 08 Apr 2012 11:29 GMT</pubDate>
</item>
<item>
   <title>Bishop の発売について</title>
   <guid isPermaLink="false">bishop_announcement_sales</guid>
   <link>http://pylone.jp/blog/bishop_announcement_sales</link>
   <description><![CDATA[

<p>
組込み Linux 開発用 CPU ボード
<a href="http://pylone.jp/bishop/">Bishop</a>
の発売についてご案内いたします。
</p>

<h4>価格</h4>

<table style="text-align:center">
  <tr>
    <th style="width:8em;">型番</th>
    <th>価格 (税込・送料別)</th>
  </tr><tr>
    <td>PE-201A</td>
    <td><span style="font-size:130%;">59,800</span>円</td>
  </tr><tr>
    <td>PE-201B</td>
    <td><span style="font-size:130%;">84,000</span>円</td>
  </tr>
</table>

<h4>発売日</h4>

2007年7月31日

<h4>購入方法</h4>

<a href="http://pylone.jp/bishop/order.html">弊社の通信販売</a>でお求め頂けます。

<h4>ソフトウェア構成</h4>

<p>
プリインストールされるルートファイルシステムは Debian GNU/Linux 4.0 (etch) を
ベースにしたものになります。
<a href="http://pylone.jp/blog/bishop_info_09">以前の記事</a>でお知らせした uClibc による ルートファイルシステムは中止しました。
</p>


]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Sun, 18 Apr 2010 10:35 GMT</pubDate>
</item>
<item>
   <title>CPU ボード Bishop (10)『Debian GNU/Linux』</title>
   <guid isPermaLink="false">bishop_info_10</guid>
   <link>http://pylone.jp/blog/bishop_info_10</link>
   <description><![CDATA[
<p>
<img src="http://pylone.jp/i/debian_60.png" alt="Debian" style="float:right;margin-left:1em;" />
<a href="http://pylone.jp/blog/bishop_info_09">前回の記事</a>
でご紹介した uClibc によるルートファイルシステムとは別に
<a href="http://www.debian.org">Debian GNU/Linux</a>
環境もご提供させていただく予定です。
</p>
<p>
組込み Linux 開発において、アプリケーションのクロスコンパイルだけでそれなりの
時間を取られてしまった経験のある開発者の方も多いかと存じます。 Debian の豊富な
バイナリパッケージをお使いいただければ製品企画段階のデモ機作成などが手軽に行え
ます。
</p>


]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Thu, 08 Apr 2010 15:32 GMT</pubDate>
</item>
<item>
   <title>CPU ボード Bishop (9) 『uClibc によるルートファイルシステム』</title>
   <guid isPermaLink="false">bishop_info_09</guid>
   <link>http://pylone.jp/blog/bishop_info_09</link>
   <description><![CDATA[

<p class="info">
2007年7月28日:
本記事にてご案内した uClibc によるルートファイルシステムは中止させていただきました。
</p>

<div class="removed">
<p>
<a href="http://pylone.jp/bishop/">Bishop</a> の
NAND フラッシュメモリにプリインストールされるルートファイルシステムは
<a href="http://buildroot.uclibc.org/">buildroot</a> によって作られたものです。
現在検討中の構成は以下の通りです。
</p>

<ul>
  <li><a href="http://www.uclibc.org/">uClibc</a>: 組込み Linux 向け軽量 C ライブラリ</li>
  <li><a href="http://busybox.net/">BusyBox</a>: 標準的な Linux ユーティリティを単一バイナリで提供</li>
  <li><a href="http://matchbox-project.org/">MatchBox</a>: 小さな画面やタッチパネルを対象に設計されたウィンドウマネージャ</li>
</ul>

<p>
詳細につきましては、正式決定後に製品情報ページや本ブログにてお知らせいたします。
</p>

<p class="info">
buildroot とは uClibc の作者である Erik Andersen 氏
によって開発されたルートファイルシステムを作成するための仕組みで、
様々なプログラムを uClibc でビルドするための Makefile や patch で
構成されています。
</p>
</div>


]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Sat, 14 Feb 2009 15:45 GMT</pubDate>
</item>
<item>
   <title>CPU ボード Bishop (8) 『U-Boot』</title>
   <guid isPermaLink="false">bishop_info_08</guid>
   <link>http://pylone.jp/blog/bishop_info_08</link>
   <description><![CDATA[


<p><a href="http://pylone.jp/bishop/">Bishop</a> のブートローダ
<a href="http://www.denx.de/wiki/UBoot/">U-Boot</a>
は前身であるPowerPC用ブートローダ
<a href="http://ppcboot.sourceforge.net/">ppcboot</a>
を他のアーキテクチャにも対応させた組込み向け汎用ブートローダです。
tftpによるネットワークブートなどブートローダとしての機能に加え、
USB、MMC、IDE、MII、PCMCIA、NAND、I2C、SPI など様々なデバイスやバスに対応
したモニタプログラムでもあります。</p>
<p>U-Boot の特筆すべき点は移植性の高さです。
アーキテクチャに依存する部分と非依存の部分が分離されているため、
コアアーキテクチャさえ対応していれば
新しい CPU への対応も比較的少ない作業で済みます。
また、デバイスドライバが豊富に用意されているため、
対応しているデバイスであれば
デバイス固有のパラメータを与えるだけで動いてしまう事が多いです。
例として、実際に U-Boot を Bishop へ移植した際に追加したコードの一部をご紹介します。</p>
<h4 id="bishop_info_08-4C.41.4E.E3.82.B3.E3.83.B3.E3.83.88.E3.83.AD.E3.83.BC.E3.83.A9.44.4D.39.30.30.30">LANコントローラDM9000</h4>
<p>DM9000 のドライバは common/dm9000x.c です。ターゲットで動かすためには
アドレスとバス幅を指定します。</p>
<p>include/configs/bishop.h:</p>
<div class="highlight"><pre><span class="cp">#define CONFIG_DRIVER_DM9000    1                        </span><span class="cm">/* ドライバを有効化 */</span><span class="cp"></span>
<span class="cp">#define CONFIG_DM9000_BASE      0x20000300</span>
<span class="cp">#define DM9000_IO               CONFIG_DM9000_BASE       </span><span class="cm">/* アドレス (I/O) */</span><span class="cp"></span>
<span class="cp">#define DM9000_DATA             (CONFIG_DM9000_BASE + 4) </span><span class="cm">/* アドレス (データ) */</span><span class="cp"></span>
<span class="cp">#define CONFIG_DM9000_USE_32BIT 1                        </span><span class="cm">/* バス幅 */</span><span class="cp"></span>
</pre></div>

<h4 id="bishop_info_08-4E.41.4E.44">NAND</h4>
<p>NAND のドライバは drivers/nand/ です。動かすためにはチップの数と NAND コントローラのベースアドレスを指定し、NAND コントローラ固有の処理を追加します。</p>
<p>include/configs/bishop.h:</p>
<div class="highlight"><pre><span class="cp">#define NAND_MAX_CHIPS          1</span>
<span class="cp">#define CFG_MAX_NAND_DEVICE     1</span>
<span class="cp">#define CFG_NAND_BASE           0x4E000010</span>
</pre></div>

<p>board/pylone/bishop/nand.c:</p>
<div class="highlight"><pre><span class="cp">#include &lt;common.h&gt;</span>

<span class="cp">#if (CONFIG_COMMANDS &amp; CFG_CMD_NAND) &amp;&amp; !defined(CFG_NAND_LEGACY)</span>

<span class="cp">#include &lt;nand.h&gt;</span>
<span class="cp">#include &lt;s3c2440.h&gt;</span>

<span class="k">static</span> <span class="kt">int</span> <span class="n">hwctl</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

<span class="k">static</span> <span class="kt">void</span> <span class="nf">bishop_hwcontrol</span><span class="p">(</span><span class="k">struct</span> <span class="n">mtd_info</span> <span class="o">*</span><span class="n">mtdinfo</span><span class="p">,</span> <span class="kt">int</span> <span class="n">cmd</span><span class="p">)</span>
<span class="p">{</span>
        <span class="n">S3C2440_NAND</span> <span class="o">*</span> <span class="k">const</span> <span class="n">reg</span> <span class="o">=</span> <span class="n">S3C2440_GetBase_NAND</span><span class="p">();</span>

        <span class="k">switch</span> <span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">case</span> <span class="n">NAND_CTL_SETCLE</span>:
                <span class="n">hwctl</span> <span class="o">|=</span> <span class="mh">0x1</span><span class="p">;</span>
                <span class="k">break</span><span class="p">;</span>
        <span class="k">case</span> <span class="n">NAND_CTL_CLRCLE</span>:
                <span class="n">hwctl</span> <span class="o">&amp;=</span> <span class="o">~</span><span class="mh">0x1</span><span class="p">;</span>
                <span class="k">break</span><span class="p">;</span>
        <span class="k">case</span> <span class="n">NAND_CTL_SETALE</span>:
                <span class="n">hwctl</span> <span class="o">|=</span> <span class="mh">0x2</span><span class="p">;</span>
                <span class="k">break</span><span class="p">;</span>
        <span class="k">case</span> <span class="n">NAND_CTL_CLRALE</span>:
                <span class="n">hwctl</span> <span class="o">&amp;=</span> <span class="o">~</span><span class="mh">0x2</span><span class="p">;</span>
                <span class="k">break</span><span class="p">;</span>
        <span class="k">case</span> <span class="n">NAND_CTL_SETNCE</span>:
                <span class="n">reg</span><span class="o">-&gt;</span><span class="n">NFCONT</span> <span class="o">=</span> <span class="n">reg</span><span class="o">-&gt;</span><span class="n">NFCONT</span> <span class="o">&amp;</span> <span class="mh">0xfffffffd</span><span class="p">;</span>
                <span class="k">break</span><span class="p">;</span>
        <span class="k">case</span> <span class="n">NAND_CTL_CLRNCE</span>:
                <span class="n">reg</span><span class="o">-&gt;</span><span class="n">NFCONT</span> <span class="o">=</span> <span class="n">reg</span><span class="o">-&gt;</span><span class="n">NFCONT</span> <span class="o">|</span> <span class="mi">2</span><span class="p">;</span>
                <span class="k">break</span><span class="p">;</span>
        <span class="p">}</span>
<span class="p">}</span>

<span class="k">static</span> <span class="kt">void</span> <span class="nf">bishop_write_byte</span><span class="p">(</span><span class="k">struct</span> <span class="n">mtd_info</span> <span class="o">*</span><span class="n">mtdinfo</span><span class="p">,</span> <span class="n">u_char</span> <span class="n">byte</span><span class="p">)</span>
<span class="p">{</span>
        <span class="n">S3C2440_NAND</span> <span class="o">*</span> <span class="k">const</span> <span class="n">reg</span> <span class="o">=</span> <span class="n">S3C2440_GetBase_NAND</span><span class="p">();</span>

        <span class="k">if</span> <span class="p">(</span><span class="n">hwctl</span> <span class="o">&amp;</span> <span class="mh">0x1</span><span class="p">)</span>
                <span class="n">reg</span><span class="o">-&gt;</span><span class="n">NFCMMD</span> <span class="o">=</span> <span class="n">byte</span><span class="p">;</span>
        <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">hwctl</span> <span class="o">&amp;</span> <span class="mh">0x2</span><span class="p">)</span>
                <span class="n">reg</span><span class="o">-&gt;</span><span class="n">NFADDR</span> <span class="o">=</span> <span class="n">byte</span><span class="p">;</span>
        <span class="k">else</span>
                <span class="n">reg</span><span class="o">-&gt;</span><span class="n">NFDATA</span> <span class="o">=</span> <span class="n">byte</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">static</span> <span class="n">u_char</span> <span class="nf">bishop_read_byte</span><span class="p">(</span><span class="k">struct</span> <span class="n">mtd_info</span> <span class="o">*</span><span class="n">mtdinfo</span><span class="p">)</span>
<span class="p">{</span>
        <span class="n">S3C2440_NAND</span> <span class="o">*</span> <span class="k">const</span> <span class="n">reg</span> <span class="o">=</span> <span class="n">S3C2440_GetBase_NAND</span><span class="p">();</span>
        <span class="k">return</span> <span class="n">reg</span><span class="o">-&gt;</span><span class="n">NFDATA</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">static</span> <span class="kt">int</span> <span class="nf">bishop_dev_ready</span><span class="p">(</span><span class="k">struct</span> <span class="n">mtd_info</span> <span class="o">*</span><span class="n">mtdinfo</span><span class="p">)</span>
<span class="p">{</span>
        <span class="n">S3C2440_NAND</span> <span class="o">*</span> <span class="k">const</span> <span class="n">reg</span> <span class="o">=</span> <span class="n">S3C2440_GetBase_NAND</span><span class="p">();</span>
        <span class="k">while</span> <span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="n">reg</span><span class="o">-&gt;</span><span class="n">NFSTAT</span> <span class="o">&amp;</span> <span class="mi">1</span><span class="p">));</span>
        <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">void</span> <span class="nf">board_nand_select_device</span><span class="p">(</span><span class="k">struct</span> <span class="n">nand_chip</span> <span class="o">*</span><span class="n">nand</span><span class="p">,</span> <span class="kt">int</span> <span class="n">chip</span><span class="p">)</span>
<span class="p">{</span>
        <span class="n">S3C2440_NAND</span> <span class="o">*</span> <span class="k">const</span> <span class="n">reg</span> <span class="o">=</span> <span class="n">S3C2440_GetBase_NAND</span><span class="p">();</span>
        <span class="n">reg</span><span class="o">-&gt;</span><span class="n">NFCONT</span> <span class="o">=</span> <span class="n">reg</span><span class="o">-&gt;</span><span class="n">NFCONT</span> <span class="o">&amp;</span> <span class="mh">0xfffffffd</span><span class="p">;</span>
        <span class="k">return</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="nf">board_nand_init</span><span class="p">(</span><span class="k">struct</span> <span class="n">nand_chip</span> <span class="o">*</span><span class="n">nand</span><span class="p">)</span>
<span class="p">{</span>
        <span class="n">S3C2440_NAND</span> <span class="o">*</span> <span class="k">const</span> <span class="n">reg</span> <span class="o">=</span> <span class="n">S3C2440_GetBase_NAND</span><span class="p">();</span>

        <span class="n">nand</span><span class="o">-&gt;</span><span class="n">eccmode</span> <span class="o">=</span> <span class="n">NAND_ECC_SOFT</span><span class="p">;</span>
        <span class="n">nand</span><span class="o">-&gt;</span><span class="n">hwcontrol</span>  <span class="o">=</span> <span class="n">bishop_hwcontrol</span><span class="p">;</span>
        <span class="n">nand</span><span class="o">-&gt;</span><span class="n">read_byte</span>  <span class="o">=</span> <span class="n">bishop_read_byte</span><span class="p">;</span>
        <span class="n">nand</span><span class="o">-&gt;</span><span class="n">write_byte</span> <span class="o">=</span> <span class="n">bishop_write_byte</span><span class="p">;</span>
        <span class="n">nand</span><span class="o">-&gt;</span><span class="n">dev_ready</span>  <span class="o">=</span> <span class="n">bishop_dev_ready</span><span class="p">;</span>
        <span class="n">reg</span><span class="o">-&gt;</span><span class="n">NFCONF</span> <span class="o">=</span> <span class="mh">0x0300</span><span class="p">;</span>
        <span class="n">reg</span><span class="o">-&gt;</span><span class="n">NFCONT</span> <span class="o">=</span> <span class="mh">0x0063</span><span class="p">;</span>

        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
<span class="cp">#endif </span><span class="cm">/* (CONFIG_COMMANDS &amp; CFG_CMD_NAND) &amp;&amp; !CFG_NAND_LEGACY */</span><span class="cp"></span>
</pre></div>


]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Sat, 14 Feb 2009 15:45 GMT</pubDate>
</item>
<item>
   <title>CPU ボード Bishop (7) 『JTAG-ICE』</title>
   <guid isPermaLink="false">bishop_info_07</guid>
   <link>http://pylone.jp/blog/bishop_info_07</link>
   <description><![CDATA[
<p>
<a href="http://pylone.jp/blog/bishop_info_06">前回の記事</a>で JTAG-ICE
を使わないでフラッシュメモリに書込む方法をご紹介しましたが、実際の開発では
JTAG-ICE を用いたデバッグのニーズも多いかと思います。基本的には ARM920T コアを
サポートしている JTAG-ICE であれば使用可能ですが、コアだけに対応して CPU 固有
のペリフェラルに対応していない JTAG-ICE では使い勝手はあまりよくありません。
</p>

<p>
<img src="http://pylone.jp/i/bishop/with_dr01.jpg" alt="写真" class="photo" style="float:right;margin-left:1em;" />
<a href="http://pylone.jp/bishop/">Bishop</a> の推奨 JTAG-ICE は
<a href="http://www.bitran.co.jp/">ビットラン株式会社</a>様
の <a href="http://www.bitran.co.jp/ice/dr01.html">DR-01</a> です。
DR-01 の
<a href="http://www.bitran.co.jp/ice/codestage.html">デバッガソフト</a>
は CPU 固有のペリフェラル定義を簡単に追加できます。
パイロンでは S3C2440 用ペリフェラル定義ファイルを公開する予定です。
このペリフェラル定義ファイルをデバッガソフトに追加することによって、直感的なユー
ザインタフェースで S3C2440 のペリフェラルレジスタへアクセスできます。
</p>

<p class="info">
2008/06/07:
<a href="http://pylone.jp/blog/dr01_s3c2440a_pri">ペリフェラル定義ファイルを公開</a>
</p>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Thu, 08 Apr 2010 15:32 GMT</pubDate>
</item>
<item>
   <title>CPU ボード Bishop (6) 『フラッシュメモリの書き込み』</title>
   <guid isPermaLink="false">bishop_info_06</guid>
   <link>http://pylone.jp/blog/bishop_info_06</link>
   <description><![CDATA[

<h4>U-Bootによる書き込み</h4>

<p>
<a href="http://pylone.jp/bishop/">Bishop</a>
にプリインストールされるブートローダ
<a href="http://u-boot.sourceforge.net/">U-Boot</a>はOSのブートだけでなくフラッシュメモリの書き込みもできます。フラッシュメモリ上のLinuxカーネルやルートファイルシステムを書き換えるにはU-Bootを使うのがもっとも簡単な方法です。
</p>

<p class="info">
U-BootによってU-Boot自体を書き換える事も可能ですが、書き込みに失敗した場合は起動できなくなります。お客様がU-Bootを上書きした事による起動の不具合についてはサポート対象外とさせていただきます。
</p>

<h4>ダウンロードケーブルによる書き込み</h4>

<p style="text-align:center;">
<img src="http://pylone.jp/i/bishop/fig_jtagparcable.png" alt="図" />
</p>

<p>
オプションとして販売予定のダウンロードケーブルとライタープログラムを使えば、 PC からNORフラッシュメモリへ書き込む事ができます。
U-Bootを使った書き込みでは U-Boot自体の上書きが失敗した場合に起動できなくなってしまいますが、本ケーブルを使えば起動できない状態でも書き込むことができます。
フラッシュメモリ書き込みのためだけにJTAG-ICEを購入する必要はありません。
</p>


]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Thu, 08 Apr 2010 15:32 GMT</pubDate>
</item>
<item>
   <title>CPU ボード Bishop (5) 『フラッシュメモリ』</title>
   <guid isPermaLink="false">bishop_info_05</guid>
   <link>http://pylone.jp/blog/bishop_info_05</link>
   <description><![CDATA[
<p>
<img style="float:right;margin-left:1em;margin-bottom:0.5em;" src="http://pylone.jp/i/bishop/fig_mem.png" alt="図" />
<a href="http://pylone.jp/bishop/">Bishop</a>
のフラッシュメモリは 4MB の NOR 型 と 128MB の NAND 型です。
NOR は S3C2440 のメモリコントローラに直接つながり、
NAND は S3C2440 の NAND コントローラによって制御されます。
</p>

<p>
S3C2440 のリセットベクタはメモリコントローラのバンク0 (ROM/RAM の先頭)
になります。
出荷状態の Bishop では バンク0 は NOR になっていますので、
ブートローダは NOR にインストールされます。
S3C2440 の Stepping Stone と呼ばれる機能により NAND からもブート可能ですが、
Bishop では Stepping Stone をサポート対象外とさせていただきます。
</p>


]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Thu, 08 Apr 2010 15:31 GMT</pubDate>
</item>
<item>
   <title>CPU ボード Bishop (4) 『カメラ』</title>
   <guid isPermaLink="false">bishop_info_04</guid>
   <link>http://pylone.jp/blog/bishop_info_04</link>
   <description><![CDATA[
<p>
<a href="http://pylone.jp/blog/bishop_info_02">前々回の記事</a>
でご紹介させていただいた通り、
<a href="http://pylone.jp/bishop/">Bishop</a> の CPU S3C2440 は
モバイル機器向けの様々なペリフェラルを内蔵しています。
その中のひとつがカメラインタフェースです。
下の写真はカメラインタフェースに接続できる 1.3M ピクセルの CMOS
カメラです。
パイロンでは、このカメラをオプションとして販売することを予定しています。
価格や発売時期などにつきましては、詳細が決まり次第お知らせいたします。
</p>

<p>
<img src="http://pylone.jp/i/bishop/camera.jpg" alt="写真" class="photo" />
<img src="http://pylone.jp/i/bishop/camera_on_bishop.jpg" alt="写真" class="photo" />
</p>


]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Thu, 08 Apr 2010 15:31 GMT</pubDate>
</item>
<item>
   <title>CPU ボード Bishop (3) 『タッチパネルと LCD』</title>
   <guid isPermaLink="false">bishop_info_03</guid>
   <link>http://pylone.jp/blog/bishop_info_03</link>
   <description><![CDATA[

<p>
<a href="http://pylone.jp/bishop/">Bishop</a>
にはタッチパネルと LCD (TFT) が付属します。サイズは2種類です。
</p>

<table>
  <tr>
    <th>サイズ</th>
    <th>解像度</th>
  </tr><tr>
    <td>6.4インチ</td>
    <td>640x480 (VGA)</td>
  </tr><tr>
    <td>4インチ</td>
    <td>480x272</td>
  </tr>
</table>

<p>
<img src="http://pylone.jp/i/bishop/board02.jpg" alt="写真" style="float:right;margin-left:0.5em;" />
6.4インチ (写真) はボードとほぼ同じサイズで解像度は VGA です。
4インチは QVGA をワイドにした感じの 480x272 というちょっと変わった解像
度です。<a href="http://www.scei.co.jp/products/psp/">PSP</a>
と同じ解像度といえばわかりやすいでしょうか。
</p>
<p>
タッチパネルからの入力は
<a href="http://linuxconsole.sourceforge.net/input/input.html">Linux Input Drivers</a>
が提供する仕組みによって
特定のデバイスに依存しない抽象的なイベントとして扱うことができます。
/dev/input/event0 や /dev/input/ts0 に対応したアプリケーションであれば修正す
ることなくタッチパネルを使えるでしょう。
サンプルアプリケーションとしてタッチパネルを
利用した手書き入力やソフトウェアキーボードなどもご用意させていただく予定です。
</p>


]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Thu, 08 Apr 2010 15:31 GMT</pubDate>
</item>
<item>
   <title>CPU ボード Bishop (2) 『CPU』</title>
   <guid isPermaLink="false">bishop_info_02</guid>
   <link>http://pylone.jp/blog/bishop_info_02</link>
   <description><![CDATA[
<p>
<img src="http://pylone.jp/i/bishop/s3c2440.jpg" alt="写真" style="float:right;margin-left:1em;"/>
<a href="http://pylone.jp/bishop/">Bishop</a> の CPU は ARM920T コアの
SAMSUNG S3C2440 400MHz です。価格が安く、海外のポータブルナビ市場におけるシェ
アが高いことで知られています。この S3C2440 は SAMSUNG の CPU ラインナップの中
でモバイル SoC と位置付けられ、モバイル機器に必要とされる標準的なペリフェラル
を内蔵しています。 Bishop の LCD、タッチパネル、MMC/SD、USB、オーディオなどの
機能も S3C2440 の内蔵ペリフェラルによるものです。
</p>

<h4>S3C2440 の主な機能:</h4>

<ul>
  <li>ARM920T コア, 16/32ビット RISC マイクロプロセッサ</li>
  <li>MMU</li>
  <li>Internal Advanced Microcontroller Bus Architecture (AMBA2.0, AHB/APB)</li>
  <li>メモリバンク x8 (ROM/SRAM x6, ROM/SRAM/SDRAM x2)</li>
  <li>64ウェイ・セットアソシエイティブ・キャッシュ (I-Cache: 16KB, D-Cache: 16KB)</li>
  <li>オンチップ MPLL/UPLL</li>
  <li>パワーモード: Normal/Slow/Idel/Sleep</li>
  <li>RTC</li>
  <li>GPIO (24ポートが外部割り込みとして使用可能)</li>
  <li>4チャンネル DMA コントローラ</li>
  <li>LCD コントローラ: STN LCD, TFT LCD</li>
  <li>A/D コンバータとタッチスクリーンインタフェース</li>
  <li>3チャンネル UART</li>
  <li>I2C バスインタフェース</li>
  <li>I2S バスインタフェース</li>
  <li>AC97 Audio CODEC インタフェース</li>
  <li>USB ホスト x2 (OHCI Rev. 1.0)</li>
  <li>USB デバイス x1 (USB Specification version 1.1)</li>
  <li>SD ホストインタフェース (SD Memory Card Protocol version 1.0, SDIO Card Protocol version 1.0, Multimedia Card Protocol version 2.11)</li>
  <li>SPI インタフェース x2 (Serial Peripheral Interface Protocol version 2.11)</li>
  <li>カメラインターフェース (最大入力解像度: 4096x4096, 出力フォーマット: RGB 16/24 ビット / YCbCr 4:2:0/4:2:2)</li>
  <li>コア電圧 1.3V @ 400MHz, メモリ: 1.8V/2.5V/3.0V/3.3V, I/O: 3.3V</li>
</ul>


]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Thu, 08 Apr 2010 15:31 GMT</pubDate>
</item>
<item>
   <title>CPU ボード Bishop (1)</title>
   <guid isPermaLink="false">bishop_info_01</guid>
   <link>http://pylone.jp/blog/bishop_info_01</link>
   <description><![CDATA[

<p>
これから何回かにわたって、7月発売予定の組込み Linux 開発用 CPU ボード
<a href="http://pylone.jp/bishop/">Bishop</a>
についての情報をお伝えしたいと思います。予定している内容は以下の通りです。
</p>

<p><img src="http://pylone.jp/i/bishop/board00.jpg" alt="写真" style="float:right;"/></p>

<ul>
<li><a href="http://pylone.jp/blog/bishop_info_02">CPU</a></li>
<li><a href="http://pylone.jp/blog/bishop_info_03">タッチパネルと LCD</a></li>
<li><a href="http://pylone.jp/blog/bishop_info_04">カメラ</a></li>
<li><a href="http://pylone.jp/blog/bishop_info_05">フラッシュメモリ</a></li>
<li><a href="http://pylone.jp/blog/bishop_info_06">フラッシュメモリの書き込み</a></li>
<li><a href="http://pylone.jp/blog/bishop_info_07">JTAG-ICE</a></li>
<li><a href="http://pylone.jp/blog/bishop_info_08">U-Boot</a></li>
<li><a href="http://pylone.jp/blog/bishop_info_09">uClibc によるルートファイルシステム</a></li>
<li><a href="http://pylone.jp/blog/bishop_info_10">Debian GNU/Linux</a></li>
<li>開発環境</li>
</ul>


]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Thu, 08 Apr 2010 15:31 GMT</pubDate>
</item>
<item>
   <title>The Official Blog is Launched</title>
   <guid isPermaLink="false">the_official_blog_is_launched</guid>
   <link>http://pylone.jp/blog/the_official_blog_is_launched</link>
   <description><![CDATA[
<p>
はじめまして、パイロン代表取締役の佐藤精一と申します。
弊社製品に関する情報や開発者向け情報をお伝えするためのブログを始めます。
どうぞよろしくお願いします。
</p>

]]></description>
   <category domain="http://pylone.jp/blog"></category>
   <pubDate>Sat, 14 Feb 2009 15:45 GMT</pubDate>
</item>
</channel>
</rss>

