X86 CMOS

3 篇文章 0 订阅

1、cmos简介。
cmos是主板上一块可读写的RAM芯片。用途:主要用来保存当前系统的硬件配置和操作人员对某些参数的设定。cmos芯片是由一块纽扣电池供电。因此在关机状态内部信息也不会丢失。

2、cmos所在的端口。
cmos芯片是挂在cpu的io空间上的.(x86体系是独立编址的)。cmos拥有两个端口号分别是70h和71h

端口号 权限 长度 作用
70h 不可读可写 8bit 用它来设置cmos中的数据地址
71h 可读可写 8bit 用它来设置70h端口地址中的值

3、cmos中的数据地址对照表。(供编程时查)
地址 数据 备注
00H Time - Seconds 硬件时间的秒
01H Alarm - Seconds
02H Time - Minutes 硬件时间的分
03H Alarm - Minutes
04H Time - Hours 硬件时间的时
05H Alarm - Hours
06H Date - Day of the week
07H Date - Day
08H Date - Month
09H Date - Year
0AH Status Register A
0BH Status Register B
0CH Status Register C
0DH Status Register D
0EH Diagnostic Status
0FH Shutdown Status
10H A:
11H Reserved
12H 0
13H Reserved
14H Equipment Installed
15H Base Memory (high byte)
16H Base memory (low byte)
17H Extended Memory (high byte)
18H Extended Memory (low byte)
19H 0 (C:) Hard Disk Type
1AH 1 (D:) Hard Disk Type
1BH Reserved
1CH Supervisor Password
1DH Supervisor Password
1EH ~ 2DH Reserved
2EH CMOS Checksum (high byte)
2FH CMOS Checksum (low byte)
30H Extended Memory (high byte)
31H Extended Memory (low byte)
32H Date - Century
33H Power On Status
34H~3FH Reserved
40H~5FH Extended CMOS
60H User Password
61H User Password
62H~7FH Extended CMOS

4、编程实例



#ifndef _CMOS_H_
#define _CMOS_H_    1

#include <io.h>

/* CMOS I/O REG */
#define CMOS_ADDR_REG   0x70
#define CMOS_DATA_REG   0x71

/* CMOS INDEX */
#define CMOS_INDEX_SECOND       0
#define CMOS_INDEX_SECOND_ALARM 1
#define CMOS_INDEX_MINUTE       2
#define CMOS_INDEX_MINUTE_ALARM 3
#define CMOS_INDEX_HOUR     4
#define CMOS_INDEX_HOUR_ALARM       5
#define CMOS_INDEX_DAY_OF_WEEK      6
#define CMOS_INDEX_DAY_OF_MONTH 7
#define CMOS_INDEX_MONTH        8
#define CMOS_INDEX_YEAR     9

#define CMOS_INDEX_STATUS_A 0xA
#define CMOS_INDEX_STATUS_B 0xB
#define CMOS_INDEX_STATUS_C 0xC
#define CMOS_INDEX_STATUS_D 0xD

#define CMOS_STATUS_B_DAYLIGHT  1
#define CMOS_STATUS_B_24HOUR    2
#define CMOS_STATUS_B_BINARY    4

static inline uint8_t bcd_to_num(uint8_t a)
{
  return ((a >> 4) * 10 + (a & 0xF));
}

static inline uint8_t num_to_bcd(uint8_t a)
{
  return (((a / 10) << 4) + (a % 10));
}

static inline uint8_t cmos_read(uint8_t index)
{
  outb(CMOS_ADDR_REG, index);
  return inb(CMOS_DATA_REG);
}

static inline void cmos_write(uint8_t index, uint8_t value)
{
  outb(CMOS_ADDR_REG, index);
  outb(CMOS_DATA_REG, value);
}


#endif /* _CMOS_H_ */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值