2012年5月31日木曜日

KOZOS EXPBRD #00のSDカードスロットを使ってKOZOSを単独稼働システムに仕立てる

KOZOS EXPBRD #00には、SDカードスロットがあります。
設計当初からKOZOSを単独稼働システムとして楽しめるようにしたいなぁと考えていました。

従来はパソコンからブートローダ経由でOSイメージをRAMに転送して実行していたわけです。
この場合、KOZOSを起動するためのパソコンが必ず必要です。
これでは、組み込みシステムとして稼働させるために隣にリッチなパソコンが存在するという矛盾した状況を生んでしまいます。せっかく組み込みの雰囲気を楽しんでいるのに、少し残念な感じがします。

そこで、SDカード系統のハードウェアデバッグも兼ねてSDカードブート機能を実装してみました。
下の動画でSDカードブートの様子を御覧下さい。




パソコンなしでもリセットスイッチを押すだけでOSイメージをRAMに展開して実行してくれます。
まさにデモする時にボード一つで実行可能。
実際の組み込みシステムの雰囲気に近づくというわけです。

KOZOS EXPBRD #00には、LCDもスイッチもLEDもあるので、複数のブートイメージを用意しておいて、ユーザインターフェースを使って起動モードを選択させたりといった事もできるでしょう。

ちなみに、FATファイルシステムはChaNさんのPetit FAT File System Moduleを使用しています。
うーん。ありがたやありがたや。

KOZOS EXPBRD #00の動作確認進捗状況

先日の記事で取り上げたKOZOS EXPBRD #00ですが、基板も上がってきてユルユルとデバッグしています。

今回は外部の基板とドッキングさせるので、基板の外形寸法の検証から。


アイキャッチを入れるのも「そういえば初めて」なので、しげしげと眺めて楽しんだりしています。

ビアのドリル径ですが、今回は0.3mmで設計しました。
「ニジマス君」の周囲にあるドリルは、両面のグランド層を繋ぐビアです。
ビアのドリル系を0.3mmにしただけで随分と配線が楽になりました。

そういえば今まで結構大きいドリルを使っていた事に今更気付いたりしています。
BlackTank LPC1769なんて、配線が多いのに0.6mmだったりしました。
そりゃ配線が大変なわけです。気を付けよう・・・というか気付いて・・・。


H8のボードとドッキングして使用している様子は以下のようになります。
外形寸法はドッキング対象のボードと同じなので、コンパクトに持ち運べます。


使用感を共有するために動画を作ってみました。
動作は全てハードウェアを確認するためのジャンクなコードによるものです。
ブートローダの書き込みとOSの転送にはkz_xmodemkz_h8writeを使用しています。

LEDをチカチカ。


ロータリーエンコーダをクルクル。


グラフィックLCDをテコテコ。


赤外線リモコンをピコピコ。


実デバイスが複数搭載された基板を制御する場合、それなりの枠組みを用意する事になります。
KOZOS EXPBRD #00は、組み込みシステム開発特有の世界をKOZOSを使って体験する事を念頭に設計しました。

KOZOSは、必要な事を最小限のコードで実現してあります。
こういったOS教材は今までになかったので、非常に面白いなぁというのが以前からの印象でした。
KOZOS EXPBRD #00と合わせて使ってみて、面白い題材になっている手ごたえを感じます。

2012年5月21日月曜日

ACB-BF592とUMB-SSM2603のベース基板を設計する

金子システム株式会社さんのコンパクトで高性能なDSP基板ACB-BF592の準備を随分前の記事で始めたわけですが、なかなか納得のいく進め方を見つけられずに放置状態でした。

先日のKOZOS EXPBRD #00を考えるうちに「こんな風にやってみようか。」という方針を自分の中で決める事ができたので前進開始です。

第1段階として、オーディオ・コーデックが搭載された基板UMB-SSM2603も使って、オーディオ・プラットフォームの実験用基板を設計する事にしました。

設計時に考えた事を列挙すると・・・
  • 2つのモジュールのコンパクトさを生かそう。
  • UARTブートのためのインターフェースは最低限欲しいなぁ。
  • バス・パワー動作させたい。
  • 使う時に楽しめるようにプチ・ディスプレイを搭載しよう。
  • ハードウェア・スイッチはアプリケーションによって要求が異なる。リモコンにしてしまえ!
  • SDカードでブートできたら嬉しいなぁ。
  • リセット・スイッチくらいはいるだろ。
  • 基板製造費用は安く抑えたい。
  • その他。
こんな感じでうだうだ考えて一日。
設計完了した基板は以下のようになりました。


ハードウェア・スイッチを取り除いたお陰でコンパクトに仕上がっています。
そして、遊べるようにディスプレイを付けておきました。

UARTインターフェースとSDカード・スロットは、UMB-SSM2603の下に隠してあります。
シンプルな見た目とは裏腹にというのが、設計の裏コンセプトです。

このベース基板を使えば、これ一つでDSPを気軽に楽しめちゃうという算段。
金子システムさんの安価なDSP基板シリーズのお陰で、気軽に始められるのが嬉しいです。

