<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
  <title type="text">Pylone Blog</title>
  <subtitle type="html"><![CDATA[製品情報や開発者向け情報]]></subtitle>
  <id>http://pylone.jp/blog/</id>
  <link rel="alternate" type="text/html" href="http://pylone.jp/blog" />
  <link rel="self" type="application/atom+xml" href="http://pylone.jp/blog/atom.xml" />
  <icon>http://pylone.jp/favicon.ico</icon>
  <logo>http://pylone.jp/i/microbar.png</logo>
  <author>
    <name>Pylone, Inc.</name>
    <uri>http://pylone.jp/blog/</uri>
    <email>webmaster@pylone.jp</email>
  </author>
  <rights>Copyright 2008 Pylone, Inc.</rights>
  <generator uri="http://pyblosxom.sourceforge.net/" version="1.3.2 2/13/2006">PyBlosxom http://pyblosxom.sourceforge.net/ 1.3.2 2/13/2006</generator>
  <updated>2010-06-07T16:37:52Z</updated>
  <entry>
    <title type="html">PE-201B販売終了について</title>
    <category term="" />
    <id>http://pylone.jp/blog/2010/06/08/bishop_announcement_eol_201b</id>
    <updated>2010-06-07T16:37:52Z</updated>
    <published>2010-06-07T16:37:52Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/bishop_announcement_eol_201b" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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>
]]>
    </content>
  </entry>

  <entry>
    <title type="html">年末年始休業のお知らせ</title>
    <category term="" />
    <id>http://pylone.jp/blog/2009/12/11/announce_20091211</id>
    <updated>2009-12-11T09:46:45Z</updated>
    <published>2009-12-11T09:46:45Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/announce_20091211" />
    <author>
      <name>Yasuko Daimon</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![CDATA[<p>
誠に勝手ではございますが、株式会社パイロンは2009年12月27日から2010年1月4日の間を休業とさせていただきます。ご迷惑をおかけいたしますが、よろしくお願いいたします。
</p>

]]>
    </content>
  </entry>

  <entry>
    <title type="html">PowerPCボードADS512101へのLinuxカーネルの移植</title>
    <category term="" />
    <id>http://pylone.jp/blog/2009/03/26/linux_for_ads512101</id>
    <updated>2010-03-30T17:28:52Z</updated>
    <published>2009-03-26T06:19:32Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/linux_for_ads512101" />
    <author>
      <name>Masashi YOKOTA</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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-1">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-2">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-3">デバイスツリーのビルド</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-4">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-5">起動</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-6">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>
]]>
    </content>
  </entry>

  <entry>
    <title type="html">jffs2イメージをloopback mount</title>
    <category term="" />
    <id>http://pylone.jp/blog/2009/03/12/tips_jffs2_loopback_mount</id>
    <updated>2009-03-12T01:39:40Z</updated>
    <published>2009-03-12T01:08:56Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/tips_jffs2_loopback_mount" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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>

]]>
    </content>
  </entry>

  <entry>
    <title type="html">TOPPERS/JSPカーネル for Bishop</title>
    <category term="" />
    <id>http://pylone.jp/blog/2009/02/25/toppers_jsp_bishop</id>
    <updated>2009-02-25T08:46:27Z</updated>
    <published>2009-02-25T08:03:33Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/toppers_jsp_bishop" />
    <author>
      <name>Masashi YOKOTA</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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-1">移植概要</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-2">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-3">関連リンク</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>
]]>
    </content>
  </entry>

  <entry>
    <title type="html">seq_fileの使い方</title>
    <category term="" />
    <id>http://pylone.jp/blog/2009/01/05/tips_seq_file</id>
    <updated>2010-04-23T02:37:40Z</updated>
    <published>2009-01-05T06:58:33Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/tips_seq_file" />
    <author>
      <name>MINAMI Hirokazu</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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-1">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-1-1">使用例</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-1-2">疑似ファイルの登録</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-2">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-2-1">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-2-2">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-2-3">stop</h5>
