让串口正常打印数据
一般在移植过程中,我们经常会碰到许多问题,这就需要让开发板给我们一些调试信息,最简单的调试信息就是通过点亮LED实现,但是LED就那么几个,能表示的调试信息少而且不直观,另一种更好的方法则是通过串口打印数据。所以我们在移植U-BOOT过程中一般都先实现串口能正常打印数据。
用过UART的人都知道,要想串口正常打印数据,最重要的两点就是时钟和波特率,所以在本章移植中,我们重点就是关注这两块的代码。
通过第一章的分析,我们知道按照程序的执行顺序,要想使用U-BOOT自带框架下的串口,要修改这几个部分:
- .globl reset(\arch\arm\cpu\arm920t\start.S)里设置了系统分频系数。
- board_early_init_f,(\common\board_f.c)初始化系统时钟
- init_baud_rate, serial_init,(\common\board_f.c)初始化串行通讯相关。
先看第一部分设置系统分频系数有没有问题。为了不在去计算时钟频率等,而直接使用韦东山老师后续的程序,我们修改一下分频系数,让FCLK:HCLK:PCLK = 1:4:8。然后根据datasheet说明,当HDIV设置为非0的时候,cpu总线模式要进行改变,默认情况下FCLK=HCLK,cpu工作在fast bus mode快速总线模式下,HDIV设置为非0后,FCLK和HCLK不再相等,要将cpu改为异步总线模式。然后为了让程序跑的更快,我们可以启用ICACHE,所以 代码修改如下:
\arch\arm\cpu\arm920t\start.S,第83行起
///* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
//mov r1, #3
mov r1, #5 /* FCLK:HCLK:PCLK = 1:4:8 */
str r1, [r0]
/* 如果HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */
mrc p15, 0, r1, c1, c0, 0 /* 读出控制寄存器 */
orr r1, r1, #0xc0000000 /* 设置为“asynchronous bus mode” */
mcr p15, 0, r1, c1, c0, 0 /* 写入控制寄存器 */
/* 启动ICACHE */
mrc p15, 0, r0, c1, c0, 0 @ read control reg
orr r0, r0, #(1<<12)
mcr p15, 0, r0, c1, c0, 0 @ write it back
然后看第二部分,也就是系统时钟。关于时钟以及分频系数这块,现在不做过多讲解,需要的可以看这个这个链接: [https://blog.youkuaiyun.com/lee244868149/article/details/49962203].里面讲的非常详细,这边直接把修改的地方列出来,也就是简单的改了一下宏的值,让系统跑到400MHz:
\b