前回からの続きです。
このテーマを最初からご覧になる場合はこちらからどうぞ。
サンプルドライバのソースコードのコピー
ここで言う「サンプルドライバ」とは、いわゆるラピステクノロジー社純正のライブラリパッケージであり、これを使用するとCPUに内蔵されているペリフェラル(周辺機器)を簡単に利用することができるというものです。
今回の「TOPPERS/ASP ML62Q1000版」のカーネル内でも、割り込み、タイマーやシリアル通信ドライバなどは、このサンプルドライバを使用しています。
ところが、このサンプルドライバのソースコードのライセンスが原則公開禁止であるために再配布できません。
そのため「TOPPERS/ASP ML62Q1000版」のソースコードが不完全なものとなり、そのままではビルドが通らず、通すためには手動で不足分のソースコードをコピーしていただくという手間を強いることになってしまいました。
お手数をおかけして申し訳ない…。
では、そのサンプルドライバのソースコードを何処から入手すれば良いのか?
もう一度、ML62Q1000マイコンスタータキット「SK-BS01-D62Q1577TB」に同梱されているDVD-ROMのトップディレクトリから「ML62Q1000_MCU_StarterKit」というディレクトリをダブルクリックします。
すると、以下のようなディレクトリになってると思います。
更に「MCU_SampleProgram_v200.zip」という圧縮ファイルをパソコンの何処へでも良いのでコピーします。
コピーした「MCU_SampleProgram_v200.zip」を解凍すると、以下のようなディレクトリが展開されます。
この中の「Software_LEXIDE」ディレクトリをダブルクリックします。
移動したディレクトリの中の「driver」ディレクトリ、この中にサンプルドライバのソースコードがギッシリ入っています!
この「driver」ディレクトリをTOPPERS/ASPのソースツリーの以下に示すのパスの直下に丸ごとコピーしましょう。
(「asp_ml62q1000_u8dev」や「asp_ml62q1000_u8dev_master」を「asp_1.9.2」に改名した場合。)
C:\cygwin64\home\morita\asp_1.9.2\arch\xn_u16_100_u8dev
これで、サンプルドライバのコピーは完了です。
ここまでは簡単ですが、面倒なのはこの次…。
スタートアップファイル「start.asm」のコピーと修正
ターゲットに電源が入った後、いの一番に実行されるアセンブラのソースコード「start.asm」を作成します。
一から書くのは大変なので、既に用意されているものをベースに作成しましょう。
元となるソースコードは、「ML621577.ASM」という名前で以下のパスに配置されています。
ターゲットCPUの型番が名前になってます。
似たような型番があるので間違えないようにしてください。
C:\U8Dev\Startup\Src
この「ML621577.ASM」を以下のディレクトリにコピーします。
C:\cygwin64\home\morita\asp_1.9.2\target\rb_d62q1577tb100_u8dev
ついでに、今コピーした「ML621577.ASM」を「start.asm」に改名しておきましょう。
続きまして、改名した「start.asm」をテキストエディターなどで開き、以下の部分を修正します。
元の「ML621577.ASM」で言うところの14行目付近からの…
- ...
- model large
- romwindow 0, 0afffh
- extrn code: _main
- extrn data near: _$$SP
- public $$start_up
- ...
…という部分を以下のように修正します。
- ...
- model large
- romwindow 0, 0afffh
- ;extrn code: _main ; コメントアウト!
- extrn code: _sta_ker ; 追記!
- extrn data near: _$$SP
- public $$start_up
- ...
アセンブラソースにおいて「;」はコメントを意味します。
これは、普通のファームウェアが「main()」関数から始まるのに対し、TOPPERS/ASPカーネルを使用する場合は「sta_ker()」という関数から始まるため、このファイルの外にある「sta_ker()」関数を使用するための宣言です。
実際に「sta_ker()」関数へジャンプする部分は、この後実装します。
さて、次の修正です。
21行目付近からの…
- ...
- cseg at 0:0h
- dw offset _$$SP
- cseg at 0:4h
- dw $$brk_reset
- ...
…という部分を以下のように修正します。
- ...
- cseg at 0:0h
- dw offset _$$SP
- cseg at 0:2h ; 追記!
- dw $$NCODml621577lw ; 追記!
- cseg at 0:4h
- dw $$brk_reset
- ...
これは、外部リセットの際のベクタを追加しています。
これを省くと、デバッガが使えなくなっちゃうので要注意です。
さてさて、お次は…。
204行目付近からの…
- ...
- ;---------------------------------------------------------------
- ; far jump to main routine
- ;---------------------------------------------------------------
- b _main
- ...
…という部分を以下のように修正します。
- ...
- ;---------------------------------------------------------------
- ; far jump to main routine
- ;---------------------------------------------------------------
- ;b _main ; コメントアウト!
- b _sta_ker ; 追記!
- ...
更に更に…。
250行目付近からの…
- ...
- cseg #03 at 0ffd0h ; address
- dw 0fffdh ; 0ffd0h
- ...
…という部分を以下のように修正します。
- ...
- cseg #03 at 0ffd0h ; address
- ;dw 0fffdh ; コメントアウト!
- ; 0ffd0h
- dw 0fff8h ; 追記!
- ; コードオプション0(CODEOP0)に該当する.
- ; ウォッチドッグ関連ビット(WDTNMCK,WDTSPMD,WDTMD)を全て0に設定する.
- ; ウォッチドッグを使用する場合は適切な値に設定すること.
- ...
これはアドレス「0ffd0h」という場所に「0fffdh」という値に替えて「0fff8h」という値を配置しています。
プログラムメモリ空間の「0ffd0h」というアドレスは「CODEOP0」というコードオプション領域に該当します。
コードオプションというのは、リセットが掛かるとマイコンが自動的に読みに来るパラメーターのことであり、CPUの動作モードやウォッチドッグなどの基本的な設定を書いておく領域のことです。
上記の例では、このコードオプション「CODEOP0」に対し、ウォッチドッグ機能を無効化するように設定しています。
こうしておけばリセット後のマイコンは、ウォッチドッグ機能が無効化された状態で動作を開始するようになります。
コードオプションの設定はもう一箇所!
「CODEOP0」のすぐ下、253行面付近からの…
- ...
- cseg #03 at 0ffd2h ; address
- dw 0ffffh ; 0ffd2h
- ...
…という部分を以下のように修正します。
- ...
- cseg #03 at 0ffd2h ; address
- ;dw 0ffffh ; コメントアウト!
- ; 0ffd2h
- dw 0fffdh ; 追記!
- ; コードオプション1(CODEOP1)に該当する.
- ; CPUの動作モードを「ウェイトモード」に設定する
- ...
これはアドレス「0ffd2h」という場所に「0ffffh」という値に替えて「0fffdh」という値を配置しています。
プログラムメモリ空間の「0ffd2h」というアドレスは「CODEOP1」というコードオプション領域に該当します。
上記の例では、このコードオプション「CODEOP1」に対し、CPUの動作モードを「ウェイトモード」に設定しています。
ML62Q1000マイコンには「ノーウェイトモード」と「ウェイトモード」の二種類があります。
前者が初期値です。
二つのモードの違いは、マイコンのデータシートを熟読していただく必要がありますが、今回は「ウェイトモード」を使用することとします。
以上で「start.asm」の修正は終わりです。
修正が終わったら、忘れずに「start.asm」を保存してください。
コマンドラインでのビルド
さて、これで全ての準備は整いました。
お疲れ様でした~!!
早速ビルドしてみましょう。
Cygwinを開いて、TOPPERS/ASPソースツリーの場所まで移動しましょう。
$ cd asp_1.9.2/
次にその直下の「OBJ」ディレクトリに移動します。
$ cd OBJ/
コンフィギュレーターのパーミッションを実行可能に設定します。
$ chmod 755 ../cfg/cfg/cfg.exe
ラピステクノロジー社のアセンブラである「rasu8」が出力した「.prn」ファイルから依存するファイルを書き出す「makedepu8.exe」という自作ユーティリティのパーミッションを実行可能に設定します。
$ chmod 755 ../arch/xn_u16_100_u8dev/utils/makedepu8.exe
ラピステクノロジー社のリンカである「rlu8」が出力した「.map」ファイルからシンボル情報ファイル「.syms」を生成する「nmu8.exe」という自作ユーティリティのパーミッションを実行可能に設定します。
$ chmod 755 ../arch/xn_u16_100_u8dev/utils/nmu8.exe
自作ユーティリティの「makedepu8.exe」も「nmu8.exe」も、ラピステクノロジー社のアセンブラやリンカが更新されて出力形式が変わってしまえば、正常に動かなくなるかもしれません。
可能性は低いですが、その際に修正できるように、それぞれのソースコードも「exe」と同じディレクトリに置いておきますね。
その場合は「../arch/xn_u16_100_u8dev/utils/」ディレクトリに移動して、以下のようなコマンドを打てば、コンパイルできます。
「makedepu8.exe」を作る場合は…
$ gcc -o makedepu8.exe makedepu8.c
「nmu8.exe」を作る場合は…
$ gcc -o nmu8.exe nmu8.c
さて、話を戻して…。
ここまで、大丈夫ですか?
そうしたら、プロジェクトのコンフィグファイル(sample1.cfg)の情報を元に、OSに必要な定義を記したソースコード(「kernel_cfg.c」と「kernel_cfg.h」)を生成します。
$ make depend
以下のような表示にならずエラーが出力される場合は、残念ながらこれまでの作業に誤りがあります。
お手数ですが、最初からご確認を!
ここまで上手くいったら、ホンチャンのビルド。
以下のコマンドを実行します。
$ make all
以下のように無事にビルドが通ったでしょうか?
本日はここまで!
とても煩雑な作業でしたが、お疲れ様でした。
コマンドラインではビルドが通るようになりましたので、次回はラピステクノロジー社純正のIDE(統合開発環境)「LEXIDE-U16」で開発できるようにプロジェクトを作りましょう。