こんにちは、しゅうです。
前回はPi:CoをUARTに対応できるようにしました。今回は、プログラムを書き込む準備と何が必要かの解説を少し行います。
書き込むためのツール
boostのインストール

初めに書き込みツールをコンパイルするときに必要となるライブラリをインストールします。こちらからダウンロードして、解凍したらboostのディレクトリごと/usr/local/includeにコピーしましょう。今回はver. 1.73で.tar.gzファイルとしてダウンロードしました。環境によっては、ダウンロード中に.tar.gzから.tarになったりするそうですが使用するコマンドは同じで問題ないです。以下のコマンドではXXXXはバージョンが入ります。
$ cd /[Path_to_where_boost_was_downloaded]/ $ ls boost* $ tar xvfz boost_XXXX.tar.gz $ cp -a ./boost_XXXX /usr/local/include/
次の画像は、僕の環境での解凍する前あたりの様子を示しています。

コピーが完了して、/usr/local/includeに無事boostが入ったことを確認したら、ダウンロードしたファイルや解凍したものは消しても問題ないです。
rxprog
MITライセンスで公開されているこちらのディレクトリをgit cloneして、rxprogのフォルダーをコピーしましょう。どこに保存しても問題ないとは思いますが、僕はRX-ToolChainフォルダーのsourceに保存しました。こちらを使うためにはmakeしなければなりませんが、その前にRX631用に書き換えていきます。
rx631_protocol.hpp
通信プロトコルが同じであるRX63Tの.hppファイル、rx63t_protocol.hppをコピーして、rx631_protocol.hppとして編集します。RX63Tという文字列をRX631に置き換えるほかにチェックサム関数を加えます。110行目あたりのsum_関数の次に以下のsum2_関数を用意しましょう。
uint8_t sum2_(const uint8_t* buff, const uint8_t* buff2, uint32_t len){
uint16_t sum = 0;
for(uint32_t i = 0; i < len; i++){
sum += *buff++;
}
for(uint32_t i = 0; i < 3; i++){
sum += *buff2++;
}
return 0x100 - sum;
}
そしてこのsum2_関数を430行あたりのinquiry_device関数に組み込みます。この関数の終わりの方で、sum_関数を使っているif文を次のif文に置き換えましょう。
if(sum2_(tmp, head, total - 1) != tmp[total-1]){
printf("%s\n", tmp);
printf("%x %x total = %d\n",tmp[total-1]&0x7f, sum_(tmp, total - 1), total);
std::cerr << "sum false" << std::endl;
return false;
}
rx_prog.hpp
次にrx_prog.hppファイルを書き換えていきます。まずはrx631_protocol.hppを#includeでインクルードしましょう。その後namespace rxの中にusing protocol_typeというものが宣言されているので、<>の中にrx631::protocolを書き加えましょう。そして、publicの中で、start関数が定義されています。そこで目標としているCPUの確認を行っているif文があるので、最後のelseの直前にRX631に関するif文を追加しましょう。
以上の編集内容を以下にまとめます。それぞれ該当箇所にて編集するようにしましょう。
//The files to include
#include "rx631_protocol.hpp"
//The protocol_type defined under namespace rx
using protocol_type = boost::variant<..., rx631::protocol>;
//The if statement for RX631 written in the start function
if(rx.cpu_type_ == "RX631") {
protocol_ = rx631::protocol();
}else
rx_prog.conf
次にrx_prog.confファイルに次のコードを書き加えてください。RX63Tのすぐ後(60〜70行目あたり)においておくと良いと思います。
R5F5631M {
group = "RX631"
clock = 1200
divide_sys = 8
divide_ext = 4
rom = 256K
ram = 64K
data = 32K
comment = "; RX631M Flash:256K DataFlash:32K RAM:64K"
rom-area = FFFC0000,FFFFFFFF
data-area = 00100000,00107FFF
ram-area = 00000000,0000FFFF
}
また、このファイルで定義されているport_osxに前回の記事で認識したモジュールのアドレスを書いておくと良いです。
main.cpp
次はmain.cppに4行ほど付け加えます。RX63Tに関するif文があるのでそのすぐ後に次のコードを加えましょう。
if(rx.cpu_type_ == "RX631"){
rx.master_ = 1200;
rx.sys_div_ = 8;
rx.ext_div_ = 4;
}
Makefile
最後に、Makefileも少し編集します。25行目あたりでifeq($(OS),XXXX)で使用しているOSの検出をします。ここでincludeファイルや先ほど保存したboostライブラリが保存されている先を指定しています。僕の環境では/usr/localに保存されているので、それに合うように編集を加えて、LOCAL_PATHとINC_SYS変数は以下のようになりました。
LOCAL_PATH = /usr/local
INC_SYS = $(LOCAL_PATH)/include \
$(LOCAL_PATH)/include/boost_1_73_0
他にも修正を加える箇所としては、Makefileの一番最後のinstall項目を書き換えます。今回は、.exeファイルが生成されたりしないので次のように書き換えましょう。
# cp $(TARGET).exe /usr/local/bin/. cp $(TARGET) /usr/local/bin/.
ここで一旦rxprogの中身をみてみると次のようになっていると思われます。赤い下線を引いているものは今回編集や新たに追加したファイルです。

これであとはmake, make installをしましょう。
$ make $ make install
再度rxprogの中身をみてみると、Makefileに書かれている実行内容が反映されているかの確認ができます。rx_progというバイナリファイル(次の画像においては赤い文字)とreleaseというオブジェクトファイル(.o)や依存関係を示すファイル(.d)が保存されているフォルダー(次の画像においては青い文字)があれば問題ないです。

rx_progが無事生成されていたら、/usr/local/binなどへパスがちゃんと引かれているかを確認しましょう。僕は、~/.zshrcファイルに書き込んでいます。source/rxprogにも一応パスを通していますが、makeでbinファイルをコピーしているので必要ないかもしれないですね。
$ echo $PATH
で必要なパスがちゃんと表示されれば次に進みます。通っていない場合は
source ~/.zshrc
をしたり、ターミナルを立ち上げ直したりして、再確認してみてください。
まとめ
以上で、Pi:Coにプログラムを書き込むためのツールの準備ができました。次回は、その書き込むプログラムを用意しながら少しずつ解説を行なっていきます。
