以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。
1、场景需求
X210开发板的SOC中一共有4个串口(串口0~3),并且用DB9接口引出了2个串口,分别是串口0和串口2。其中靠近网口的是串口0,远离网口的是串口2。
因为三星公司推荐使用串口2来作为调试串口,所以三星移植的uboot和内核都使用串口2作为控制台串口的。有时候可能需要将调试串口修改为其他的串口(本次移植改为串口0),这时候就需要修改uboot的代码,让uboot工作在串口0的控制台下。
2、代码分析
由uboot源码——汇编阶段的start.S文件可知,uboot中初始化串口控制器的代码在lowlevel_init.S中的uart_asm_init中,内容如下:
由此可见,其使用ELFIN_UART_CONSOLE_BASE这个宏,作为串口n(这里的n表示那个要进行初始化的串口的编号,另外注意这个初始化只初始化一个串口)这个硬件中所有寄存器的基地址,然后结合偏移量来对串口的寄存器进行寻址,以便执行初始化。
ELFIN_UART_CONSOLE_BASE这个宏定义在/include/s5pc110.h文件中。
因此uart_asm_init函数初始化哪个串口,取决于ELFIN_UART_CONSOLE_BASE这个宏,而这个宏又由CONFIG_SERIALn这个宏来决定(n从1到4,对应着串口0到3)。
上图中的代码说明,uboot默认使用串口2作为控制台串口。
3、移植操作与验证
(1)移植的目的,是将uboot的控制台串口,由原来的串口2改为串口0。
(2)根据上图的代码,其实只需要把CONFIG_SERIAL3这个宏注释掉,就会进到#else下的代码,从而使用串口0作为控制台串口。CONFIG_SERIAL3这个宏定义在/include/configs/smdkv210single.h文件中。
这样修改后编译时报错(因为其他文件中需要定义相关的CONFIG_SERIALn)。
于是根据需要,将CONFIG_SERIAL3改为CONFIG_SERIAL1,编译成功。
(3)烧录运行,验证结果
1)如果串口线此时还插在串口2上,则SCRT只打印如下内容:
“SD checksum Error”这个iNand校验失败的信息是内部iROM打印出来的。为何会在串口2上显示,内部iROM默认使用串口2吗?可就算是默认,串口2还没有初始化,这怎么显示的?在串口2显示的话,那串口0还会显示这个信息吗?另外“OK”是串口初始化时输出的信息,这里为何在串口2上显示?
2)我们此时将串口线插到串口0上,然后根据实际情况更改SCRT的COM口,重启uboot时发现没有信息输出!这是为何呢?
3)怀疑原来的板子串口0坏了,换一个板子试试,发现还是没有输出信息。
4)怀疑其他内容出错,换九鼎的uboot进行修改,发现还是有输出信息。
待解决!