Raspberry Piのシリアルコンソール設定について

シリアル通信の設定 ( config.txt )

※ 以下はRaspberry Pi3で実施したもので、特にシリアルコンソール設定に関しては、最新モデルであるRaspberry Pi4で、ハードウェアの仕様が変わると設定方法が変更になる可能性がある。

Raspberry Pi3やZeroにはWifi/Bluetoothモジュールが搭載されるようになったが、設計がイマイチなのか仕方ないのかはともかく、以下の仕様らしい。

  • BluetoothモジュールがCPUのUART0に接続されている(Pi1,P2はUART0にシリアルが接続)
  • 代わりにGPIOのUART(8,10pin)は、miniUARTに接続されている
  • 上記は設定で入れ替えることも可能(後述)
  • Pi3、ZeroWのminiUARTのボーレートはGPUのコアクロックに依存してしまうように設計されているので、負荷によってボーレートが変化してしまうらしい。
  • miniUARTのデバイスパスは/dev/ttyS0
  • WiFi/Bluetoothのデバイスパスは/dev/ttyAMA0
  • miniUARTの制限として、データ幅は7,8bit、パリティエラーが検出不可など最小限の機能

シリアルコンソールを使えるようにする方法

方法はいくつかあり、WindowsマシンからSDカードをマウントしてconfig.txtの末行に以下を追加する。

  1. GPUのコアクロックを400MHzから250MHzに固定化

性能が落ちてしまうが、Bluetooth、シリアルコンソール共に利用できる

core_freq=250
  1. Bluetoothを利用しない設定にして、UART0をシリアルポートとして使用する

Bluetoothを利用しない設定にすると、従来のUART0とシリアルポートがリンクするようになる。(Wifi・Bluetoothなしモデルと同じ構成になる)

dtoverlay=pi3-disable-bt
  1. UART0をシリアルポートとして、miniUARTをBlutoothとの通信に使用する

UART0とminiUARTの接続デバイスを逆にする。UART0がGPIOヘッダーのpin8,10に接続される。Bluetooth通信も使えるはずだが、どのような制限がかかるのかは不明。

dtoverlay=pi3-miniuart-bt
  1. UARTを有効にするフラグを立てる

なんとなく「1. GPUのコアクロックを400MHzから250MHzに固定化」と同じ気がする。

enable_uart=1

シリアルコンソールの確認

シリアルポートがどのデバイスに接続されているか確認する方法

> ls -l /dev/serial*

現在のコアクロックが幾つなのか表示させる方法。アイドル状態だと250MHzに変動するので、CPU等に負荷をかけたときにいくつなのかを調べる。ラズパイ3の場合、通常だと400MHzまで上がる。

# arm, core, uart
> vcgencmd measure_clock core

デフォルトのconfig.txt

Bluetooth使用可能、シリアルコンソール不可

> ls -l /dev/serial*
lrwxrwxrwx 1 root root 7 Jul  6 04:21 /dev/serial1 -> ttyAMA0 # UART0

> vcgencmd measure_clock core
frequency(1)=400000000

dtoverlay=pi3-disable-bt

Bluetooth使用不可にする

# /boot/config.txt
dtoverlay=pi3-disable-bt

Bluetoothを利用不可にすると、結果的にシリアルコンソールがUART0に接続する。シリアルコンソールが利用可能になる。

> ls -l /dev/serial*
lrwxrwxrwx 1 root root 7 Jul  6 04:23 /dev/serial0 -> ttyAMA0 # UART0
lrwxrwxrwx 1 root root 5 Jul  6 04:23 /dev/serial1 -> ttyS0 # miniUART

> vcgencmd measure_clock core
frequency(1)=400000000 # CPUに負荷をかけると400MHzになる(アイドル時は250MHz)

dtoverlay=pi3-miniuart-bt

シリアルコンソールとBluetoothを入れ替える

dtoverlay=pi3-miniuart-bt
> ls -l /dev/serial*
lrwxrwxrwx 1 root root 7 Jul  6 05:22 /dev/serial0 -> ttyAMA0 # UART0
lrwxrwxrwx 1 root root 5 Jul  6 05:22 /dev/serial1 -> ttyS0 # miniUART

入れ替えただけで、クロックを固定してなくてもシリアルコンソールは使えるし、コンソール出力表示も乱れない。負荷が掛かるとちゃんと400MHzになる。

> vcgencmd measure_clock core
frequency(1)=400000000 # CPUに負荷をかけると250~400MHzに変動する

※ 2019-07-06 Raspberry Pi4 + Raspbian Busterの組み合わせで上記設定だと、コアクロックが250Mhzに固定化される。上記設定を解除(デフォルト状態)にするとシリアルコンソール表示しなくなるが、Pi4だと500MHzまでクロックが変動する。

enable_uart=1

シリアル通信を有効?にする設定

enable_uart=1

シリアルコンソールとBluetoothデバイスの入れ替えは発生しないが、コアクロックが250MHz固定になる。

> ls -l /dev/serial*
lrwxrwxrwx 1 root root 5 Jul  6 04:29 /dev/serial0 -> ttyS0 # miniUART
lrwxrwxrwx 1 root root 7 Jul  6 04:29 /dev/serial1 -> ttyAMA0 # UART0

> vcgencmd measure_clock core
frequency(1)=250000000 # CPUに負荷をかけても250MHz固定

まとめ

シリアルコンソールもBluetoothも使いたければ、dtoverlay=pi3-miniuart-btの設定が一番良さそう。ただ、Bluetoothがどんな制約を受けるのか、enable_uart=1と何が違うのか腑に落ちない状態。

こんなややこしい仕様やめてほしい。Raspberry Pi4で変更になってないかな。。

-->