<p>読み手に十分なテキストが渡ったか、next()からデータがもうないことを通知した(NULLを返した)後に呼びだされます。</p>
<p>リソースの開放を行なうべきですが、引数として渡されるポインタはNULLの場合があることに注意が必要です。</p>
<h5 id="tips_seq_file-2-4">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-3">サンプル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>
]]>
    </content>
  </entry>

  <entry>
    <title type="html">Bishopバージョンアップのお知らせ</title>
    <category term="" />
    <id>http://pylone.jp/blog/2009/01/05/bishop_rev2</id>
    <updated>2009-02-15T03:50:49Z</updated>
    <published>2009-01-05T04:49:45Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/bishop_rev2" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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-1">既にご購入いただいたお客様へ</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-2">関連リンク</h4>
<ul><li><a href="http://pylone.jp/bishop/spec-software.html">Bishop - ソフトウェア仕様</a></li></ul>
]]>
    </content>
  </entry>

  <entry>
    <title type="html">Bishopエミュレータ正式版リリース</title>
    <category term="" />
    <id>http://pylone.jp/blog/2008/12/21/qemu_bishop_0.9.1_pylone1</id>
    <updated>2010-04-26T18:56:13Z</updated>
    <published>2008-12-21T13:39:37Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/qemu_bishop_0.9.1_pylone1" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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-1">ドキュメント</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-2">ダウンロード</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-3">関連記事</h4>
<ul><li><a href="http://pylone.jp/blog/tags/qemu+bishop">Bishopエミュレータに関する記事</a></li></ul>
]]>
    </content>
  </entry>

  <entry>
    <title type="html">Code Stage用S3C2440Aペリフェラル定義ファイルの公開</title>
    <category term="" />
    <id>http://pylone.jp/blog/2008/12/18/codestage_s3c2440a_peri</id>
    <updated>2010-03-09T09:41:41Z</updated>
    <published>2008-12-18T08:53:42Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/codestage_s3c2440a_peri" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![CDATA[

