移植u-boot启动时串口出现乱码

本文介绍了TX2440开发板上U-Boot版本2010.06中遇到的串口乱码问题。通过对get_PLLCLK函数的深入分析,发现由于数据溢出导致的UBRDIV0值错误,并给出了修改后的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用的是tx2440的板子。u-boot-2010.06

speed.c中的get_FCLK,get_PCLK等函数都修改好了,可是串口一直出现乱码。查看MPLLCON, CLKDIVN,寄存器的值都是正确,就是UBRDIV0不正确,源代码找了好久都找不到错来。这问题一直纠缠了好几天。后来发现是在get_PLLCLK中出错。
原来代码:
static ulong get_PLLCLK(int pllreg)
{
struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();
ulong r, m, p, s;
if (pllreg == MPLL)
r = readl(&clk_power->MPLLCON);
else if (pllreg == UPLL)
r = readl(&clk_power->UPLLCON);
else
hang();
m = ((r & 0xFF000) >> 12) + 8; //200
p = ((r & 0x003F0) >> 4) + 2; //3
s = r & 0x3; //2

#if defined(CONFIG_S3C2440)
if (pllreg == MPLL)
{
return ((CONFIG_SYS_CLK_FREQ * m * 2) /(p << s));
}
else if (pllreg == UPLL)
#endif

return (CONFIG_SYS_CLK_FREQ * m) / (p << s);
}
问题就出在: return ((CONFIG_SYS_CLK_FREQ * m * 2) /(p << s));
CONFIG_SYS_CLK_FREQ为12MHZ , 12M*200*2结果已经超出了32bit的范围而导致数据溢出了,所以结果出错了,悲剧,浪费了我这么多时间。
修改方法:
ulong clk_tmp = (CONFIG_SYS_CLK_FREQ * m )/(p << s);
return (clk_tmp*2);
//return ((CONFIG_SYS_CLK_FREQ * m * 2) /(p << s));

这样u-boot在串口就可以打印出正常字符了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值