[常見問與答] 解決從序列埠登入到 Pi 3 的亂碼問題

購買產品:PL2303HX USB轉TTL傳輸線PL2303HXD USB轉TTL傳輸線

raspberry-pi-3-login-via-uart-baud-rates-broken

剛拿到 Pi 3 如果安裝 2016-02-26-raspbian-jessie 的映像檔後想使用序列埠連線,會發現出現亂碼,該怎麼辦?

這是因為原本 Pi 3 內建的硬體 UART 被 BCM2837 SoC 拿去給 Bluetooth 晶片組使用,而原本的 UART 輸出腳位(GPIOs 14 & 15)改成用 mini-uart port。意思是原本硬體 UART 有獨立的 clock divisor,因此 baud rate 可以維持在 115200,可是 mini-uart 使用系統核心時脈,實際只能跑到 72000 左右的 baud rate,因此當使用 115200 的 baud rate 連線就會出現亂碼。

解決的方法為:
步驟一,增加一個 pi3-disable-bt-overlaydevice tree overlay。這個 overlay 會停用藍牙,並且將 UART0/ttyAMA0 再設定給 GPIOs 14 & 15。
建議將 image 寫入 SD 卡後就直接修改 /boot/config.txt,在檔案最後增加兩行。

force_turbo=1
dtoverlay=pi3-disable-bt

add-pi3-disable-bt-overlay-at-config-file

其中,force_turbo=1 是強制 CPU 的時脈維持 1.2GHz 的時脈。預設值為 0 時表示時脈為 ondemand,會隨著負載而調整。
dtoverlay=pi3-disable-bt 表示載入 pi3-disable-bt 這個 device tree overlay,將會停用藍牙並將 UART0/ttyAMA0 設定到 GPIOs 14 & 15 腳位。

其實做完步驟一以後就可以用 115200 的 baud rate 透過序列埠連線進 Pi 了。可是雖然載入 pi3-disable-bt-overlay,但藍牙的服務依然是開啟的,因此還是要進入系統將藍牙服務停掉。

$ sudo systemctl disable hciuart

最後,因為使用 force_turbo=1 這個設定,整個 SoC 溫度會很高,因此再更新系統(包括 firmware 和 dtb)後就可以把這個設定註解掉,重開機生效。

$ sudo apt-get update
$ sudo apt-get upgrade

connect-to-raspberry-pi-3-via-serial

更多資訊:

1. 要如何看 CPU 時脈?
可以用 cat 指令查看以下三個檔案如下,分別為最高時脈、目前時脈、最低時脈。

$ cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
$ cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq

2. 如何看目前的 Device Tree?
首先要安裝 device tree compiler

$ sudo apt-get install device-tree-compiler

再用 dtc 指令查看。

$ dtc -I fs /proc/device-tree

結果會像

/dts-v1/;

