June 21, 2008

iPod shuffle 充電器を作る

E1061iPod 第2世代 shuffle 専用充電器を作った。
自分のブログを見返してみると、以前、デジタル小物の回で、iPod を買いたいと言った事はあったが、実際に iPod Shuffle を買った事は報告していなかったようだ。実は、この春に iPod Shuffle を買っていた。フィットにカーオーディオを付けるの回で、 AUX 接続したのも、この iPod shuffle である。
使っていると、最もシンプルな iPod shuffle は、それなりに使いやすい。もちろん、機能の豊富な iPod nano 以上の iPod が欲しいときは無いと言えば嘘になるが、野外で音楽を聴くには十二分だ。

使っていて不満が出たのは、充電器である。付属の USB ケーブル(正確には DOCK か?)だと、パソコン使用時にしか充電できない。普段、iPod を使っているのは、妻で、先日、バッテリーが上がったとき、充電の仕方が判らなかったのだ。
もちろん、私が充電すれば良いのだし、iPod shuffle は、一度フル充電すると忘れてしまうくらい長持ちするのだが、やはり、使いたいときに自分で充電するのが一番良い。
確かに、充電するだけのために一々パソコンを起動するのも面倒だし、さりとて専用の充電器も意外と高いので、作ってしまったのが、写真の充電器だ。
最も作ったのは、中央部だけで、左は iPod 本体と DOCK だし、右の黒いのは Zaurus 用の AC アダプターだ。

E1062E1063

調べてみると左の DOCK のジャックは、USB コネクタと、この写真のように接続されているだけだ。また、右は一般的な USB のホスト側のコネクタだ。USB は、電源に5Vを用いているし、実際、パソコンに接続した時の DOCK のジャックをテスターであたったら、5Vが出ていた。
そこで、Zaurus の AC アダプター(5V)を使って USB コネクタに電力を与えれば充電できるだろうと作ったのが、今回の充電器だ。
問題は、2つの信号線だ。15KΩ位の抵抗を介してプルアップするかプルダウンするかなのだが、状況が良く判らない。とは言え、組み合わせは、たった四通りなのだから、全て試すことにした。なお、手持ちに15KΩの抵抗が無かったので、10KΩの抵抗で試した。

・D+/D−ともにプルダウン
 USBの定義的には、パソコンを接続した状態
 iPod shuffle を接続すると、オレンジ色の LED が数回点滅した後、消灯する。
・D+はプルダウン/D−はプルアップ
 USBの定義的には、ロースピード USB
 iPod shuffle を接続すると、オレンジ色の LED が数回点滅した後、消灯する。
・D+はプルアップ/D−はプルダウン
 USBの定義的には、フルスピード or ハイスピード USB
 iPod shuffle を接続すると、オレンジ色の LED が数回点滅した後、消灯する。
・D+/D−ともにプルアップ
 USBの定義的には、不明??
 iPod shuffle を接続すると、オレンジ色の LED が点灯する。

予測では、「D+/D−ともにプルダウン」だったんだけど、どうやら普段パソコンで充電するときと同じなのは「D+/D−ともにプルアップ」のようだ。

と言うわけで、「D+/D−ともにプルアップ」の状態で、iPod shuffle を一時間半位接続したままにしておいたら、オレンジ色の LED は、グリーン色に変わった。充電完了の印である。

で、iPod 第2世代 shuffle 専用充電器の完成。

もし、このコンテンツ読んで作る気になっても自己責任で。万一、iPod が故障しても責任取れません。

| | Comments (0) | TrackBack (0)

May 05, 2008

12 コア CPU を FPGA に

堅い話題が続いているので、ちょっと休憩。

雑誌の付録の FPGA で遊んで居る。
25万ゲートとは言え、オンチップでメモリーに使えるのは 24k バイトが上限なので、ワンチップ・マイコンとして使うなら、そんなに大規模ではない。小規模な組込み制御用のマイコンとして、適当なCPUコアを入れてリアルタイムOSをインストールできないか、調査し始めた。

調査を進めるうちに、疑問が芽生えて来た。
適当なCPUとリアルタイムOSが見つからなかった訳ではない。

「ワンチップ・マイコンとしてリアルタイムOSを走らすことに、FPGAの使い方として、何のメリットがあるというのか??」と

市販のワンチップ・マイコンに比べて、FPGAにCPUコアを入れることが有利な点は、インターフェース部分を自由に作り替えることは可能な事くらいだ。それ以外は、市販のワンチップ・マイコンの方が遥かに有利だ。数百円も出せば、H8 や SH-Tiny など、FPGA の何倍ものメモリー容量を持つワンチップ・マイコンが買えるし、それらでリアルタイムOSを使って居て、何の不便も無い。
もし、インターフェースを自由に作り替えたいなら、数百円のワンチップ・マイコンに、これまた数百円で買える数千ゲート級の CPLD を付けた方が大容量FPGAを使うより安くて早い。

FPGA でなければ、実現できないような事じゃなきゃ、試しても意味が無い。

そもそも、何故、リアルタイムOSを使うかと言うと、組み込み制御のマイコンの場合、いくつかの処理を組み合わせている場合が多いからだ。プログラミング・テクニックを駆使して、複数の処理を一つのタスク上で時分割に行うよりも、リアルタイムOS上で複数のタスクに各々の処理を任せた方が楽だ。

だが、本当に「複数の処理を行うには、リアルタイムOSでマルチタスクで行う」のがベストなんだろうか?
考えてみれば、大きな前提条件として「複数のCPUを組み合わせるのは難しい」があって始めて「リアルタイムOSがベスト」と言える。

もし、「必要なタスクの数だけCPUがある」のなら、リアルタイムOSは必要ないのかもしれない。

私自身のリアルタイムOSで作ったプログラムをみると、タスクの数は概ね6〜8個迄である。もちろん、大きなプログラムで、もっとタスクの数が必要になった時もあるが、それはむしろ例外的だ。大概の場合、10個程度のタスクが使えれば、それなりに使えそうだ。

市販のマイコン・チップは、当然のことながら、1つのチップで、1つのCPUコアしかもたない。最近では、SH などでもデュアルコアのチップが出始めたが、これは極めて例外的だし、それとて CPU コアの数は2個が上限だ。

今までは 10個のCPUが必要なら、10個のマイコン・チップを接続するしかなかった。これは大変な手間である。こんな手間をするくらいなら、リアルタイムOSの方が、ずっと楽だ。

だが、FPGA だと話は別だ。複数のCPUコアを一つのチップ上に入れることなど、造作もない。実際、25万ゲートのFPGAにZ80コンパチCPUを入れた時、半分も使って居なかったので、少なくとも2つの Z80 CPU をいれることは可能だろう。

もっとシンプルな CPU なら、もっと沢山の CPU が FPGA の中に入るかもしれない。

FPGA 上にマルチコアを入れ、各々のCPUコアに一つずつタスクを割り当てるなら、Z80 よりシンプルな機能の CPU で十分だろう。割り込みも必要ない。そもそもリアルタイムOSは使わないし、また、割り込みが必要なタスクには、それぞれ専用の CPU を割り当てるからだ。

ネットで調べた結果、XILINX が 公開している PicoBlaze と言う CPU が、コンパクトで良さそうだと判った。PicoBlaze は正確にはオープンソースでは無いのだが、無料で使えるので、CPU を何個 FPGA 上に作ってもロイヤリティーの問題は無い。ただ、PicoBlaze は割り込みの機能があるのだが、これは使わなければ良いだけの話だろう。

いろいろ試して、25万ゲートの FPGA に 12個の PicoBlaze CPU を乗せることに成功した。

それぞれの CPU 間は、メッセージ・キューやセマフォにあたる機能をハードウエア的に作って接続し、データの受け渡しや並行処理の同期を行っている。まだ、共有メモりにあたるものは実装していないが、作るのは難しくは無さそうである。