さて、コンパクトさを生かす設計には、基板製造費用を抑制するという効果もあります。
FusionPCBでは、基板外形の最大寸法で費用が決まります。


今回の基板の外形寸法は、約92x62mmなので、10cm Max * 10cm Maxで収まり、+$15.00で済みます。これが、仮に横方向15cm以上となるといきなり+$60.00です。

DSP基板がコンパクトなお陰で、ベース基板も安く設計する事ができるのが嬉しい限り。
少し寝かせて基板製造工程に進む予定です。

2012年5月19日土曜日

KOZOS EXPBRD #00 (KOZOSをしゃぶりつくしたい人の為の拡張基板を設計しました)

KOZOS EXPBRD #00とは、KOZOSをしゃぶりつくしたい人の為の拡張基板です。
12ステップでは飽き足らない、もっとKOZOSで色々やりたい人を想定して設計しました。


基板には以下の部品を搭載しています。
  • 122x32ドットのモノクロ・グラフィック・ディスプレイ
  • マイクロSDカード・スロット
  • 2つのLED
  • 2つのスイッチ
  • ロータリー・エンコーダー
  • mp3エンコーダー・チップ
  • ステレオ・フォン・ジャック
  • 赤外線受光素子
この基板は、秋月電子通商から販売されている「H8/3069Fネット対応マイコンLANボード」を裏返しにした状態で、その上にドッキングさせる事を前提に設計してあります。

使用の際は、分厚くなった二階建ての基板を机に縦に置いて使うイメージです。
もちろん支柱を立てて寝かせて使う事もできます。

ドッキングした状態でも、動作モード切り替えスイッチやリセットスイッチ、シリアルポートが使えるので便利。加えて、先に挙げた追加接続されたデバイス達を制御できるというわけです。

もちろんアイ・キャッチは坂井弘亮さんのオリジナル・キャラクタである「ニジマス君」です。


著者いわく「KOZOS本は初心者向け」とおっしゃっていますが、現役の組み込みエンジニアが見ても勉強になる部分は多々あるように思います。
その場合、実際に色々なデバイスの制御をカーネルを介して実装していく事で、なかなか他では味わえないような楽しさに遭遇する事ができます。

基板は例によってFusionPCBに頼みました。
実際に自分で作ったスクリプトに助けられたりして、意外に忘れるのは早いなぁと感じたり。

本当は、別件の基板設計に着手していたのですが、先にこちらが完了してしまいました。
気分転換の方が先に出来てしまうなんて、なんというかどうしようもない感じです。
まぁ、それはそれ。
このプロジェクトでも色々と考えた事があるので無駄にはならない気がしています。

2012年5月6日日曜日

Natural Tiny Shell (NT-Shell) をLX9で使ってみる

Natural Tiny Shell (NT-Shell)の次のリリースに向けて「Eating your own dog food」を実践しているわけですが、今回はLX9で試してみることにしました。


と言っても、NT-Shellはもともと「UARTのReadとWriteさえ用意してくれればうまく行くよ。」という設計なのであまり苦労する事はありません。

UARTの付いたHardware Platformを使ってHello Worldプロジェクトを新規作成します。


次にNT-Shellのソースコードを持ってきてプロジェクトに追加します。


後はhelloworld.cにNT-Shell用の記述を追加するだけ。
以下のようにシンプルな実装で直ぐにNT-Shellを試す事ができます。

簡単です。

#include "platform.h"
#include "ntshell.h"
#include "xuartlite.h"

XUartLite xu;
ntshell_t ntshell;

static int func_read(char *buf, int cnt)
{
 int i;
 for (i = 0; i < cnt; i++) {
  u8 c;
  while (XUartLite_Recv(&xu, &c, 1) != 1) {
  }
  buf[i] = c;
 }
    return 0;
}

static int func_write(const char *buf, int cnt)
{
 int i;
 for (i = 0; i < cnt; i++) {
  u8 c = buf[i];
  while (XUartLite_Send(&xu, &c, 1) != 1) {
  }
 }
    return 0;
}

static int func_callback(const char *text, void *extobj)
{
    fprintf(stdout, "The user input text is '%s'\n", text);
    return 0;
}

int main()
{
    init_platform();

    u16 UartDeviceId = 1;
    XUartLite_Initialize(&xu, UartDeviceId);
    ntshell_execute(&ntshell, func_read, func_write, func_callback, NULL);

    cleanup_platform();

    return 0;
}

BSPに含まれるライブラリのインターフェースを見て、stdinとstdoutが使えそうかと思う方もいるかもしれません。 実際にやってみるとわかるのですが、stdoutは通常のlibcと同様バッファリングされているのでNT-Shellで使うのには向きません。fflush(stdout)してもバッファはフラッシュされませんでした。そこで上記のようにXUartLiteのAPIをそのまま呼んでいます。


同様にしてXilkernel上での実装も可能ですので、履歴編集機能を持つシェル(風味)インターフェースを気軽に追加する事ができます。

ちなみに、ハードウェアプラットフォーム211に対してのBSPを合わせて以下の容量になりました。

   text    data     bss     dec     hex filename
  69044    1428    8780   79252   13594 hello_world_0.elf