Raspberry Piに搭載されているSoCには2つのUART機能(UART0とminiUART)がある。
Pi1B,Pi2Bでは,UART0がGPIOヘッダーに使われている。
Raspberry Pi3B,ZeroWでは,WifiとBluetooth用にチップが搭載されたんだけど,搭載したチップとの通信にそれまでシリアル通信に使用されていたUART0を使うように設計されたため,GPIOヘッダーのpin8,10のUARTには,miniUARTを使用するように変更された。
その結果,Pi3BやZeroWではシリアル通信を利用する時にいくつか問題が発生する。
といった問題がある。
さらに,このminiUARTは以下のような機能制限があり,低速でも使用できるコンソール用途向けになってしまっている。
これらを踏まえて対策しないと,シリアルコンソールを使用した場合,ログインプロンプトが表示されてユーザー名を入れたあたりで,反応しなくなってしまうなどが起こる。
そこで,うまく利用出来る方法を設定して利用する必要がある。
やり方としては,1つ目は,GPUコアクロックを250MHzに固定してしまう方法。2つ目は,Bluetoothを無効にしてしまう方法がある。
Bluetoothを使わないなら無効にする方法が良いのかも。
どちらも利用したい場合は,GPUのコアクロックを固定にする方法を選択すべきとは思うが,この場合多少パフォーマンスが落ちる。
また,どちらの方法でも,GPIOヘッダーの8pin(TXD),10pin(RXD)のピンに,シリアルポート(miniUARTまたはUART0)が接続される。シリアルポートとしてはコネクタ経由で利用できるポートは1ポートのみになる。
デフォルト時のデバイス名のエリアスは,
Pi3Bの場合:
/dev/serial0 -> /dev/ttyS0 /dev/serial1 -> /dev/ttyAMA0
Pi1B,Pi2Bの場合:
/dev/serial0 -> /dev/ttyAMA0
になっている。
Pi3B,ZeroWで,dtoverlay=pi3-miniuart-btに設定した時のデバイス名のエリアスは,
/dev/serial0 -> /dev/ttyAMA0 /dev/serial1 -> /dev/ttyS0
になる。
シリアルポートを,OSのインストール時の操作やリモートログイン用にシリアルコンソールとして出来るようにデフォルト設定されている。
これは,/boot/cmdline.txtで/dev/serial0をシリアルコンソールで使用するように設定されているから。
/boot/cmdline.txtの内容:
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes root wait
ただ,デフォルトのままでは,上記の理由でPi3B,ZeroWでは正常に使用できない。*1
上手くシリアルポートが動作するよう,以下の様な設定を/boot/config.txt を修正して設定する。
core_freq = 250
dtoverlay=pi3-disable-bt
# systemctl disable hciuart
dtoverlay=pi3-miniuart-bt core_freq = 250
After=dev-serial1.device -> After=dev-ttyS0.device
シリアルポートをシリアルコンソールとして使用するのではなく,プログラムで他の機器とシリアル通信をするために使用する場合には,以下の様な設定を/boot/config.txt を修正して設定する。
enable_uart=1
dtoverlay=pi3-miniuart-bt core_freq = 250
console=serial0,115200
# systemctl stop serial-getty@ttyS0.service # systemctl disable serial-getty@ttyS0.service
# systemctl stop serial-getty@ttyAMA0.service # systemctl disable serial-getty@ttyAMA0.service
これで,シリアルコンソールの使用を停止・無効に出来て,シリアル通信に使用できるようになった。
コメント一覧
新しくコメントをつける
ありがとうございました