各 CPU は、PCCOMP と言う専用の C コンパイラでプログラミングした。実は、この C コンパイラの癖が強いのが、最も苦労したところだ。もっとも PicoBlaze と言う CPU 自体がプログラムエリアは 2k バイトと、それなりの容量なのに、リード・ライトできるデータエリアが僅か 64 バイトと極端に少ないので、あながちコンパイラの所為とも言い切れない。

とりあえず、12 個の CPU を1つの FPGA に乗せ、何とかデータの受け渡しや処理の同期を試したと言うのが本当のところで、まだまだ、複数 CPU による複数タスクの効果を確認したところまで達して居ない。

次の課題は、少なくともマルチ CPU ・マルチタスクの効果を確認できるような使い方を試す事だと思う。

ちゃんと実用になるためには、もう少しプログラミングしやすい CPU が欲しいところだ。コンパイラとして gcc が使え、メモリーは 2k バイトでも良いから、プログラム領域とデータ領域が共用できて欲しい。MIPS のようにメジャーな CPU のオープンソースの互換コアで、割り込み等は省略しても小さいサイズのものを探すべきなのかも知れない。

もっとも、理想的な CPU が見つかって、多数の CPU を FPGA に乗せることができても、何等かの理由で、リアルタイム OS の方が使い勝手が良いと言う結論になる可能性もある。

それを確かめるためにも、頭の中で考えるだけじゃなくて、実際に試してみなきゃいけないんだよねえ。

| | Comments (2) | TrackBack (0)

April 29, 2008

FPGA 再入門

昨年から大量の半田付け作業が続いている。半田付け箇所が多いのは、ディスクリートで回路を組んでいるからだ。(ディスクリートとは、単機能の IC を組み合わせてデジタル回路を作ること)
パワー制御部やアナログ部分はともかく、デジタル部は FPGA にすれば良いのに・・と友人に指摘を受けた。

FPGA とか CPLD や PLD を知っているだろうか?
IC とか LSI と言った集積回路の中身を自由に作り替える事のできる部品だ。中に入れる回路を規模が小さいものを PLD、中規模のものを CPLD、大規模のものを FPGA だと思ってもらうとイメージしやすいだろう。
(正確には FPGA と CPLD と PLD の違いは回路規模では無く、内部構造の違いである。しかし、ユーザーから見るとコンパイラが対応してくれるので、回路規模しか違いが見えない。CPU の CISC と RISC みたいな違い)

現在、半田付け作業は一段落付いているが、また、再開するかもしれない。今の間に FPGA を使えるようにしておこうと思い、試してみた。

以前は、Windows 98SE 上に FPGA 開発環境を構築していたのだが、いまさら 98SE でもあるまい。私が個人的に良く使う FPGA デバイス・メーカーである XILINX のサイトを見ると最新版は Linux にも対応していると言う。
対応 Linux は RedHat だが、Debian でも使えるようだ。早速、試すと意外と簡単に Debian Linux etch にインストールできた。昔作った FPGA ライター用ケーブルを接続すると簡単に FPGA (正確には CPLD)に書き込めた。

FPGA や CPLD を使うのも 5〜6年ぶりなので、世間の情勢が判らなくなっているので、ちょっと調べてみた。以前なら入手が難しかった CPLD も秋葉原の秋月や千石で数百円程度から買えるようになっている。

「デバイスの値段が安くなったとは言え、品揃えは昔と、そう変わらないなあ・・」と思って居たら、とんでもない勘違いだと気付いた。なんと千石で20万ゲートの FPGA が数千円で売っている。こんなものが数千円で手に入るとは・・・

こう言うことに詳しい友人に聞いたところ、ここ2・3年では、当たり前の事なんだそうだ。
うかうかしていると時代に取り残されるなあ。

5〜6年前にも10万ゲートを越える FPGA はあるにはあった。だが、何十万円もして、とてもアマチュアの手の出せるものでは無かった。それが、今では数千円で買えるほど、なっている。
一番手軽に数十万ゲート級の FPGA を試すのは雑誌の付録になっているものを使う事らしい。早速、去年のデザインウエーブを入手して試した。

雑誌付録の25万ゲートの FPGA に書き込むには自作のケーブルでは駄目で、既製品のケーブルを使わざるを得なかった。しかし、全て LINUX 上で開発環境がそろうとは頼もしい。
試しにオープンソースとして公開されている Z80 互換の CPU コア t80 を入て、シリアルポートに「Hello World」を出力するプログラムを走らせたら、ちゃんと動いた。

やはり、十万ゲートを越える FPGA は世界が違う。ワンチップ上に CPU とシリアルインターフェース、メモリーまで付けて、まだ半分しか使っていない。30年前に自作したコンピュータの何倍もの規模の回路が、この FPGA の上に乗りそうだ。
それどころか、ちょっと外部に回路を追加すれば、昔のパソコン PC-8001 くらい作れそうだ。

と、妄想しながら、ネット上を探索すると居る居る。PC-8001 に限らず、MSX とか X6800 とか、昔のパソコンを FPGA を使って再現している人が既にいっぱい居る。
誰でも考えることは同じかあ。
既に実行した人が居るんじゃ、今更やっても面白くない。何か別の事をやってみよう。

| | Comments (0) | TrackBack (0)

July 08, 2007

SH-TINY その5 漢字ターミナルを作る

さすがに、いっぺんに3つもコンテンツをアップすると疲れるなあ。
E0961前回、秋月のグラフィック液晶に漢字を表示したのに、良い気になって、今回は、漢字ターミナルを作ってみた。
(クリックすると写真は拡大)

この写真のように、PS/2 インターフェースを付け、フルキーボードからキー入力を得られるようにした。
キー入力と漢字の表示とを、シリアルインターフェースで入出力することで、漢字ターミナルとしている。

漢字フォントは、8x8 ドットだ。
これは、前回の最後に書いたように、SH-TINY の ROM サイズ(128K)に収まるのは、8x8 ドットが限界だったからだ。
写真では、恵梨沙フォントを使っているが、美咲フォントを使うことも、もちろん可能だ。

E0962写真の例では、シリアルケーブル経由で、Debian Linux Sarge にログインしている。
ls で、存在しないファイルを探そうとしたので、漢字でエラーメッセージが出ているのが判る。
(クリックすると写真は拡大)

シリアルケーブル経由と言えど、ちゃんとログインしているので、なんでもできる。

回路図
E0963前回の回路図に比べて、PS/2 インタフェースが増えただけだ。
IRQ0 を使って、PS/2 クロックを受信している。

(クリックすると画像は拡大)

プログラム
sh7125term.tgzをダウンロード

プログラムの構築には、漢字フォントが必須だ。漢字フォントのダウンロードと解凍については、前回のコンテンツを参考にしてもらいたい。

$ cd ~/hos-v4/sample/
$ tar zxvf sh7125glcd.tgz
$ cd sh7125glcd/
$ make -f make -f gcc.mak

ホスト PC の Linux に外部ターミナルからシリアル経由でログインするには、外部ターミナルを起動した後、ホスト側で次のようにコマンドする。

# /sbin/getty -L 38400 ttyS0 vt100

後は、普通にログインするだけである。

プログラムの説明
このプログラムは、2つのタスクで成り立っている。
(1)シリアルインターフェースから文字を受け取り、グラフィック液晶に表示するタスク
(2)PS/2 キーボードから信号を受け取り、スキャンテーブルで ASCII コードに変換し、シリアルインターフェースから送るタスク

グラフィック液晶に対するアクセスは、(1)のタクスのみである。従って、グラフィック液晶に対するアクセスがコンフリクトを起こす可能性は無いと判断し、セマフォ等の設定はしていない。
もし、2つ以上のタスクがグラフィック液晶をアクセスするようなプログラムを作る場合、セマフォ等で排他処理をしないとコンフリクトを起こす可能性があるから注意されたい。

