gcc 標準ライブラリー libc.a の改造

SH-2A には USB が内臓なのだが、こいつと通信する為には、色々なスタックを実装する必要がある、ソースコードも公開されているのだが、色々ハマりそうと考えて、とりあえず、シリアルインターフェースを繋げる事にした。

最近のPCには、シリアルポートはまず無いので、USB-シリアルのブリッジを使う。
秋月電子で、FT232を使った格安なモジュールを売っている。
FT232 モジュール

とりあえず、これを繋いで、シリアルコンソールに文字を出す事が出来た。
でも、サンプルのコードはポーリングなので、割り込み処理にしないと実用性が無いな・・・

FT-232 USB シリアル

とりあえず、本格的なシリアルドライバーは後回しで、gcc の標準ライブラリーに細工する時が来た~

まず、重要なのは、記憶割り当てを行う「malloc」関数群、色々調べると、syscallsモジュールに、「_sbrk」という関数があり、「malloc」は、この低レベルメモリー割り当てを呼ぶ、通常は、シンボル「end」から、スタックの間のメモリー空間を使って、そこに記憶割り当て空間を作り、そこで記憶割り当てを行うのだが、それは、多少まずい、そこで、以下のように改修した。

caddr_t _sbrk (int incr)
{
extern char alloc_top;
extern char alloc_end;
static char *heap_end;
char *prev_heap_end;

if(heap_end == 0) {
heap_end = &alloc_top;
}

prev_heap_end = heap_end;
if((heap_end + incr) >= &alloc_end) {

CPU_UartPuts("Heap and Stack Collision occured...\n");
// abort();
return (caddr_t)NULL;
}
heap_end += incr;
return (caddr_t)prev_heap_end;
}

「alloc_top」、「alloc_end」は、独自のセクションで領域を割り当てていて、この空間内で、メモリーのアロケーションを行う。

※startup.s
.section .MEMALLOC, "w"
.align
.global _alloc_top
_alloc_top:
.space 65536
.global _alloc_end
_alloc_end:

現在は仮に65536バイト確保してある。

※リンク情報
.bss (NOLOAD) :
{
__bss_start__ = . ;
*(.bss)
*(.bss.*)
*(COMMON)
*(.got.*)
. = ALIGN(4);
__bss_end__ = . ;
_end = . ;
} > TRAM

.memalloc (NOLOAD) :
{
. = ALIGN(4);
__alloc_start__ = . ;
*(.MEMALLOC)
__alloc_end__ = . ;
} > TRAM

.stack (NOLOAD) :
{
__stack_start__ = . ;
*(.STACK)
*(.stack)
. = ALIGN(4);
__stack_end__ = . ;
} > TRAM

syscalls のモジュールは、通常、libc.a にアーカイブされているので、sh-elf-arコマンドを使い、オリジナルのlibc.aから、syscallsモジュールを削除しておいた。

リンクする場合、元のsyscalls内の関数全てを実装する必要があるので、とりあえず、ダミー関数を入れておいた。

次は、stdout、stdin、stderrなどファイル関係のサポートだな。

LCD 接続

SD カードからのブートが出来るようになると、早速 LCD を繋いでみたい!
組み込み機器用の小型の液晶を、個人で買うのは、実は、意外とハードルが高い!
正規ルートだと、もう、値段が尋常ではない。

そんな時に見つけたのが、「ストロベリーリナックス」で売ってる PSP の液晶ユニット、
ストロベリー・リナックス - PSP 液晶
まぁ、8800円は多少高いけど・・・

でもでも、さらに見つけたのが、「aitendo」
※最近は売り切れている。
※自分はココで買いました確か5000円くらいだったと思う。

PSP の液晶は、480 X 272 ピクセルでフルカラー、発色も凄く良い。
また、aitendo ではキャリーボードも売っていた(300円だった)これは、液晶のバックライト用 DC-DC も載っていて、フレキケーブルコネクターを普通の40Pコネクターに変換できる、自作にはピッタシの基板。

次はソフトなのだが、ネットを探すと、既に、繋げている人がいるようで、LCD デバイスの初期化コードがアップされているとこを発見!
早速、ソースコードを利用させてもらい、多少苦労したものの画面を出す事ができた。
※「SE組込人」さんありがとう御座います~

PSP 液晶 キャリーボード裏面

LCD にサンプル画像を表示

手始めに、SDカード・インターフェース

まず、考えなければならないのは開発環境。

雑誌の記事等では、ルネサス純正のHEWを使ったものが主流なようで、USBでPCと接続して、トレース、なども行える本格的なものなのだが、自分は、そこまでの環境は必要無いと考えている。
※GUIの統合環境は、裏で勝手に色々やられて好きではない。

