UEFI开发历程4—串口调试功能的探索

前言

现如今,由于BIOS代码在生成bin文件烧录进板子后,我们无法看见程序变量的变化,故而导致调试困难。我们都知道,大部分语言程序都有几种方法:日志打印、单步调试等方法。然而BIOS是一个开机过程中的用于初始化的系统,它不是一个软件,因此没有实体界面可以观察变量的改变。但由于主板上存在着串口,因此,串口调试对于BIOS来说是一种非常重要的调试手段。

串口调试实现方法

串口调试功能的打开我知道的有三种方式:IO配置寄存器并通过寄存器发送/接收数据的方式、Protocol配置寄存器并通过Protocol提供的读/写函数来发送/接收数据、直接使用库提供的DEBUG(( ))函数。注意:这里的DEBUG函数是两层括号的。

一、IO读写配置串口方式

首先呢,主板上一般都会存在一个或多个串口,我们可以通过配置串口的这些寄存器来使用串口功能。串口功能一般被集成在SuperIO芯片里,这里拿我学习的ITE8613E芯片为例讲解。

用过单片机的都知道,配置串口需要配置的一般都有波特率、校验位、停止位、数据位等参数。而读写数据则是由相应寄存器的控制位来控制的。

1、配置串口步骤

(1)首先要做的就是确定需要用哪个串口,比如ITE8613E只支持一个串口,也就是串口1,这个串口通过逻辑设备1来访问与配置。

(2)获取基地址,逻辑设备1提供了很多寄存器可供使用,其中包含着串口1的基地址,如下图所示。

 很明显,0x60处的是基地址高八位,0x61处的是基地址低八位。

(3)使能串口,将0x30设置为0x01;

 (4)配置串口配置寄存器

 由上图可知,以及通过查询原理图可知,我们需要打开bit5的IO80_OUT1,以及设置时钟源,因此,此寄存器可设置为0x20。

(5)配置好寄存器后,接下来我们还要配置波特率、数据位、停止位、检验位等寄存器,然后就可以发送/接收数据了。相关寄存器如下

 由上图可知,当DLAB=0时,Base + 0h处的是读/写寄存器,即读写共用这个寄存器。

那么这个DLAB是什么呢,它是Base + 3h处寄存器的bit7。

波特率的低八位是,当DLAB=1时,Base + 0h处的寄存器的功能就会变成设置波特率低八位的功能,即DLL,Base + 1h处的寄存器就是可设置波特率高八位的寄存器,即DLM。

需要注意的是,所谓的设置波特率,其实就是设置分频值,基本波特率为115200,我们设置进去的数其实应该是:115200/想要的波特率,下图有详细说明。

图片右栏就是我们应该设置进DLL和DLM的值(DLL为低八位,DLM为高八位)。 

波特率设置了,那么停止位,数据位和检验位呢?别急往下看。

 由图很轻易得知,此寄存器是Base+3处的寄存器,此时DLAB不对该寄存器产生影响,bit0和1是控制数据位的,bit2是设置停止位的,它是和数据位的多少有关联的,如下所示

 由图知,当数据长度为8位时,当bit2设置为1时,停止位为2个停止位。

再回到上上图,bit3是奇偶检验的使能位,bit4是奇偶校验设置位,bit7就是所谓的DLAB了。

此时寄存器已经配置完了,接下来就可以发送数据了,当DLAB = 0 时,直接往Base+0h这个寄存器写ascii字符的十六进制或十进制就可以发送出去了。

但是需要注意的是,64位系统的计算能力很强大,所以会发得很快,但串口传输能力是有限的,因此如果不做一些限制的话,那么数据就会丢失很多。

在这里,寄存器提供了控制位来控制数据流,即,Base+5h寄存器的bit5和bit6同时为1时,这时数据才应该再次发送。位说明如下。

 程序如下:

#define SerialPort 0x3F8
#define TIMEOUT 0xFFFF
void Delay()
{
    UINT16 Timeout = TIMEOUT;
    UINT8 SendIsEmpty = 0x60; // 0110 0000 bit5an
    while( (IoRead8(SerialPort + 5) & SendIsEmpty) != SendIsEmpty ){
    
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值