UEFI学习(四)-- SIO的Read与Write

EC与SIO都可以通过4E/4F 2E/2F去访问特定的地址空间;

EC被访问的地址空间一般是0x400,默认是通过4E/4F访问;SIO默认是通过2E/2F访问,这个访问的通道在EC/SIO里面可以通过更改寄存器来更改;

图为SIO更改访问通道的寄存器:
SIO 寄存器更改访问通道

既然知道了访问地址空间的通道是什么,接下来看Spec,查看通过通道访问的规范;
SIO 通过通道访问的方式
图中说明了寄存器的访问方式,需要先向2E写入,再从2F读取;

即:

//假设读的寄存器offset为0x01
IoWrite8(0x2E,0x01);
SIORead = IoRead8(0x2F);

因为0x2E/0x2F这两个通道地址我们需要经常用到,且有概率变更为4E/4F,所以可以定义一个宏定义,方便后续更改;
即:

#define SIO_Index       0x2E
#define SIO_Data        0x2F

IoWrite8(SIO_Index,0x01);
SIORead = IoRead8(SIO_Data);

Spec中又提到,需要往写IO地址中写入两次0x87,进入扩展模式后,才能对数据进行更新;
SIO 通过通道访问的方式2
SIO entry ExpansionMode
退出扩展模式,需要往IO地址中写入0xAA;
SIO break ExpansionMode

即:

#define SIO_Index       0x2E
#define SIO_Data        0x2F

IoWrite8(SIO_Index,0x87);
IoWrite8(SIO_Index,0x87);
IoWrite8(SIO_Index,0x01);
SIORead = IoRead8(SIO_Data);
IoWrite8(SIO_Index,0xAA);

访问SIO的方式已经知道了,接下来实际操作一下,用以上的code去访问并Print出SIO address的value;
我的code为:

//.inf
[Defines]
  INF_VERSION                    = 0x00010005
  BASE_NAME                      = SIO
  FILE_GUID                      = dd6c3ae0-296d-47d4-a491-d3c5b457059c
  MODULE_TYPE                    = UEFI_APPLICATION
  VERSION_STRING                 = 1.0
  ENTRY_POINT                    = UefiMain

[Sources]
  SIO.c

[Packages]
  MdePkg/MdePkg.dec

[LibraryClasses]
  UefiApplicationEntryPoint
  UefiLib
  IoLib
//.h
#ifndef __SIO_H__
#define __SIO_H__

#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/IoLib.h>

extern UINTN ReadSIO(UINT8 offset);
extern UINTN ExpansionMode(UINT8 EMValue);

#endif //SIO_H

//.c
#include "SIO.h"

#include "SIO.h"

#define SIO_Index                   0x2E
#define SIO_Data                    0x2F

#define SIO_Entry_EM                0x01
#define SIO_Break_EM                0x00

