1
/* kern/i386/datetime.c - x86 CMOS datetime function.
3
* GRUB -- GRand Unified Bootloader
4
* Copyright (C) 2008 Free Software Foundation, Inc.
6
* GRUB is free software: you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation, either version 3 of the License, or
9
* (at your option) any later version.
11
* GRUB is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
20
#include <grub/datetime.h>
21
#include <grub/i386/cmos.h>
24
grub_get_datetime (struct grub_datetime *datetime)
26
int is_bcd, is_12hour;
27
grub_uint8_t value, flag;
29
flag = grub_cmos_read (GRUB_CMOS_INDEX_STATUS_B);
31
is_bcd = ! (flag & GRUB_CMOS_STATUS_B_BINARY);
33
value = grub_cmos_read (GRUB_CMOS_INDEX_YEAR);
35
value = grub_bcd_to_num (value);
37
datetime->year = value;
38
datetime->year += (value < 80) ? 2000 : 1900;
40
value = grub_cmos_read (GRUB_CMOS_INDEX_MONTH);
42
value = grub_bcd_to_num (value);
44
datetime->month = value;
46
value = grub_cmos_read (GRUB_CMOS_INDEX_DAY_OF_MONTH);
48
value = grub_bcd_to_num (value);
50
datetime->day = value;
52
is_12hour = ! (flag & GRUB_CMOS_STATUS_B_24HOUR);
54
value = grub_cmos_read (GRUB_CMOS_INDEX_HOUR);
57
is_12hour = (value & 0x80);
64
value = grub_bcd_to_num (value);
69
datetime->hour = value;
71
value = grub_cmos_read (GRUB_CMOS_INDEX_MINUTE);
73
value = grub_bcd_to_num (value);
75
datetime->minute = value;
77
value = grub_cmos_read (GRUB_CMOS_INDEX_SECOND);
79
value = grub_bcd_to_num (value);
81
datetime->second = value;
87
grub_set_datetime (struct grub_datetime *datetime)
89
int is_bcd, is_12hour;
90
grub_uint8_t value, flag;
92
flag = grub_cmos_read (GRUB_CMOS_INDEX_STATUS_B);
94
is_bcd = ! (flag & GRUB_CMOS_STATUS_B_BINARY);
96
value = ((datetime->year >= 2000) ? datetime->year - 2000 :
97
datetime->year - 1900);
100
value = grub_num_to_bcd (value);
102
grub_cmos_write (GRUB_CMOS_INDEX_YEAR, value);
104
value = datetime->month;
107
value = grub_num_to_bcd (value);
109
grub_cmos_write (GRUB_CMOS_INDEX_MONTH, value);
111
value = datetime->day;
114
value = grub_num_to_bcd (value);
116
grub_cmos_write (GRUB_CMOS_INDEX_DAY_OF_MONTH, value);
118
value = datetime->hour;
120
is_12hour = (! (flag & GRUB_CMOS_STATUS_B_24HOUR));
133
value = grub_num_to_bcd (value);
138
grub_cmos_write (GRUB_CMOS_INDEX_HOUR, value);
140
value = datetime->minute;
143
value = grub_num_to_bcd (value);
145
grub_cmos_write (GRUB_CMOS_INDEX_MINUTE, value);
147
value = datetime->second;
150
value = grub_num_to_bcd (value);
152
grub_cmos_write (GRUB_CMOS_INDEX_SECOND, value);