シリアルインターフェースに対するアクセスは(1)(2)の両方のタスクからある。従って、コンフリクトの可能性が大きく、また、良く使うので、汎用的に使えるデバイスドライバにしておいた。セマフォや割り込みなど多数使用している。
ホスト側から速い速度で、データを送られた時、表示が間に合わなくなるので、XON/XOFF によるソフトウエア・フロー制御を行うようにしている。

PS/2 キーボード・インタフェースは、不規則性で、迅速な処理が必要なので、IRQ による外部割り込みを使っている。

このように複数のタスクや、割り込み等を使ってプログラムが書けるところが、リアルタイム OS の良いところだ。

なお、通信のボーレートは 38400bps 固定、キーボードは日本語キーのみ、漢字コードは EUC-JP のみ、エスケープシーケンスは最低限のモノしか用意していない。
この辺、誰か汎用的にしてくれると嬉しいのだが・・・
(エスケープシーケンスを揃えて、VT100互換にしても vi や emacs でエディットするのはキツイと思うが)

最後に
いやあ、結構、SH-TINY って、何でもできるね。
最後の漢字ターミナルなんて、黎明期のパソコン PC-8001とかPET並みだよね。もちろん、表示のドット数は落ちるけど、速度とか逆に速いような気もするし。
漢字ターミナルは、フォントデータが大きいけど、それでも 70K 程度しかない。まだ、50K も ROM が余っている。これに BASIC 等のインタープリタ/スクリプト言語を載せたら、本当に黎明期のパソコン並みになると思うのだが・・・

玄箱のシリアルインターフェースに接続するのも良いかも知れない。
DHCP で得た IP や内部状態のモニターだけでなく、新幹線の車内ニュース表示のように、インターネット上のニュースを RSS 経由で得て、表示するのも面白い。

もっと、大きな視認性の高い漢字フォントを使いたければ、外部にシリアルインターフェースの ROM でも付ければ良いかもしれない。ただし、アクセス速度の問題があるので、プログラムを工夫する必要が出ると思うが。

妄想は広がるばかりだ。

| | Comments (0) | TrackBack (0)

SH-TINY その4 秋月のグラフィック液晶で漢字を表示

E0951今回は、秋月のグラフィック液晶(122x32 ドット)を使い、さらにリアルタイム OS の HOS-V4 を使って漢字を表示する方法を示す。

左の写真は、16x16 の東雲フォントを使って表示した例だ。
(クリックすると画像が拡大する)

難しい漢字も表示できているが、半角で15文字x2行、全角で7文字x2行と少ししか表示できないのが難点だ。

E0952左の写真は、12x12 の東雲フォントを使って表示した例だ。

(クリックすると画像が拡大する)

少し字が小さくなっている。

文字数は、半角で20文字x2行、全角で10文字x2行だ。

E0953左の写真は、8x8 の美咲フォントを使って表示した例だ。

(クリックすると画像が拡大する)

かなり、字が小さく、複雑な文字は判別が困難だ。

文字数は、半角で30文字x4行、全角で15文字x4行だ。

E0954左の写真は、8x8 の恵梨沙フォントを使って表示している。ただし、半角文字は、美咲フォントを使っている。

(クリックすると画像が拡大する)

かなり、字が小さく、複雑な文字は判別が困難だ。

文字数は、半角で30文字x4行、全角で15文字x4行だ。

回路図は、下記の通りである。
このグラフィック液晶は、2kHz のクロックが必要なのだが、このクロックは、SH-TINY のタイマー機能を使って作っている。

E0955(クリックすると画像が拡大する)

フォントのダウンロード
フォントは、X Window 用のビットマップフォントで、フリーでダウンロードできるものを使用している。
フリーと言っても、ライセンスの問題もあり、フォントの転載は難しいので、直接下記のリンクからダウンロードしてもらいたい。
東雲 ビットマップフォントファミリー から shinonome-0.9.11p1.tar.bz2 をダウンロード

美咲フォント から mskbdb10.tar.gz をダウンロード

恵梨沙フォントファミリー から elisau10.tgz をダウンロード

$ cd ~/hos-v4
$ mkdir fonts
$ cd fonts
$ tar jxvf shinonome-0.9.11p1.tar.bz2
$ mkdir misaki
$ cd misaki
$ tar zxvf mskbdb10.tar.gz
$ cd ..
$ mkdir elisau10
$ cd elisau10
$ tar zxvf elisau10.tgz

プログラム
sh7125glcd.tgzをダウンロード

$ cd ~/hos-v4/sample/
$ tar zxvf sh7125glcd.tgz
$ cd sh7125glcd/
$ make -f make -f gcc.mak

プログラムを見たら判ると思うが、ruby で、出力する文字列から、必要な漢字フォントのデータを配列化して ROM に書き込むようにしている。このため、ruby のインストールが必須である。

できた sampleRom.mot を SH-TINY ボードに書き込むと、グラフィック液晶に漢字文字列を表示しつつ、「いわゆる哲学者の食事の問題」を実行する。

今回の方法では、漢字フォントの内、必要なデータだけを切り出して、SH-TINY の ROM に書き込んでいる。プログラムが予め表示すべき文字列を用意している場合は、この方法で十分だろう。

SH-TINY の ROM は、128K バイトなので、16x16 や 12x12 ドットの漢字のデータを全て書き込む事はできない。しかし、8x8 ドットの漢字フォントなら、JIS 第2水準まで全て含めても 53Kバイトで収まる。あらゆる漢字を表示する必要がある場合、漢字フォントを ROM に書き込む方法もあり得る。

| | Comments (0) | TrackBack (0)

SH-TINY その3 リアルタイム OS

ちょっと間が開いたが、SH-TINY にリアルタイム OS の HOS-V4 を載せる話題だ。
実は私よりも先に、適当電子工作研究所SH/TinyにHOS-V4を載せようと言うコンテンツで、SH-TINY に HOS-V4 を載せる話が公開されている。このコンテンツの場合、アルファプロジェクトのSH/Tiny基板に、ルネサス純正のコンパイラの SHC 体験版を使って、HOS-V4 を入れる方法が書いてある。(コンパイラについては推測)
今回、私は、秋月の SH-TINY チップを使った自作マイコンに gcc を使って HOS-V4 をインストールしたのだが、適当電子工作研究所のコンテンツが大変参考になった。このコンテンツが無かったら、今ごろ、泥沼に陥っていたかも知れない。「適当電子工作研究所」の hamayan さんに感謝、感謝である。

さて、何がそんなに参考になったかと言うと、SH-TINY の CPU 部分は、SH-2 と全く同じでは無く、微妙に違う部分がある。具体的に言うと、「スロット不当命令例外処理に関する注意事項」である。正直、当初これは全く把握していなかった。HOS-V4 では、タスク切替えに、この機能を使っているので、気が付かなかったら、混乱していたと思う。
その他、 例外処理ベクタが増えていたり、メモリーや周辺機器のアドレスが変更になっている。

この中で、「スロット不当命令例外処理」と「例外処理ベクタ」の変更部分は、HOS-V4 のカーネル自体に変更が必要にある。以前の私のコンテンツを参考にした人も居るかもしれないが、ここでは改めて、最初から、SH-TINY 用に HOS-V4 をインストールする方法を示そう。


HOSのダウンロードと解凍及びコンフィギュレーターとライブラリの構築
HOSから、h4_101a.tgzをダウンロード
sh2gcc.tgzをダウンロード

$ cd ~/
$ tar zxvf h4_101a.tgz
$ cd hos-v4/config/
$ make -f gcc.mak
# cp hos4cfg /usr/cross/bin/
$ cd ../src/sh
$ rm -rf sh2gcc
$ tar zxvf sh2gcc.tgz
$ cd ../../lib/sh/sh2gcc/

ここで、h4sh2.makの中の

sh-hms-gccをsh-elf-gccに
sh-hms-arをsh-elf-arに
sh-hms-ranlibをsh-elf-ranlibに変更する。

