以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。
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、移植操作与验证
移植的目的,是将uboot的控制台串口,由原来的串口2改为串口0。
根据上图的代码,其实只需要把CONFIG_SERIAL3这个宏注释掉,就会进到#else下的代码,从而使用串口0作为控制台串口。CONFIG_SERIAL3这个宏定义在/include/configs/smdkv210single.h文件中。
然后编译烧录与运行。
如果串口线此时插在串口2上,则SCRT只打印“SD checksum Error”(这个iNand校验失败的信息是内部iROM打印出来的。为何会在串口2上显示,是默认吗?可就算是默认,串口2毕竟还没有初始化,这怎么显示的?另外串口0还会显示这个信息吗?)
如果串口线插到串口0上,则启动后SCRT显示所有的信息。
这就说明移植成功!