むしろ、枯れた環境で開発出来て、全体が見通せる環境の方が良い。
まぁ、バグに悩まされて、トレースが必要な場合もあるだろうが、それはそれとして・・

そこで、昔からの「慣れ」と、emacs と make の CUI 環境の方が好きなので、cygwin 上で gcc を使う事としたのだが・・・
自分でソースコードからコンパイルする事もできるけど、既にコンパイル済みな「KPIT Cummins」のGNU Tools を使う事にした、登録が必要だけど、バグ修正なども比較的良く行われており、シンプルな構成で、インストーラー付き、この新しいSH-2Aにも対応している。
KPIT GNU TOOLS

開発環境に目処がついたとこで、開発スパンをどうするか・・・
この SH-2A には大容量RAMが内臓の為か、フラッシュ ROM を内蔵していない、代りに、外部にシリアル EEPROM があり、そこから BOOT できるようになっており、ローダーに、HEW とデバッグ通信する為のモニターも内臓している。

gcc で生成したバイナリーをどうやって送るか・・・
そんな事を考えているうちに、SDカードを接続して、SD カードに置いた実行バイナリーを読み込んで起動するローダーが発表された。

SD カードのインターフェースは、簡単なので、さっくり作った、SH-2A 基板の 3.3V ラインの容量が微妙なので、5V->3.3Vのレギュレーターを別途載せておいた。

SD カード・インタフェース

それで、自分起動用ソースコードを準備して、簡単なテストが動くようになった。

はじめに

バイクに積むコンピューター(と言っても、速度や、エンジン回転などの情報を表示したり、ウインカーやライトの制御などを行うもの)の構想は前からあり、実験用に何回か組んだ事もあった・・

いつもネックになるのは表示装置、以前は128×64の白黒液晶を使う方向で作業していたが、チープだし、カラーフォトフレームが3000円も出すと買える時代にそぐわないと感じていた・・

それで、カラー液晶なんだけど、制御回路や、フレームバッファのメモリーなど回路の規模が大きくなる事が問題だった。
液晶が接続できる、ARM ベースの Linux 基板なども買って、色々やったが、これはこれで良いし、パフォーマンスも申し分無いのだが、コストが高いのが問題となっていた、自分で使う分にはあまり問題では無いけど、複数台作って、欲しい人に提供する事を考えると、あまり高価になる事は避けるべきと感じてた。

そんな時、インターフェース2010年、6月号にSH-2A基板付録とゆーのを見つけた、まぁいつもの事で、あんまし期待していなかったのだが、内容を観て、興味が沸いた~
・144MHz駆動
・1MB RAM 内臓(ワンチップでこの容量は珍しい)
・64KB高速RAM内臓
・LCDインターフェース(RGB565の16ビットカラー)
・FPU 内臓
・USB インターフェース
などなど

そこで、コレをベースに使って、もう一度作り直してみる事にした。

SH-2A ベース基板

インターフェース6月号付録SH-2A基板

雑誌付録のCPU基板、何枚買った事か・・

ARMやSH2、他色々、いつも、おお!、これは~と思い買うのだがー
遊びでちょこっと使う分にはまぁ良いが、実用性が乏しかったりす
るのがいつもの事。
※RTC使いたいけどバックアップの事が考えられていない、配線も
出来ない。
※明らかな間違いがある。
※表面実装部品の下に目的のトラックがあり、改修不可能。
などなど・・・

しかし、今回は、いつもと少し違うかも。

SH-2Aの仕様が素晴らしい!
・144MHz
・FPU
・1MB-RAM
・64KB高速RAM
・LCDインターフェース
これなら、ボード単体で、相当色々な物が作れそう~

以前からレース用のデータロガーを作成趣味としてて(笑)
今回、ようやく、適したベースが作れそう!

一番の問題は、「液晶表示」なんですよ・・
データロガーと言うより、バイクのデジタルメーターを自作したい
事が始まりで、ついでにデータのロギングもして、ラップタイム
や、エンジンや車両の状態などを記録したいと考えてました。

そこで問題となるのが液晶の表示で、カラー液晶で、それなりの
解像度となると、フレームバッファやインターフェースなど、
色々追加部品を組まなければならない・・、しかし、このSH-2Aに
は全て揃っている!

とゆー訳で、この人を使って、プロトタイプを作り直してみます。

-----
以前に、AVRと白黒液晶を使ったものや、ARMを使った物など、途中
まで作って「ボツ」にした経緯があるので、今回は、最後まで作っ
てみようと思います。