$ make -f h4sh2.mak

サンプルプログラムのROM 化
sh7125test.tgzをダウンロード

$ cd ~/hos-v4/sample/
$ tar zxvf sh7125test.tgz
$ cd sh7125test/
$ make -f gcc.mak

できた sampleRom.mot を SH-TINY ボードに書き込むと、「いわゆる哲学者の食事の問題」を実行する。

| | Comments (0) | TrackBack (0)

June 14, 2007

SH-TINY その2

E094左が、今回私が作った SH-TINY の回路図だ。前回のコンテンツの写真のように 0.5mm ピッチの 64pin QFP なので、変換基板を介して配線している。なお、前回の写真の右部にあるプラスチックケースは、RS-232C 用の電圧コンバート部だ。私は、RS-232C を良く使うので、3V から 5V まで電源電圧を気にせずに使える用の電圧コンバート部分を汎用的に使えるように用意している。

本来、SH-TINY の空いた端子は、抵抗を介してプルアップでもすべきなのだろうが、今回は動作確認できれば十分なので、プルアップしなかった。実際、誤動作は起きていない。パワーオンリセットの回路は、インターフェース誌付録の SH-2 ボードでも問題になったので、少し余裕をみた回路定数にしている。
回路中の 0.1 μFのコンデンサーは PLL に使うので、積層セラミックコンデンサーを使うこと。その他の回路定数はいい加減だ。なお、水晶に 10MHz を使ったのは、最高周波数になる 12.5MHz が売ってなかったので、安く手に入った 10MHz を使っただけで、深い意味は無い。

回路ができたら、テストプログラムを走らせよう。
プログラミングは、以前SH-2 Linux上でのリアルタイム OS 開発環境 (その1 クロスコンパイラ構築編)またはここで紹介した gcc のクロスコンパイル環境が、そのまま使える。

下記にテストプログラムをアップした。
shtinytest.tgz

これを解凍すると、ソースコードとコンパイル済みの rom.mot が入っている。クロス gcc のインストールされた環境なら、make 一発で、コンパイルできるはずだ。
なお、以前は、Debian Linux Sarge での gcc のクロスコンパイル環境の構築法を示したが、Debian Linux の最新版 Etch でも同様の方法で問題なく構築できることを確認している。
また、Windows 上の Cygwin での構築もできるはずなので、これは読者の人にお任せしたい。

プログラムができたら(コンパイル済みの rom.mot を使っても構わないが)、SH-TINY に書込もう。
書込みには、ルネサスの HTerm を使う。
ルネサス テクノロジ のホームページから「設計サポート」「半導体セミナー」「サンプルプログラム」「同意します」「SuperHファミリ」「モニタプログラム専用通信ソフト Hterm」の順にリンクを辿り、htermmdi.exe 1947516バイトをダウンロードする。

このプログラムは、Windows 用なので、また、wine を使う。Debian Linux Sarge での wine のインストール方法は、
SH-2 Linux上でのリアルタイム OS 開発環境 (その3 ROM 書き込み編)または、ここを参照してもらいたい。
(ここ以下の説明では、LINUX 上で Hterm を使う説明をしているが、Windows 上ではネイティブ環境なのでもっと楽に使えるはずだ)

$ cd ~/Desktop/
$ wine htermmdi.exe

とすると、ダイアログが開き、デフォルトのままだと「c:\hterm」にファイルが展開される。(Linux のファイルシステムでは、~/.wine/dosdevices/c:/hterm 以下に展開される。)

$ cd ~/.wine/dosdevices/c:/hterm
$ wine Hterm.exe

とすると、Htermが起動する。
メニューから「フラッシュ」「ブートモード」と進む。

ここで、SH-TINY ボードと LINUX マシンをストレートのシリアルケーブルで接続し、ジャンパースイッチを2つとも接続した状態で、電源を入れる。

「OK」を押し、次に、ダイアログの選択画面で「R5F7125」を選ぶ。
次に、CPUおよび周辺機能共に×2を選び、動作周波数では「10MHz」を入れる。
最後にファイル選択ダイアログが開くので、「rom.mot」を選ぶとプログラムが書き込まれる。

なお、Hterm はデフォルトでは、COM1 に相当する /dev/ttyS0 をシリアルポートに選ぶ。
LINUX をインストールしているパソコンに COM ポートが付いて居れば、/dev/ttyS0 に設定されるはずなので、問題が無く使えるはずだ。
しかし、最近では、COM ポートの無いパソコンも増えている。この場合、秋月で 1400円での「USB-シリアル変換器」を使うと、シリアルインタフェースが使える。だが、/dev/ttyUSB0 などに割り当てられるはずだ。その時は、Hterm を起動する前に

$ cd ~/.wine/dosdevices/
$ ln -s /dev/ttyUSB0 com1

とやっておけば、問題なく使える。

さて、ここまでは、Debian Linux Sarge での話。同じ Debian でも Etch だと、ちょっと違う。
Etch では、wine が標準のパッケージで用意されているので、インストールは楽だ。

# apt-get install wine

だけで、OK だ。

ところが、utf-8 と wine のキーボード入力機能との相性が悪く、wine で動いているプログラム上で、キーボード入力するとハングアップしてしまう。
wine を起動する前に

$ export LC_ALL=ja_JP.eucJP

とやっておくと、キーボード入力はできるが、日本語表示が全滅してしまう。

マウスなら全く問題は無いし、キーボード入力するところは、動作周波数のところの一ヶ所だけだ。
結局、私は、utf-8 のままで起動しておき、クリップボードに「10.0」と言う文字列をコピーしておき、キーボード入力する代わりに、マウスの右ボタンを使って、動作周波数のところに文字列をペーストする事で回避している。

さて、ROM への書き込みが終わったら、Hterm を終了し、kermit などのターミナルソフトを起動し、ボーレートを 38400 bps にする。
SH-TINY ボードの電源を切った状態で、ジャンパスイッチを両方とも切り、再度、電源を入れる。
「Hello World!」に続いて、「ok」と言う文字列が出続ければ、成功である。 

| | Comments (0) | TrackBack (0)

June 13, 2007

SH-TINY

E093大量のハンダ付け作業は、未だ続いているが、この間に部品などの購入で何度も秋葉原へ行った。その時、改装した秋月で「SH-TIINY」なるワンチップ CPU が売っているのを見つけた。最初見た時は買わなかったのだが、帰宅後、ネットで情報を集め、何とかなりそうだと思い、二度目に購入した。

このSH-TINY (R5F71253N50FPV)は 900円、0.5mm ピッチの 64pin QFP の CPU 単体のみの販売で、秋月でのキットなどの販売は無い(他社からは出ているようだ)
SH-TINY は、SH-2 CPU コアを持つワンチップマイコンで、昨年インターフェース誌の付録になった SH-2 ボードの SH-2 (HD64F7144F50V) の弟分に当たるような CPU である。
SH-2 (HD64F7144F50V) に比べると、ROM が 256Kバイトから 128K に半減したり、シリアルポートが 4つから 3つに減らされるなど、パッケージのピン数が減った分、IO が少なくなっているなどの点が異なる。
一番大きな相違点は、SH-2 (HD64F7144F50V) は外部に RAM を接続できるようになっているのに対し、SH-TINY はメモリーバスが省略されていることだろう。
モニター入れて、リモートデバッグしようと思って居る人には RAM 増設ができないのは痛いかもしれないが、私のように組み込みで ROM 化しか考えて無い人に取っては大きな問題ではない。
その他、電源電圧が、3.3V から 5V に変わってたりするが、CPU クロックは Max 50MHz 65MIPS で処理速度など、性能的な面で見劣りはしない。

TINY と言うと、H8-TINY (HD64F3664F/HD64F3694F) を思い浮かべる。H8-TINY も決して悪いマイコンじゃないのだが、メモリが小さく (ROM:32K RAM:2K)、処理速度が遅く (HD64F3664F が最大 16MHz HD64F3694F が最大 20MHz、MIPS は不明)、IO ポートが少ない。何よりもシリアルポートが 1つしかなかったのが、不満だった。