<p class=""><a href="http://www.flickr.com/photos/pylonejp/3117956236/sizes/o/" 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-1">関連記事</h4>
<ul><li><a href="http://pylone.jp/blog/dr01_s3c2440a_pri">DR-01用S3C2440Aペリフェラル定義ファイルの公開</a></li></ul>
]]>
    </content>
  </entry>

  <entry>
    <title type="html">Bishop向けLinuxカーネルのテスト版 - 2.6.26.8</title>
    <category term="" />
    <id>http://pylone.jp/blog/2008/12/18/bishop_linux-2.6.26.8</id>
    <updated>2009-02-15T03:50:43Z</updated>
    <published>2008-12-18T01:45:47Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/bishop_linux-2.6.26.8" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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>
]]>
    </content>
  </entry>

  <entry>
    <title type="html">年末年始休業のお知らせ</title>
    <category term="" />
    <id>http://pylone.jp/blog/2008/12/15/announce_20081215</id>
    <updated>2009-02-14T15:45:29Z</updated>
    <published>2008-12-15T02:35:42Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/announce_20081215" />
    <author>
      <name>Yasuko Daimon</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![CDATA[<p>
誠に勝手ではございますが、株式会社パイロンは平成20年12月27日から平成21年1月4日の間を休業とさせていただきます。ご迷惑をおかけいたしますが、よろしくお願いいたします。
</p>
]]>
    </content>
  </entry>

  <entry>
    <title type="html">sysfs 経由でモジュールパラメータにアクセス (2)</title>
    <category term="" />
    <id>http://pylone.jp/blog/2008/11/14/tips_modparams_via_sysfs_2</id>
    <updated>2009-02-14T15:45:29Z</updated>
    <published>2008-11-14T04:24:55Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/tips_modparams_via_sysfs_2" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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-1">コード</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="c">/* 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="c">/* 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-2">ビルド</h4>
<p>環境に応じて Makefile の KERNEL_SRC, CROSS_COMPILE, ARCH を修正し、make を実行します。</p>
<h4 id="tips_modparams_via_sysfs_2-3">使い方</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-4">解説</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> はこれの応用です。
ファイルとして読み書きできるので
ユーザ空間のプログラムとヘッダを共有する必要がない点は
<a href="http://www.linux.or.jp/JM/html/LDP_man-pages/man2/ioctl.2.html">ioctl(2)</a>
より使い勝手がよいかもしれません。</p>
<h4 id="tips_modparams_via_sysfs_2-5">関連記事</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>
]]>
    </content>
  </entry>

  <entry>
    <title type="html">Virtual Battery Driver</title>
    <category term="" />
    <id>http://pylone.jp/blog/2008/10/30/virtual_battery</id>
    <updated>2009-02-14T15:45:29Z</updated>
    <published>2008-10-30T04:29:11Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/virtual_battery" />
    <author>
      <name>Masashi YOKOTA</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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://code.google.com/intl/ja/android/">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>


]]>
    </content>
  </entry>

  <entry>
    <title type="html">BishopエミュレータBeta4リリース</title>
    <category term="" />
    <id>http://pylone.jp/blog/2008/09/26/qemu_bishop_beta4</id>
    <updated>2010-04-17T17:36:20Z</updated>
    <published>2008-09-26T05:35:38Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/qemu_bishop_beta4" />
    <author>
      <name>MINAMI Hirokazu</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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-1">更新履歴</h4>
<ul><li>2008/9/26: 初版公開</li></ul>
<h4 id="qemu_bishop_beta4-2">Beta3からの変更点</h4>
<h5 id="qemu_bishop_beta4-2-1">ボード画像/LED状態表示のサポート</h5>
<p>Bishopの実機では、GPIOポートに対して出力を行うことで、基板上でLED5/LED4/LED8/LED7とラベルされたLEDを制御することができます。</p>
<p>QEMUウィンドウ内にLCDの内容だけでなく、これらのLED状態も表示されるようにしました。起動初期段階のデバッグ等に利用できます。</p>
<h4 id="qemu_bishop_beta4-3">リリース内容</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-3-1">各種ペリフェラルのサポート状況</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-4">コンパイル手順</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-4-1">必要なもの</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-4-2">手順</h5>
<pre>
$ <span class="cmdline">./configure --target-list=arm-softmmu --enable-alsa</span>
$ <span class="cmdline">make</span>
</pre>
<h4 id="qemu_bishop_beta4-5">実行</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-6">関連記事</h4>
<ul><li><a href="http://pylone.jp/blog/tags/qemu+bishop">Bishopエミュレータに関する記事</a></li></ul>
]]>
    </content>
  </entry>

  <entry>
    <title type="html">usbmon</title>
    <category term="" />
    <id>http://pylone.jp/blog/2008/07/03/tips_usbmon</id>
    <updated>2009-04-15T12:33:38Z</updated>
    <published>2008-07-03T11:27:21Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/tips_usbmon" />
    <author>
      <name>MINAMI Hirokazu</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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>

]]>
    </content>
  </entry>

  <entry>
    <title type="html">Bishop サンプルコード</title>
    <category term="" />
    <id>http://pylone.jp/blog/2008/06/24/demo-programs</id>
    <updated>2010-04-08T15:32:22Z</updated>
    <published>2008-06-24T03:55:56Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/demo-programs" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![CDATA[
<p>
<img src="/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>

]]>
    </content>
  </entry>

  <entry>
    <title type="html">distcc による Linux カーネルのクロスコンパイル</title>
    <category term="" />
    <id>http://pylone.jp/blog/2008/06/23/cross-distcc-linux</id>
    <updated>2009-02-14T15:45:29Z</updated>
    <published>2008-06-23T07:41:48Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/cross-distcc-linux" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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-1">グラフ</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-2">リンク</h4>
<ul><li><a href="http://distcc.org/">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>
]]>
    </content>
  </entry>

  <entry>
    <title type="html">DR-01用S3C2440Aペリフェラル定義ファイルの公開</title>
    <category term="" />
    <id>http://pylone.jp/blog/2008/06/07/dr01_s3c2440a_pri</id>
    <updated>2009-02-14T15:45:29Z</updated>
    <published>2008-06-07T10:29:31Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/dr01_s3c2440a_pri" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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>
]]>
    </content>
  </entry>

  <entry>
    <title type="html">BishopエミュレータBeta3リリース</title>
    <category term="" />
    <id>http://pylone.jp/blog/2008/05/23/qemu_bishop_beta3</id>
    <updated>2009-02-14T15:45:29Z</updated>
    <published>2008-05-22T15:09:15Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/qemu_bishop_beta3" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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-1">更新履歴</h4>
<ul><li>2008/5/23: 初版公開</li></ul>
<h4 id="qemu_bishop_beta3-2">Beta2からの変更点</h4>
<h5 id="qemu_bishop_beta3-2-1">オーディオサポート</h5>
<p>再生のみですが、オーディオに対応しました。</p>
<h5 id="qemu_bishop_beta3-2-2">SD/MMCサポート</h5>
<p>SD/MMCに対応しました。
-sd オプションで指定したディスクイメージファイルをSDカードとして扱うことができます。
ディスクイメージの作成方法は「<a href="http://pylone.jp/blog/tips_diskimage_partitioning">ディスクイメージのホスト側での操作方法</a>」を参照してください。</p>
<h5 id="qemu_bishop_beta3-2-3">バイナリパッケージ</h5>
<p>debianパッケージ、RPM、Windows インストーラを用意しました。</p>
<h4 id="qemu_bishop_beta3-3">リリース内容</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-3-1">各種ペリフェラルのサポート状況</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-4">インストール</h4>
<h5 id="qemu_bishop_beta3-4-1">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-4-2">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-4-3">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-5">実行</h4>
<h5 id="qemu_bishop_beta3-5-1">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-5-2">Windows</h5>
<p>「スタート」 → 「すべてのプログラム」 → 「qemu-bishop」</p>
<h4 id="qemu_bishop_beta3-6">コンパイル手順</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-6-1">必要なもの</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-6-2">手順</h5>
<pre>
$ <span class="cmdline">./configure --target-list=arm-softmmu --enable-alsa</span>
$ <span class="cmdline">make</span>
</pre>
<h4 id="qemu_bishop_beta3-7">関連記事</h4>
<ul><li><a href="http://pylone.jp/blog/tags/qemu+bishop">Bishopエミュレータに関する記事</a></li></ul>
]]>
    </content>
  </entry>

  <entry>
    <title type="html">busybox-staticによるinitramfs</title>
    <category term="" />
    <id>http://pylone.jp/blog/2008/03/10/tips_initramfs_using_busybox</id>
    <updated>2009-02-14T15:45:29Z</updated>
    <published>2008-03-10T10:41:51Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/tips_initramfs_using_busybox" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![CDATA[

<p>カスタムボードへのLinuxカーネル移植の初期段階で
とりあえずのrootfsが必要になる場合は多いと思います。
とりあえずのものにそれほど手間はかけたくないですが、
カーネルのデバッグや動作確認のために機能はそれなりに欲しいところです。</p>
<p>方法は色々あると思いますが、パイロンではDebianの
<a href="http://packages.debian.org/busybox-static">busybox-staticパッケージ</a>と
<a href="http://www.linux.or.jp/JF/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>
]]>
    </content>
  </entry>

  <entry>
    <title type="html">debootstrapの前半部分をホストで、後半をターゲットで行う手順</title>
    <category term="" />
    <id>http://pylone.jp/blog/2008/02/27/tips_debootstrap_cross</id>
    <updated>2009-03-09T08:46:27Z</updated>
    <published>2008-02-27T13:39:56Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/tips_debootstrap_cross" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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>

]]>
    </content>
  </entry>

  <entry>
    <title type="html">dpkg-crossの&amp;#45;&amp;#45;exclude オプション</title>
    <category term="" />
    <id>http://pylone.jp/blog/2008/01/07/tips_dpkgcross_exclude_opt</id>
    <updated>2009-03-13T11:13:55Z</updated>
    <published>2008-01-07T12:28:00Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/tips_dpkgcross_exclude_opt" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![CDATA[
<p class="info">dpkg-crossの基本的な使い方を知っている方向けの記事です。</p>

<p><a href="http://dpkg-cross.alioth.debian.org/">dpkg-cross</a>の--excludeオプションはクロスへ変換する際にDependsから特定のパッケージを取り除くオプションです。
<a href="http://alioth.debian.org/plugins/scmcvs/cvsweb.php/dpkg-cross/dpkg-cross.diff?r1=1.25;r2=1.26;cvsroot=dpkg-cross;f=h">最近追加</a>
されたらしいのですが、使ってみたら便利だったので紹介します。</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>
]]>
    </content>
  </entry>

  <entry>
    <title type="html">BishopエミュレータBeta2リリース</title>
    <category term="" />
    <id>http://pylone.jp/blog/2007/12/28/qemu_bishop_beta2</id>
    <updated>2009-02-14T15:45:29Z</updated>
    <published>2007-12-28T12:15:12Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/qemu_bishop_beta2" />
    <author>
      <name>MINAMI Hirokazu</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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 align="center" class="unstable">      △       </td><td>       ROMとして表現され、NORとしてのコマンドには応答しません。 </td></tr>
<tr>    <th colspan="2">        NAND    </th> <td align="center" class="stable">        ○       </td><td>               </td></tr>
<tr>    <th colspan="2">        LCD     </th> <td align="center" class="stable">        ○       </td><td>               </td></tr>
<tr>    <th colspan="2">        RTC     </th> <td align="center" class="stable">        ○       </td><td>               </td></tr>
<tr>    <th colspan="2">        シリアルポート </th> <td align="center" class="stable">        ○       </td><td>               </td></tr>
<tr>    <th colspan="2">        イーサネット  </th> <td align="center" class="stable">        ○       </td><td>               </td></tr>
<tr>    <th>    GPIO    </th><th>       LED     </th><td align="center" class="unstable">       △       </td><td>       状態の設定は可能ですが、表示はおこなわれません。        </td></tr>
<tr class="weaksplit">  <th rowspan="3">        USB(OHCI)       </th><th>       マスストレージ </th><td align="center" class="unstable">       △       </td><td>       高負荷時に不安定になる場合があります。     </td></tr>
<tr class="weaksplit">   <th>   キーボード   </th><td align="center" class="unstable">       △       </td><td>       ホストのキーボードが英語配列でない環境では、一部のキーが正しく解釈されません。 </td></tr>
<tr class="weaksplit">   <th>   マウス     </th><td align="center" class="stable"> ○       </td><td>               </td></tr>
<tr>    <th colspan="2">        サウンド    </th> <td align="center" class="broken">        ×       </td><td>               </td></tr>
<tr>    <th colspan="2">        タッチスクリーン        </th> <td align="center" class="stable">        ○       </td><td>               </td></tr>
<tr>    <th colspan="2">        MMC     </th> <td align="center" class="broken">        ×       </td><td>               </td></tr>
<tr>    <th colspan="2">        カメラ     </th> <td 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>

]]>
    </content>
  </entry>

  <entry>
    <title type="html">Bishop向けLinuxカーネルのテスト版 - 2.6.24-rc6</title>
    <category term="" />
    <id>http://pylone.jp/blog/2007/12/28/bishop_linux-2.6.24-rc6</id>
    <updated>2009-02-14T15:45:29Z</updated>
    <published>2007-12-28T12:11:25Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/bishop_linux-2.6.24-rc6" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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>

]]>
    </content>
  </entry>

  <entry>
    <title type="html">klibcベースのinitramfs</title>
    <category term="" />
    <id>http://pylone.jp/blog/2007/12/27/bishop_klibc_based_initramfs</id>
    <updated>2010-04-08T15:32:18Z</updated>
    <published>2007-12-27T12:53:53Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/bishop_klibc_based_initramfs" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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://www.linux.or.jp/JF/JFdocs/kernel-docs-2.6/early-userspace/README.html">日本語訳</a>もあります。
</p>

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

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

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

]]>
    </content>
  </entry>

  <entry>
    <title type="html">年末年始休業のお知らせ</title>
    <category term="" />
    <id>http://pylone.jp/blog/2007/12/20/announce_20071220</id>
    <updated>2009-02-14T15:45:29Z</updated>
    <published>2007-12-20T12:24:35Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/announce_20071220" />
    <author>
      <name>Yoshiko Fukushima</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![CDATA[<p>
誠に勝手ではございますが、株式会社パイロンは平成19年12月29日から平成20年1月6日の間を休業とさせていただきます。ご迷惑をおかけいたしますが、よろしくお願いいたします。
</p>
]]>
    </content>
  </entry>

  <entry>
    <title type="html">クロス開発環境のRPMパッケージ</title>
    <category term="" />
    <id>http://pylone.jp/blog/2007/12/12/cross_toolchain_rpm</id>
    <updated>2009-02-14T15:45:29Z</updated>
    <published>2007-12-12T10:01:40Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/cross_toolchain_rpm" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![CDATA[
<p>
<a href="http://pylone.jp/blog/cross_toolchain_deb">クロス開発環境のDebianパッケージ</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>
レポジトリ情報を更新します。
</p>

<pre>
# <span class="cmdline">yum update</span>
</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>
]]>
    </content>
  </entry>

  <entry>
    <title type="html">initramfs作成支援スクリプト</title>
    <category term="" />
    <id>http://pylone.jp/blog/2007/11/15/gen_init_cpio_conf</id>
    <updated>2010-04-08T15:32:32Z</updated>
    <published>2007-11-15T12:56:08Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/gen_init_cpio_conf" />
    <author>
      <name>MINAMI Hirokazu</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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 class='console'>
$ <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>

]]>
    </content>
  </entry>

  <entry>
    <title type="html">クロス開発環境のDebianパッケージ</title>
    <category term="" />
    <id>http://pylone.jp/blog/2007/11/09/cross_toolchain_deb</id>
    <updated>2009-03-09T09:07:56Z</updated>
    <published>2007-11-09T08:32:30Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/cross_toolchain_deb" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![CDATA[
<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>
アーカイブの鍵を導入します。
</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>様が公開されている<a href="http://www.si-linux.co.jp/pub/debian-sh/pool/main/g/glibc">glibcパッケージ</a>のdebian/patches/sh/*.diffを使わせて頂きました。
</p>

]]>
    </content>
  </entry>

  <entry>
    <title type="html">ディスクイメージのホスト側での操作方法</title>
    <category term="" />
    <id>http://pylone.jp/blog/2007/11/07/tips_diskimage_partitioning</id>
    <updated>2009-02-14T15:45:29Z</updated>
    <published>2007-11-07T10:47:27Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/tips_diskimage_partitioning" />
    <author>
      <name>MINAMI Hirokazu</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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 class='console'>
$ <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 class='console'>
<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 class='console'>
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 class='console'>
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 class='console'>
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>
仮想環境で使用中のイメージファイルをホスト側環境から同時に操作すると、データを失う可能性があります。

]]>
    </content>
  </entry>

  <entry>
    <title type="html">sysfs 経由でモジュールパラメータにアクセス</title>
    <category term="" />
    <id>http://pylone.jp/blog/2007/11/06/tips_modparams_via_sysfs</id>
    <updated>2009-02-14T15:45:29Z</updated>
    <published>2007-11-06T08:36:23Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/tips_modparams_via_sysfs" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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="c">/* パラメータ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="c">/* パラメータ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-1">関連記事</h4>
<ul><li><a href="http://pylone.jp/blog/tips_modparams_via_sysfs_2">sysfs 経由でモジュールパラメータにアクセス (2)</a></li></ul>
]]>
    </content>
  </entry>

  <entry>
    <title type="html">BishopエミュレータBeta1リリース</title>
    <category term="" />
    <id>http://pylone.jp/blog/2007/10/12/qemu_bishop_beta1</id>
    <updated>2010-04-11T16:10:45Z</updated>
    <published>2007-10-12T05:49:00Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/qemu_bishop_beta1" />
    <author>
      <name>MINAMI Hirokazu</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![CDATA[
<p class="info">
正式版を公開しました - 記事: <a href="http://pylone.jp/blog/qemu_bishop_0.9.1_pylone1">Bishopエミュレータ正式版リリース</a>
</p>

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

<p class="mobile-youtube-uaXr-1DMxMw">
<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 align="center" class="unstable">	△	</td><td>	ROMとして表現され、NORとしてのコマンドには応答しません。	</td></tr>
<tr>	<th colspan="2">	NAND	</th> <td align="center" class="stable">	○	</td><td>		</td></tr>
<tr>	<th colspan="2">	LCD	</th> <td align="center" class="stable">	○	</td><td>		</td></tr>
<tr>	<th colspan="2">	RTC	</th> <td align="center" class="stable">	○	</td><td>		</td></tr>
<tr>	<th colspan="2">	シリアルポート	</th> <td align="center" class="stable">	○	</td><td>		</td></tr>
<tr>	<th colspan="2">	イーサネット	</th> <td align="center" class="stable">	○	</td><td>		</td></tr>
<tr>	<th>	GPIO	</th><th>	LED	</th><td align="center" class="unstable">	△	</td><td>	状態の設定は可能ですが、表示はおこなわれません。	</td></tr>
<tr class="weaksplit">	<th rowspan="3">	USB(OHCI)	</th><th>	マスストレージ	</th><td align="center" class="unstable">	△	</td><td>	高負荷時に不安定になる場合があります。	</td></tr>
<tr class="weaksplit">	 <th>	キーボード	</th><td align="center" class="unstable">	△	</td><td>	ホストのキーボードが英語配列でない環境では、一部のキーが正しく解釈されません。	</td></tr>
<tr class="weaksplit">	 <th>	マウス	</th><td align="center" class="stable">	○	</td><td>		</td></tr>
<tr>	<th colspan="2">	サウンド	</th> <td align="center" class="broken">	×	</td><td>		</td></tr>
<tr>	<th colspan="2">	タッチスクリーン	</th> <td align="center" class="broken">	×	</td><td>		</td></tr>
<tr>	<th colspan="2">	MMC	</th> <td align="center" class="broken">	×	</td><td>		</td></tr>
<tr>	<th colspan="2">	カメラ	</th> <td 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>
]]>
    </content>
  </entry>

  <entry>
    <title type="html">QEMUによるBishop エミュレーション</title>
    <category term="" />
    <id>http://pylone.jp/blog/2007/10/11/qemu_bishop</id>
    <updated>2010-04-08T15:32:40Z</updated>
    <published>2007-10-11T06:56:55Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/qemu_bishop" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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>
]]>
    </content>
  </entry>

  <entry>
    <title type="html">Linux 起動ロゴの変更</title>
    <category term="" />
    <id>http://pylone.jp/blog/2007/08/18/tips_fblogo</id>
    <updated>2010-04-08T15:32:47Z</updated>
    <published>2007-08-17T18:03:39Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/tips_fblogo" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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://www.is.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>
]]>
    </content>
  </entry>

  <entry>
    <title type="html">Bishop の発売について</title>
    <category term="" />
    <id>http://pylone.jp/blog/2007/07/28/bishop_announcement_sales</id>
    <updated>2010-04-18T10:35:26Z</updated>
    <published>2007-07-27T20:07:43Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/bishop_announcement_sales" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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>

]]>
    </content>
  </entry>

  <entry>
    <title type="html">CPU ボード Bishop (10)『Debian GNU/Linux』</title>
    <category term="" />
    <id>http://pylone.jp/blog/2007/07/02/bishop_info_10</id>
    <updated>2010-04-08T15:32:14Z</updated>
    <published>2007-07-02T03:44:29Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/bishop_info_10" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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>

]]>
    </content>
  </entry>

  <entry>
    <title type="html">CPU ボード Bishop (9) 『uClibc によるルートファイルシステム』</title>
    <category term="" />
    <id>http://pylone.jp/blog/2007/06/29/bishop_info_09</id>
    <updated>2009-02-14T15:45:29Z</updated>
    <published>2007-06-29T00:01:26Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/bishop_info_09" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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>

]]>
    </content>
  </entry>

  <entry>
    <title type="html">CPU ボード Bishop (8) 『U-Boot』</title>
    <category term="" />
    <id>http://pylone.jp/blog/2007/06/19/bishop_info_08</id>
    <updated>2009-02-14T15:45:29Z</updated>
    <published>2007-06-19T05:32:03Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/bishop_info_08" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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-1">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="c">/* ドライバを有効化 */</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="c">/* アドレス (I/O) */</span><span class="cp"></span>
