ReactOS,硬件抽象层,访问CMOS寄存器

 

分析环境reactos0.3.4 ,i386体系]

在HAL级所提供的针对CMOS功能
在硬件抽象层中,主要的功能是隐藏具体的硬件细节,向上层提供读取以及设置CMOS信息的相关函数,当然还有读取和设置时钟信息的相关函数,这些函数的接口对于上层是一致的,对于下层来说只有实现上的不同,因为不同体系结构不同的芯片也许端口地址或寄存器会有所不同,但是上层并不知道,应为HAL的函数接口是一致的。HAL对于CMOS来说向上层提供了如下函数:
(这些函数位于halx86\generic\cmos.c中)
 
读写CMOS寄存器
UCHAR
FORCEINLINE
HalpReadCmos(IN UCHAR Reg)
{
    /* 选择要访问的CMOS寄存器 */
    WRITE_PORT_UCHAR(CMOS_CONTROL_PORT, Reg);
 
    /* 从数据端口读出这个寄存器的值 */
    return READ_PORT_UCHAR(CMOS_DATA_PORT);
}
 
VOID
FORCEINLINE
HalpWriteCmos(IN UCHAR Reg,
              IN UCHAR Value)
{
     /* 选择要访问的CMOS寄存器 */
    WRITE_PORT_UCHAR(CMOS_CONTROL_PORT, Reg);
 
     /* 从数据端口写入制定得值到这个寄存器 */
    WRITE_PORT_UCHAR(CMOS_DATA_PORT, Value);
}
 
 
与环境信息相关:
HalGetEnvironmentVariable:用于获取保存在CMOS中的制定信息
HalSetEnvironmentVariable:用于获取保存在CMOS中的制定信息
 
这两个函数从目前的代码上看主要用于ReactOS用于设置计算机成功启动后的状态“LastKnownGood”两个函数所读取和设置的信息也仅仅是一些状态信息。这个信息保存在CMOS中首先是隐蔽性,其次是可靠性,应为CMOS的信息在断电后仍然有效。
 
HalSetEnvironmentVariable和HalGetEnvironmentVariable的访问方式类似,因此就已
HalGetEnvironmentVariable为例说明。
 
 
ARC_STATUS
NTAPI
HalGetEnvironmentVariable(IN PCH Name,                    // 目前仅仅接受LastKnownGood名字
                          IN USHORT ValueLength,         // 要求返回的字符串长度
                          IN PCH Value)                   // 出口参数,缓冲区地址保存返回的字符串
/*
* 功能:这个函数用于将一些特定的信息保存在RTC的状态寄存器的某些位上
*/
{
    UCHAR Val;
 
    /* Only variable supported on x86 */
    if (_stricmp(Name, "LastKnownGood")) return ENOENT;
 
    /* FIXME: Acquire CMOS Lock */
 
    /* 查询RTC寄存器的值Status register B索引号为0x0B */
    /* 目前仅仅是取最低位的值 */
    Val = HalpReadCmos(RTC_REGISTER_B) & 0x01;
 
    /* FIXME: Release CMOS lock */
 
    /* 如果最低位为1 */
    if (Val)
    {
        /* 则将FALSE”字符串的某个子集存放在value中,比如ValueLength=2value=FA
 如果ValueLength的长度大于“FALSE”的长度则超过部分填充NULL*/
        strncpy(Value, "FALSE", ValueLength);
    }
    else
    {
        /* Return true */
        strncpy(Value, "TRUE", ValueLength);
    }
 
    /* Return success */
    return ESUCCESS;
}
 

[如需转载请注明出处:(雄)blog.csdn.net/mickey139]

posted @ 2008-10-04 21:33  BinSys  阅读(581)  评论(0编辑  收藏  举报