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

<channel>
	<title>Cerevo tech blog</title>
	<atom:link href="http://tech.cerevo.com/blog/feed" rel="self" type="application/rss+xml" />
	<link>http://tech.cerevo.com/blog</link>
	<description>株式会社Cerevoのテクニカル情報発信Blogです。組み込み系・Web系のソフト＆ハードについてあれやこれやを発信</description>
	<lastBuildDate>Thu, 03 Sep 2009 01:01:54 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>GIOChannelの使い方</title>
		<link>http://tech.cerevo.com/blog/archives/254</link>
		<comments>http://tech.cerevo.com/blog/archives/254#comments</comments>
		<pubDate>Wed, 02 Sep 2009 08:10:20 +0000</pubDate>
		<dc:creator>inagaki</dc:creator>
				<category><![CDATA[組み込みソフトウェア]]></category>

		<guid isPermaLink="false">http://tech.cerevo.com/blog/?p=254</guid>
		<description><![CDATA[				こんにちは、稲垣@CEREVOです。今回はGTK+に関する (正確にはGLibに関することなのですが……) 話題で、GIOChannelの使い方を見てみたいと思います。
				なぜGIOChannelを使うのか [...]]]></description>
			<content:encoded><![CDATA[				<p>こんにちは、稲垣@CEREVOです。今回はGTK+に関する (正確にはGLibに関することなのですが……) 話題で、GIOChannelの使い方を見てみたいと思います。</p>
				<h2>なぜGIOChannelを使うのか</h2>
				<p>GTK+でGUIアプリケーションを書くと、プログラムは基本的にイベントドリブンになります。つまり、メインループの中でイベントが起きるのを黙って待って、何か起きたらコールバックの中で処理します。こうしたフレームワークではファイルやソケットの読み書きでブロックされる(待ちが発生する) のは嬉しくありません。ブロックされている間は基本的に他の処理ができず、たとえば処理中のアニメーションが止まったりします。GIOchannelを使えば、ブロックされない状態になってから処理を開始することができます。</p>
				<p>なお、今回はあまり関係ありませんが、テキストのエンコーディングを適当にUTF-8に変換してくれる機能もあります。</p>
				<h2>GIOChannelの使い方</h2>
				<ul>
				<li>g_io_channel_unix_newで生成 (unix系のシステムを想定しています……)</li>
				<li>NONBLOCKに設定する (設定しないとG_IO_STATUS_AGAINが返るかわりにブロックされます)</li>
				<li>g_io_add_watchでイベントソースをデフォルトメインループに追加<br />
				(頻繁に掛け外しをする場合は、g_io_create_watchで作ったイベントソースを自分で扱った方がいいかも知れません)</li>
				<li>コールバック
				<ul>
				<li>どんなイベントが起きたのか、GIOConditionを見て判断する</li>
				<li>GIOChannelを読み書きしてG_IO_STATUS_NORMALやG_IO_STATUS_AGAINが返ってきたらTRUEを返す<br />
				G_IO_STATUS_EOFやG_IO_STATUS_ERRORが返ってきたらFALSEを返してイベントソースを外す</li>
				</ul>
				</li>
				</ul>
				<h3>読み込みサンプル</h3>
				<p>標準入力から読み込んでg_messageでメッセージを表示するサンプルです:</p>
				<pre><code>
#include &lt;glib.h&gt;
static gboolean read_callback(GIOChannel *io, GIOCondition cond, gpointer user_data) {
  GMainLoop *loop = user_data;
  gboolean continue_to_watch = FALSE;
  if (cond &amp; G_IO_IN) {
    GError *e = NULL;
    char *text;
    switch (g_io_channel_read_line(io, &amp;text, NULL, NULL, &amp;e)) {
    case G_IO_STATUS_NORMAL:
      g_message("%s: read line: %s", __func__, text);
      g_free(text);
      continue_to_watch = TRUE;
      break;
    case G_IO_STATUS_AGAIN:
      g_message("%s: AGAIN", __func__);
      continue_to_watch = TRUE;
      break;
    case G_IO_STATUS_ERROR:
      g_message("%s: error: %s", __func__, e-&gt;message);
      g_error_free(e);
      break;
    case G_IO_STATUS_EOF:
      g_message("%s: EOF", __func__);
      break;
    default:
      break;
    }
  }
  if (! continue_to_watch) {
    g_main_loop_quit(loop);
    g_main_loop_unref(loop);
  }
  return continue_to_watch;
}

static void sample_loop(int fd, GIOCondition cond, GIOFunc callback) {
  GMainLoop *loop = g_main_loop_new(NULL, FALSE);
  GIOChannel *io = g_io_channel_unix_new(fd);
  guint tag = g_io_add_watch(io, cond, callback, g_main_loop_ref(loop));
  g_io_channel_set_flags(io, G_IO_FLAG_NONBLOCK, NULL);
  g_io_channel_set_close_on_unref(io, TRUE);
  g_io_channel_set_encoding(io, NULL, NULL);
  g_main_loop_run(loop);
  g_io_channel_unref(io);
  g_main_loop_unref(loop);
}

int main(int argc, char *argv[]) {
  sample_loop(0, G_IO_IN, read_callback);
  return 0;
}
</code></pre>
				<p>G_IO_INは読み込み可能を示すフラグです (読み込み専用のfdについてはこのフラグしか立たないようです――man poll参照)。ただし、読み込み可能と言っても、読んでみたらすぐにG_IO_STATUS_EOFが返ってくることもあります。EOFが返ってきたらもうチャンネルに用はないのでFALSEを返してイベントソースを外します。</p>
				<h3>書き込みサンプル</h3>
				<p>標準出力 (のバッファ) が書き込み可能になるのを待って書き込みまくるサンプルです。なおsample_loop関数は前節の関数をそのままコピーして使ってください。実行すると大量のメッセージが出力されますから、</p>
				<p>./sample | read i</p>
				<p>などとして、パイプが適当に閉じられるようにして実行してください:</p>
				<pre><code>
#include &lt;glib.h&gt;
static gboolean write_callback(GIOChannel *io, GIOCondition cond, gpointer user_data) {
  GMainLoop *loop = user_data;
  gboolean continue_to_watch = FALSE;
  if (cond &amp; (G_IO_ERR | G_IO_HUP))
    g_message("%s: channel is closed", __func__);
  else if (cond &amp; G_IO_OUT) {
    GError *e = NULL;
    char *text = "BABEL\n";
    int len;
    switch (g_io_channel_write_chars(io, text, -1, &amp;len, &amp;e)) {
    case G_IO_STATUS_NORMAL:
      g_message("%s: wrote %d chars", __func__, len);
      continue_to_watch = TRUE;
      break;
    case G_IO_STATUS_AGAIN:
      g_message("%s: wrote %d chars, AGAIN", __func__, len);
      continue_to_watch = TRUE;
      break;
    case G_IO_STATUS_ERROR:
      g_message("%s: error: %s", __func__, e-&gt;message);
      g_error_free(e);
      break;
    case G_IO_STATUS_EOF:
      g_message("%s: EOF", __func__);
      break;
    default:
      break;
    }
  }
  if (! continue_to_watch) {
    g_main_loop_quit(loop);
    g_main_loop_unref(loop);
  }
  return continue_to_watch;
}

int main(int argc, char *argv[]) {
  sample_loop(1, G_IO_OUT | G_IO_ERR | G_IO_HUP, write_callback);
  return 0;
}
</code></pre>
				<p>チャンネルが閉じられるとコンディションにG_IO_ERRのビットが立ちます。同時にG_IO_OUTビットが立つこともありますが、それは単にバッファに空きがあるというだけで、書き込んでも誰も見てくれないので無視するようにしました。</p>
				<p>またg_io_channel_write_charsでは、本来は書き込まれたバイト数もチェックしなければならないのですが、長いデータを書き込まなければ途中で切れることはないようなので、今回はチェックしていません。</p>
				<h3>読み書き用の場合</h3>
				<p>ソケットは読み書き両用なので、必要なら読み書き両用のコールバックを書くことができます。そのときは上記のread_callback関数とwrite_callback関数を適当に結合させればいいでしょう。なお、ソケットの相手側が閉じられていても (コンディションにG_IO_ERRビットが立っていても)、バッファに読み込み可能なデータが残っていることがあります。プロトコルによりますが、必要ならG_IO_INビットをチェックしてG_IO_STATUS_EOFが返ってくるまで読み出してやることもできます。</p>
				<h2>おわり</h2>
				<p>GIOChannelを使えば、GLibのメインイベントループの中で、ブロックされることなく入出力を処理することができます。イベントドリブンなアプリケーションを書くために是非とも使い方を把握しておきたいものです。</p>
				<p>Happy hacking!</p>
]]></content:encoded>
			<wfw:commentRss>http://tech.cerevo.com/blog/archives/254/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MSP430のPWM出力を増やす方法</title>
		<link>http://tech.cerevo.com/blog/archives/238</link>
		<comments>http://tech.cerevo.com/blog/archives/238#comments</comments>
		<pubDate>Wed, 26 Aug 2009 23:50:33 +0000</pubDate>
		<dc:creator>inagaki</dc:creator>
				<category><![CDATA[組み込みソフトウェア]]></category>

		<guid isPermaLink="false">http://tech.cerevo.com/blog/?p=238</guid>
		<description><![CDATA[				こんにちは、稲垣@Cerevoです。今回はまたMSP430の話題です。
				※一応、使っているのはMSP430F247であると断わっておきます。
				MSP430には二つのタイマが入っていて、PWMを自動 [...]]]></description>
			<content:encoded><![CDATA[				<p>こんにちは、稲垣@Cerevoです。今回はまたMSP430の話題です。</p>
				<p>※一応、使っているのはMSP430F247であると断わっておきます。</p>
				<p>MSP430には二つのタイマが入っていて、PWMを自動で (CPUが割り込みの中で操作しなくても) やってくれます。今回は普通にタイマでPWMをする方法を紹介し、さらに頑張って普通はPWMに使えないポートでも半自動でPWMをやってみたいと思います。</p>
				<h2>タイマの概要 (コンペアモード)</h2>
				<p>タイマにはタイマレジスタとキャプチャ・コンペアブロック0から2 (もしくは0から7) があり、大体以下のように動作します:</p>
				<ul>
				<li>タイマレジスタ
				<ul>
				<li>値が0になるときに割り込みを発生させる (オーバーフロー割り込み)</li>
				<li>タイマAでは16ビット幅で固定、タイマBでは16/12/10/8ビット幅で可変</li>
				<li>三つのタイマモード
				<ul>
				<li>ビット幅全てを使ってカウントアップ (連続モード)</li>
				<li>コンペアレジスタ0の値までカウントアップ (アップモード)</li>
				<li>コンペアレジスタ0の値までカウントアップ、さらに0までカウントダウン (アップダウンモード)</li>
				</ul>
				</li>
				</ul>
				</li>
				<li>キャプチャ・コンペアブロック
				<ul>
				<li>キャプチャ・コンペアレジスタ (コンペアレジスタと略します) と出力ビットがある</li>
				<li>コンペアレジスタの値がタイマレジスタの値と等しくなるとき割り込み (コンペア割り込み)</li>
				<li>同時に出力ビットをセット・リセットする</li>
				</ul>
				</li>
				<li>キャプチャ・コンペアブロック (0以外)
				<ul>
				<li>タイマレジスタの値がコンペアレジスタ0の値と等しくなるときに (すなわちコンペア割り込み0のタイミングで)、出力ビットをセット・リセット・トグルする (出力モードによる)</li>
				</ul>
				</li>
				</ul>
				<p>キャプチャ・コンペアブロック (0以外) には、出力ビットの変化するタイミングが</p>
				<ul>
				<li>自分のコンペア割り込み</li>
				<li>ブロック0のコンペア割り込み</li>
				</ul>
				<p>の二つあることに気づかれましたか。変化のタイミングが二つあるので、各ブロックごとに異なったデューティー比のPWM出力ができるわけです。つまり、普通のPWMとしての使い方は次のようです:</p>
				<ul>
				<li>アップモード</li>
				<li>コンペアレジスタ0: 変調周波数を決める</li>
				<li>コンペアレジスタ0以外: デューティー比を決め、適当な出力モードでPWM出力</li>
				</ul>
				<h2>キャプチャ・コンペアブロック0でもPWM</h2>
				<p>上記のような特性から、ブロック0ではPWM出力はできません (パルス幅が0固定のPWMと言えなくもないのですが)。かといって、連続モードに設定して、割り込みが発生するたびにコンペアレジスタを設定しながらGPIOを叩くのもやや無駄な話です。そういうのは各ブロックで別々の割り込み周期を使いたい場合にすることです。もうちょっとCPUがサボりながらPWM出力をする方法があります。ハードウェアに足りない機能だけ、ソフトウェアで実現するべきです。</p>
				<p>PWMのキモはこの特徴です:</p>
				<blockquote><p>コンペア割り込みのタイミングで出力ビットをセット・リセット・反転</p></blockquote>
				<p>これでデューティー比が決まるわけです。この特徴は全てのキャプチャ・コンペアブロックに存在します。活用しましょう。ただし、キャプチャ・コンペアブロック0で活用するには、連続モードにしなければいけません。代償として変調周波数は自由に設定できなくなります。</p>
				<p>一方、キャプチャ・コンペアブロック0には、この機能がありません:</p>
				<blockquote><p>ブロック0のコンペア割り込みタイミングで出力ビットをセット・リセットする</p></blockquote>
				<p>当然ですね。この部分をオーバーフロー割り込みのタイミングでソフトウェアで処理すれば、キャプチャ・コンペアブロック0でもPWMができます。つまりオーバーフロー割り込みで、出力ビットを0または1に設定すればいいのです。</p>
				<p>なお、出力ビットは、通常の出力モードでは値を設定できません。手動設定のモードに切り替えてから設定し、また通常のモードに戻すことになります。なかなか普通じゃない感があります。</p>
				<h2>そして自由な変調周波数</h2>
				<p>先に、「代償として変調周波数は自由に設定できなくなります」と書きましたが、自由にする方法が無いわけではありません。というのは、タイマAのタイマレジスタはビット幅が16ビット固定で、連続モードに設定すると周期がかなり長くなってしまうのです。通常の1MHzのクロックだとおよそ16Hz、8MHzのクロックを使ってもおよそ128Hzです。省電力な低速クロックではさらに遅くなりますし、そもそも16HzなんてPWMでLEDを光らせるには遅すぎます。</p>
				<p>解決方法は簡単で、周期を短くしたければ、オーバーフロー割り込みの中でタイマレジスタの値を適当に大きくすればいいのです。例えば、0xff00を代入すれば、カウンタは8ビット幅になったも同然。こうして自由な変調周波数を手に入れることができます。コンペアレジスタの値も対応する値にしておきましょう。</p>
				<h2>まとめ</h2>
				<p>まとめると次のようにタイマを設定することになります:</p>
				<ul>
				<li>初期設定
				<ul>
				<li>連続モード</li>
				<li>コンペアレジスタ0にデューティー比を設定 (必要なら、(0&#215;10000 &#8211; 周期 + デューティー比) の値にする)</li>
				<li>出力モードはトグル</li>
				</ul>
				</li>
				<li>オーバーフロー割り込み
				<ul>
				<li>出力モードを手動に設定し、出力ビットを0 (ないし1) に初期化</li>
				<li>出力モードをトグルに設定し直す</li>
				<li>必要ならタイマレジスタの値を (0&#215;10000 &#8211; 周期) の値に設定し直す</li>
				</ul>
				</li>
				</ul>
				<p>ちなみに、タイマのクロックがCPUのクロックと同期していない場合についてデータシートには色々と注意書きがありますが、今回のような使い方では特に気にするべきことはないようです。</p>
				<h2>おしまい</h2>
				<p>実は事の発端はタイマBの出力0にLEDをつなげてしまったことだったりします。プリント基板を作る前にチップの仕様をよく確認しないと、ソフトにしわ寄せがくるようですね (寄せることができるともいう)。<br />
				ともあれ、Happy hacking!</p>
]]></content:encoded>
			<wfw:commentRss>http://tech.cerevo.com/blog/archives/238/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>すごくシンプルなハミング距離計算</title>
		<link>http://tech.cerevo.com/blog/archives/228</link>
		<comments>http://tech.cerevo.com/blog/archives/228#comments</comments>
		<pubDate>Tue, 18 Aug 2009 23:50:52 +0000</pubDate>
		<dc:creator>inagaki</dc:creator>
				<category><![CDATA[組み込みソフトウェア]]></category>

		<guid isPermaLink="false">http://tech.cerevo.com/blog/?p=228</guid>
		<description><![CDATA[				ハミング距離とはなんぞや……という話はWikipediaでも見ていだたくとして、要するに「ビット列を比較して値の異なる位置を数えたい」ということです。例えば01010011と01010111のハミング距離は1です [...]]]></description>
			<content:encoded><![CDATA[				<p>ハミング距離とはなんぞや……という話は<a href="http://ja.wikipedia.org/wiki/ハミング距離">Wikipedia</a>でも見ていだたくとして、要するに「ビット列を比較して値の異なる位置を数えたい」ということです。例えば01010011と01010111のハミング距離は1です。</p>
				<h2>異なるビット</h2>
				<p>二つのビット列のうち、ビットの異なる位置を抽出することは簡単です。基本です:</p>
				<pre><code>d = a ^ b;</code></pre>
<h2>ビットを数える</h2>
<p>あとはここから立っているビットを数えるわけですが、普通に考えると</p>
<ul>
<li>ビット列の幅の分だけループさせる</li>
<li>プロセッサのビットサーチ命令を使う</li>
</ul>
<p>という方法を使うと思います。前者は当然遅いので嫌ですね。後者はインラインアセンブラを使ってプロセッサ依存にしないといけませんし、ビットマスクを作ってビットを消しながら数えなくてはならず、いかにも面倒です (←根拠もなくシフト命令は遅いと思っているヤツ)。</p>
<p>そこで私が使う方法は次のようなものです:</p>
<pre><code>d &amp;= d - 1; // 立っている最下位ビットを消す</code></pre>
				<p>全ビットが消えるまでループすればハミング距離が分かります:</p>
				<pre><code>d = a ^ b;
i = 0
while (d) {
  d &amp;= d - 1;
  i++;
}</code></pre>
				<h2>おしまい</h2>
				<p>このコードを何に使うのかというと、BCH(15,5)符号などをパターンマッチングで誤り訂正しようということだったりします。15ビットもあるのに内容は5ビット(32パターン)しかないので、ハミング距離が一番小さい符号語が訂正結果ということにした方が簡単なのではないかというわけです。別にガロア体がよく分からんとかそういう理由ではないんですよ。<br />
				Happy hacking!</p>
]]></content:encoded>
			<wfw:commentRss>http://tech.cerevo.com/blog/archives/228/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>モバイル機器開発Tips ～パワーマネージメント　その2～</title>
		<link>http://tech.cerevo.com/blog/archives/222</link>
		<comments>http://tech.cerevo.com/blog/archives/222#comments</comments>
		<pubDate>Thu, 13 Aug 2009 06:23:45 +0000</pubDate>
		<dc:creator>m_suzuki</dc:creator>
				<category><![CDATA[ハードウェア]]></category>

		<guid isPermaLink="false">http://tech.cerevo.com/blog/?p=222</guid>
		<description><![CDATA[				こんにちは、Cerevoの鈴木です。
				今回はパワーマネージメントを支えるハードウェアということで電源回路を扱ってみます。
				実際にどんな電源回路を選定すべきかにフォーカスしたいと思います。
				 [...]]]></description>
			<content:encoded><![CDATA[				<p>こんにちは、Cerevoの鈴木です。<br />
				今回はパワーマネージメントを支えるハードウェアということで電源回路を扱ってみます。<br />
				実際にどんな電源回路を選定すべきかにフォーカスしたいと思います。<br />
				と言っても、そんなに電気回路の知識が必要ない程度で紹介しますので、ご安心をw</p>
				<h2>電源回路の基本の基本</h2>
				<p>よく使用される電源回路はDC/DCコンバータという回路です。<br />
				この回路を使うことで、例えばリチウムイオンバッテリの電圧である+3.7Vから内部回路の動作に必要な各種電圧を生成するわけです。<br />
				DC/DCコンバータの実際の動作としては電力変換を行うのですが、残念ながら100%変換されるわけじゃありません。<br />
				性能としては変換時の「効率」が重要になります。ちなみに変換できなかった電力は…熱に変換されますw<br />
				では、実際の回路を見てみます。</p>
				<h3>DM355EVMの電源回路</h3>
				<p>実際に自分たちが使用しているCPUであるDM355に関する例を紹介してみます。<br />
				まずはDM355の評価ボードであるDM355EVMを見てみます。<br />
				DM355EVMの回路図は <a href="http://c6000.spectrumdigital.com/evmdm355/reve/files/EVMDM355_Schematics_RevE.pdf">http://c6000.spectrumdigital.com/evmdm355/reve/files/EVMDM355_Schematics_RevE.pdf</a> からDLできます。<br />
				P.25-26がDM355の電源回路部分になります。使用しているチップは TPS54310 ですね。<br />
				このチップのデータシート <a href="http://focus.tij.co.jp/jp/lit/ds/symlink/tps54310.pdf">http://focus.tij.co.jp/jp/lit/ds/symlink/tps54310.pdf</a> をちょっと見てみます。<br />
				まずはP.1にある「効率 対 負荷電流」のグラフを見てみます。<br />
				内部回路、この場合はDM355に対して、出力電圧+3.3Vで1Aの電流が流れた場合(つまりDM355に3.3Wの電力を供給した場合)に約93%ぐらいの効率であることが読み取れます。なかなか優秀ですね。<br />
				でも、DM355は省電力モードのあるCPUです。<br />
				例えば、省電力モードになって+3.3Vで1mAの負荷電流となった(つまりDM355に3.3mWの電力だけを供給することでよくなった)場合に、効率はどうなるか…もう少しデータシートを読み漁ってみましょう。<br />
				P.10に特性グラフが出てきました。図12に注目してください。<br />
				何と、負荷電流が200mAぐらいのところを境にして、急激に効率が65%程度まで低下しているじゃないですか！<br />
				この回路では省電力モード時に約35%の電力が電源チップで熱となって消費されてしまいます。<br />
				というか、このEVMでは残念ながら省電力モードの評価や実験はできないですねw</p>
				<h3>Leopard Boardの電源回路</h3>
				<p>DM355が載っているボードとして、最近一部で話題のLeopard Boardがあります。<br />
				このボードはカメラ付きで$99と評価ボードとしては破格の価格のボードです。<br />
				早速、回路図を見てみましょう。回路図は <a href="http://">http://www.leopardboard.org/uploads/DM355_LEOPARD_BOARD.pdf </a>からDLできます。<br />
				P.13が電源回路になります。Leopard BoardではDM355EVMとは違って、電源統合チップ TPS65053 が使用されていますね。どうりで安いわけですね(ぉ<br />
				さてさて、どんな性能でしょうか…データシート <a href="http://focus.tij.co.jp/jp/lit/ds/symlink/tps65053.pdf">http://focus.tij.co.jp/jp/lit/ds/symlink/tps65053.pdf</a> を見てみましょう。<br />
				データシートのP.1には大体そのチップのFEATUREが書いてありますが、いきなり &#8220;Up To 95% Efficiency&#8221; と書いてありますね。期待できそうです。<br />
				問題は省電力モードになったとき、つまり低負荷時の効率です。<br />
				P.7のFigure1, Figure2に注目です。<br />
				どちらも効率と負荷電流の関係を表していますが、Figure1のほうが負荷電流が0.001A=1mAのときでも効率が90%程度を維持しています。<br />
				違いは何かというと、Figure1が&#8221;PWM/PFM Mode&#8221;なのに対して、Figure2が&#8221;PWM Mode&#8221;オンリーなことです。<br />
				このモードをどう切り替えるか、それもデータシートに書いてあります。<br />
				P.5に TPS65053 の各ピン毎の機能が &#8220;TERMINAL FUNCTIONS&#8221; にまとめられていますが、その中のMODEピンが該当します。</p>
				<pre>Select between Power Save Mode and forced PWM Mode for DCDC1 and DCDC2.
In Power Save Mode, PFM is used at light loads, PWM for higher loads.
If PIN is set to high level, forced PWM Mode is selected.
If Pin has low level, then the device operates in Power Save Mode.</pre>
				<p>つまり、通常時はMODEピンをHighにしておいて、DM355が省電力モードになるときにはLowにしてあげるとバッテリが効率良く使えますね。<br />
				電源回路はこうじゃないといけないです。</p>
				<h2>電源回路のポイントとまとめ</h2>
				<p>バッテリ動作するようなモバイル機器の電源回路は、とにかく高効率であることが重要です。<br />
				しかも、ON/OFFできるだけじゃなく、電源回路自体がパワーセーブモードを持つものじゃないと長生きできません。<br />
				今回はDM355の省電力モードと絡めて電源回路を紹介しましたが、Linuxが動作しているようなCPUが実際に省電力モードになるまでの動作に興味をもたれる方もいると思いますので、次回はその辺の具体例を紹介する予定です。</p>
]]></content:encoded>
			<wfw:commentRss>http://tech.cerevo.com/blog/archives/222/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GTK+自作ウィジェットの描画処理を軽くする</title>
		<link>http://tech.cerevo.com/blog/archives/210</link>
		<comments>http://tech.cerevo.com/blog/archives/210#comments</comments>
		<pubDate>Mon, 10 Aug 2009 12:12:06 +0000</pubDate>
		<dc:creator>inagaki</dc:creator>
				<category><![CDATA[組み込みソフトウェア]]></category>

		<guid isPermaLink="false">http://tech.cerevo.com/blog/?p=210</guid>
		<description><![CDATA[				グラフィックアクセラレータのない組み込み環境でGTK+を使う場合、描画処理はけっこう負荷の高い処理です。例えば画像を大量に描画すると、その負荷が高くてバックグラウンドで別の処理を進めることができないということも起 [...]]]></description>
			<content:encoded><![CDATA[				<p>グラフィックアクセラレータのない組み込み環境でGTK+を使う場合、描画処理はけっこう負荷の高い処理です。例えば画像を大量に描画すると、その負荷が高くてバックグラウンドで別の処理を進めることができないということも起こりえます。<br />
				そこでGtkDrawingやGtkLayoutに自作の描画ハンドラ (exposeイベントのシグナルハンドラ――以下、exposeハンドラ) を作るときに無駄な描画処理をしないためのテクニックを紹介したいと思います。</p>
				<h2>背景色を正しく設定する</h2>
				<p>ウィジェットのある部分についてexposeイベント (ひらたく言えば描画イベント) が発生すると、当該部分が背景色で塗り潰されてからexposeハンドラが呼ばれます。ここを別な色で塗り直すのは当然無駄なわけで、ウィジェットの生涯を通じて最も描画面積の大きい色を背景色として設定しておけば、描画処理は軽くなるでしょう。</p>
				<h2>クリッピングする</h2>
				<p>ウィジェットの重なりが変更されたり、GtkLabelなどの自分のGdkWindowを持たないウィジェットの内容が変更されたりすると、<br />
				下になっているウィジェットの重なっている部分が再描画されます。<br />
				exposeハンドラでは、GdkGCを設定して、ウィジェットの必要な部分だけを書き換えるようにしましょう。</p>
				<h3>GdkRegionを使う方法</h3>
				<p>この方法が<a href="http://library.gnome.org/devel/gtk/unstable/checklist-gdkeventexpose-region.html">推奨</a>されているようです:</p>
				<pre><code>static gboolean
my_widget_expose_event_handler (GtkWidget *widget, GdkEventExpose *event) {
  GdkGC *gc = widget-&gt;style-&gt;fg_gc[GTK_WIDGET_STATE(widget)];
  gdk_gc_set_clip_region(gc, event-&gt;region);
  /* 描画処理 */
  gdk_gc_set_clip_region(gc, NULL);
  /* 他の処理 */
}</code></pre>
				<h3>GdkRectangleを使う方法</h3>
				<pre></code>static gboolean
my_widget_expose_event_handler (GtkWidget *widget, GdkEventExpose *event) {
  GdkGC *gc = widget-&gt;style-&gt;fg_gc[GTK_WIDGET_STATE(widget)];
   gdk_gc_set_clip_rectangle(gc, &amp;event-&gt;area);
  /* 描画処理 */
  gdk_gc_set_clip_rectangle(gc, NULL);
  /* 他の処理 */
}</code></pre>
				<h2>ウィジェット全体を再描画するのはやめよう</h2>
				<p>クリッピングとも関係のある話ですが、手抜きをしてgtk_widget_queue_redraw_areaを使うのは避けるべきです。gtk_widget_queue_redraw_area を多用している場合は設計を見直した方がいいかも知れません。<br />
				特に画像を重ねて描画している場合、効率よく再描画するために重なりを管理する処理を書くことになりがちです。それはGTK+が既に持っている機能なので自分で作るべきではありません。</p>
				<h2>バグのあるウィジェットは使わない</h2>
				<p>バグのあるウィジェットとはGtkFixedのことですが、子ウィジェットを動かすとGtkFixed全体が再描画されるというバグがあります。</p>
				<p>具体的なことはgtk_fixed_moveとgtk_layout_moveの実装を比較すると分かりますし、直すことも難しくありません。しかしGtkFixedは設計も古く (よく言えば単純で)、あんまりメンテナンスされていないようなので使わない方がいいでしょう。</p>
				<h2>おしまい</h2>
				<p>ぶっちゃけGTK+は独学なのであまり偉そうなことは言えません。むしろ教えてください。<br />
				Happy hacking!</p>
]]></content:encoded>
			<wfw:commentRss>http://tech.cerevo.com/blog/archives/210/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>クラッシュ＆移行 ～Cerevo社内開発用サーバ構築記～</title>
		<link>http://tech.cerevo.com/blog/archives/190</link>
		<comments>http://tech.cerevo.com/blog/archives/190#comments</comments>
		<pubDate>Mon, 10 Aug 2009 02:00:00 +0000</pubDate>
		<dc:creator>mat2uken</dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[ハードウェア]]></category>

		<guid isPermaLink="false">http://tech.cerevo.com/blog/?p=190</guid>
		<description><![CDATA[				まつけんです。
				Beagle Boardの記事が好評だったので、そのままなにかBeagleネタで行こうかとおもったのですが、本日、開発マシンが突然死したので、哀しみの開発マシン移行記を今回は書いてみます。 [...]]]></description>
			<content:encoded><![CDATA[				<p>まつけんです。</p>
				<p>Beagle Boardの記事が好評だったので、そのままなにかBeagleネタで行こうかとおもったのですが、本日、開発マシンが突然死したので、哀しみの開発マシン移行記を今回は書いてみます。</p>
				<h2>事の発端</h2>
				<p>土曜日の午前中、結構集中してコーディングをしていました。マシン自体は、快調に動いており、問題なく作業を進めました。ふと、喉が渇いて、お茶を汲んで、トイレに行ってきました。かえってきたら、sshでログインしているターミナルがすべて反応しません。</p>
				<p>あれっとおもって、マシンを見ると、CPUファンが回っていません。あれ、電源落ちた？と思い、近づきます。明らかに焦げ臭いにおいが漂ってきました。危険な感じがヒシヒシと伝わってきます。とりあえず、保存してない分のソースは藻屑と消えました、合掌。。。って、この時点でテンション-10です。</p>
				<p>とりあえず、原因をさぐるために、マザーボードに顔を近づけます。どうも、臭いのもとはCPU周辺で、かつ、ヒートシンクは触れないくらい熱くなっています。CPUが焦げて再起不能になった感たっぷりです。</p>
				<p>ちょっと余談ですが、自作PC系でオーバークロックとかを趣味にされている方を中心に、なんというかこの臭いを感じた瞬間のテンションの下がりかたは、経験のある人はわかるとおもうのですが、完全に脱力系です。</p>
				<p>さて、そうなると、とりあえず、電源ボタン、というか、マザーに直刺ししているスイッチを押しても当然のように反応がありません。これはやばいな、ということで、とりあえず、電源ケーブルを抜きます。ここで、おもむろにヒートシンクを掴むとやけど確実に火傷します。とりあえず、はやる気持ちを抑え、心を落ち着けて、深呼吸しながら冷えるのを待ちます。何故かこの時間の間に自分で自分を無駄に責めます。エアフローダメすぎとか、いや、ていうか根本的にオーバークロックしてる時点で、とかぐるぐるしながら待ちます。</p>
				<p>さて、こっからが問題なのですが、結局のところ、起動しない原因がCPUかどうかを確定するのは結構厄介です。わざわざほかのマシンに挿してみるのも面倒ですし、それでなんかショートとかしてて、その検証用マザーを壊した日には泣くに泣けません。</p>
				<p>というわけで、とりあえず、もう一度だけ、電源をつないでみて、CPUを刺し直して、起動をためしてみました。やっぱりダメです。ここで、結論をだします。諦めてマシンを新調することにしました。</p>
				<h2>新旧マシン構成の変化点</h2>
				<p>事の発端が、むやみと長くなりました。さっきクラッシュして、マシン組み直したばかりなので、まだショックから抜け切れていないせいか、まだ妙にハイテンションです。そのせいもあり、どこかのだれかに共感してほしくて長く書いてしまいました。</p>
				<p>さて、本題にもどって、新しいマシンにするなら、どういう構成にするかを決めて、必要なものを買い出しです。うちの会社はアキバのPCパーツ系ショップエリアから徒歩３分くらいなので、買い出しには困りません。この会社の位置は素晴らしいです。</p>
				<p>結局、開発マシンで壊れている部分を考えると、CPUは間違いなさそう、マザーはどうだろう、微妙だな、という具合です。一番、やすく済ませるなら、とりあえずCPUだけ買ってきて変えてみるのも手なのですが、これを期に、ウチのほかのサーバ用マシンと構成をあわせるのもついでにやってしまおうということで、思い切ってAMDなPhenomからIntel C2Qに変更することにしました。そうすると、もれなくマザーも買い換えです。</p>
				<p>なので、購入したのは以下の部品です。</p>
				<ul>
				<li>Intel Core2Quad Q9550</li>
				<li>Intel DQ45CB</li>
				</ul>
				<p>なんで、DQ45CBかは、はてなさんのサーバが公開された時も紹介されていましたが、キーワードは消費電力とIntel AMTです。このへんの話題はまた来週のエントリを書く際にご紹介したいとおもいます。</p>
				<p>もともとのCPUとマザーボードは、以下のような構成です。</p>
				<ul>
				<li>Phenom 9950BE 3.0GHz (x15に倍率変更)</li>
				<li>GIGABYTE GA-MA78GPM-DS2H</li>
				</ul>
				<p>まあ、ご覧の通り、OCしてるし、VCoreもちょっと盛ってるので、壊れたのはまさに自業自得です。</p>
				<p>それ以外のメモリ、HDD、電源などのパーツはすべて流用です。</p>
				<h2>Gentooの移行</h2>
				<p>マシンは昼飯ついでに買ってきて、さくさくっとくみ上げます。ざっと配線などをチェックして電源を入れます。うん、うまく動きました。とりあえず、予想通り、CPUかマザーが壊れているので正解だったようです。電源とかだったら、涙目になるところでした。</p>
				<p>とりあえず、BIOSとAMTまわりをざーっと設定します。さて、あとは、OSの移行です。もともと、開発マシンはGentooがインストールされていたので、その環境を再現しましょう。</p>
				<p>基本的に、すでに動いていたHDDを挿すので、そのまま起動するはず、と一瞬おもったんですが、よく考えたらCPU変えたけど、大丈夫かいな、とおもいつつ、起動します。まずは、不安的中、カーネルがIOMMUまわりで刺さります。</p>
				<p>わーん、となげきつつ、しょうがないのでまずはカーネルを入れ替えるところをやります。とりあえず、USB-HDDから起動できるようにし<a name="doc_chap2_sect2">たGentoo MinimalインストールCDイメージがあったので、そのHDDをつないで、そこから起動します。</a></p>
				<p>起動できなかったHDDを適当なところにマウントします。まあ、インストール時と同じ、/mnt/gentooがわかりやすい気がします。</p>
				<pre># mount /dev/sda1 /mnt/gentoo
# mount /dev/sda2 /mnt/gentoo/var
# mount -t proc none /mnt/gentoo/proc
# mount -o bind /dev /mnt/gentoo/dev</pre>
				<p>おもむろに、chrootします。うまくいったので、深く考えなかったんですが、ここで実行できるバイナリだったので、よかったです。chrootできないと結構悲惨でしたね。</p>
				<pre># chroot /mnt/gentoo /bin/bash
# env-update</pre>
				<p>さて、カーネルが刺さるので、コンフィグを見直します。とりあえず、同じ構成でうごいているマシンがあるので、その.configをもってきます。バージョンが2.6.30.2-&gt;2.6.30.4だったので、</p>
				<pre># make oldconfig</pre>
<p>します。さて、ここで問題発生。いつになっても、oldconfigがおわりません。そんな時間のかかる処理だったっけ、とあまりよく考えず、3分くらい待ちました。やっぱり終わりません。ここまできて、ようやくtopとかvmstatを眺めます。cc1が100%のまま、ずーっと張り付いています。ここで激しく嫌な予感。もしかして、gccがPhenom向けにコンパイルされててうまく動いてない感じなのか、と気づきます。そういえば、gccのオプションを/etc/make.confで-march=nativeとかにしています。やばげ。</p>
<p>さて、どうにかしないといけません。とりあえず、作戦を変更して、カーネルだけほかのマシンからもってきて、grubを書き換えて起動します。nicとかがudevのせいで、eth1に変わったりしてちょっと変ですが、とりあえず、うまく起動しました。これで、gccもうごくといいなー、とまったく根拠のない希望をもちつつ、make oldconfigと叩きます。はい、やっぱりダメです。</p>
<p>うーん、これはなんとかして、このマシン上でも動くgccを用意するしかありません。これも、結局、他のマシンのgcc, glibcをもってくることにしました。しかし、どのファイルをもってくればいいのか、特定するのはめんどくさいです。</p>
<p>解決策は、Gentooならquickpkgをつかって、バイナリパッケージをtbz2で作成してくれます。</p>
<pre># quickpkg gcc glibc</pre>
				<p>そうすると、/usr/portage/packages以下にファイルができあがります。これを開発マシンにコピーします。そして、はじめは、淡い希望をもって、emerge経由でインストールできないもんかと試します。</p>
				<pre># emerge -avk =sys-devel/gcc-4.3.3-r2</pre>
<p>残念。やっぱりcc1が暴走して、永遠に終わりません。となると、バイナリパッケージって所詮、ただのtarで固められたアーカイブなので、思い切って上書きで展開します。なにかおこったら、諦めて最初から構築しなおしの覚悟を決めます。</p>
<pre># tar jxpvf gcc-4.3.3-r2.tbz2 -C /
# tar jxpvf glibc-2.9_p20081201-r2.tbz2 -C /</pre>
				<p>さて、とりあえず、gcc -vとかためして、入れ替わったか確認します。うん、上書きされたようです。そして、再度、make oldconfigします。やった、うまくいきました。</p>
				<p>ここまでいけば、あとは、カーネル再構築して、バイナリを最適化されているものに入れ替えです。Gentooつかってると、emerge -eDN worldとかちょっとわくわくしますよね。とか書いて、そんなわけねーよと思われていたら、悲しいですが。</p>
				<p>そして、現在、emerge worldの最中です。問題無く、コンパイルされているようです。あとは、待つのみ。</p>
				<h2>最後に</h2>
				<p>これで、なんとか開発マシンがもとの状態にもどるところまでたどり着きました。</p>
				<p>今回の教訓。</p>
				<p>CPUとか変更するなら、事前にもうちょっといろいろ考えろよ、自分、っていうところにつきますね。まあ、なんとかなったからいいか、とおもって、毎回、こういう行き当たりばったりなことをしている気がします。直そう。</p>
				<p>まあ、とりあえず、こういうときにいろいろ手が考えられるところとかも含め、いろいろGentooは楽しいです。みんなUbuntuとか言わずに、Gentooにしようよ、と社内で布教中なのですが、だれも言うことを聞いてくれません。悲しいです。ていうか、Ubuntuを使っていると、このケースならトラブルなく移行できた気がしますね。負けました。</p>
				<p>さて、次回のエントリは、Intel AMTで快適リモート操作〜IPMIなんてなくても頑張れる子 DQ45CB〜をご紹介したいと思います。</p>
				<p>では、長々と書きましたが、ここまで読んでくれた方、大変ありがとうございました。</p>
				<p>最後に新旧開発マシンはこんな感じ。</p>
				<p><img class="aligncenter size-medium wp-image-197" title="プリントサーバという名の開発マシン" src="http://tech.cerevo.com/blog/wp-content/DSCN3352-300x225.jpg" alt="プリントサーバという名の開発マシン" width="300" height="225" /></p>
				<p style="text-align: center;">
]]></content:encoded>
			<wfw:commentRss>http://tech.cerevo.com/blog/archives/190/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Introduction of UBIFS</title>
		<link>http://tech.cerevo.com/blog/archives/177</link>
		<comments>http://tech.cerevo.com/blog/archives/177#comments</comments>
		<pubDate>Sun, 09 Aug 2009 23:30:42 +0000</pubDate>
		<dc:creator>hnakagawa</dc:creator>
				<category><![CDATA[組み込みソフトウェア]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://tech.cerevo.com/blog/?p=177</guid>
		<description><![CDATA[				はじめまして、Cerevoの中河です。
				ソフトウェア担当で主にLinuxカーネル/ドライバ回りを担当しています。
				今回はUBIFSとういうLinuxで使用できるファイルシステムについて書きたいと思 [...]]]></description>
			<content:encoded><![CDATA[				<p>はじめまして、Cerevoの中河です。<br />
				ソフトウェア担当で主にLinuxカーネル/ドライバ回りを担当しています。<br />
				今回はUBIFSとういうLinuxで使用できるファイルシステムについて書きたいと思います。</p>
				<h2>UBIFSって？</h2>
				<p>UBIFSとはNANDフラッシュメモリ向けに開発されたファイルシステムです。<br />
				フラッシュメモリと言うと、一般的にはUSBメモリやSSDが連想されるかもしれませんが、それらのデバイスはハードディスクと同じような扱いが出きるようハードウェア的な仕組みが入っている為、ここでは該当しません。<br />
				UBIFSが対象としているのは、あくまでもCPUのNANDフラッシュメモリ・コントローラに直接接続されたNANDフラッシュメモリです。</p>
				<h2>何故UBIFS？</h2>
				<p>フラッシュメモリ上では、JFFS2というファイルシステムが広く使用されてきました。<br />
				しかし、JFFS2にはフラッシュメモリの容量に比例して、マウント時間やメモリ使用量が大きくなってしまうという設計上の問題があり、昨今の大容量NANDフラッシュメモリには対応できなくなってきました。<br />
				そういった問題を解決するために設計・開発されたのがUBIFSです。</p>
				<p>JFFS2と比較すると、UBIFSには以下のような特徴があります。<br />
				- 高速マウント<br />
				JFFS2の様にマウント時にパーティション全体をスキャンする必要が無く、高速にマウントできる。<br />
				- 省メモリ<br />
				JFFS2はファイルシステムのインデックスをメモリ上に置いていたため、容量に比例して大量のメモリを消費していましたが、UBIFSではインデックスをフラッシュメモリ上に置いているため、メモリ消費量が少ない。<br />
				- Write-Backサポート<br />
				Write-Backをサポートしているため高速に書き込み処理が出来る。<br />
				- UBI<br />
				JFFS2はMTDと呼ばれるフラッシュメモリ・デバイスドライバを抽象化したサブシステム上で動作しますが、UBIFSはMTD上にさらにUBIという、ウェアレベリング※1と論理ボリュームを実現するレイヤをのせ、その上で動作します。</p>
				<h2>UBIFSを使用してみる</h2>
				<p>- まずホスト環境で、UBIツールをクロスビルドします。<br />
				$ git clone git://git.infradead.org/mtd-utils.git<br />
				$ cd mtd-utils/<br />
				$ CROSS=arm-uclinuxeabi- make</p>
				<p>- ビルドしたflash_eraseallとubimkvolコマンドをターゲットにコピーしてください。<br />
				$ cp arm-uclinuxeabi/flash_eraseall [ターゲットのroot]/usr/bin<br />
				$ cp arm-uclinuxeabi/ubi-utils/ubimkvol [ターゲットのroot]/usr/bin</p>
				<p>- 続いてターゲット環境上でUBIFSで使用するmtdパーティションを初期化します。<br />
				$ flash_eraseall /dev/mtd1</p>
				<p>- 以下のブートパラメータを追加します。<br />
				ubi.mtd=1</p>
				<p>- 最後にUBI論理ボリュームを作成 &amp; マウントします。<br />
				$ ubimkvol /dev/ubi0 -n 0 -N ubifs -m<br />
				$ mount -t ubifs ubi0_0 /mnt</p>
				<h2>まとめ</h2>
				<p>駆け足でしたが、UBIFSを紹介してみました。<br />
				UBIFSは製品レベルで十分使用できるものと考えていますので、大容量NANDフラッシュメモリを使用する場合は、是非UBIFSの採用を検討してみてください。<br />
				またそのうち、UBIFSやUBIの内部構造もご紹介できればと思います。</p>
				<p>参考<br />
				UBIFS &#8211; http://www.linux-mtd.infradead.org/doc/ubifs.html<br />
				UBI &#8211; http://www.linux-mtd.infradead.org/doc/ubi.html</p>
				<p>※1 http://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%AC%E3%83%99%E3%83%AA%E3%83%B3%E3%82%B0</p>
]]></content:encoded>
			<wfw:commentRss>http://tech.cerevo.com/blog/archives/177/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>モバイル機器開発Tips ～パワーマネージメント　その１～</title>
		<link>http://tech.cerevo.com/blog/archives/173</link>
		<comments>http://tech.cerevo.com/blog/archives/173#comments</comments>
		<pubDate>Thu, 06 Aug 2009 03:36:34 +0000</pubDate>
		<dc:creator>m_suzuki</dc:creator>
				<category><![CDATA[ハードウェア]]></category>

		<guid isPermaLink="false">http://tech.cerevo.com/blog/?p=173</guid>
		<description><![CDATA[				こんにちは、Cerevoの鈴木です。
				今回はモバイル機器では必須のパワーマネージメントについて扱ってみます。
				なぜパワーをマネージメントするのか？
				ノートパソコンや携帯、デジカメなどのモバ [...]]]></description>
			<content:encoded><![CDATA[				<p>こんにちは、Cerevoの鈴木です。<br />
				今回はモバイル機器では必須のパワーマネージメントについて扱ってみます。</p>
				<h2>なぜパワーをマネージメントするのか？</h2>
				<p>ノートパソコンや携帯、デジカメなどのモバイル機器には電源としてバッテリが実装されています。<br />
				バッテリの容量というのは大小色々ありますが、有限です。<br />
				その限られた電力で出来るだけ長時間動作させたい、というのが目的になります。<br />
				(もっと大容量、もっと小型のバッテリが使えるようになると話は変わるのかも知れませんが)</p>
				<h2>良く使われるパワーマネージメント方法</h2>
				<p>出来るだけ電力消費を抑えるのが目的になるので、実際には機器内部のハードウェア・デバイスを色々と制御することになります。<br />
				いくつかの手法がありますが、世の中の常でプロコンがあります。</p>
				<h3>ソフトウェアスタンバイ</h3>
				<p>まずはデバイスの省電力機能を使うことが上げられます。<br />
				最近のデバイスはレジスタにアクセスすることで省電力モードになるものがあります。<br />
				「ソフトウェアスタンバイ」なんて言葉でこの機能が説明されている場合が多いです。<br />
				この手法はお手軽で通常の状態に復帰するのも早いですが、一方でそれほど消費電力が下がらないということがあります。</p>
				<h3>ハードウェアスタンバイ</h3>
				<p>次にデバイスのピンの電圧を変化させることで省電力状態にする手法があります。<br />
				これは上の例とは異なり、外部からターゲットとなるデバイスのピンに対してHigh or Lowをハード的に出力する手法になります。<br />
				「ハードウェアスタンバイ」なんて言葉で説明されている場合が多いです。<br />
				この手法はHigh or Lowを出力する仕組みが別途必要になるのでお手軽ではないのですが、大体の場合は消費電力が大幅に低下します。</p>
				<h3>電源制御</h3>
				<p>最後はターゲットとなるデバイスの電源をOFFにしてしまう手法です。<br />
				これは分かりやすいですね。消費電力は0になります。<br />
				ただし、電源ラインをON/OFFできるスイッチ(古くはリレー、最近はFETなんかで構成できます)とそのスイッチを制御する仕組みが別途必要になるのでハードウェア的には一番複雑になります。<br />
				しかも電源をOFFにしてしまうので、通常状態に復帰させるためには電源をONにして初期設定をし直さないといけません。<br />
				・・・でも、でも、「消費電力ゼロ」は魅力的なわけです。また、起動に1分かかるPCとは違って、起動して初期設定完了まで1～2秒程度、なんてのが一般的なので、意外に使えちゃったりするわけです。ケータイのカメラなんかは良い例ですね。</p>
				<h2>まとめ</h2>
				<p>概要は以上なのですが、実際には機器内部には多くのデバイスがあって、動作仕様によって今回の3つの手法を織り交ぜて使います。<br />
				パワーマネージメントはハードとソフトが協調して動かないといけないので、ちゃんと設計しないといけない雰囲気は伝わったかと思います。<br />
				次回は少し具体的な例を紹介しようと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://tech.cerevo.com/blog/archives/173/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>コンクリート壁への内装品固定方法</title>
		<link>http://tech.cerevo.com/blog/archives/167</link>
		<comments>http://tech.cerevo.com/blog/archives/167#comments</comments>
		<pubDate>Tue, 04 Aug 2009 17:42:19 +0000</pubDate>
		<dc:creator>iwasa</dc:creator>
				<category><![CDATA[オフィス設営]]></category>

		<guid isPermaLink="false">http://tech.cerevo.com/blog/?p=167</guid>
		<description><![CDATA[				こんばんわ、岩佐です。
				私は会社でコードを書いていないので、&#8221;Tech&#8221;はテックでもコードにまで落ちない、商品企画レベルでのテクノロジー系ネタを扱っていくことにします。あと、オフィ [...]]]></description>
			<content:encoded><![CDATA[				<p>こんばんわ、岩佐です。<br />
				私は会社でコードを書いていないので、&#8221;Tech&#8221;はテックでもコードにまで落ちない、商品企画レベルでのテクノロジー系ネタを扱っていくことにします。あと、オフィス設営なんかに関する日曜大工的なTechTopicsなどなど。</p>
				<p>というわけで第一弾はいきなり日曜大工系で「コンクリート壁への重量物取り付け」。具体的にはライティングレールなど(※配線には要電気工事2種資格)。</p>
				<p>用意するのは電気ドリルとコンクリート用ドリル刃、コンクリートアンカープラグ、タッピングビス。コンクリート壁に通常のタッピングビスを打ってもすぐに抜け落ちてきてしまいますので、ドリルで下穴をあけてからアンカーを指し込み、タッピングビスを打ち込むことでコンクリート内でアンカーが広がり、固定されます。</p>
				<p>ポイントはコンクリート専用ドリル刃というのが売っていますので、これを使うこと。柔らかいところであれば鉄鋼用の刃でも太刀打ちできますが、刃がすぐにダメになってしまいます。また、アンカープラグの長さよりも少し長いビスを使うこともポイント。プラグを貫通してプラグが大きく広がることで、がっちりと固定されます。</p>
				<p>秋葉原で1本単位で購入するなら、西川電子部品のネジ部がおすすめです。<br />
				http://nishikawa.or.tv/map/index.htm</p>
				<p>西川電子部品では1本単位のビスに値段が書いていませんが、店員さんに聞けばちゃんと教えてくれます。ちなみに鉛製オールプラグ（サンコーテクノ製）と、それに適合するM3のタッピングビスはそれぞれ10円でした。</p>
]]></content:encoded>
			<wfw:commentRss>http://tech.cerevo.com/blog/archives/167/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>なんとなく分かるgtkrcの書き方</title>
		<link>http://tech.cerevo.com/blog/archives/119</link>
		<comments>http://tech.cerevo.com/blog/archives/119#comments</comments>
		<pubDate>Mon, 03 Aug 2009 23:45:17 +0000</pubDate>
		<dc:creator>inagaki</dc:creator>
				<category><![CDATA[組み込みソフトウェア]]></category>
		<category><![CDATA[GTK+]]></category>

		<guid isPermaLink="false">http://tech.cerevo.com/blog/?p=119</guid>
		<description><![CDATA[				こんにちは、稲垣@Cerevoです。
				今回はアセンブリ言語から離れてGTK+に関することを書いてみたいと思います。
				gtrkrcの書き方
				gtkrcをちょっと書いてみようとして、ググったけ [...]]]></description>
			<content:encoded><![CDATA[				<p>こんにちは、稲垣@Cerevoです。<br />
				今回はアセンブリ言語から離れてGTK+に関することを書いてみたいと思います。</p>
				<h2>gtrkrcの書き方</h2>
				<p>gtkrcをちょっと書いてみようとして、ググったけどまともな解説がなくて挫折したという方、<br />
				けっこういるのではないでしょうか?<br />
				実は、書くときに必要な知識はGTK+のドキュメントに書いてあります。<br />
				<a title="Resource Files" href="http://library.gnome.org/devel/gtk/stable/gtk-Resource-Files.html"> http://library.gnome.org/devel/gtk/stable/gtk-Resource-Files.html</a></p>
				<p>しかし他のドキュメントを参照しないと分からない部分もありますし、<br />
				そういう部分に限ってドキュメントのポインタが示されていなかったりするのも事実です。</p>
				<p>そこで、gtkrcを書こうとしたけどよく分からなかったという人や<br />
				自分のプログラムでどう利用したらいいか分からないという人向けに、<br />
				gtkrcの書き方・使い方をまとめてみたいと思います。</p>
				<h2>スタイル</h2>
				<p>GTK+では、色やフォントの設定は<a href="http://library.gnome.org/devel/gtk/stable/GtkStyle.html">スタイル (GtkStyle)</a> としてまとめられています。<br />
				gtkrcでは次のような記述でスタイルを定義します。</p>
				<pre><code>style "hoge" {
   fg  [NORMAL] = "#fff"
   font_name = "M+1P+IPAG 12"
   xthickness = 2
   GtkWidget::focus-line-width = 3
}
</code></pre>
				<h3>色</h3>
				<p>fg bg text base bg_aaの部分の5種類の部分について、<br />
				NORMAL ACTIVE PRELIGHT SELECTED INSENSITIVEの各状態の色を指定します:</p>
				<pre><code>fg[NORMAL] = "#fff"</code></pre>
<p>普段はNORMALの色、カーソルが当たったときはPRELIGHTの色などと使い分けることが想定されているようですが、<br />
実際のところ、これらの色を実際にどこに配置するかはウィジェット次第です。<br />
例えばGtkNotebookはちょっとそれ違わない?って感じの配色をしますね。<br />
極端な話、GtkDrawingやGtkLayoutを使う場合は、5×5=25色のパレットだと思ってしまってもいいかもしれません。<br />
お行儀よくはありませんが。</p>
<h3>フォント</h3>
<pre><code>font_name = "M+1P+IPAG 12"</code></pre>
				<p>などと指定します。fontconfigが面倒を見てくれます。</p>
				<h3>厚み</h3>
				<p>xthicknessとythicknessはボタンの厚みやボックスのマージンなんかに使われる、<br />
				と思います。ほとんどいじったことはありません。</p>
				<h3>各クラス固有のスタイルプロパティ</h3>
				<p>普通のプロパティとは別にスタイルプロパティというものが各クラスに定義されており、<br />
				gtkrcで設定することができます。</p>
				<p>たとえばGtkWidgetには<a title="GtkWidget.style-properties" href="http://library.gnome.org/devel/gtk/stable/GtkWidget.html#GtkWidget.style-properties"><code>focus-line-width</code></a>というスタイルプロパティがあり、</p>
				<pre><code>GtkWidget::focus-line-width = 3 </code></pre>
<p>などと指定すると、<br />
フォーカスの当たっているウィジェットに破線で描かれる枠が太くなります。</p>
<h3>プログラムからの利用</h3>
<p>ウィジェットはスタイルを持っており、公開されていますから、普通にポインタでアクセスできます。<br />
例えばNORMAL状態の前景色のGdkGCは</p>
<pre><code>widget-&gt;style-&gt;fg_gc[GTK_STATE_NORMAL]</code></pre>
				<p>としてアクセスできます。<br />
				プログラムの中でGdkGCやPangoを操作するのは面倒ですし 、<br />
				デザイン変更のたびにリコンパイルするのも大変ですから、<br />
				積極的に利用したいものです。</p>
				<h2>バインディング</h2>
				<p>バインディングはキーにアクションシグナルを結びつけます:</p>
				<pre><code>binding "fuga" {
  bind "Return" { "move-current" (next) }
  bind "Left" { "cancel" () }
}</code></pre>
				<p>解説を探してもEmacsキーバインディングにする方法しか書いてないことがほとんどで、<br />
				たとえば「どんな名前のキーがあるのか」ということはよく分からないという<br />
				ちょっと厄介な部分です。</p>
				<p>バインディングも、スタイルと同様、一式を定義してからウィジエットに結びつけるという形をとります。</p>
				<h3>キーの名前</h3>
				<p>使うキーの名前は <a title="gdkkeysyms.h" href="http://svn.gnome.org/viewvc/gtk%2B/trunk/gdk/gdkkeysyms.h?view=markup">gdk/gdkkeysyms.h</a> に書かれています。<br />
				たとえばGDK_Rightと書かれていたら、gtkrcには&#8221;Right&#8221;と書きます。<br />
				どのキーなのかは、おおむね見れば分かります。それで深く考えたことはありませんが、<br />
				どうしても気になるときは、<a href="http://library.gnome.org/devel/gdk/stable/gdk-Event-Structures.html#GdkEventKey">GdkEventKey</a>をダンプするプログラムでも書いたら分かるんじゃないんでしょうか。</p>
				<h3>アクションシグナル</h3>
				<p>アクションシグナルの定義は、スタイルプロパティ同様、各クラス (と親クラス) のドキュメントに書かれています。<br />
				引数は、基本的に文字列か数か (上記の&#8221;move-current&#8221;に対するnextのような) シンボルです。<br />
				シンボルに関しては、アクションシグナルの定義をみると型が宣言されているので、それを見ればなんとなく分かります。</p>
				<p>たとえば<a href="http://library.gnome.org/devel/gtk/stable/GtkMenuShell.html#GtkMenuShell-move-current">GtkMenuShellの&#8221;move-current&#8221;シグナル</a>は引数に<a href="http://library.gnome.org/devel/gtk/stable/GtkMenuShell.html#GtkMenuDirectionType">GtkMenuDirectionType</a>を取るのですが、<br />
				その型は次のように宣言されています:</p>
				<pre><code>typedef enum
{
  GTK_MENU_DIR_PARENT,
  GTK_MENU_DIR_CHILD,
  GTK_MENU_DIR_NEXT,
  GTK_MENU_DIR_PREV
} GtkMenuDirectionType;</code></pre>
				<p>この場合、型がGtkMenuDirectionTypeなので、シンボルのGTK_MENU_DIRの部分は型名だと思って切り捨てて、<br />
				gtkrcには next と書きます。</p>
				<h3>例</h3>
				<p>例えば「キー&#8221;Right&#8221;にアクションシグナル&#8221;activate&#8221;をバインド、引数なし」という設定は<br />
				次のように書けます:<br />
				<code>bind "Right" { "activate" () }</code><br />
				連続して複数のアクションシグナルを送ることもできますから (;で区切る必要はありません)、<br />
				ある程度複雑な動作をキーに割り当てることができると思います。</p>
				<h2>パスによる指定</h2>
				<p>定義したスタイルはウィジェットに&#8221;装備&#8221;させないと意味がありません。<br />
				ウィジェットは、ディレクトリと同様に階層構造を成しているので、<br />
				パス (path) とよく似たウィジェットパスによって特定することができます<br />
				(ウィジェットにはクラスがあるのでCSSのセレクタの方が近い)。<br />
				パスの区切り文字は &#8220;.&#8221; です。<br />
				いわゆるshell glob構文が使えると書いてあるのですが、[abc]みたいのは使えないようなので、<br />
				ワイルドカードに使えるのは?と*のようです。</p>
				<p>GTK+2.10以降では、クラスを指定する部分に&lt;someclass&gt;のように書くと派生クラスにもマッチします。<br />
				例えば &#8220;&lt;GtkBox&gt;&#8221; は GtkHBoxにもGtkVBoxにもマッチします。</p>
				<h3>widget</h3>
				<p>例えば</p>
				<pre><code>widget "mainwindow.GtkHBox.okbutton" style "hoge"</code></pre>
<p>のように、ウィジェットの名前でパスを指定します。<br />
ウィジェットの名前は<a href="http://library.gnome.org/devel/gtk/stable/GtkWidget.html#gtk-widget-get-name">gtk_widget_set_name</a>で設定され、デフォルトではクラス名です。</p>
<h3>widget_class</h3>
<p>例えば</p>
<pre><code>widget "GtkWindow.GtkHBox.GtkButton" style "hoge"</code></pre>
				<p>のように、パスをウィジェットのクラス名によって指定します。</p>
				<h3>class</h3>
				<p>例えば</p>
				<pre><code>class "GtkMenuShell" binding "fuga"</code></pre>
<p>のように、階層構造を無視してウィジェット単体のクラス名によって指定します。</p>
<p>実際のところ、</p>
<pre><code>widget_class "*GtkMenuShell" binding "fuga"</code></pre>
				<p>と書くのとほとんど変わらないと思うのですが……</p>
				<h2>まとめ</h2>
				<p>gtkrcを書くときに必要な知識を、分かりにくそうなことを中心になんとなくまとめてみました。<br />
				gtkrcを活用すればデザインをプログラムから分離することができ、開発が効率的になるでしょう。<br />
				Happy hacking!</p>
]]></content:encoded>
			<wfw:commentRss>http://tech.cerevo.com/blog/archives/119/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DM355のインストールディスクを作る 後編</title>
		<link>http://tech.cerevo.com/blog/archives/103</link>
		<comments>http://tech.cerevo.com/blog/archives/103#comments</comments>
		<pubDate>Wed, 11 Mar 2009 23:00:08 +0000</pubDate>
		<dc:creator>inagaki</dc:creator>
				<category><![CDATA[ハードウェア]]></category>
		<category><![CDATA[組み込みソフトウェア]]></category>

		<guid isPermaLink="false">http://tech.cerevo.com/blog/?p=103</guid>
		<description><![CDATA[				こんにちは、Cerevoの稲垣です。
				前回は、DM355のブート処理を概観し、SDカード用のブートローダ (SD-UBL) を試してエラーを起こすところまで扱いました。今回はSD-UBLを分析・修正して、 [...]]]></description>
			<content:encoded><![CDATA[				<p>こんにちは、Cerevoの稲垣です。</p>
				<p>前回は、DM355のブート処理を概観し、SDカード用のブートローダ (SD-UBL) を試してエラーを起こすところまで扱いました。今回はSD-UBLを分析・修正して、実際にインストールディスクを作ってみたいと思います。</p>
				<h2>メッセージを分析</h2>
				<p>SD-UBLが出すメッセージはけっこう冗長なので保存して比較してみると、ブートモードとインストールモードではカーネル (Linux) とRAMディスクのロード先が入れ替わっていることが分かります。関係するメッセージだけ引用します:</p>
				<pre>ブート時のメッセージ:
  * Loading kernel
 sdcard_read sdc_src_addr=0x00081000 dst=0x82000000 len=0x00200000
  * Loading ramdisk
 sdcard_read sdc_src_addr=0x00281000 dst=0x80700000 len=0x00400000
インストール時のメッセージ:
  * Flashing kernel
 sdcard_read sdc_src_addr=0x00081000 dst=0x80700000 len=0x00200000
  * Flashing Root FS
 sdcard_read sdc_src_addr=0x00281000 dst=0x82000000 len=0x00400000</pre>
				<p>SDカードにアクセスできないU-Bootを使っていますから、ロード先が入れ替わっては起動するはずがありません。しかし、ひとまずU-Bootのパラメータをデフォルトから変更すれば起動しそうです。実際にU-Bootの自動起動を中止して起動スクリプトを書き直してやると起動しました。</p>
				<p>ただし、このままのメモリ配置では9MiBより大きなRAMディスクをロードできません。やはりSD-UBLの修正が必要です。それでハックの方針は以下のようになります:</p>
				<ul>
				<li>Linuxとramdiskのロード先アドレスを変更する</li>
				<li>ロードサイズを変更する</li>
				</ul>
				<p>なお、インストールモードのフラッシュ書き換え機能は、ブートメッセージによれば、TIがリリースしているユーティリティをベースにしているらしいので使いません。そのTIのユーティリティはNANDフラッシュの書き込みエラー処理とかしてないっぽいので、信用できないからです。</p>
				<h2>SD-UBLを解析する</h2>
				<p>まずはディスクイメージからSD-UBLを探します。RBLの仕様はTIが公開しているDM355のARM subsystemのデータシートに書かれていますから、RBLになったつもりでディスクイメージを見ていきます……すぐに見つかりますね。ダンプしてみると、第1セクタにUBLディスクリプタが書かれています:</p>
				<pre> 00000200:  00 ed ac a1 00 01 00 00  2e 00 00 00 09 00 00 00</pre>
<p>左から順に、マジックナンバー0xa1aced00、エントリポイントが0&#215;100、サイズが0&#215;2eセクタ、先頭は第9セクタ、という意味です。なおUBLはメモリ空間の0&#215;0020にロードされるので解析には注意が必要です。</p>
<p>位置が分かったのでSD-UBLを切り出します:</p>
<pre> dd if=dm355_boot.sdcard of=sd-ubl.bin bs=512 skip=9 count=$((0x2e))</pre>
				<p>逆アセンブルします:</p>
				<pre> arm_v5t_le-objdump -b binary -m arm -D sd-ubl.bin &gt; sd-ubl.s</pre>
<p>逆アセンブルしたソースを検索してみると、ロード元のアドレス0&#215;41000とか0&#215;81000を引数にして同じサブルーチンが3回ほど続けて呼ばれていることが分かります。関係する部分を引用します:</p>
<pre>    2fd8:	e59f3064 	ldr	r3, [pc, #100]	; 0x3044
    2fdc:	e59f4064 	ldr	r4, [pc, #100]	; 0x3048
    2fe0:	e5932000 	ldr	r2, [r3] 	; 0x15aa4
    2fe4:	e1a01004 	mov	r1, r4
    2fe8:	e1a02482 	mov	r2, r2, lsl #9
    2fec:	e3a00a41 	mov	r0, #266240	; 0x41000
    2ff0:	ebfffe76 	bl	0x29d0

    3044:	00015aa4 	andeq	r5, r1, r4, lsr #21
    3048:	81080000 	tsthi	r8, r0
    304c:	00015594 	muleq	r1, r4, r5

    5a84:	0000012c 	andeq	r0, r0, ip, lsr #2</pre>
				<p>ARMのgccの関数呼び出し規約ではr0からr3が引数ですので、そっちのレジスタも見てみると、ロード先とサイズも引数として渡されているらしいことが分かります (簡単に書いてますが劇的な場面ですよ)。実にExcellentなコードですね。</p>
				<p>0&#215;15aa4という変なアドレスにアクセスしているので解説しておきましょう。TCMは0&#215;00000と0&#215;10000の両方からアクセスできるようになっているので、アドレス0&#215;15aa4は0&#215;5aa4と同じです。さらに、UBLのロードされるアドレスは0&#215;00020ですから、0&#215;15aa4へのアクセスは 0&#215;15aa4 = 0&#215;10000 + 0&#215;20 + 0&#215;5a84 と分解することができ、ソースの5a84:の部分へのアクセスになるわけです。</p>
				<p>同様に解析するとU-Boot、Linux、ramdiskのロードがほぼ同じように書かれているらしいことが分かります。ロードする長さだけは変数としてメモリ上に置いてあります (グローバル変数なのでしょう……なぜだろう)。</p>
				<h2>バイナリパッチ</h2>
				<p>結局、具体的には以下のようにバイナリエディタでハックします (Emacsでは M-x hexl-find-file):</p>
				<ul>
				<li>Linuxとramdiskのロード先はハードコードされているので入れ替える:
				<ul>
				<li>3000: e3a01482 を e59f1054 に変更</li>
				<li>301c: e59f1038 を e3a01482 に変更</li>
				</ul>
				</li>
				<li>グローバル(?)変数になっているそれぞれのイメージサイズを変更する:
				<ul>
				<li>5a84: U-Bootのセクタ数</li>
				<li>5a88 ramdiskのバイト数</li>
				<li>5a8c Linuxのバイト数</li>
				</ul>
				</li>
				</ul>
				<p>淡々と結果だけ書いてしまいましたが、ARM命令は32bit固定長なのでバイナリパッチが簡単なのです。今回は値を入れ替えたりそのままメモリ上に変数として置いてある値を書き換えるだけなのでコードも増えませんし、PC相対のディスプレースメントだけちょっと計算すればお終いです。</p>
				<p>あとはU-Bootの環境変数を書き換えておいて、SDカードに書き込めばインストールディスクのできあがりです。好きなインストーラが起動するように仕込みましょう:</p>
				<pre> dd of=/dev/sdc bs=512 seek=9 if=sd-ubl.bin
 dd of=/dev/sdc bs=512 seek=520 if=uboot.bin
 dd of=/dev/sdc bs=512 seek=1032 if=uImage  #linux
 dd of=/dev/sdc bs=512 seek=5128 if=fs.bin    #ramdisk</pre>
				<h2>おしまい</h2>
				<p>SD-UBLがバグっているので多少バイナリパッチをしましたが、ARMのバイナリは割とハックしやすいと思います。ブートローダ程度のものなら皆さんもハックしてみてはいかがでしょうか?</p>
]]></content:encoded>
			<wfw:commentRss>http://tech.cerevo.com/blog/archives/103/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>DM355のインストールディスクを作る 前編</title>
		<link>http://tech.cerevo.com/blog/archives/92</link>
		<comments>http://tech.cerevo.com/blog/archives/92#comments</comments>
		<pubDate>Wed, 04 Feb 2009 03:05:32 +0000</pubDate>
		<dc:creator>inagaki</dc:creator>
				<category><![CDATA[組み込みソフトウェア]]></category>
		<category><![CDATA[ARM]]></category>

		<guid isPermaLink="false">http://tech.cerevo.com/blog/?p=92</guid>
		<description><![CDATA[				こんにちは、Cerevoの稲垣です。今回も割と低レイヤーな話です。
				今どきのPCは、買ってくるとHDDが内蔵されていてOS (Windowsとか) がインストールされているのが普通です。組み込みの機器も、 [...]]]></description>
			<content:encoded><![CDATA[				<p>こんにちは、Cerevoの稲垣です。今回も割と低レイヤーな話です。</p>
				<p>今どきのPCは、買ってくるとHDDが内蔵されていてOS (Windowsとか) がインストールされているのが普通です。組み込みの機器も、やはり工場でファームウェアをインストールされて出荷されます。例えばNOR型のフラッシュROMを使う場合、最初からファームウェアの書かれたチップをハンダ付けするそうです。対してNAND型のフラッシュROMだと、生ROMを載せておいて基板が完成してから書き込むことになります。これはNANDフラッシュには不良ブロックがあるので、各自で対策を講じつつ書き込まないといけないからです。ちょうどPCのインストールで使うようなインストールディスクを作って量産工場に渡しておかないといけません。つまり今回はブートローダとかインストーラとかそういう話です。</p>
				<h2>DM355のブート処理</h2>
				<p>CPUに電源が入ると、PCの場合はROMに入っているBIOSが最初に走りだすわけですが、私が今相手にしているTI (Texas Instruments) のDM355でもやはりROMに入っているBIOSのようなものが走ります。TIの用語ではこれをRBL (ROM BootLoader) と呼んでいます。なおRBLによってロードされるプログラムのことは、TIの用語でUBL (User BootLoader) と言います。RBLはCPUに直結したスイッチによって四通りの場所からUBLをロードすることができます:</p>
				<ul>
				<li>NANDフラッシュROM</li>
				<li>NORフラッシュROM</li>
				<li>SDメモリカード</li>
				<li>シリアルポート</li>
				</ul>
				<p>したがってインストール“ディスク”はSDカードだったりします。もちろんシリアルポートにPCを繋げてインストールとかいう方法も使えなくはありませんが、遅いしPCが必要だし面倒なのでやらないと思います。</p>
				<p>RBLはロード作業以外の、DDRメモリの初期化とかは (恐らくは) してくれません。この辺はややこしいこと満載なのですが、DM355のCPUコアはARMなので、TCM (Tightly Coupled Memory――密結合メモリ) とかAIM (ARM Internal Memory――ミサイルじゃないよ) とか呼ばれるメモリを *CPUに内蔵* することができるのです。キャッシュとは別物です。DM355の場合、TCM領域は64KiBあり、32KiBのRAMと、8KiBのROMと、24KiBの予約領域が配置されています。ともかく、RBLはCPU内のROMに書かれていて、CPU内のRAMにプログラムをロードしてくれるわけです。RBLではCPU内部のメモリしか使わないので、DDRメモリの初期化なんかは段階的にロードされたプログラムがやる必要があるわけですね。その後、ロードされたUBLは、DDRメモリを初期化してNANDフラッシュなりSDカードなりからU-BootなどのLinux用ブートローダを読み込むわけですが、この辺はフツーなので割愛します。</p>
				<p>DM355の起動に関する仕様はだいたいこんな感じです。身も蓋もない言い方をすれば、インストールSDカードにはSDカード用のUBLを入れればいいのです。ところが、TIはSDカード用のUBLをリリースしていません。TIの掲示板を見ると……<br />
				<a href="https://community.ti.com/forums/p/1970/7286.aspx">https://community.ti.com/forums/p/1970/7286.aspx</a><br />
				さすがはTIだ。SDカード対応のU-Bootを先にリリースする予定とは……順序が逆なんじゃないのか。</p>
				<h2>有志のSDカード用UBLを試す</h2>
				<p>というわけで、TIよりも先にSDカード対応のUBL (勝手にSD-UBLと呼びます) を開発して、インストールディスクのデモを作った人がいます:<br />
				<a href="http://community.ti.com/forums/t/2299.aspx">http://community.ti.com/forums/t/2299.aspx</a><br />
				U-BootとLinuxとramdiskイメージをロードして、単に起動したりNANDフラッシュに書き込んだりしてくれるようです (一応、ディスクイメージを見なくてもなんとなく分かるように記事を書いたつもりですが、気になる人はダウンロードして見てください)。これを適当に解析して改造すればインストールディスクが作れそうです。</p>
				<p>とりあえずSDカードに書き込んで動かしてみると、シリアルコンソールにバナーとメニューが出ます。ブートとインストール、二つの機能があります:</p>
				<pre> SD Card DM35x boot loader
 by Constantine Shulyupin http://www.LinuxDriver.co.il/, sponsored by Applitec
 based on TI DM35x FlashAndBootUtils 1.10  SFT and SpectrumDigital evmdm355 v1
 Compiled on Dec 18 2008 at 13:16:08
 scd_nand_copy
 sd_init
 MMCSD_initCard
 1 - boot; 2 - install; 3 - global flash erase and install</pre>
				<p>まずは単純にブートさせてみると……正常に起動しません。U-BootがLinuxを起動してすぐリセットがかかります。一方、インストール機能は正常に動作します。まずはデバッグが必要なようです。</p>
				<h2>つづく</h2>
				<p>次回の後編では、SD-UBLのバグを探して、バイナリを直接書き直し、実際にインストールディスクを作ります。</p>
]]></content:encoded>
			<wfw:commentRss>http://tech.cerevo.com/blog/archives/92/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Beagle Board用 ツールチェインとAndroidの起動のおまけ</title>
		<link>http://tech.cerevo.com/blog/archives/80</link>
		<comments>http://tech.cerevo.com/blog/archives/80#comments</comments>
		<pubDate>Wed, 21 Jan 2009 23:00:04 +0000</pubDate>
		<dc:creator>mat2uken</dc:creator>
				<category><![CDATA[ハードウェア]]></category>
		<category><![CDATA[組み込みソフトウェア]]></category>
		<category><![CDATA[ARM]]></category>
		<category><![CDATA[BeagleBoard]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://tech.cerevo.com/blog/?p=80</guid>
		<description><![CDATA[				Cerevo まつけんです。
				すこし間があいてしまいましたが、Beagle Board用第２弾をお送りしたいと思います。
				今回は、BeagleBoard上で実行することが可能なバイナリが作成できる [...]]]></description>
			<content:encoded><![CDATA[				<p>Cerevo まつけんです。</p>
				<p>すこし間があいてしまいましたが、Beagle Board用第２弾をお送りしたいと思います。</p>
				<p>今回は、BeagleBoard上で実行することが可能なバイナリが作成できるようになるための準備をしたいと思います。</p>
				<p>その後、ツールチェインをつくるだけではおもしろくないので、Androidをコンパイルして起動してみましょう。といっても、Androidの場合、ツールチェインが必要になるのは、カーネルコンパイル時だけだったりしますが。</p>
				<h2>ツールチェインとは</h2>
				<p>まずは、ツールチェインって何？というところですが、私の理解では、コンパイラ、リンカなどのBeagleBoard上で動くプログラムを作成するためのツール集です。linuxの場合は、大抵、binutils+gcc+glibc or uclibcなどの組み合わせになると思います。(newlibとかもあるのかな)</p>
				<p>そして、こういった組込機器向けの場合、これらツールチェインは、ストレージ容量やコンパイル速度の都合上、ビルドはPC上で行うことが多いかと思います。その場合、クロスコンパイラとして、ツールチェインを作成し、PCでビルドして、BeagleBoard上で動作させるという流れになります。</p>
				<h2>ツールチェイン作成のための環境</h2>
				<p>まず、今回のビルド作業を２パターンの環境で試しました。どちらでも、作業する内容は同じで問題なく動作しました。</p>
				<ul>
				<li>KVM(qemu)上のi386なマシン（ホストは、Phenom 9950BE,メモリ8GBで、ゲストには2GB割り当てています。）のGentoo</li>
				<li>Amazon EC2 c1.xlarge上のGentoo</li>
				</ul>
				<p>今回は、EC2を使って作業というのを体験してみたかったので、同時に試してみました。</p>
				<p>EC2 c1.xlargeは確かに速いんですが、高いです。今回の作業で20hくらいつかったのですが、結局、カスタムAMIをS3においたり、ビルド作業用ディレクトリをEBSに置いたりすると、30$近くかかりました。興味半分で、c1.xlargeにしたのですが、c1.mediumで十分だと思います。</p>
				<p>メリットとしては、自宅などに簡単にlinuxの環境なんか用意できねーよ、みたいな人にはかなりよいかも。ツールチェイン作りって基本的に、CPUパワー命なので、あまり非力なマシンだと時間かかりまくりで悲しくなってしまいますし。</p>
				<h2>ツールチェイン作成</h2>
				<p>さて、本題のツールチェイン作成です。作成には、結構いろんなパターンがあります。</p>
				<p>一番、漢な手段は全部、手動でコンパイルとかなのでしょうが、当然、そんなのはやりたくありません。逆に、一番、お手軽なパターンは、BeagleBoard向けの場合、もっともメジャーなのは、バイナリな形で配布されている<a href="http://www.codesourcery.com/gnu_toolchains/arm/releases/2007q3">Code Sourcery ARM Sourcery G++ 2007q3.</a>をダウンロードしてきてインストールするというパターンです。</p>
				<p>今回は、その中間くらいのパターンとして、ツールを利用して、コンパイルする手段をとりたいと思います。どういう流れでツールチェインが作成されるのかを知りたかったのでこれでいきました。そこで、Gentooには、すばらしいツールがあります。crossdevです。これは、portageで提供されているツールチェイン作成ツールです。</p>
				<pre># PORTAGE_OVERLAY=/opt/crossdev crossdev -t arm-gentoo-linux-gnueabi</pre>
<p>と実行するだけで、ツールチェインが作成できます。<br />
ただ、&#8221;-S&#8221;オプションやバージョンを指定しないと、最新バージョンが選択され、結構、Floating Exceptionなどでコンパイルに失敗したりします。その場合は、バージョンをオプションで指定しましょう。<br />
今回は、かなり新しめのでもいけるかなーということで、そのまま実行したら、とりあえず、うまくいったので、それを利用しています。</p>
<ul>
<li>binutils: 2.19</li>
<li>gcc: 4.3.2</li>
<li>glibc: 2.9</li>
</ul>
<p>コマンドが完了すると、arm-gentoo-linux-gccなどのコマンドが入ります。</p>
<p>簡単にためすなら、</p>
<pre><span class="code-input">$ echo 'int main(){return 0;}' &gt; crossdev-test.c
$ </span><span class="code-input">arm-gentoo-linux-gnueabi-gcc -Wall crossdev-test.c -o crossdev_test</span>
$ file crossdev_test
crossdev_test: ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.6.16, dynamically linked (uses shared libs), not stripped</pre>
				<p>と実行して、ARM向けのバイナリであることが確認できます。</p>
				<h2>Androidのビルド</h2>
				<p>さて、最後にAndroidのビルドを試してみます。</p>
				<p>Android on BeagleBoardに関しては、先人がすでにポーティングしてくれています。それに従いましょう。</p>
				<p><a href="http://labs.embinux.org/index.php/Android_Porting_Guide_to_Beagle_Board">Android Porting guide for Beagle Board</a></p>
				<p>最初のカーネルコンパイル時に、</p>
				<pre>    $make ARCH=arm omap3_beagle_android_defconfig
    $make ARCH=arm CROSS_COMPILE=PATH_TO_CODE_SOURCERY_TOOL_CHAIN uImage</pre>
				<p>となっていますが、このPATH_TO_CODE_SOURCERY_TOOL_CHAINに先ほど作成したarm-gentoo-linux-gnueabi-を渡します。そうすると、コンパイルされるかと思います。</p>
				<p>あとは、ほぼ書かれている手順どおりでいけました。パッチがうまくあたらない部分などは手動であててみました。</p>
				<p>実際には、はじめは、linux-omap3のツリーに手動でAndroid用の拡張を自力でパッチを当てていたのですが、そのあとパッチを発見してちょっと悲しい思いをしたりしました。</p>
				<p>そして、起動したときのムービーが以下です。</p>
				<a href="http://tech.cerevo.com/blog/archives/80"><p><em>Click here to view the embedded video.</em></p></a>
				<h2>最後に</h2>
				<p>というわけで、ツールチェインの作成はおわりました。これで、BeagleBoard上で様々な自作プログラムを動作させられるところまでは来ました。あとは、このツールチェインをつかってrootfsを構築すれば、自分でBeagleBoard上のすべてソフトウェアをコンパイルできるようになります。あとは、お好みの構成を考えて、なんでも好きなものがつくれるようになる。。。はずです。</p>
				<p>今回の内容は、<a href="http://www.gentoo.org/proj/en/base/embedded/handbook/index.xml">Gentoo Embedded Handbook</a>をかなり参考にしています。ユーザランドの構築もこちらには書かれています。是非、参考にしてみてください。</p>
]]></content:encoded>
			<wfw:commentRss>http://tech.cerevo.com/blog/archives/80/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>電源が入らなくなったchumbyを復活させてみる　～その1～</title>
		<link>http://tech.cerevo.com/blog/archives/50</link>
		<comments>http://tech.cerevo.com/blog/archives/50#comments</comments>
		<pubDate>Wed, 24 Dec 2008 23:00:24 +0000</pubDate>
		<dc:creator>m_suzuki</dc:creator>
				<category><![CDATA[ハードウェア]]></category>
		<category><![CDATA[chumby]]></category>

		<guid isPermaLink="false">http://tech.cerevo.com/blog/?p=50</guid>
		<description><![CDATA[				はじめまして。Cerevoの鈴木です。
				私も稲垣と同じく組み込みソフトウェアの担当なのですが、より低レイヤの方が守備範囲となっています。
				最近デザインの参考に色々なガジェットを集めているのですが、 [...]]]></description>
			<content:encoded><![CDATA[				<p>はじめまして。Cerevoの鈴木です。<br />
				私も稲垣と同じく組み込みソフトウェアの担当なのですが、より低レイヤの方が守備範囲となっています。<br />
				最近デザインの参考に色々なガジェットを集めているのですが、先日ある方から「壊れているchumbyならあるけど」という連絡があり、頂けることになりました。<br />
				折角なのでchumbyの内部を勉強しつつ、いじくり回して復活させるまでの体験記みたいなものを今後紹介していこうと思います。</p>
				<p><strong>初見<br />
				</strong>このブログをご覧になっている方達に「chumbyとは…」という話は不要でしょう。<br />
				最近はビックカメラやソフマップでも入手できるようになりました。<br />
				ところで、頂いたchumbyは外側のカバーが剥がされて、中の臓物がむき出しのちょっと可哀想な状態でした。<br />
				<img class="alignnone size-medium wp-image-58" title="001" src="http://tech.cerevo.com/blog/wp-content/001-300x225.jpg" alt="001" width="300" height="225" /></p>
				<p>さてさて、どこから手をつけましょうか…</p>
				<p><strong>まずは電源投入<br />
				</strong>見つめていても仕方ないので、何はともあれまずは電源を投入してみます。<br />
				フロントのLCDに何か表示されるかな、と思っていたのですが、何も映りません。。。<br />
				一瞬でも変化しないか、と数回電源のON/OFFをしてみましたが、何の変化もしません。。。<br />
				本当に電源が投入されているのか確認したくなってきました。<br />
				一度、電源電圧をテスタで測定してみたほうが良さそうです。<br />
				テスタでどこに当たればよいのか？それを知るためには回路図を入手する必要があります。</p>
				<p><strong>回路図を入手<br />
				</strong>Chumbyはほんの一部のソフトを除いて、ハードウェアを含めたほぼ全ての情報がオープンになっています。<br />
				回路図ももちろん入手可能です。<br />
				ただし、一度 <a href="http://www.chumby.com/developers">http://www.chumby.com/developers</a> にアクセスしてアカウントを登録する必要があります。<br />
				アカウント登録後は、Hardwareのページから &#8220;Complete schematics and layout for the chumby core unit with cross-references&#8221; のリンクを辿ることで Rev37_release.pdf がダウンロードできるはずです。</p>
				<p><strong>大元の電源電圧を確認してみる<br />
				</strong>電源回路は4ページ目になります。<br />
				<img class="aligncenter size-full wp-image-67" title="0041" src="http://tech.cerevo.com/blog/wp-content/0041.png" alt="0041" width="390" height="272" />(<a href="http://tech.cerevo.com/blog/wp-content/0041.png">大きな画像で見る</a>)<br />
				今回はバッテリを使わずACアダプタで動かします。ACアダプタ出力電圧はACアダプタを良く見ると書いてあって +12V です。<br />
				回路図を見てみると、内部ではこの+12Vから+5V, +3.3V, +1.8Vが生成されているようです。<br />
				信号名 DCIN_PROTECTED は元々 RAW_PWR の入力に対してフィルタやヒューズ、逆流防止用のダイオードを経由して生成されていて、(ほぼ)ACアダプタ出力なので、R300の片側が測定ポイントに出来そうです。<br />
				測定がしにくいので、測定に関係のないLCDは外すことにします。<br />
				外す前の状態は↓のような感じです。<br />
				<img class="alignnone size-medium wp-image-60" title="002" src="http://tech.cerevo.com/blog/wp-content/002-300x225.jpg" alt="002" width="300" height="225" /><br />
				LCDがメインボードと薄い銅板のようなモノでハンダ付けされているので、これを外さないといけません。<br />
				外した後の状態は↓のような感じになります。あとはLCDから伸びているフレキシブル基盤を外すことで、メインボードがむき出しにできます。<br />
				<img class="alignnone size-medium wp-image-61" title="003" src="http://tech.cerevo.com/blog/wp-content/003-300x225.jpg" alt="003" width="300" height="225" /><br />
				メインボードのプリント基板外周の金色のパターンはGNDなので、まずはR300の片側とGND間の電圧を測定してみます。<br />
				測定結果は…何だか良く分かりません。+12Vではなく値がフラフラして安定していません。<br />
				どうも、どこかで電源関係がおかしくなっているようです。</p>
				<p><strong>電源とGNDの抵抗値を測定してみる<br />
				</strong>こんなときは電源とGNDがどこかでショートしていることを疑ったほうがいいです。<br />
				ちょっとしたコツとしては、末端の方から調べてみるということでしょうか。<br />
				回路図を見ると、chumbyの場合はACアダプタ入力(+12V)→+5V→+3.3V, +1.8Vという系統になっていることが分かります。<br />
				そのため、一度chumbyの電源をOFF(意外と忘れやすい)にしてから、まずは+3.3V, +1.8VとGND間の抵抗値を確認してみます。<br />
				+3.3VはJ302で確認できるので、GND間との抵抗値を測定します。<br />
				測定結果は…801Ω、大丈夫そうです。<br />
				次に+1.8VはJ304で確認できますので、同じ調子で測定してみます。<br />
				測定結果は…3Ω、これはちょっと低すぎです。<br />
				モノにもよりますが、通常電源ラインとGND間の抵抗値は数100Ω～数kΩ程度の値になります。3Ωはあまりにも低い値です。<br />
				抵抗値が低いということは+1.8Vには多くの電流が流れるということを意味しています。<br />
				ここで先程説明した系統を思い出してほしいのですが、+1.8Vに多くの電流が流れるということは、遡るように+5Vにも多くの電流が流れて、最終的に+12Vにも多くの電流が流れることになります。<br />
				電源ICには流すことが出来る電流が仕様で決まっていて、それ以上になると電圧が下がります。<br />
				もしかして+1.8Vの過負荷が原因で、+12Vの電圧が不安定になっているのでしょうか…</p>
				<p><strong>負荷を減らしてみる<br />
				</strong>+1.8Vがおかしいのは何となくわかりましたが、何が原因なのかは良く分かりません。<br />
				こういうときは負荷となっているモノをばっさりと切り離してしまうとはっきりします。<br />
				+1.8Vが回路に供給されないようにすればいい訳です。<br />
				今回の場合は、+1.8Vを生成する電源ICを外してみるのが手っ取り早い感じです。<br />
				そこで+1.8Vを生成しているIC、U302を外します。<br />
				この程度の大きさのICであれば、ハンダゴテ2本を使うと以外と簡単に外せます。<br />
				U302を外したあと、+1.8V～GND間の抵抗値を測定してみます。<br />
				測定結果は…2.6kΩなので、負荷側には問題なさそうです。どうやらこのU302が壊れているようです。<br />
				ここまできたので改めて電源を投入してみます。+12Vの値が正常になりました！</p>
				<p><strong>次回の予告<br />
				</strong>さて+12Vはマトモになりましたが、じゃあ次の系統の+5Vはというと…まだフラフラして安定していません。<br />
				そして回路図を見てみると、+5Vを生成している電源チップに CHUMBY_ON という制御信号が接続されています。あやしいです。<br />
				<img class="aligncenter size-full wp-image-70" title="0051" src="http://tech.cerevo.com/blog/wp-content/0051.png" alt="0051" width="355" height="180" />(<a href="http://tech.cerevo.com/blog/wp-content/0051.png">大きな画像で見る</a>)<br />
				この辺りを少し追いかけてみようと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://tech.cerevo.com/blog/archives/50/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>MSP430のコードを小さくするテクニック</title>
		<link>http://tech.cerevo.com/blog/archives/44</link>
		<comments>http://tech.cerevo.com/blog/archives/44#comments</comments>
		<pubDate>Mon, 15 Dec 2008 23:20:27 +0000</pubDate>
		<dc:creator>inagaki</dc:creator>
				<category><![CDATA[組み込みソフトウェア]]></category>

		<guid isPermaLink="false">http://tech.cerevo.com/blog/?p=44</guid>
		<description><![CDATA[				Cerevoの稲垣です。
				私は組み込みソフトウェア開発の担当で、主にLinuxを扱っていますが、ボードに載っているマイクロコントローラのプログラミングもします。最近はMSP430というTIのマイコンを相手 [...]]]></description>
			<content:encoded><![CDATA[				<p>Cerevoの稲垣です。</p>
				<p>私は組み込みソフトウェア開発の担当で、主にLinuxを扱っていますが、ボードに載っているマイクロコントローラのプログラミングもします。最近はMSP430というTIのマイコンを相手にしているので、MSP430のアセンブリ言語プログラミングについて、x86アセンブリの経験者を対象にして書きたいと思います。</p>
				<h2>MSP430のレジスタとアドレッシング</h2>
				<p>MSP430には16本のレジスタがありますが、そのうちのr0はPC (プログラムカウンタ)、r1はSP (スタックポインタ)、r2はSR (ステータスレジスタ) および定数ジェネレータ、r3は定数ジェネレータとなっていて、汎用レジスタとして使えるのはr4からr15の12本のレジスタです。スタックの扱いはx86と同じです (ARMにあるようなリンクレジスタはない)。</p>
				<p>MSP430の2オペランド命令はソースとデスティネーションが直交していて、それぞれ以下のモードが使えます:</p>
				<p>ソース:</p>
				<ol>
				<li>r4          ; レジスタモード</li>
				<li>foo(r4) ; インデックスモード</li>
				<li>@r4        ; 間接レジスタモード</li>
				<li>@r4+      ; 間接自動インクリメント</li>
				</ol>
				<p>デスティネーション:</p>
				<ol>
				<li>r4          ; レジスタモード</li>
				<li>foo(r4) ; インデックスモード</li>
				</ol>
				<p>ソース・デスティネーションの両方にメモリオペランドを使うこともできる点がx86とは大きく異なる点と言えます (x86だとそういう命令はpush、pop、movsくらいしかありません)。インデックスモードを使うとディスプレースメントが付くので命令は可変長です。</p>
				<p>オペランドのエンコーディングは上記の4種類だけですが、PCおよび定数ジェネレータとの組み合わせによって以下のアドレッシングモード<br />
				が実現されています:</p>
				<ol>
				<li>foo       ; シンボリックモード (PCを使ったインデックスモード、いわゆるPC相対)</li>
				<li>&amp;foo     ; 絶対モード (定数生成レジスタをインデックスにしたインデックスモード)</li>
				<li>#foo     ; 即時モード (PC間接自動インクリメントモード……これは面白い実装だと思います)</li>
				</ol>
				<h2>MSP430命令の注意点</h2>
				<p>演算命令はx86とほぼ共通なものが揃っていますが細かいところが違います:</p>
				<ul>
				<li>オペランドはソース, デスティネーション の順に書きます。</li>
				<li>バイト演算でレジスタをデスティネーションにすると上位バイトがクリアされます。それで、and #0xff, r4 は mov.b r4, r4 で代用すると1ワード節約できます。</li>
				<li>シフト・ローテートは1ビットづつしかできません。上位バイトと下位バイトを入れ替えるswpb命令が用意されているので組み合わせてシフトすることになります。</li>
				</ul>
				<p>フラグ関連は微妙でありながらけっこう重要な違いがあります:</p>
				<ul>
				<li>bic (ビットクリア)、bis (ビットセット) ではフラグは変化しません。</li>
				<li>andとxorでは、演算結果が0でなければキャリーフラグがセットされます。</li>
				<li>subとcmpで生じるキャリーフラグはx86とは逆です。けっこう混乱します。</li>
				<li>補助キャリーとパリティはありません。x86でも滅多に使わないフラグですが。</li>
				</ul>
				<p>callは、jmpのようなオフセット値によるエンコーディングではなく、通常のソースオペランドで実現されています。したがって、callを使ったコードをROMからRAMにコピーするときはリロケート処理が必要です。あるいはオペランドをレジスタやメモリ(PC相対)にしておく方が楽かも知れません。</p>
				<h2>MSP430の定数ジェネレータを利用する</h2>
				<p>定数ジェネレータは -1, 0, 1, 2, 4, 8 を生成することができ、これを使うと即値の分の1ワードを節約することができます。例えば7回ループしたいとき、普通は以下のようにします:</p>
				<pre>  mov #7, r4    ; カウンタ</pre>
<pre>foo:</pre>
				<pre>  dec r4        ; 減算</pre>
<pre>  jnz foo</pre>
				<p>しかしこれを以下のように置き換えると1ワード節約できます:</p>
				<pre>  mov #2, r4    ; カウンタ</pre>
<pre>foo:</pre>
				<pre>  add.b r4, r4  ; シフト</pre>
<pre>  jnz foo</pre>
				<p>定数ジェネレータのお蔭で、インクリメントに1以外の値を使ってもコードは短いままです。それで、例えば32回のループは以下のようにすれば短くなります:</p>
				<pre>  mov #0, r4</pre>
<pre>foo:</pre>
				<pre>  add.b #8, r4   ; 32回ループ</pre>
<pre>  jnz foo</pre>
				<p>他に以下の回数のループは1ワード短く書くことができますので、暇があれば考えてみると面白いかも知れません:<br />
				3 5 6 7 9 13 14 15 16 31 63 127 255 8191 16383 32767 65535</p>
				<h2>MSP430の自動インクリメントも利用する</h2>
				<p>x86ではinc・decが1バイトでできるため、ループの終了条件はほぼカウンタ一択です。しかし、MSP430ではアドレスの自動インクリメントがあるため、メモリアクセスをループさせる場合は、終了アドレスとポインタを比較した方が短いコードになることがあります。例えば、通常のメモリ間コピーは以下のようにします:</p>
				<pre>  mov #src, r4</pre>
<pre>  mov #count, r5</pre>
				<pre>foo:</pre>
<pre>  mov @r4+, dest-src-2(r4)  ; 自動インクリメント、メモリ間コピー</pre>
				<pre>  dec r5</pre>
<pre>  jnz foo</pre>
				<p>しかしcountが定数ジェネレータで生成できない場合、mov #count, r5とdec r5で3ワードも消費してしまいます。これをアドレス比較に書き換えると1ワード節約できます:</p>
				<pre>  mov #src, r4</pre>
<pre>foo:</pre>
				<pre>  mov @r4+, dest-src-2(r4)  ; 自動インクリメント、メモリ間コピー</pre>
<pre>  cmp #src+count*2, r4</pre>
				<pre>  jnz foo</pre>
<p>自動インクリメントと定数ジェネレータがあるMSP430ならではの最適化です。</p>
<h2>最適化できない場合</h2>
<p>x86だと即値とレジスタの間のmovには専用形が用意されていますが、MSP430にはありません。したがって、例えば r4 = r5 ^ 0&#215;1234; を実行する場合、以下のどちらのコードでも結果は全く同じです:</p>
<pre> ; x86ではこっちの方が１バイト短い</pre>
				<pre> mov #0x1234, r4</pre>
<pre> xor r5, r4

 ; x86では１バイト長くなる</pre>
				<pre> mov r5, r4</pre>
<pre> xor #0x1234, r4</pre>
				<p>MSP430ではデスティネーションのエンコーディングが2種類しかないので、メモリデスティネーションをアクセスするとディスプレースメントが必ずついてしまいます。これを最適化する方法はありません。メモリマップされたペリフェラルを操作することが多いので多分これでいいのですが、なんだかすっきりしない気分になります。</p>
				<h2>終わりに</h2>
				<p>MSP430のROMは何KBとある上に、新しいチップは安くてRAMもたくさん載っているので、ここで書いたような1ワードを争う最適化は滅多に必要ありません。でも100クロックかかる処理が90クロックで済むようになったら、消費電力は10%減るわけです。そう考えると、21世紀もまだまだアセンブリ言語の出番はあるのかも知れません。あるといいな……</p>
]]></content:encoded>
			<wfw:commentRss>http://tech.cerevo.com/blog/archives/44/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Beagle Board 事始め</title>
		<link>http://tech.cerevo.com/blog/archives/11</link>
		<comments>http://tech.cerevo.com/blog/archives/11#comments</comments>
		<pubDate>Mon, 01 Dec 2008 23:00:21 +0000</pubDate>
		<dc:creator>mat2uken</dc:creator>
				<category><![CDATA[ハードウェア]]></category>
		<category><![CDATA[組み込みソフトウェア]]></category>
		<category><![CDATA[ARM]]></category>
		<category><![CDATA[BeagleBoard]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://tech.cerevo.com/blog/?p=11</guid>
		<description><![CDATA[				はじめまして。Cerevo まつけんです。
				(2009-02-13追記) 下記の利用するシリアルケーブルの種類の説明で、Null Modem Cable＝ストレートケーブルという記述になっていましたが、N [...]]]></description>
			<content:encoded><![CDATA[				<p>はじめまして。Cerevo まつけんです。</p>
				<p>(2009-02-13追記) 下記の利用するシリアルケーブルの種類の説明で、Null Modem Cable＝ストレートケーブルという記述になっていましたが、Null Modem Cable=クロスケーブルの間違いでした。記事を修正しました。コメントでのご指摘ありがとうございます。</p>
				<p>昨日、弊社岩佐個人Blog<a href="http://d.hatena.ne.jp/wa-ren/20081130/p2">キャズムを超えろ！</a>にて、スタートを宣言されたこのBlogですが、思ったより反応があり、すこし腰が引けつつ、最初の投稿です。</p>
				<p>私自身は、主に、サーバ関連全般（Web系のアプリ〜サーバ、ネットワークインフラ等）を担当しています。そのため、各部品ののデータシートを読み込んで、ハード設計して、回路図も書けて、ハンダ付けもバリバリ！みたいな組み込み屋さんではありません。ただ、前職の関係で、組み込み関連の知識は多少あるという感じです。</p>
				<p>今回は、そんな人間によるBeagleBoardというARM系のCPU搭載開発ボードをつかった組み込みLinuxの体験記です。<br />
				まずは、BeagleBoardの紹介、そして、購入から実際にLinuxが動くところまでをお送りします。<br />
				今後も連載という形で、</p>
				<ul>
				<li>BeagleBoard(OMAP3)向けtoolchainの構築</li>
				<li>linux kernelの構築とインストール</li>
				<li>NFSルートでの起動</li>
				<li>DebianやGentooのインストール</li>
				<li>DSPの使い方</li>
				</ul>
				<p>なども紹介していきたいと考えています。</p>
				<h2>前置き</h2>
				<p>といいつつ、まず、すこしだけ前置きをさせていただきます。</p>
				<p>まず、組み込みの世界は広大です。家電だけにフォーカスを当てても、電子レンジ、炊飯器などの白物で使われる8bitくらいのマイコンから、まるでPC並なARMが搭載された携帯電話、PowerPCが搭載されたゲーム機等まで、それぞれの用途に合わせて、ハードウェア、OS、開発環境、ライセンスなどすべてに違いがあるのが現状であり、一概に語れる状況ではないのはその通りだと思っています。<br />
				ただ、どうしても、組み込み系の開発といえば、基本的に個人が手を出せるようなものではなく、ベンダーのサポートを前提とした契約（多くの場合、NDAもセット）のもと、EVMなどの評価ボードと高価な開発環境を手に入れて開発をしていく、という形のものが多く、現在もメジャーであるとは思います。</p>
				<p>ただ、近年、そのなかでも、高性能な機器向けを中心として、組み込みの世界で存在感を示しつつあるのが、組み込み向けのLinuxです。組み込み向けのLinuxの搭載を前提とするボードなどでは、ライセンスの関係などから、ソースが公開され、個人でもFreeに手に入れられるものも出てきています。<br />
				そういったものは、個人で入手可能な形で販売され、比較的、ローコストで開発に入れるようになっているものも増えています。<br />
				たとえば、プラットホームのOpenBlockS,OpenMicroServer、アットマークテクノのArmadilloシリーズなど、日本でも簡単に開発環境も含め、手に入るものがかなり増えてきました。玄人指向の玄箱もこれに含めてもよいかもしれません。</p>
				<p>そんな組み込みLinuxな世界を、あまりコストをかけず、気軽に体験してみようというのが、今回の趣旨になります。</p>
				<p>＃個人的には、マイナーですが、NetBSDなどの組み込みっぽいBSDも好きです。<br />
				＃NetBSDのどんな機器にもポーティングするぜ、みたいなパワーに憧れます。</p>
				<h2>Beagle Boardとは</h2>
				<p>長くなってしまいました。さて、本題のBeagle Boardです。<a href="http://beagleboard.org/">本家</a>のページに様々な説明があります。<br />
				このボードの特徴は、なんといっても高性能なのに安い、とりあえず回路図とかほぼすべてオープン、というところにあるんではないでしょうか。そのため、個人がx86系ではない環境で、Linuxを動かす、という目的においては、ローコスト、かつ、情報も集めやすい環境であり、今現在、かなりオススメな入門環境です。</p>
				<p>ここからの内容は、基本的に、<a href="http://elinux.org/BeagleBoard">Embedded Linux Wiki</a> を参考に書かれています。ここの情報＋αという形で書いていきます。<br />
				ここのWikiに、かなりの情報があります。とりあえず、ざっと読んでみて損はないと思います。</p>
				<p><a href="http://beagleboard.org/">本家</a>のページにも、いろいろ説明があるので、具体的なボードのスペックは簡単にだけご紹介します。</p>
				<ul>
				<li>OMAP 3530(Cortex-A8 500-600MHz + C64x DSP + Graphics Accelerator)</li>
				<li>128MB SDRAM</li>
				<li>256MB NAND Flash</li>
				<li>USB 2.0 OTG</li>
				<li>USB EHCI Host</li>
				<li>DVI-out x1</li>
				<li>SDスロット x1</li>
				</ul>
				<p>というのが、大体の概要でしょうか。いわゆる、CPU(OMAP3550)、メモリ(SDRAM)、ストレージ(NAND,SD)がそろっており、USBも搭載しているので、結線がどうとか、回路がどうとか考えずに、ある程度の拡張が容易です。CMOSなどもスペック上はつながりそうです。</p>
				<p>性能という点でみた場合、組み込み用途としては、かなりの高性能だと思います。TIのOMAPシリーズは携帯電話を中心に採用されているもので、OMAP 3530はそのシリーズの最新のものになり、OMAP3の中でもOMAP3530は最上位モデル？にあたり、OpenGL ES互換のグラフィックアクセラレータまで搭載しています。そのような性能のため、後述のAngstromのデモでは、普通にFirefoxなど追加で構築し直して使ってみると、かなり快適に動作します。<br />
				＃はじめは、ボード上に、チップぽいものが１つしかなく、PoP(Package On Package)というものを知らなかったので、どこにメモリやNAND Flashは搭載されているのだろう？と探し回っていたりしました。</p>
				<h2>購入</h2>
				<p>なにはともあれ、まずはBeagleBoardを購入します。<br />
				これは、現在、日本で購入する場合は、DigiKey日本語サイトからの購入が無難です。<br />
				価格は、約17,000円で、送料は無料です。ただし、税関手数料？が600円程度かかるようです。<br />
				現在、購入すると、Rev.Bのボードになります。これは、制限として、USB EHCIがうまく動きません。<br />
				Rev.Cでは直る予定だそうですが、2009/Q1の遅い時期にならないと手に入らないという感じのようです。</p>
				<p><a href="http://search.digikey.com/scripts/DkSearch/dksus.dll?pname?site=jp;lang=ja;name=296-23428-ND"><br />
				http://search.digikey.com/scripts/DkSearch/dksus.dll?pname?site=jp;lang=ja;name=296-23428-ND</a><br />
				ここで、注文をすると、UPSで海外から送られてきます。<br />
				注文ですが、個人として注文する場合は、ないかもしれませんが、法人名で購入した場合、確認の電話がかかってきます。<br />
				アメリカからの輸入になり、規制？を突破するために、用途等を聞かれます(電話は日本語でOKなのでご安心を)。</p>
				<ul>
				<li>細かい用途、できれば、このボード上で動くアプリケーションの概要</li>
				<li>軍事用途ではないことの確認</li>
				</ul>
				<p>などを聞かれました。一応、どう答えるか、事前に考えておいた方がよいかもしれません。</p>
				<p>これで、アメリカから、４〜５日程度でボードが届きます。しかし、これで、さあ、開発だ！というわけにはいきません。<br />
				BeagleBoardには、ケーブル等が全くついてきません。そのへんを用意する必要があります。</p>
				<p>今回、別途用意をしたのは、</p>
				<ul>
				<li>電源関連(ACアダプタ等)</li>
				<li>RS232C関連（IDC10←→DSub9pin変換、ストレートケーブル、USBシリアル変換）</li>
				<li>USB関連(USBハブ、A-&gt;MiniA変換ケーブル、USB-LANアダプタ)</li>
				<li>HDMI←→DVIケーブル</li>
				<li>SDカード</li>
				</ul>
				<p>です。そのあたりについて、説明をしていきます。</p>
				<h3>電源関連</h3>
				<p>なにはともあれ、電源を用意します。<br />
				Beagle Boardは、USBからの給電でも動作可能なのですが、Rev.Bのボードでは、EHCIのほうのUSBが動作しません。そのため、OTGのポートを給電用に利用してしまうと、キーボード、マウスなどを接続するポートが無くなってしまいます。<br />
				したがって、今回は、DCジャックからの給電で動作させています。</p>
				<p>これは、プラグの形状等(2.1mm径 センタープラス)だけ気をつけて、5VのACアダプタを買ってきます。秋葉原なら若松や千石などのパーツ屋さんに行けば、普通においてあります。<br />
				私は、手元にあるもので代用したので、モバイルクルーザー＋USB-DCケーブル(2.1mm径)のものという組み合わせで給電しています。</p>
				<h3>シリアルケーブル(RS232C)</h3>
				<p>基本的に、シリアルコンソール経由での操作が大半を占めますので、必須です。</p>
				<p>ただし、Beagle Boardには、PCを使ってるような人になじみ深いDSUB9ピンのコネクタなどは実装されていません。<br />
				ボード上にピンが立っているので、そこに接続する形のケーブルを用意する必要があります。<br />
				おそらく、普通の組み込み屋さんなら、さくっと自作してしまうのだとおもいますが、購入も可能です。<br />
				海外では、それ用のケーブルも販売しているようですが、ケーブル一本を通販で購入するのは、さすがに送料が高すぎて現実的ではないと思います。<br />
				PC向けマザーボードには、同じようにRS232Cのピンが立っているものが多いので、付属品としてIDC10コネクタのケーブルが販売されてて、今回はこれを流用しています。<br />
				実際に利用しているものは、千石電商にIDC-BBという型番でおいていたものです。<br />
				検索してみても、結構出てくるので、通販でも買えると思います。<br />
				コネクタさえ一緒なら、他のものを買ってもいいのですが、注意するのは、結線をちゃんと確認することです。<br />
				BeagleBoard側がどのようなピン配置になっているかは、<a href="http://www.beagleboard.org/uploads/BBSRM_6.pdf">ハードウェアマニュアル</a>に詳しく載っています。</p>
				<p>IDC-BBの場合、以下のようになっています。</p>
				<pre>DB-9   IDC-10
Pin 1 - Pin 1
Pin 2 - Pin 2
Pin 3 - Pin 3
Pin 4 - Pin 4
Pin 5 - Pin 5
Pin 6 - Pin 6
Pin 7 - Pin 7
Pin 8 - Pin 8
Pin 9 - Pin 9</pre>
				<p>これだと、ストレートに結線されていることが分かります。<br />
				とりあえず、このタイプを選ぶのがよいと思います。</p>
				<p>次は、シリアルケーブルを用意します。<br />
				こちらは、Wikiには、Null Modem Cableという表記になっていますが、要は<span style="text-decoration: line-through;">ストレート</span>クロス結線のものを用意します。<br />
				こちらも、千石電商で一緒に買いました。<br />
				＃最終的に、相手側とTX/RXがうまく接続されればよいので、実際は、IDC-GB+クロスケーブルでも動きます。</p>
				<p>最後に、PC側ですが、私は、MacBookProを利用しているため、RS232Cポートがないので、USB-シリアル変換ケーブルを用意しました。<br />
				また、なんらかのターミナルソフトが必要です。ここでは、ckermitを利用しています。</p>
				<p>ここで、ひとつポイントがあります。<br />
				BeableBoardは、実際は、RS232Cと呼んではいますが、TX/RX(送受信用のピン),GNDしか使われません。<br />
				そのため、RS232Cのフローコントロールはなしに設定しないと、シリアルポートでの通信は動作しません。<br />
				これは、通常、ソフトウェア側で設定可能です。<br />
				しかし、私が利用していたUSBシリアルであるSUNTAC VS60-Rはどうもフローコントロールをなしに設定しても、CTSをチェックしてしまうようで、受信はできるが、送信はできないという状況に陥りました。<br />
				USBシリアルが原因でそうなっていることに気づくまで３時間以上はまってしまいました。<br />
				結局、Arvel SRC06-USBに交換することで、問題なく動作するようになりました。<br />
				もし、同じ状況になったら、疑ってみてください。<br />
				あ、SUNTAC VS60-Rなら、ドライバを入れなくても動作しましたが、Arvelのやつは別途インストールしました。</p>
				<p>まずは、Macならターミナル等を立ち上げて、以下のような操作をおこないます。<br />
				・kermitの起動(kermit -l /dev/tty.usbserial-FTDCNAMX)<br />
				&gt;set speed 115200<br />
				&gt;set flow-control none<br />
				&gt;set carrier-watch off<br />
				とコマンドをうち、<br />
				&gt;connect<br />
				で、接続します。</p>
				<p>この状態で、用意したケーブルを接続し、電源を入れます。<br />
				すると、以下のような表示になると思います。</p>
				<pre>bash-3.2# kermit -l /dev/tty.usbserial-FTDCNAMX
C-Kermit 8.0.209, 17 Mar 2003, for Mac OS X 1.0
Copyright (C) 1985, 2003,
Trustees of Columbia University in the City of New York.
Type ? or HELP for help.
(/Users/ku/) C-Kermit&gt;set speed 115200
/dev/tty.usbserial-FTDCNAMX, 115200 bps
(/Users/ku/) C-Kermit&gt;set carrier-watch off
(/Users/ku/) C-Kermit&gt;set flow-control none
(/Users/ku/) C-Kermit&gt;connect
Connecting to /dev/tty.usbserial-FTDCNAMX, speed 115200
Escape character: Ctrl-\ (ASCII 28, FS): enabled
Type the escape character followed by C to get back,
or followed by ? to see other options.
----------------------------------------------------
Texas Instruments X-Loader 1.4.2 (Aug  8 2008 - 16:59:05)
Reading boot sector
Booting from mmc

U-Boot 2008.10-rc2 (Oct  2 2008 - 09:02:46)

OMAP3530-GP rev 2, CPU-OPP2 L3-165MHz
OMAP3 Beagle board + LPDDR/NAND
DRAM:  128 MB
NAND:  256 MiB
In:    serial
Out:   serial
Err:   serial
Hit any key to stop autoboot:  0[return]
OMAP3 beagleboard.org #</pre>
				<p>というような画面がターミナルに表示され、returnなどを押して、コンソールが操作できれば、シリアルコンソールはうまく動いているということになります。これで、とりあえず、第一段階突破です。</p>
				<h3>USB関連</h3>
				<p>Angstromのデモでは、とりあえず、EnlightmentというWindowManagerが立ち上がるので、キーボードとマウスをつないで操作する必要があります。それと、ネットワークも使うなら、BeagleBoardにはEthernetがないので、USB-LANアダプタも接続する必要があります。</p>
				<p>それらを接続するために、まずは、USBハブを用意します。<br />
				ここでの注意点は、セルフパワーのものを用意することです。BeagleBoardのポートから給電される電流は非常に少ないので、USB-LANとかは確実に電力不足で直結しても動きません。</p>
				<p>また、BeagleBoardに実装されているコネクタは、Mini-ABコネクタになります。ABコネクタは、A,Bどちらも挿せるということだそうです。今回は、Hostとして操作させるので、USB Aメス←→USB Mini Aのケーブルを買ってきて、USBのコネクタを変換する必要があります。<br />
				これも、千石電商にいけば、変換アダプタがおいていたので、それを購入するので良いと思います。</p>
				<p>USB-LANは、Linuxで安定して動くものであれば、なんでもいいとは思います。<br />
				私は、手元にあったCorega FEther USB-TXCという製品を利用しています。これは、dm9000というモジュールで動作しました。NFSルートとかやるなら、100BASEのはやいものにしたほうがよいかも。</p>
				<h3>HDMI←→DVIケーブル</h3>
				<p>これは、そこらじゅうで売っているとおもうので、適当に用意します。<br />
				ちなみに、BeagleBoardではHDMIコネクタになっていますが、仕様としては満たしていません。単に、DVIのちっこいコネクタとして、流用しているだけのようです。</p>
				<h3>SDカード</h3>
				<p>容量はそこそこ大きめのほうがよいと思います。<br />
				今後、Debianなどをインストールして、Xもうごかすなら、1GBでは足りないかもしれないです。<br />
				私は、上海問屋の2GBのを使っていますが、問題なく動いています。</p>
				<p>ここまでできると、開発に入る準備は完了です。</p>
				<h2>Angstromデモの起動</h2>
				<p>ここからは、とりあえず、なにか動かしてみようということで、デモイメージが公開されているAngstromのデモを動作させてみます。</p>
				<h3>SDカードのフォーマット</h3>
				<p>まず、SDカードからブートできるように、SDカードのフォーマットを行います。<br />
				ここからの操作は、なんからのLinux(今回はGentoo)上での操作を前提としています。fdiskが動けば、ほかのOSでもいけるかも。Linuxが手元にない場合、VMware等でLinuxをインストールするか、UbuntuやKNOPPIXなどのLiveCDを活用するとよいかもしれません。</p>
				<p>SDカードは、カーネル等を置くFAT32のパーティションとユーザランドを配置するext3のパーティションの２つに分けます。<br />
				詳しい説明は、<a href="http://wiki.davincidsp.com/index.php?title=MMC_Boot_Format">MMC boot format</a>というページでまとめられています。</p>
				<p>一応、私がおこなった具体的な操作は以下になります。<br />
				/dev/sddがSDカードだとします。</p>
				<p>最初に、パーティションテーブルをクリアします。</p>
				<pre>peng ~ # fdisk /dev/sdd
Command (m for help): o
Building a new DOS disklabel with disk identifier 0x226a3c58.
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>SDカードの容量を確認します。</p>
				<pre>Command (m for help): p
Disk /dev/sdd: 2041 MB, 2041577472 bytes
....</pre>
				<p>ここの2041577472 bytesの数字は、使うのでメモしておきます。</p>
				<p>expertモードに入ります。</p>
				<pre>Command (m for help): x
Expert command (m for help):</pre>
				<p>あんまりよく分かってないのですが、255 heads,63sectors,容量に応じたcylindersに変更します。</p>
				<pre>Expert command (m for help): h
Number of heads (1-256, default 4): 255
Expert command (m for help): s
Number of sectors (1-63, default 62): 63
Warning: setting sector offset for DOS compatiblity

Expert command (m for help): c
Number of cylinders (1-1048576, default 1011):248</pre>
				<p>容量に応じたという部分は、上の容量の数字を使って、<br />
				2041577472 / 255 / 63 / 512　という式で算出しています。</p>
				<p>通常モードにもどり、あたらしいパーティションを作成します。</p>
				<pre>Expert command (m for help): r
Command (m for help): n
Command action
e   extended
p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-15, default 1): 1
Last cylinder or +size or +sizeM or +sizeK (1-15, default 15): 15</pre>
				<p>DOSパーティションなので、bootableフラグを設定し、FAT32にパーティションタイプを変更します。</p>
				<pre>Command (m for help): a
Partition number (1-4): 1
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): c
Changed system type of partition 1 to c (W95 FAT32 (LBA))</pre>
				<p>そして、のこりの領域をlinuxのパーティションに割り当てます。</p>
				<pre>Command (m for help): n
Command action
e   extended
p   primary partition (1-4)
Partition number (1-4): 2
First cylinder (52-245, default 52):
Using default value 52
Last cylinder or +size or +sizeM or +sizeK (52-245, default 245):
Using default value 245</pre>
				<p>これで、wを入力して、パーティションテーブルを書き込みます。</p>
				<p>その後、それぞれのファイルシステムでフォーマットします。</p>
				<pre># mkfs.msdos -F 32 /dev/sdd1 -n LABEL
# mkfs.ext3 /dev/sdd2</pre>
				<p>これで、SDカードの準備は終了です。</p>
				<h3>Angstromデモイメージの書き込み</h3>
				<p><a href="http://www.angstrom-distribution.org/demo/beagleboard/">ここ</a>からAngstromのデモイメージ（rootfs, uImage, u-boot.bin, MLO）をダウンロードします。<br />
				そして、rootfs以外をFATのパーティションにコピーします。ただし、MLO最初にコピーする必要があります。</p>
				<pre># wget 〜
# mount /dev/sdd1 /mnt/sdcard/p1
# cp MLO /mnt/sdcard/p1/
# cp u-boot.bin /mnt/sdard/p1/
# cp uImage /mnt/sdcard/p1/
# umount /mnt/sdcard/p1</pre>
				<p>という感じで実行します。</p>
				<h3>起動シーケンス</h3>
				<p>それぞれのファイルは、起動シーケンスなどの紹介などができれば、そこでまた詳しく説明すべきだとはおもいますが、簡単にだけ説明しておきます。<br />
				基本的に、BeagleBoardは、(On Chip Bootrom) -&gt; X-Loader -&gt; U-Boot -&gt; Linuxという順で起動します。</p>
				<ul>
				<li>X-Loader　→　BeagleBoard On chip Bootromからロードされるstage2のBoot Loader（と呼んでいいのかどうかはよくわかりません。。。）</li>
				<li>U-Boot　→　こいつがNAND FlashやSDカードからLinuxカーネルをロードします。</li>
				</ul>
				<p>X-Loaderが、いわゆる、NAND,SD,serialなどから、Bootloaderをロードし、起動する役割を担います。一応、U-Boot非依存になっているようなので、ほかのBootloaderをポーティングすることも可能かとは思います。<br />
				というわけで、今回は、SDにU-Boot,Linuxカーネルを入れておいて、X-Loaderには、ボード上のスイッチを押して、電源をいれることで、X-LoaderにSD上のU-Bootをロードしてね、と伝えることで、SDブートをしています。</p>
				<h3>Rootfsの配置</h3>
				<p>rootfsは、最新は、Angstrom-Beagleboard-demo-image-glibc-ipk-2008.1-test-20080920-beagleboard.rootfs.tar.bz2のようです。これを、ext3でフォーマットしたパーティションに展開します。<br />
				/mnt/sdcard/p2に、/dev/sdd2をマウントしているとして。</p>
				<pre># tar jxpvf Angstrom-Beagleboard-demo-image-glibc-ipk-2008.1-test-20080920-beagleboard.rootfs.tar.bz2 -C /mnt/sdcard/p2</pre>
<p>という感じ。</p>
<p>これで、umontすれば、セットアップは完了です。</p>
<h3>boot</h3>
<p>あとは、BeagleBoardにセットアップしたSDカードを挿して、電源を入れます。このとき、USR1のボタンを押したまま起動することで、SDからのbootが有効になります。</p>
<p>そして、うまくU-Bootが起動したら、コンソールに入ります。</p>
<p>そこで、</p>
<pre># setenv bootargs 'console=ttyS2,115200n8 root=/dev/mmcblk0p2 rw rootwait'
# setenv bootcmd 'mmcinit;fatload mmc 0 80300000 uImage;bootm 80300000'
(もし、毎回、この設定で起動したいなら)
# saveenv</pre>
				<p>と実行します。</p>
				<p>そして、bootです。</p>
				<pre># boot</pre>
<p>これで、Linuxカーネルのロードが始まるはずです。</p>
<pre>2198180 bytes read
## Booting kernel from Legacy Image at 80300000 ...
Image Name:   Linux-2.6.27
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    2198116 Bytes =  2.1 MB
Load Address: 80008000
Entry Point:  80008000
Verifying Checksum ... OK
Loading Kernel Image ... OK
OK

Starting kernel ...

Uncompressing Linux............................................................................................................................................. done, booting the kernel.
Linux version 2.6.27 (voodoo@voodoo-desktop) (gcc version 4.3.2 (Sourcery G++ Lite 2008q3-41) ) #1 Fri Oct 31 12:04:40 CDT 2008
CPU: ARMv7 Processor [411fc082] revision 2 (ARMv7), cr=00c5387f
Machine: OMAP3 Beagle Board
Memory policy: ECC disabled, Data cache writeback
OMAP3430 ES2.1
SRAM: Mapped pa 0x40200000 to va 0xd7000000 size: 0x100000
CPU0: L1 I VIPT cache. Caches unified at level 2, coherent at level 3
CPU0: Level 1 cache is separate instruction and data
CPU0: I cache: 16384 bytes, associativity 4, 64 byte lines, 64 sets,
supports RA
CPU0: D cache: 16384 bytes, associativity 4, 64 byte lines, 64 sets,
supports RA WB WT
CPU0: Level 2 cache is unified
CPU0: unified cache: 262144 bytes, associativity 8, 64 byte lines, 512 sets,
supports WA RA WB WT
....</pre>
				<p>Angstromは、初回起動にいろいろ準備をするようで、かなり時間がかかります。無事起動することを祈りながら待ちます。</p>
				<p>そして、起動完了したら、シンプルなユーザ設定画面が表示されるはずです。<br />
				適当なユーザ名とパスワードを入力してください。<br />
				そうすると、Enlightmentが起動するはずです。<br />
				このデモイメージには、</p>
				<ul>
				<li>画像編集ソフト(GIMP)</li>
				<li>Webブラウザ(GNOME Web Browser, Midori)</li>
				<li>ワープロソフト(AbiWord)</li>
				<li>表計算ソフト(Gnumeric)</li>
				<li>動画再生ツール(mplayer,omapfbplay)</li>
				</ul>
				<p>などが含まれています。使ってみてください。動画再生などは、DSPをつかってない状態でも、そこそこの解像度（320&#215;240）とかのMPEG-4なら再生できたりして、ちょっとびっくりしました。</p>
				<p>ちなみに、私がつかったデモイメージではうまくUSB-LANが認識されませんでした。その場合、カーネルをほかのものにかえてみたり、自分でコンパイルすると解決するはずです。</p>
				<h3>最後に</h3>
				<p>今回は、ここまでで一旦、切らせていただきます。<br />
				ここまでだけでも、かなりの分量になってしまいましたが、これ以降、自分の造るアプリを動かすための開発環境構築などをおこなっていきます。ここからが本番です。</p>
				<p>とりあえず、組み込み環境なので、ペリフェラルやSDのセットアップは大変ですが、Linuxが動いてしまえば、アプリ等はPCとあまり変わりません。これが、組み込みLinuxのメリットだと思います。</p>
				<p>次回は、最初にも書きましたが、</p>
				<ul>
				<li>OpenEmbeddedの開発環境を使ってみる</li>
				<li>Gentooのcrossdevをつかって、独自のツールチェイン作成し、クロスコンパイルに挑戦</li>
				<li>カーネル再構築</li>
				</ul>
				<p>あたりをご紹介できたらな、と考えています。</p>
				<p>ひっじょーに長い記事になってしまいましたが、だれかひとりでも参考にしていただける人がいれば幸いです。</p>
]]></content:encoded>
			<wfw:commentRss>http://tech.cerevo.com/blog/archives/11/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Cerevo tech blog Start</title>
		<link>http://tech.cerevo.com/blog/archives/6</link>
		<comments>http://tech.cerevo.com/blog/archives/6#comments</comments>
		<pubDate>Sun, 30 Nov 2008 08:04:55 +0000</pubDate>
		<dc:creator>iwasa</dc:creator>
				<category><![CDATA[その他]]></category>

		<guid isPermaLink="false">http://tech.cerevo.com/blog/?p=6</guid>
		<description><![CDATA[				Cerevoの岩佐です。
				株式会社Cerevoのエンジニアコミュニティ向けの技術情報発信Blogとして、本Blog「Cerevo tech blog」を開始しました。
				組み込みソフトウェアの情報は [...]]]></description>
			<content:encoded><![CDATA[				<p>Cerevoの岩佐です。</p>
				<p>株式会社Cerevoのエンジニアコミュニティ向けの技術情報発信Blogとして、本Blog「Cerevo tech blog」を開始しました。</p>
				<p>組み込みソフトウェアの情報はWeb上に少なく、Webベースソフトウェア開発者コミュニティなどと比べ会社の枠を超えた技術的コミュニケーションの機会をもっと作るべきと考えました。そこで、まずは弊社から積極的に情報を発信すべきとの考えから、本Blogの開始に至りました。</p>
				<p>弊社ではWeb系の技術についても積極的に開発に取り組んでいるため、組み込みに限らずWeb系の情報などもあわせて発信してまいります。</p>
				<p>今後ともCerevoを宜しくお願いいたします。</p>
]]></content:encoded>
			<wfw:commentRss>http://tech.cerevo.com/blog/archives/6/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