EFI_STATUS
EFIAPI UefiMain (IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
{
    UINT8 SIO_ID_H;
    UINT8 SIO_ID_L;

    ExpansionMode(SIO_Entry_EM);
    
    SIO_ID_H = (UINT8)ReadSIO(0x20);
    SIO_ID_L = (UINT8)ReadSIO(0x21);

    ExpansionMode(SIO_Break_EM);

    Print(L"%x%x",SIO_ID_H,SIO_ID_L);

    return TRUE;
}

UINTN ReadSIO(UINT8 offset)
{
    IoWrite8(SIO_Index,offset);

    return IoRead8(SIO_Data);
}

UINTN ExpansionMode(UINT8 EMValue)
{
    if (EMValue == SIO_Entry_EM)
    {
        IoWrite8(SIO_Index,0x87);
        IoWrite8(SIO_Index,0x87);
    }
    else if (EMValue == SIO_Break_EM)
    {
        IoWrite8(SIO_Index,0xAA);
    }
    else 
    {
        //return FALSE;
    }

    return TRUE;
}

code内读取的是EC Chip ID;
SIO Chip ID
写SIO就直接调用IOWrite8,往Index里面写就行了,相对于读来说比较简单;
示例:

void WriteSIO(UINT8 offest,UINT8 value)
{
    IoWrite8(SIO_Index,offest);
    IoWrite8(SIO_Data,value);
}

下一篇继续说一下SIO的Read与Write中关于device和CONFIGURATION REGISTER的东西;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Moxa是一家做了几十年工业串口卡、串口服务器之类设备的公司,PComm Lite是一套易用性、可靠性久经考验串口编程开发包。相比用API或mscomm控件开发简单太多了。 版本:目前最新版是Version 1.6 Released May 14, 2012 支持XP/win7, 32/64bit的库都有,开发环境支持VC/VB/Delphi。注意可以会搜到另外一个Version 2.6. Released Jul 8, 2008,那是在WIN9x/NT4用的,不要看版本号高下错了。 使用方法:运行安装后有类库、例程、帮助和几个小工具。关键的有个文件:pcomm.h/pcomm.lib两个文件复制到项目目录并引用,pcomm.dll丢到windows\system32下或跟应用程序放在一起,pcomm.chm帮助备查。 函数介绍:整个库包含50多个函数,最常用的也就10来个: 打开、关闭、设波特率的:sio_open ()、sio_close()、sio_baut() 发送数据的:sio_putch(),sio_write() 接收数据的:sio_getch(),sio_read() 查询输入输出缓冲区状态的:sio_iqueue(), sio_oqueue() 有时可能要设读写超时:sio_SetReadTimeouts(), sio_SetWriteTimeouts() 这些函数见名知义,用法查一下PComm.chm就行了。 编程方法: 接收数据一般免不了要开线程的,在接收线程里sio_iqueue()看一下有没有数据,有就处理,没就Sleep()一会。接收数据时它至少会帮你缓冲几十k,一般也不会丢数据。也可以用sio_term_irq()指定接收一定长数据数据就调用一个CALLBACK函数。 这些基本就齐活了。需要控制DTS/RTS、自动流控制都有,甚至还有Xmoderm/Ymoderm/Zmoderm发送文件。如果要Modbus之类的协议就要自己写了。 与其它串口开发方式比较:简单地说API是基础零件,自己做起来麻烦。MSComm控件、CSerialPort类是实验室产品,Pcomm lite是工业成熟产品。
### 回答1: UEFI BIOS Utility-EZ Mode是一种简单易用的BIOS设置界面,它提供了基本的系统信息、启动选项、调整CPU和内存频率、设置风扇控制等功能。它的设计使得用户可以轻松地进行基本的BIOS设置,而不需要深入了解BIOS的复杂性。 ### 回答2: UEFI BIOS Utility - EZ Mode是一种UEFI BIOS配置工具,它旨在使用户可以轻松管理和调整基本系统设置。EZ Mode提供了一个简化的图形用户界面面板,使用户能够快速而准确地调整各种BIOS选项。 EZ Mode界面以图形化方式呈现各种设置和参数,这使得用户可以更轻松地了解它们的含义和作用。例如,在EZ Mode中,用户可以快速地查看CPU速度、内存用量、系统温度、风扇转速等参数,并进行必要的调整以改善系统的性能和稳定性。 除了常规的设置,EZ Mode还提供了一些高级功能。例如,用户可以选择开启或关闭诸如Intel快速启动技术、USB 3.0支持、SATA控制器等功能,以最大程度地优化系统性能。 此外,EZ Mode还支持自动检测并更新BIOS固件,这可以保证系统始终运行在最新的稳定版本中。 总之,UEFI BIOS Utility - EZ Mode 是一个非常有用和功能强大的BIOS配置工具,它使用户在处理系统设置和参数时更加轻松。无论是普通用户还是高级用户,都可以从EZ Mode的功能中受益。 ### 回答3: UEFI BIOS Utility是现代计算机使用的一种新型Firmware。UEFI位于操作系统和硬件之间,主要负责计算机启动过程中的硬件自检以及操作系统的加载过程。UEFI BIOS Utility的EZ模式是一种简化操作的模式,旨在提供用户一个更加直观的界面,以便用户轻松地对计算机进行配置。 UEFI BIOS Utility的EZ模式提供了一个清晰的界面,可以让用户更加直观地了解计算机的硬件配置,系统信息以及启动选项等。在这种模式下,用户可以很方便地进行一些常见的设置,例如修改系统时间,设置启动顺序等等。同时,EZ模式还提供了导航面板,让用户轻松地找到需要的选项。 一些重要的系统配置也可以在EZ模式下进行调整。例如,用户可以配置CPU的频率和电压,设置内存检测参数等等。此外,用户还可以对硬盘进行分区,修改RAID设置和SATA模式等。 总之,UEFI BIOS Utility的EZ模式提供了一个真正的易用界面,让用户轻松处理大量的系统配置和硬件设置。当您需要进行系统调整的时候,把您的注意力放在EZ模式中,就不需要担心在BIOS中迷路了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值