LapisさんのLazuriteを1/256倍ぐらい使う記事 (まだ書き途中)

この記事について
==============

Lapisさんの[Lazurite](http://www.lapis-semi.com/lazurite-jp/)を、ちょっとイレギュラーな方法で遊んでみようと思います。
実用性はあまり考えてません。
筆者のところでは[Lazurite 920J](http://www.lapis-semi.com/lazurite-jp/products/lazurite-920j) で試していますが、オリジナルのLazurite SubGHzの方もだいたいうまくいくかと思います。

記事は気長に段階的に更新していこうと思います。


まずは、LazuriteIDEの動きを観察してみる
---------------------------

そもそも、[LazuriteIDE](http://www.lapis-semi.com/lazurite-jp/download)を *そのまま使うつもりはない* のですが、
どんな具合でコンパイラ等々を叩いてるのか、とか、焼き込みはどのコマンド使ってるのか、とかを見てみます。

IDEのフォルダ構成を眺める
----------------------

デフォルトのインストール先は `C:/LazuriteIDE/` になっています。
とりあえず、ここにインストールされている前提で話を進めていきます。
コマンドラインからビルドすることを前提に考えると、興味あるのは

- `bin/`
- `hardware/`

の2つのフォルダだけです。

### `bin/`
文字通り実行のバイナリが入っています。
bin/直下には、

<dl>
 <dt>bin_hex_converter.exe</dt>
 <dd>hexとバイナリの変換を行う</dd>
 <dt>lazurite_ft232_ctrl.exe</dt>
 <dd>FT232のGPIOピンを操作して、Lazuriteを書き込みモードに遷移させる</dd>
 <dt>XYM.exe</dt>
 <dd>XMODEM方式(懐)でバイナリをLazuriteに送信する</dd>
</dl>

みたいな、主に書き込み関連のツールが入っています。


### `bin/U8Dev/`

ツールチェーン一式が入っています。古めかしいIDEやICEのツールとかも入っているみたいですが、
使うことはないでしょう、


### `bin/U8Dev/Doc/`

地味に大事なドキュメントフォルダです。
コンパイラとCPUの命令セットは入ってますが、何故かペリフェラル類のドキュメントが抜けてるので、
[ML620Q503/Q504 ユーザーズマニュアル](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwjF-PqH2svQAhXCupQKHbZyAJ4QFggcMAA&url=http%3A%2F%2Fwww.lapis-semi.com%2Fjp%2Fdata%2Fuser%27s%2520manual-file_db%2Fmiconlp%2FFJUL620Q504-01.pdf&usg=AFQjCNGsuL7IqKQoxPh5nX8ZrR9nDlgahg&sig2=7NfQPocGZZtXIknlGBOlZw) も一緒に
入れておくと良いかと思います。

### `hardware/lazurite_subghz/`

主にソースが入っています。

### `hardware/lazurite_subghz/ml620q504/`

ペリフェラル類のドライバです。微妙に下記のlazuriteのフォルダの中身と相互依存しています。

### `hardware/lazurite_subghz/lazurite/`

Arduinoとだいたい互換のAPIの実装が入っています。オリジナルのArduinoのC++と違って
Cで実装しているので、使用感の似たAPIといった方が良いのかもしれません。

### `hardware/lazurite_subghz/sub_ghz/`

Lazuriteの無線モジュール(bp3596)のドライバが入っています。
コンパイルするとワーニングがいっぱい出ます。


ビルドの動き
----------

この辺りはわりあい素直で、LazuriteIDEのウィンドウに
実行しているコマンドラインが表示されるので、それを追っていくとだいたい理解できます。

1. コンパイラ(ccu8),アセンブラ(rasu8)でcファイルからobjファイルを生成 (.c -> .asm -> .obj)
2. objファイルをライブラリアン(libu8)まとめて、libファイルを生成 (.obj -> .lib)
3. libファイルとobj(startup部分) をリンカ(rlu8)くっつけて、HEXファイルを生成
4. HEXファイルをバイナリに変換

ここで実行しているような感じでコマンドを叩いてあげれば、
実行ファイルが出来そうな感じです。

書き込みの動き
------------
書き込みもわりかしシンプルな動きです。ウィンドウにコマンドが表示されないので、
子プロセスの起動が見えるような[ツール](http://www.rohitab.com/apimonitor)みたいなのを
使って、起動しているコマンドを追っかけて行きます。

2. lazurite_ft232_ctrl.exe で TEST0,1端子を上げ下げして書き込みモードに。
3. XYM.exeでファイルを転送
4. lazurite_ft232_ctrl.exe で TEST0,1端子を上げ下げしてリセット

XMODEMを使ったファイル転送がレガシィな感じで素敵です。
この辺も、あまり特殊なことはやってなくて、素直にコマンド叩いているという感じです。


ビルドの方と合わせて、この辺のコマンドを実行すれば、
イメージの作成から、Flashへの焼き込み、実行ができそうです。




AWESOME toolchain
====================

このLapis Semiconductorのu8向けコンパイラ、かなり癖あるというか、
とってもイカ~~れた~~したコンパイラです。

- C89対応、規格が古いのでgccでコンパイル通るコードで通らないものがいっぱい。
- 変数名やマクロ名に最大31文字の制限がある。
- LFNにちゃんと対応していない。DOS時代の8.3形式でないと受け付けないところがある。

ちょっと色々試してみると…

```test.c
int test() {
	return 1;
}
```

```compile.cmd
C:\Users\user>ccu8 /TML620504F test.c  <--- これはOK
C:\Users\user>copy test.c test-function.c
C:\Users\user>ccu8 /TML620504F test-function.c  <--- NG. ファイル名にハイフンが入ってると駄目
C:\Users\user>copy test.c testfunction.c
C:\Users\user>ccu8 /TML620504F testfunction.c  <--- OK. ファイル名にハイフンが入ってなければ通る
C:\Users\user>copy test.c te-st.c
C:\Users\user>ccu8 /TML620504F te-st.c  <--- NG. LFNでなくてもハイフンはNG
```

ファイル名のハイフンは駄目、だけど... 


```test-2.h
extern int test2();
```

```test2.c
#include "test-2.h"

int test2() {
	return 2;
}
```

```compile.cmd
C:\Users\user>ccu8 /TML620504F test2.c  <--- OK. includeで見るヘッダファイルでのハイフンはなぜか許される
```

なかなか奇怪な挙動です。


```includedirectory/test3.h
extern int test3();
```

```test3.c
#include "test3.h"

int test3() {
	return 3;
}
```

```compile.cmd
C:\Users\user>ccu8 /TML620504F /Iincludedirectory test3.c  <--- NG. /IはLFNを受け付けない
C:\Users\user>ccu8 /TML620504F /IINCLUD~1 test3.c  <--- OK. 8.3形式のディレクトリ名ならいける。
```

/IにLFNは駄目。だけど、

```compile.cmd
C:\Users\user>copy test3.c longfilenametest3.c
C:\Users\user>ccu8 /TML620504F /IINCLUD~1 longfilenametest3.c  <--- OK. ファイル名はLFNで通る。
```

/Iが駄目なら#includeはどうか？

```test3x.c
#include "includedirectory/test3.h"

int test3() {
	return 3;
}
```

```compile.cmd
C:\Users\user>ccu8 /TML620504F /I. test3x.c  <--- OK. プリプロセッサのinclude文はLFNで通る。
```

文法で影響あるのは、シンボルの31文字制限.

```test_longfunc.c
char* lazurite_is_awesome_iot_platform() {
	return "Lazurite is awesome iot platform.";
}
```

```compile.cmd
C:\Users\user>ccu8 /TML620504F test_longfunc.c
CCU8 C Compiler, Ver.3.41
Copyright (C) 2008-2013 LAPIS Semiconductor Co., Ltd.

test_longfunc.c
test_longfunc.c(1) : Warning : W3000 : Identifier truncated to 'lazurite_is_awesome_iot_platfor'

Error(s)     :  0
Warning(s)   :  1
```

途中で切られるので、

```test_longfunc2.c
char* lazurite_is_awesome_iot_platform() {
	return "Lazurite is awesome iot platform.";
}

char* lazurite_is_awesome_iot_platform_for_newbie() {
	return "Lazurite is awesome iot platform.";
}
```

のような場合、

```compile.cmd
C:\Users\user>ccu8 /TML620504F test_longfunc2.c
CCU8 C Compiler, Ver.3.41
Copyright (C) 2008-2013 LAPIS Semiconductor Co., Ltd.

test_longfunc2.c
test_longfunc2.c(1) : Warning : W3000 : Identifier truncated to 'lazurite_is_awesome_iot_platfor'
test_longfunc2.c(5) : Warning : W3000 : Identifier truncated to 'lazurite_is_awesome_iot_platfor'
test_longfunc2.c(5) : Error : E4030 : 'lazurite_is_awesome_iot_platfor' already has a body

Error(s)     :  1
Warning(s)   :  2
```

重複定義で死にます。
シンボル名の制限は引っかかると手が打ちづらいです。

もっとも、これがOKでも他のところで色々ひっかかるところがあるので、
githubからコロッとソース持ってきてコンパイルして使う、というのはちょっと無理がありそうです。


LLVMのCBackendを使ってアレコレする
==============

以下、後日更新。