ロボットなどの制御を考えると、ワンチップマイコンを複数乗せ、シリアルポートで通信し分散処理させるのが面白い。この場合、プログラム書込み兼デバッグ用にシリアルポートを1つ占有するので、少なくとも2つ以上のシリアルポートが欲しかった。

そう考えると、SH-TINY は中々良い選択だ。値段も安いし、IO ポートも程々の数があるし、何よりもシリアルポートが3つもある。仮に IO が多く必要だったり、ROM 領域が多く必要だった場合、SH-2 (HD64F7144F50V) も交ぜて使えば良いのだ。元々シリーズCPUなのだから、プログラムも共用しやすいだろう。

問題なのは、ROM への書込みソフトだが、ルネサスのHTERM か FDT で書けるようだ。
と言うわけで、SH-TINY を買って来て、ハンダ付けの合間に作ったのが、写真の基板だ。ハンダ付けの気分転換にハンダ付けをするのだから、我ながら可笑しい。とは言え、DIPのハンダ付けと、0.5mm ピッチの QFP を実体顕微鏡を使ってハンダ付けするのは、まるで違う。それなりに基分転換になるから不思議だ。

現状、プログラムの書きこみや動作確認及び HOS のインストールまで確認している。
次回以降、数回に分けて、回路図などのハードウエア、ROMへのプログラムの書きこみ、HOS のインストール方法を説明したいと思う。

| | Comments (0) | TrackBack (0)

October 13, 2006

SH-2 Linux上でのリアルタイム OS 開発環境 (その5 HOSのバージョンをV4にする編)

既に述べてあるが、V4a だと周期ハンドラが無かったり、割込み処理でハングアップしたりと不安定な事が判った。同様のプログラムを、V4 で動かしたところ、全く問題なく安定して動作した。

どうも、V4a は開発途中で不安定なようだ。
と言うわけで、今回は、HOS のバージョンを V4 にする話だ。

HOSのダウンロードと解凍及びコンフィギュレーターとライブラリの構築
HOSから、h4_101a.tgzをダウンロード

$ cd ~/
$ tar zxvf h4_101a.tgz
$ cd hos-v4/config/
$ make -f gcc.mak
# cp hos4cfg /usr/cross/bin/
$ cd ../lib/sh/sh2gcc/

ここで、h4sh2.makの中の

sh-hms-gccをsh-elf-gccに
sh-hms-arをsh-elf-arに
sh-hms-ranlibをsh-elf-ranlibに変更する。

$ make -f h4sh2.mak

SH7045用のサンプルプログラムを構築

$ cd ~/hos-v4/sample/sh2gcc/

ここで、gcc.makの中の

sh-hms-gccをsh-elf-gccに
sh-hms-arをsh-elf-arに
sh-hms-objcopyをsh-elf-objcopyに変更する。

また、sample.x に次の行を追加する。

<<< 最初略 >>>
.text :
{
_TEXT_START = . ;
*(.vector)
*(.text)
*(.strings)
*(.rodata)
*(.rodata.*) << この行を追加。
_TEXT_END = . ;
} > rom
<<< 最後略 >>>

$ make -f gcc.mak

なお、私は、SH7045 を持っていないので、上でコンパイルしたプログラムが動作するか確認していない。

ROM 化
「sh7144rom01.tar.gz」をダウンロード

$ cd ~/hos-v4/sample/
$ tar zxvf sh7144rom01.tar.gz
$ cd sh7144rom01/
$ make -f make -f gcc.mak

できた sampleRom.mot を SH-2 ボードに書き込むと、「いわゆる哲学者の食事の問題」を実行する。

ハードウェア操作
「sh7144hw01.tar.gz」をダウンロード

$ cd ~/hos-v4/sample/
$ tar zxvf sh7144hw01.tar.gz
$ cd sh7144hw01/
$ make -f make -f gcc.mak

できた sampleRom.mot を SH-2 ボードに書き込むと、ハードウェアを操作するプログラムを実行する。

| | Comments (2) | TrackBack (0)

October 11, 2006

ココログのファイル管理

どうも、SH-2 のプログラムソースをアップロードすると、ココログの機能か、勝手に gzip 圧縮されてしまうらしい。
今のところ、ごまかしてアップロードしているが、上手くダウンロードできなかったり、解凍できなかったりしたら、御報告してほしい、よろしくお願い。

と、まあ、SH-2 のリアルタイム OS の話題を続けているが、次回から HOS のバージョンを V4a から V4 に戻す。
実は、周期的な処理や割込み等を試したのだが、V4a だと周期ハンドラが無かったり、割込み処理でハングアップしたりと不安定な事が判ったのだ。
ところが、同様のプログラムを、V4 で動かしたところ、全く問題なく安定して動作した。

やはり、V4a は開発途中で不安定なようだ。と言うわけで、次回からは、HOS-V4 の話題になる。
私に付き合ってくれて、HOS-V4a の導入をしてくれた人には、誠に申し訳ない。

| | Comments (2) | TrackBack (0)

October 08, 2006

SH-2 Linux上でのリアルタイム OS 開発環境 (その4 ハードウェア操作編)

E070この週末も大風が吹いていて、模型飛行機は飛ばせない。引き続いて、SH-2 ボードでリアルタイム OS を使う方法の説明をしよう。

今回説明するのは、ハードウェアを直接叩く方法である。わざわざ、ROM 化したのは、IO ポートを沢山使うためだ。せっかくだから、その沢山使える IO ポートを使う方法を説明する。

簡単に試せるように、押しボタンスイッチと LED だけで作れるテスト回路を図に示した。
IO ポートは贅沢な使い方をしているが、説明のためである。
なお、押しボタンスイッチと C ポートや D ポートの間にある抵抗は、間違って、C ポートや D ポートをアウトプットに設定しても、SH-2 を壊さないようにする保護のためのものだ。

下が、サンプルプログラムだ。
「sh7144hw00.tar.gz」をダウンロード
(もし、ダウンロードしたファイルが「sh7144hw00.tar.gz.gz」になっていたら、「sh7144hw00.tar.gz」にリネームすること。)

次のような操作でコンパイルできる。

$ cd ~/hos/hos-v4a/sample/sh/
$ tar zxvf sh7144hw00.tar.gz
$ cd sh7144hw00/gcc/
$ make -f gmake.mak

ソースコード中、main.c の中で、RAM を読み書きするバスを全て IO ポートに使えるように設定している。今回の例では、 B ポートを出力に、C ポートと D ポートを入力に設定している。応用するときは、この辺を参考にしてみると良いだろう。

コードをコンパイルし、SH-2 ボードに書き込み、実行させると、シリアルポートに押しボタンスイッチの状態を表示すると共に、LED の点灯にも出力する。
また、SH-2 ボード上の LED も点滅させる。

簡単な例だが、HOS を使って、ハードウェアを操作させる方法の理解になれば、幸いである。

| | Comments (0) | TrackBack (0)

October 06, 2006

SH-2 Linux上でのリアルタイム OS 開発環境 (その3 ROM 書き込み編)

さて、今回は、コンパイルした sampleRom.mot を SH-2 内部の ROM に書き込む方法に付いて述べる。

Linux 専用の書き込みプログラムが無い
普段、Linux から、H8 や SH-2 に書き込む時は、Open SH/H8 writerを用いている。
ところが、これは、SH7050F や SH7045F には対応しているものの、今回使っている SH7144F には対応していない。

Open SH/H8 writer はソースも公開しているので、SH7144F 用に作り変える事も可能かと思ったが、意外と難しそうなので、諦めた。(誰か、お願い)

そこで、ちょっとインチキだが、Wine と Windows 用の書き込みソフトを使う手段を使った。

