前言
在RK3399平台开发过程中,串口debug是一种不错的调试手段。但很多时候串口在打印过程中会出现正常输出一段时间后,莫名出现打印乱码情况。本文旨在解决设备启动后,串口正常打印一段时间后出现乱码的问题。
系统:Android8.1
内核 : Kernel 4.4.167
一、串口输出乱码及其原因
串口正常打印一段时间后出现乱码的问题,猜测可能是由于数据太多导致的乱码,初步尝试将波特率从150000改为115200 。
二、串口波特率修改
修改串口波特率时需要修改以下两部分:uboot和设备树dts 。
1. uboot 修改
在 : u-boot/configs/rk3399_defconfig 文件中 :
将:
CONFIG_SYS_EXTRA_OPTIONS="RKCHIP_RK3399,PRODUCT_MID,NORMAL_WORLD,SECOND_LEVEL_BOOTLOADER,BAUDRATE=150000"
CONFIG_ARM=y
CONFIG_ROCKCHIP_ARCH64=y
CONFIG_PLAT_RK33XX=y
修改为
CONFIG_SYS_EXTRA_OPTIONS="RKCHIP_RK3399,PRODUCT_MID,NORMAL_WORLD,SECOND_LEVEL_BOOTLOADER,BAUDRATE=115200"
CONFIG_ARM=y
CONFIG_ROCKCHIP_ARCH64=y
CONFIG_PLAT_RK33XX=y
2. 内核中设备树dts修改
在 : kernel/arch/arm64/boot/dts/rockchip/ 路径中查找 :
$ grep -r "rockchip,baudrate" -n
找到所在设备树rk3399-android.dtsi :
将:
fiq_debugger: fiq-debugger {
compatible = "rockchip,fiq-debugger";
rockchip,serial-id = <2>;
rockchip,wake-irq = <0>;
rockchip,irq-mode-enable = <0>; /* If enable uart uses irq instead of fiq */
rockchip,baudrate = <1500000>; /* Only 115200 and 1500000 */
pinctrl-names = "default";
pinctrl-0 = <&uart2c_xfer>;
interrupts = <GIC_SPI 150 IRQ_TYPE_LEVEL_HIGH 0>;
};
修改为 :
fiq_debugger: fiq-debugger {
compatible = "rockchip,fiq-debugger";
rockchip,serial-id = <2>;
rockchip,wake-irq = <0>;
rockchip,irq-mode-enable = <0>; /* If enable uart uses irq instead of fiq */
rockchip,baudrate = <115200>; /* Only 115200 and 1500000 */
pinctrl-names = "default";
pinctrl-0 = <&uart2c_xfer>;
interrupts = <GIC_SPI 150 IRQ_TYPE_LEVEL_HIGH 0>;
};
3. 重新编译并烧录
重新编译u-boot 和内核并烧录生效。
三、串口输出测试
将波特率改为115200后,串口输出恢复正常。
总结
- 当调试串口输出异常时,可通过适当降低串口波特率来解决。
- rk3399 只支持115200 和 1500000的波特率。
- u-boot中波特率和内核dts中波特率要保持一致。