/ {
    model = "Raspberry Pi 3 Model B Rev 1.2";
    compatible = "brcm,bcm2710", "brcm,bcm2709";
    memreserve = <0x3b000000 0x4000000>;
    #address-cells = <0x1>;
    #size-cells = <0x1>;
    interrupt-parent = <0x1>;
...
    soc {
        compatible = "simple-bus";
        ranges = <0x7e000000 0x3f000000 0x1000000>;
        #address-cells = <0x1>;
        phandle = <0x27>;
        #size-cells = <0x1>;
        linux,phandle = <0x27>;
...
            uart0_pins {
                phandle = <0x34>;
                brcm,function = <0x4>;
                brcm,pins = <0xe 0xf>;
                brcm,pull = <0x0 0x2>;
                linux,phandle = <0x34>;
            };
            uart1_pins {
                phandle = <0xf>;
                brcm,function = <0x2>;
                brcm,pins = <0xe 0xf>;
                brcm,pull = <0x0 0x2>;
                linux,phandle = <0xf>;
            };
...

參考資料:
* CONFIG.TXT
* DEVICE TREES, OVERLAYS AND PARAMETERS
* Raspberry Pi Device Tree Overlays
* Raspberry Pi 3 UART Overlay Workaround
* Raspberry Pi 3 compatibility (BT disable & serial port remap fix)
* RPi Serial Connection
* Raspberry Pi Serial Communication: What, Why, and a Touch of How
* More on Raspberry Pi serial ports

[基礎] 從序列埠登入到 Raspberry Pi

購買產品:PL2303HX USB轉TTL傳輸線PL2303HXD USB轉TTL傳輸線

Raspberry Pi 有提供原生的序列(Serial)傳輸介面,因此只要透過 USB 轉 TTL 序列傳輸線,就可以在不需要螢幕和鍵盤滑鼠的情況下登入 Raspberry Pi (預設帳號密碼是 pi/raspberry),連上的虛擬終端機為 ttyAMA0。
序列傳輸介面至少需要有三條線,包括接地(GND)、接收(RX)和傳送(TX),參考接線圖如下。
connect-serial-to-raspberry-pi-model-b
connect-serial-to-raspberry-pi-model-b-plus本 Raspberry Pi B+ GPIO 腳位圖獲得授權使用

比較好的產品會有較多的連接線,例如做流量控制的 RTS/CTS 等。在不同作業系統使用的方式大同小異,詳細步驟如下。

注意:
1. 目前 PL2303HX 僅支援 Windows XP/Vista/7 和 Linux 使用,如果是 Windows 8 和 Mac 作業系統,需使用 PL2303HXD 才能正常使用。
2. 安裝 USB 轉 TTL 傳輸線設定時,Raspberry Pi 不需要開機。但是完成安裝後,記得要將 Raspberry Pi 開機,才能透過該序列傳輸線連接。

Windows XP
1. 沒有接上 USB 轉 TTL 序列傳輸線時的裝置管理員。
not-connect-to-serial

2. 接上 USB 轉 TTL 序列傳輸線時的裝置管理員,一開始會跳出”歡迎使用尋找新增硬體精靈”。我們先暫時忽略這訊息並下載驅動程式吧。
ask-for-insert-new-hardware

3. PL2303HXPL2303HXD 都是使用旺玖科技的晶片,官方網站驅動程式下載連結為:
http://www.prolific.com.tw/TW/ShowProduct.aspx?p_id=226&pcid=79
prolific-driver-download-url-windows

4. 下載後解壓縮執行 PL2303_Prolific_DriverInstaller_v1.8.0.exe,按照指示完成後重開機。再次開啟裝置管理員,可以發現多了一個連接埠 COM3。
connect-to-serial

5. 下載並開啟 putty。
putty-windows

6. 在 Connection type 先選擇 Serial,再根據剛剛的連接埠依序填入 Serial line、Speed的值。由於剛剛裝置管理員是看到 COM3,因此在 Serial line 也填入 COM3,Speed 填入 115200。
putty-serial-setting-windows

7. 相關的參數填完後,按 “Open” 就能連上 Raspberry Pi 如下圖。如果等了幾秒還是沒有畫面,可將 Raspberry Pi 重開(電源重插拔),應該就可以順利看到登入訊息。
successful-to-connect-to-raspberry-pi-via-serial-on-windows

Ubuntu Linux
1. 接上 USB 轉 TTL 序列傳輸線,打 ls /dev/ttyUSB*,在我們的環境是長在 ttyUSB0。
tty-usb0

2. 開啟 putty,如果還沒安裝請執行sudo apt-get install putty安裝。
putty-linux

3. 在 Connection type 先選擇 Serial,再根據剛剛的連接埠依序填入 Serial line、Speed的值。由於該節點是長在 ttyUSB0,因此在 Serial line 也填入 ttyUSB0,Speed 填入 115200。
putty-serial-setting-linux

4. 如果出現 Unable to open serial port 如下圖,改用 sudo 權限執行 putty。
putt_unable_to_open_serial_port

5. 相關的參數填完後,按 “Open” 將能連上 Raspberry Pi 如下圖。如果等了幾秒還是沒有畫面,可將 Raspberry Pi 重開(電源重插拔),應該就可以順利看到登入訊息。
successful-to-connect-to-raspberry-pi-via-serial-on-linux

Mac
1. 下載並安裝 PL2303HXD Driver,安裝後會重新開機。官方網站驅動程式下載連結為:
http://www.prolific.com.tw/US/ShowProduct.aspx?p_id=229&pcid=41
prolific-driver-download-url-mac

2. 重開機生效。

3. 檢查是否出現裝置節點,打 ls /dev/cu*,如果出現 /dev/cu.usbserial,可以直接使用指令 screen /dev/cu.usbserial 115200 連線進去。

4. 如果沒出現 /dev/cu.usbserial,試著重插拔 USB 轉 TTL 傳輸線和重新插拔電源。

5. 如果使用 screen 後沒畫面出現,重新插拔電源試試看(USB 轉 TTL 傳輸線不要拔掉)。

常見問與答:

1. 我需要接紅色的線嗎?
如果將 USB 轉 TTL 傳輸線的紅色線接到 Pin 2,將會從傳輸線供電給 Pi 而讓 Pi 開機。由於我們已經有供給穩定的電源給 Pi,因此這邊我們不會將紅色線接到 Pin 2。

2. 我可以將序列埠的功能關掉嗎?
我們可以透過修改/boot/cmdline.txt,將

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

改為

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

還要再修改/etc/inittab,將

#Spawn a getty on Raspberry Pi serial line
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

改為

#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

再重開機即可。