Wine
Wine は、Linux 上で、Windows のアプリケーションを動かすことができるエミュレーターだ。
まだ、正式リリース版では無いようだが、意外と色々なアプリケーションが動作する。
私の場合、3D 表示やサウンドを使った Windows アプリは動作しないが、ATI や nVIDIA のようなグラフィックカードを使っていれば、3D 表示の Windows アプリも動作するらしい。(サウンドの方は単なるセッティングの問題の可能性が高い)

今回は、フリーの Windows 用の書き込みソフトを試したところ、もちろん 3D 表示もサウンドも使っていないせいか、全く問題なく Wine の上で動作した。

まず、Wine のインストールだ。
ここから、Wine のソースをダウンロードする。Wine は毎週のように更新している。私が使ったバージョンは、wine-0.9.6.tar.bz2 だが、最新のものでも大丈夫だろう、確信は無いが。

次のような手順でインストールする。

$ bunzip2 < wine-0.9.6.tar.bz2 |tar xvf -
$ cd wine-0.9.6
$ ./configure
$ make depend
$ make
# make install

/etc/ld.so.conf に /usr/local/lib があることを確認。

# /sbin/ldconfig -v

$ winecfg
で、設定が行えるのだが、たぶん、デフォルトのままで良い。
$ winemine
とやって、ゲームが動けば、動作確認である。

フリーの Windows 用の書き込みソフト
H8ライター+H8工作+PIC工作から、H8W_036b.zip をダウンロードする。

$ unzip H8W_036b.zip
$ cd H8W
$ wine h8w.exe
これで、書き込みソフトが起動する。

・SH-2 ボード上のジャンパーを接続する。
・パソコンのシリアルポートと SH-2 ボードのシリアルポートをストレートケーブルで接続。
・SH-2 ボードの電源を入れる。
・書き込みソフトの「書き込み制御ファイル」で「7144_45_F48M_P384.MOT」を選択
・「COM Port」「COM1」
・「Baud (B)」「19200」
・「Baud (P)」「38400」
・「書き込むファイル」ボタンを押し、「目的となる sampleRom.mot」を選択する。
・「書き込み開始」ボタンを押す。
・しばらく、時間がかかるが、プログラムを書き込む事ができる。
・SH-2 ボードの電源を切る。
・書き込みソフトを終了。

動作試験
ターミナルソフトをインストールしていなければ、kermit をインストールしておこう。

# apt-get install ckermit 

~/.kermrc と言うファイルを作り、

set line /dev/ttyS0
set speed 38400
set carrier-watch off

$ kermit
で、kermit がスタートする。
C-Kermit>
と言うプロンプトが出たら、「c」とエンターでターミナルがスタートする。

・SH-2 ボード上のジャンパーを切る。
・パソコンのシリアルポートと SH-2 ボードのシリアルポートをストレートケーブルで接続。
・SH-2 ボードの電源を入れる。

これで、サンプルソフト(いわゆる哲学者の食事の問題)が、表示されれば、成功である。
なお、kermit を止めるには、コントロール+「\」に続いて、「c」を押し、

C-Kermit>
と言うプロンプトが出たら、「exit」とコマンドを入れる。

私のパソコンには、シリアルポートが付いており、全く問題なく、ROM にプログラムが書き込めた。
シリアルポートの無いパソコンの場合、USB 等のシリアルポートからプログラミングができるかどうかは試していない。誰か、やってみたら、結果を教えてほしい。

| | Comments (0) | TrackBack (0)

October 05, 2006

SH-2 Linux上でのリアルタイム OS 開発環境 (その2 リアルタイムOS編)

Interface 6月号付録の SH-2 基板に、Linux 上でプログラミングについての第二回目として、リアルタイムOS について述べる。

HOSのダウンロード
リアルタイム OS は、フリーの ITRON 4.0 である HOS を用いた。

HOS には、リリース版の V4 と、開発版の V4 Advance がある。
本当は安定版である V4 の方が良かったのだが、V4 Advance のお知らせに「Interface2006年6月号付録SH2基板で動き始めました」とあったので、V4 Advance を使うことにした。だが、V4 Advance は、開発途中ということもあり、今後、変更される可能性も高いので、V4 にすべきだったかと思うこともある。

さて、HOS-V4 Advance のソースコードをダウンロードするのだが、これは、cvs を使う必要がある。もし、Debian Linux で、cvs をインストールしていなければ、

# apt-get install cvs
として、cvs をインストールしておくこと。

$ cd ~/
$ cvs -d:pserver:anonymous@cvs.sourceforge.jp:/cvsroot/hos login
Logging in to :pserver:anonymous@cvs.sourceforge.jp:2401/cvsroot/hos
CVS password: (パスワードは、改行のみ)
$ cvs -z3 -d:pserver:anonymous@cvs.sourceforge.jp:/cvsroot/hos co hos/hos-v4a
$ cvs -d:pserver:anonymous@cvs.sourceforge.jp:/cvsroot/hos logout
Logging out of :pserver:anonymous@cvs.sourceforge.jp:2401/cvsroot/hos

カーネルモジュールを作る

$ cd ~/hos/hos-v4a/kernel/build/sh/sh2/gcc
$ make -f gmake.mak

サンプルプログラムを作る

$ cd ~/hos/hos-v4a/sample/sh/sh7144/gcc/

ここで、gmake.mak の中の

h4acfg-sh2.exe を h4acfg-sh2 に変更する。

$ make -f gmake.mak

これで、sample.mot が作成される。
ただし、この sample.mot は、RAM 上で動作するものらしい。RAM を追加していない SH-2 基板では動かないようなので、動作チェックしていない。

ROM 化
HOS を使ったプログラムを ROM 化し、SH-2 内蔵のフラッシュ ROM に書き込めるようにした。

何故、ROM 化するかと言うと、SH-2 に RAM を接続すると、せっかく沢山ある I/O ピンの多くが使えなくなってしまうからだ。
また、実際に組み込み用途に使うことを考えると、電源を入れる度に、母艦となるパソコンから RAM にプログラムをアップするよりも、ROM 化した方が便利だ。

もう一つ、MMU が無く、メモリ保護の無い SH-2 のような CPU の場合、RAM 上にロードしたプログラムを書き換えてしまう可能性があるからだ。
万一の場合、ウォッチドックタイマなどで緊急対策用のプログラムに飛ぶように作っていても、飛び先のプログラムが消えていては何にもならない。その点、書き換えできない ROM 上にプログラムがあれば、大丈夫だ。もっとも、SH-2 で、そんな信頼性の必要なプログラムをするか、どうかは別問題だ。まさか、宇宙船の制御をするつもりなわけじゃない。(事も無いことも無いこともない・・・・・)

ROM 化のデメリットとしては、SH-2 の内蔵 ROM の書き換え回数は 100 回だそうで、これが制約になりかねない。
また、ROM 化すると、モニターが無いのでデバッガーを走らせられない事もデメリットと言われそうだ。実は、私はデバッガーを使わない人なので、この点については全く困らない。特にタイミングが命のリアルタイム OS だと、デバッガーを使ったデバッグは余り意味が無いので、この点は余りデメリットとはならないと思うのだが、いかがだろう。

ROM 化するプロセスを再現すると長くなるので、すぐに ROM 化できるようなサンプルプログラムを用意しておいた。

下記のファイルをダウンロードする。
「sh7144rom.tar.gz」をダウンロード
(もし、ダウンロードしたファイルが「sh7144rom.tar.gz.gz」になっていたら、「sh7144rom.tar.gz」にリネームすること。)


$ cd ~/hos/hos-v4a/sample/sh/
$ tar zxvf sh7144rom.tar.gz
$ cd sh7144rom/gcc/
$ make -f gmake.mak

これで、ROM に書き込める sampleRom.mot ができる。
なお、sh7144rom.tgz に入っている regs_sh7144.h だが、元々のファイルのレジスタアドレスがいくつか間違っていたので訂正しておいた。ただし、全てを修正し尽くしたわけではないので、注意してもらいたい。

