CPU実験でLinuxでコマンドラインからUART通信する話
タイトルのまんまです。
adventar.org
枠が余ってたのでアドベントカレンダー7日に入れました。
ArchLinux on VMware on Windows without GUIでUSB使ってUARTするやつです。
話
UART通信、Linuxだとcutecom*1、WindowsだとTeraTermを使うのがよくあるようですが、
僕の基本の開発環境はVMのGUIなしLinuxで、そこからやりたいじゃないですか。送りたい機械語データもこっちのPCにあるし。
やり方
- FPGA名+UART driverとかでググるとここがヒットします。書いてある通りホストOSのWindowsにドライバ入れます。
- 再起動したかもしれません。
- USBケーブルをFPGAとPCに指すと、Windowsがこれを認識します。
- あとはVMwareのデバイス設定をいじって、これをゲストOS側に持ってきます。
- これによって、Linux側に/dev/ttyUSBxが生えました。
dmesg
等も確認してください。 - baud rateを、
sudo stty -F /dev/ttyUSBx 115200
のようにして設定してください。
これによって、sudo cat hoge > /dev/ttyUSBx
sudo cat /dev/ttyUSBx
などで通信ができるようになります。
なるんですが、罠があります。
LF(\x0a)が、CRLF(\x0d\x0a)にすべて置換されることになります。CPU実験では、機械語を送りつけるわけですが、そのなかにたまたまLFが含まれていると、すべてずれることになります。
ソフトウェアの挙動かと思ってpicocom nanocomとか試したんですが、どうも治らず、結局raw modeというのでした。
Configuring Linux’s serial port to raw modeacassis.wordpress.com
sudo stty -F /dev/ttyUSBx raw
これで終わりです。
sudoつけまくりましたが、ユーザをdialoutグループに所属させた方がいいかもしれませんね。(僕は全部sudo -s上でやりましたが)
*1:他にもいろいろ。シリアルコンソール - ArchWiki ArchWikiはいいぞ