前回ROCK64からSPI通信でデバイスを動かそうとしていろいろと試作をしていたら、SPIのSCLKラインに外部から許容電圧を超える5Vの電圧を間違えて入れてしまい、このピンだけ無反応になってしまった。。。
仕事であればこの基板は即捨て対象になるが、あくまで個人のホビーであるし他の動作に対しての影響はなさそうなので
このまま使うことに。
とは言え外部デバイスとの通信手段がなくなるとこの先の検討がいろいろできなくなってしまうので、代わりにUARTによるシリアル通信の手段は確認しておくことにした。
ROCK64にはUART0, UART1, UART2が用意されているが、UART0は既にLinuxのコンソール用に予約されているので、自由に使えるUART1とUART2のみ。そのうち、今回はUART1を使えるようにしておく。
# ls /dev/ttyS* /dev/ttyS2
Linuxをブートした直後のデバイスの認識は/dev/ttyS2のみなので、デバイスツリーに/dev/ttyS1を認識させるために
新たにuart1.dtsを作成し、dtcでuart1.dtsをuart1.dtboに変換、デバイスツリーのオーバレイでdtboを読み込ませてUART1を有効にする。
# vi uart1.dts
/dts-v1/;
/plugin/;
/ {
compatible = "pine64,rock64";
fragment@0 {
target = <&uart1>;
__overlay__ {
status = "okay";
};
};
};
# dtc uart1.dts -o uart1.dtbo
# mkdir /sys/kernel/config/device-tree/overlays/uart1
# cat uart1.dtbo > /sys/kernel/config/device-tree/overlays/uart1/dtbo
# ls /dev/ttyS*
/dev/ttyS1 /dev/ttyS2
これで新たに/dev/ttyS1が作成されたが、通常ユーザの書き込み権限がないのでchmodで書き込み権限を付与。
# sudo chmod 666 /dev/ttyS1
これでUART1のデバイス認識は完了。
シリアル通信がうまくいくかテストするため、UARTをUSBに変換するための変換基板(AE-UM232R, 秋月電子)を使って
PC, ROCK64の双方のターミナルソフトを起動し互いに送受信ができるか確認をした。
ROCK64の通信ボーレートはデフォルトが1.5Mbpsになっており、普段の38.4kbpsとか115.2kbpsなどよりもかなり早いが、
AE-UM232Rで使用しているFTDIのIC(FT232RL)はこの速度に対応できているので問題なし。
接続図とピン配列は以下の通り。


ROCK64のLinuxにはGtkTermをインストールしてあるので、こちらを起動してメニューのConfigurationから
Portを「/dev/ttyS1」,Baud Rateを「1500000」に設定。Parityは「none」、Bits「8」, Stopbits「1」で他の項目はデフォルトのまま。
PC側はTeratermを起動して、同じようにメニューのシリアルポートからスピードを「1500000」に設定、他の設定も上記と同様。
TeraTermから「PC send msg to Rock64」, GtkTermから「Rock64 send msg to PC」と打ち込むと、送り先のターミナルから各々のメッセージが表示されたので双方向の通信が確立されていることが確認できた。

実験のミスでRock64のSPI通信が使えなくなったのは残念だが、UARTが使えればまだ基板の使い道はあるのでよしとしよう。