| | Comments (1) | TrackBack (0)

October 04, 2006

SH-2 Linux上でのリアルタイム OS 開発環境 (その1 クロスコンパイラ構築編)

Interface 6月号付録の SH-2 基板を、Linux 上でプログラミングし、リアルタイム OS (HOS)を使い、更に rom 化して、SH-2 内蔵の rom に書き込む方法について述べる。
今回は、第一回目として、Linux 上でのクロスコンパイラ構築方法について述べる。

私の Linux は、Debian Linux 3.1 Sarge であるが、大概の Linux なら同様の方法で、クロスコンパイラが構築できると思う。また、私の Linux 環境にはセルフコンパイル用の gcc 等のインストールは既に済んでいる。もし、セルフ用 gcc 等のインストールが済んでいない人は、そこから行ってほしい。

まず、必要なソースファイルのダウンロードを行う。
GCCソースコードの在処
BINUTILSソースコードの在処
NEWLIBソースコードの在処

上記のリンク先から、下記のファイルをダウンロードする。
・binutils-2.17.tar.gz
・gcc-3.4.6.tar.gz
・newlib-1.14.0.tar.gz
なお、私のダウンロードしたバージョンは、その時点での最新のソースファイルをダウンロードしただけである。(gcc は、3.4 系列での最新)

ダウンロードしたファイルは、「~/src/」ディレクトリに入れておく。

以下のコマンドを実行する。なお、文頭が「$」はユーザーモードで、「#」はrootモードで実行すること。

解凍

$ cd ~/src/
$ tar zxvf binutils-2.17.tar.gz
$ tar zxvf gcc-3.4.6.tar.gz
$ tar zxvf newlib-1.14.0.tar.gz

binutils の構築

# mkdir /usr/cross
$ cd ~/src/binutils-2.17
$ ./configure -target=sh-elf -prefix=/usr/cross -disable-nls
$ make
# make install

~/.bashrc を編集し

 PATH=/usr/cross/bin:$PATH ; export PATH
を追加し、一度ターミナルを終了するか、ログアウトして、PATHを反映しておく。

gcc の構築

$ cd ~/src/gcc-3.4.6
$ ln -s ../newlib-1.14.0/newlib .
$ mkdir dist;cd dist
$ ../configure -target=sh-elf -prefix=/usr/cross -with-gnu-as
-with-gnu-ld -with-newlib
-with-headers=~/src/newlib-1.14.0/newlib/libc/include
--enable-languages="c,c++"
$ make
# PATH=/usr/cross/bin:$PATH ; export PATH
# make install

なお、上記の「../configure」は、本来、一行で入力するのだが、表示上複数行に分けて居るので、注意して欲しい。

これで、クロスコンパイラの構築は終了である。
なお、gcc の make などは、意外と時間がかかるので、のんびりできるときに行った方が良い。

| | Comments (0) | TrackBack (0)

September 20, 2006

SH-2

E069先の三連休は、模型飛行機を飛ばしたくても、台風13号が近付いていって、とても飛ばせる天候では無かった。せっかく、ゴムを大量に購入して準備をしていたのだが、仕方が無い。

そこで、SH-2 のマイコンボードを作って遊んでいた。新たに購入したのでは無く、Interface 誌の 6 月号の付録である。最近の雑誌には、付録にマイコンとか FPGA が付いていて面白い。とは言え、付録の付いた雑誌は買うには買うが、実際に作って見ることは滅多に無い。2年も前のトランジスタ技術の付録の H8 基板も、そのままになっている。今回は、ちょっと必要に迫られたところもあって、Interface 誌の SH-2 基板を作ってみた。

作ったと言っても、QFP の CPU は既に半田付けしてあって、新たに半田付けするのは D-Sub 等のコネクタ類だけだ。こんな半田付けは、あっと言う間に終って、早速、電源を接続する。予め書き込んであるテストプログラムが走って、動作確認終了である。

まあ、ここまでは普通だが、Interface 誌の記事通りにしても面白くないので、開発環境は Linux 上に作った。
まずは、binutls や gcc を、SH-2 用にクロスコンパイルできるように構築した。この辺は、やりなれている作業なので、楽に進む。(ちなみに私のPCには、H8 や SH-3、Zaurus、PIC 用とクロス開発用のアセンブラやコンパイラが山ほど入っている。究め付けは FPGA 用の VHDL コンパイラだろう)

だが、この先で困った。コンパイルしたプログラムを SH-2 の ROM に書き込む方法が無いのだ。普段なら、Linux からは、「Open SH/H8 writer h8writer」と言うプログラムで書き込むのだが、このプログラムは、同じ SH-2 でも旧いタイプの 7045F までしか対応していない。今回使った Interface 誌の付録は、新しい 7144F なので、書き込めないのだ。
結局、ネット上を探しても Linux で使える 7144F 用のライティングプログラムは見付からなかった。また、「Open SH/H8 writer h8writer」のソースコードは公開されているのだが、簡単に改造できるようでは無かった。

そこで、ちょっとインチキな方法で書き込むことにした。H8W (H8ライター+H8工作+PIC工作)と言う Windows 用のライティングプログラムを使ったのだ。 Windows 用のライティングプログラムを、Wine で動かして、書き込みに成功したのだ。
Wine は、Linux 上で Windows アプリを動かすエミュレーターだが、簡単なソフトなら意外と使いものになる。
私の場合、3D 表示のソフトとサウンドを使ったソフトは動かない。今回は、シリアルポートを叩くソフトなので、ちょっと心配したが、問題なく動いた。なお、 Wine は、まだ正式リリース前で、毎週のようにバージョンアップしているが、私が使ったバージョンは、ちょっと前の 0.9.6 だ。(Linux の方は、もちろん Debian Linux 3.1 Sarge)

さらに調子に乗って、リアルタイム OS のポーティングにも挑戦した。
リアルタイムOS は、フリーの ITORN 仕様のHOS である。HOS-v4a には、元々、SH-2/SH7144F のサンプルが入っているのだが、あいにくモニター使用時用の RAM 上で動作するものであった。だが、ROM で使いたかったので、RAM 用のサンプルプログラムを元にネット上の情報を参考に ROM 化に成功した。
(この辺、要望があるようなら、ソースコードとか公開しようと思うが、どうでしょう?)

まあ、リアルタイム OS のポーティングを含めると三連休を、ちょっとハミ出たが、全く SH-2 を触った事がない時点から始めて、ここまでやったのだから早い方だろう。

さて、リアルタイム OS までポーティングしたのだから遊べるだろう。調べてみると SH-2/7144F は、シリアルポートが、4 チャンネルもあるので、これだけでも色々と試すことがありそうだ。

と言うわけだが、一体、何に「ちょっと必要に迫られた」のかは、少しだけ秘密である。

| | Comments (2) | TrackBack (0)

August 12, 2005

夏休み工作シリーズ 第2段 Zaurus 用外部キーボード・インターフェース

主要部品代、わずか 300 円で作れるリナザウ用の外部キーボード赤外線インターフェースを紹介する。
キーボードの無い SL-A300 でも、動作確認済みだ!
el0010これが、実際に使って居る写真だ。
(家に転がって居た中で、一番小さいケースを使ったんだけど、大き過ぎた)

私の使って居る Zaurus は、SL-C760 なので、小さいとは言えキーボードが付いて居る。だが、小さすぎて、とてもタッチタイピングできないし、SL-A300 のようにキーボードが付いて居ない機種もある。
公式的には、リナザウ用の外部キーボードは無いようだ。ただし、SL-C1000 や SL-C3x00 以降の新しい Zaurus なら、USB のホストを持って居るので、USB キーボードを接続する方法がある。
しかし、SL-A300 SL-B500 SL-C7xx SL-C860 のようなちょっと旧式の機種には、USB のホスト機能が無いので、USB キーボードは使えない。

