当系统出错时或者使用内核日志时会输出一些打印信息,这最终都是调用到bspLib.c中的bspDebugMsg 这个接口来实现的,所以我们在开发BSP时,第一个要做的工作就是实现这个接口。
我们去bspLib.c文件中看看系统对于我们的bspDebugMsg()函数的描述:

一般的调试信息都是通过串口来输出的,所以我们需要实现T3开发板上串口发送的函数。因为我们的开发板使用的是P10串口连接,下图就是连接方式,即UART0,所以U-Boot在启动时使用串口0输出信息,所以我们这里只要实现串口0的发送函数即可。

我们去T3的电路图看一下这个P10。

我们注意在连接杜邦线的时候TTL转USB的时候RX连接TX,TX连接RX。我们通过开发板的P10串口连接转USB接口工具连接到我们的笔记本电脑,出现下面的页面,会出现很多uboot的信息:

我们现在要实现串口驱动,在driver 目录下新建一个uart目录用来存放串口驱动文件uart.c和uart.h:

其中uart.h会被bspLib.c文件使用,我们需要在uart.c中实现串口的轮询发送接口,
#define __SYLIXOS_KERNEL
#include
#include
/*********************************************************************************************************
基地址定义
*********************************************************************************************************/
#define UART0_BASE (0x01c28000) /* 这个地址就是我们UART0的基地址,我们在前面也有带大家看过手册 */
/*********************************************************************************************************
寄存器偏移
*********************************************************************************************************/
#define RBR 0x0 /* 这个也是要看手册看UART寄存器 RBR 的偏移量 */
#define THR 0x0 /* 这个也是要看手册看UART寄存器 THR 的偏移量 */
#define USR 0x7C /* 这个也是要看手册看UART寄存器 USR 的偏移量 */
VOID uartPutChar (CHAR cChar)
{
// 若 FIFO 不满就填入数据,否则等待
while (!(readl(UART0_BASE + USR) & BIT(1))); // 判断USR的第二位是1还是0 ,如果不满就执行下一句。这个是看手册得到的信息。
writel(cChar, UART0_BASE + THR); //把cChar 填入 THR寄存器
}
VOID uartPutMsg (CPCHAR cpcMsg)
{
CHAR cChar;
if (!cpcMsg) {
return;
}
while ((cChar = *cpcMsg) != '\0') {
uartPutChar(cChar);
cpcMsg++;
}
}

readl 我们追一下就知道这个表示就是地址,其实是为了判断USR寄存器的第二位是0是1,如果是1 & 1 为1 ,0&1为0
然后在bspLib.c中的bspDebugMsg 接口中调用我们刚刚实现的串口轮询发送函数:
/*********************************************************************************************************
** 函数名称: bspDebugMsg
** 功能描述: 打印系统调试信息
** 输 入 : pcMsg 信息
** 输 出 : NONE
** 全局变量:
** 调用模块:
*********************************************************************************************************/
VOID bspDebugMsg (CPCHAR pcMsg)
{
/*
* TODO: 通过 UART 打印系统调试信息
*/
uartPutMsg(pcMsg);
}
接下来我们需要验证我们的这个debug串口是否正确。我们先编译一下我们的BSP工程,生成我们的SylixOS内核镜像文件,然后看有没有串口打印信息。如果有说明我们代码没问题。
编译BSP工程(注意,我们的BSP工程是依赖BASE工程的,所以编译BSP过程之前要先把BASE工程编译好),在Debug目录下找到BSP_T3.bin 这个文件,如下图

这个就是我们编译出来的SylixOS内核镜像,将其拷贝到SD卡上,将SD卡插入开发板上,然后和上面一样连接开发板进入uboot ,查看我们的mmc信息,遇到了一点点问题,但是最后还是解决了,下面记录一下。

上电通过以下命令启动SylixOS内核:
=> fatload mmc 2:0 40100000 bsp_t3.bin
=> go 40100000
由于这里我的UBoot读不出我的bin文件,所以我没办法看到我的调试串口的打印信息,这里的第一条指令就没有通过,报出了下面的错误信息:

我尝试了一些办法但是都没有解决。我也只能先继续往下做了。如果有遇到过相同问题的朋友欢迎指导。