<span class="cp">#define DM9000_DATA             (CONFIG_DM9000_BASE + 4) </span><span class="c">/* アドレス (データ) */</span><span class="cp"></span>
<span class="cp">#define CONFIG_DM9000_USE_32BIT 1                        </span><span class="c">/* バス幅 */</span><span class="cp"></span>
</pre></div>

<h4 id="bishop_info_08-2">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="c">/* (CONFIG_COMMANDS &amp; CFG_CMD_NAND) &amp;&amp; !CFG_NAND_LEGACY */</span><span class="cp"></span>
</pre></div>

]]>
    </content>
  </entry>

  <entry>
    <title type="html">CPU ボード Bishop (7) 『JTAG-ICE』</title>
    <category term="" />
    <id>http://pylone.jp/blog/2007/06/12/bishop_info_07</id>
    <updated>2010-04-08T15:32:09Z</updated>
    <published>2007-06-12T06:04:26Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/bishop_info_07" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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>
]]>
    </content>
  </entry>

  <entry>
    <title type="html">CPU ボード Bishop (6) 『フラッシュメモリの書き込み』</title>
    <category term="" />
    <id>http://pylone.jp/blog/2007/06/08/bishop_info_06</id>
    <updated>2010-04-08T15:32:03Z</updated>
    <published>2007-06-08T04:34:56Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/bishop_info_06" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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>

]]>
    </content>
  </entry>

  <entry>
    <title type="html">CPU ボード Bishop (5) 『フラッシュメモリ』</title>
    <category term="" />
    <id>http://pylone.jp/blog/2007/06/07/bishop_info_05</id>
    <updated>2010-04-08T15:31:58Z</updated>
    <published>2007-06-07T02:26:37Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/bishop_info_05" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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>

]]>
    </content>
  </entry>

  <entry>
    <title type="html">CPU ボード Bishop (4) 『カメラ』</title>
    <category term="" />
    <id>http://pylone.jp/blog/2007/06/06/bishop_info_04</id>
    <updated>2010-04-08T15:31:50Z</updated>
    <published>2007-06-06T02:06:45Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/bishop_info_04" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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>

]]>
    </content>
  </entry>

  <entry>
    <title type="html">CPU ボード Bishop (3) 『タッチパネルと LCD』</title>
    <category term="" />
    <id>http://pylone.jp/blog/2007/06/05/bishop_info_03</id>
    <updated>2010-04-08T15:31:42Z</updated>
    <published>2007-06-05T04:23:21Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/bishop_info_03" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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>

]]>
    </content>
  </entry>

  <entry>
    <title type="html">CPU ボード Bishop (2) 『CPU』</title>
    <category term="" />
    <id>http://pylone.jp/blog/2007/06/04/bishop_info_02</id>
    <updated>2010-04-08T15:31:38Z</updated>
    <published>2007-06-04T06:24:09Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/bishop_info_02" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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>

]]>
    </content>
  </entry>

  <entry>
    <title type="html">CPU ボード Bishop (1)</title>
    <category term="" />
    <id>http://pylone.jp/blog/2007/06/01/bishop_info_01</id>
    <updated>2010-04-08T15:31:30Z</updated>
    <published>2007-06-01T06:57:54Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/bishop_info_01" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![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>

]]>
    </content>
  </entry>

  <entry>
    <title type="html">The Official Blog is Launched</title>
    <category term="" />
    <id>http://pylone.jp/blog/2007/05/17/the_official_blog_is_launched</id>
    <updated>2009-02-14T15:45:29Z</updated>
    <published>2007-05-17T00:28:19Z</published>
    <link rel="alternate" type="text/html" href="http://pylone.jp/blog/the_official_blog_is_launched" />
    <author>
      <name>Seiichi SATO</name>
    </author>
    <content type="html" xml:lang="ja" xml:base="http://pylone.jp/blog/">
      <![CDATA[<p>
はじめまして、パイロン代表取締役の佐藤精一と申します。
弊社製品に関する情報や開発者向け情報をお伝えするためのブログを始めます。
どうぞよろしくお願いします。
</p>
]]>
    </content>
  </entry>

</feed>