このような旧式のリナザウに Palm 用等の外部キーボードを接続する試みは、ネット上で幾つか公開されて居る。

PS/2キーボードはSLザウルスの周辺機器となるか?
Linux ZaurusにPS/2キーボードを繋ぐ
ぱたぱたキーボードを LinuxZaurus に接続する(ハード編)ぱたぱたキーボードを LinuxZaurus に接続する(ソフト編)
IRK(赤外線キーボード)のすすめ

最初のリンクは、PS/2 キーボードを IrDA に変換する IrKB101 を使う話だが、肝心の IrKB101 が生産終了で入手困難だ。
次のリンクは、PS/2 キーボードを、3番目のリンクは Palm 用の外部キーボードを Zaurus のデータ同期用のシリアルインターフェースと接続する話だ。だが、私は、この方法は推薦しない。Zaurus のデータ同期用のシリアルインターフェースのコネクタは、配線が難しいので、余程、ハンダ付に自信がある人以外は、試さない方が良い。下手をすると、Zaurus に永久的な破損を与える可能性がある。
最後のリンクは、Palm 用の IrDA インターフェースの外部キーボードを Zaurus で使う話だ。配線は必要無く、ソフトウエアだけの対応だし、Palm 用の IrDA インターフェースの外部キーボードは入手可能なので、一番実現性が高い。
実は、私も買おうか、どうしようかと、現物を見に行った。価格が高い(税込9,800円)事と、ぱたぱたキーボードと言うには、意外と大きく重いので、買うのを躊躇してしまった。

そうこうして居るうちに、PIC と赤外線 LED だけで、IrDA 通信できることが判った。(詳細は「夏休み工作シリーズ 超低コスト 非接触型電圧プローブ」を参照のこと)
それなら、PIC と赤外線 LED で、PS/2 キーボードから IrDA への変換器が作れるだろうと挑戦したのが、今回の工作だ。PS/2 キーボードなら、色々な形状大きさの物が入手可能だし、わざわざ持ち運ばなくても出先に転がって居る可能性も高い。また、赤外線通信機能を使うので、工作に失敗しても、Zaurus を壊す可能性が少ない。

例によって、例のごとく、私は極端な「シンプル・イズ・ベスト」派なので、徹底的に回路を簡素化した。

部品は以下の通りだ。
・PICF629 (140円@秋月) 1個
・赤外線 LED (30円@秋月) 1個
・miniDIN 6ピン・ソケット (120円@千石) 1個
・470Ω抵抗 (5円@千石) 1個
・33KΩ抵抗 (5円@千石) 1個

el0011このコンバータは、PS/2 キーボードの出力を、そのまま、IrDA の規格(SIR 1.0)の 9600 ボーで送るだけだ。
本来、PS/2 キーボード・インターフェースは、双方向だが、今回は簡略化のためにPS/2 キーボードから Zaurus への一方通行にして居る。このため、キーボードのスキャンコードの変更とか、CAPS LOCK/NUM LOCK ランプの点灯は行えないので、注意してもらいたい。

キーボードの出力コードを IrDA に変換しただけでは、Zaurus で、使うことはできない。
IRKでぱたぱたを使えるようにしよう で、公開して居る irk-zaurus-j_0.11.1f-tp4_arm.ipk のソースコードを改修した。
正直、私の改修した部分は、まだ、十分に熟成したプログラムでは無い。PS/2 キーボードのスキャンコード・テーブルを追加して、なんとか、入力だけはできるようになっただけだ。
それでも、オープンソースとして公開した方が、今後の展開は速いと思うので、公開する。

【作り方】
まず、プログラムを PIC に書き込む。(プログラムは、まとめて此の記事の末に載せた)
PIC への書き込みは、「夏休み工作シリーズ 超低コスト 非接触型電圧プローブ」と同様に、RCDライタの製作と、WinPic日本語版を使った。

el0012配線は、簡単だが、PS/2 用の miniDIN コネクタのピン配置が分りにくいので、図に書いて置いた。
電源は、PS/2 キーボードが、5Vを必要とするので、必然的に5Vになる。私は、#2ソケットを付けて、Zaurus 用の AC 電源から供給できるようにしている。なお、新型乾電池オキシライド(単三型)×3本でも、動作を確認して居る。オキシライドは、電圧が高く約 1.7V なので、3直列で5V用のPS/2 キーボードが動くかと試したのだが、見事に動いた。

なお、回路図中では、GP4 は空いて居るが、実はここに、スキャンコードをシリアルで出力して居る。MAX232 のようなレベルコンバータを通したら、通常の COM ポートでも受信できる。形式は、9600 ボー 8N1 だ。なお、論理反転させて、電圧を 3.3V にすれば、 Zaurus のデータ同期用のシリアルインターフェースと接続する事も可能かもしれない。だが、既に述べたように、Zaurus のコネクタは、配線が難しいので、この方法は推薦しない。

【irk-zaurus-j_0.11.1f-mad0_arm.ipk】
Zaurus 側のプログラムは、ipk になって居るので、普通にインストールする。ただし、インストール中に、リセットがかかるので、注意されたい。

el0013el0014PS/2 キーボードから入力する時は、インプットメソッドの選択(▲マークをタップ)で、irk(デフォルトのままだと、JP106となって居る筈)を選ぶ。

irk のコントロールバー(表示されてなけば、左下のアイコンをタップ)のONを選ぶ。


この状態で、赤外線 LED を IrDA ポートに近付けると、PS/2 キーボードから入力できるはずだ。

また、英数字と日本語の切り替えは、『全/半』キーで行う。(ALT +『全/半』ではないので、注意!)
PS/2 キーボードからの入力をやめる時は、OFFにした後、インプットメソッドの選択で、irk 以外を選ぶ。

「Setting」ボタンで、設定画面が表示される。

el0015PS/2 キーボードが、日本語キーボードなら「JP106」を、英語キーボードなら「US102」を選ぶ。
(私は、英語キーボードを持って居ないので、スキャンコードが正しいか、確認して居ない)

設定が反映されなかったり、調子が悪い時は、一度、インプットメソッドの選択で、irk 以外を選んだ後、もう一度、irk を選ぶと良いようだ。
それでも駄目なら、リセットしてみる。

既知のバグとして、
・「_」(半角下線)が入力できない。
・「・」(全角の中央点)が入力できない。
・シフト+カーソルキーが使えない。
・テンキーが使えない。
 (写真でも分かるが、私のキーボードは小型でテンキーが無い。このため、スキャンコードの確認ができないため)
等がある。

Zaurus に限らず、その他の機器(PDA とか携帯電話)の入力に使えたら教えて下さい。

キーボードの無い Zaurus でも、PS/2 キーボードから入力する方法が分かったから、SL-AXXXX のような縦型 Zaurus シリーズが復活しないかなあ。

ライセンス・プログラム等

本当は、ハードウエアの回路については、著作権を放棄したい(余りにも簡単すぎるから)ところだが、日本の法律上、著作権の放棄はできんらしいので、著作権は野田篤司に帰属するが、誰でも自由に使って良いものと宣言する。

PIC 側のプログラムは、BSD ライセンスとする。

インプット・メソッド irk は、GPL。

なお、既に述べているが、インプット・メソッド irk の内、私の改修した部分は、まだまだ成熟の足りないプログラムだ。使用に関しては、くれぐれも自己責任でお願いしたい。

【PIC側プログラム】
pickeyir.lzh
 ソースファイルとアセブリ済みの HEX ファイル、ソースは、MPLAB でアセンブルできる。
 何を書き込むかについては、含まれる readme を参照のこと。

【Zaurus 用 インプット・メソッド】
irk-zaurus-j_0.11.1f-mad0_arm.ipk
 ipk になっているので、簡単にインストールできる。
 SL-A300 とSL-C700 で、動作確認。

【Zaurus 用 インプット・メソッド プログラム・ソースコード】