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=2则value=“FA”
如果ValueLength的长度大于“FALSE”的长度则超过部分填充NULL*/
strncpy(Value, "FALSE", ValueLength);
}
else
{
/* Return true */
strncpy(Value, "TRUE", ValueLength);
}
/* Return success */
return ESUCCESS;
}
[如需转载请注明出处:(雄)blog.csdn.net/mickey139]