尝试修改Duo的U-Boot串口波特率

修改uboot的默认配置文件

  • 文件路径
    build/boards/cv180x/cv1800b_sophpi_duo_sd/uboot/cvitek_cv1800b_sophpi_duo_sd_defconfig

  • 在文件末尾添加

CONFIG_BAUDRATE=460800

修改uboot的芯片源码文件

  • 文件路径 u-boot-2021.10/include/configs/cv180x-asic.h

  • 源文件

        /* config uart */
	#define CONSOLEDEV "ttyS0\0"

  • 修改后
         /* config uart */
        #define CONSOLEDEV "ttyS0\0"
        #define CONSOLEBAUDRATE CONFIG_BAUDRATE
        #define CONFIG_SYS_BAUDRATE_TABLE {9600, 19200, 38400, 57600, 115200, 460800, 921600}
  • 源文件
#define CONFIG_EXTRA_ENV_SETTINGS	\
		"netdev=eth0\0"		\
		"consoledev=" CONSOLEDEV  \
		"baudrate=115200\0" \
		"uImage_addr=" __stringify(UIMAG_ADDR) "\0" \
		"update_addr=" __stringify(UPDATE_ADDR) "\0" \
		"mtdparts=" PARTS "\0" \
		"mtdids=" MTDIDS_DEFAULT "\0" \
		"root=" ROOTARGS "\0" \
		"sdboot=" SD_BOOTM_COMMAND "\0" \
		OTHERBOOTARGS \
		PARTS_OFFSET

  • 修改后
#define CONFIG_EXTRA_ENV_SETTINGS       \
                "netdev=eth0\0"         \
                "consoledev=" CONSOLEDEV  \
                "baudrate=" __stringify(CONSOLEBAUDRATE) "\0" \
                "uImage_addr=" __stringify(UIMAG_ADDR) "\0" \
                "update_addr=" __stringify(UPDATE_ADDR) "\0" \
                "mtdparts=" PARTS "\0" \
                "mtdids=" MTDIDS_DEFAULT "\0" \
                "root=" ROOTARGS "\0" \
                "sdboot=" SD_BOOTM_COMMAND "\0" \
                OTHERBOOTARGS \
                PARTS_OFFSET
  • 使用clean_uboot && build_uboot进行编译

  • 查看这个文件可以看到修改已经生效了u-boot-2021.10/build/cv1800b_sophpi_duo_sd/u-boot.cfg

#define CONFIG_EXTRA_ENV_SETTINGS "netdev=eth0\0" "consoledev=" CONSOLEDEV "baudrate=" __stringify(CONSOLEBAUDRATE) "\0"
...
#define CONFIG_SYS_BAUDRATE_TABLE {9600, 19200, 38400, 57600, 115200, 460800, 921600}
...
#define CONFIG_BAUDRATE 460800

然后打包插电开机 一看控制台全是乱码

  • 翻了下uboot的配置文件可以看到使用的是ns16550兼容驱动
  • 驱动文件位于u-boot-2021.10/drivers/serial/ns16550.c
  • 翻阅驱动文件可以发现他时钟是16分的而设备树里面串口0的时钟是25M 所以…
int ns16550_calc_divisor(struct ns16550 *port, int clock, int baudrate)
{
	const unsigned int mode_x_div = 16;

	return DIV_ROUND_CLOSEST(clock, mode_x_div * baudrate);
}

不知道有啥办法可以解决乱码问题

1 Like

收到了你的反馈 :bangbang:

我想我们会解决这个问题,请给我们多一些时间。