From 135c881e4d29ef5be1462a5f9788d546b3b2cad2 Mon Sep 17 00:00:00 2001 From: Fabien Siron Date: Wed, 27 Jan 2016 17:51:46 +0000 Subject: [PATCH 1/2] Improve cmos reading --- kernel/devices/cmos.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/kernel/devices/cmos.c b/kernel/devices/cmos.c index 158244da..e68cfb60 100644 --- a/kernel/devices/cmos.c +++ b/kernel/devices/cmos.c @@ -18,6 +18,16 @@ * and regular decimal integers. */ #define from_bcd(val) ((val / 16) * 10 + (val & 0xf)) +enum cmos_values +{ + CMOS_SECOND = 0, + CMOS_MINUTE = 2, + CMOS_HOUR = 4, + CMOS_DAY = 7, + CMOS_MONTH = 8, + CMOS_YEAR = 9 +}; + void cmos_dump( uint16_t * values @@ -29,6 +39,12 @@ cmos_dump( } } +int is_update_in_progress(void) +{ + outportb(0x70, 0x0a); + return inportb(0x71) & 0x80; +} + /** * Get the current month and day. * @@ -127,8 +143,27 @@ uint32_t boot_time = 0; uint32_t read_cmos(void) { uint16_t values[128]; + uint16_t old_values[128]; + + while (is_update_in_progress()) + ; + cmos_dump(values); + do + { + memcpy(old_values, values, 128); + while (is_update_in_progress()) + ; + + cmos_dump(values); + } while ((old_values[CMOS_SECOND] != values[CMOS_SECOND]) || + (old_values[CMOS_MINUTE] != values[CMOS_MINUTE]) || + (old_values[CMOS_HOUR] != values[CMOS_HOUR]) || + (old_values[CMOS_DAY] != values[CMOS_DAY]) || + (old_values[CMOS_MONTH] != values[CMOS_MONTH]) || + (old_values[CMOS_YEAR] != values[CMOS_YEAR])); + /* Math Time */ uint32_t time = secs_of_years(from_bcd(values[9]) - 1) + secs_of_month(from_bcd(values[8]) - 1, from_bcd(values[9])) + From 01ebba1a5289035fb1bd3fcd58e5a9fb8d4d72d3 Mon Sep 17 00:00:00 2001 From: Fabien Siron Date: Wed, 27 Jan 2016 19:00:14 +0000 Subject: [PATCH 2/2] Improve code readability of the cmos driver --- kernel/devices/cmos.c | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/kernel/devices/cmos.c b/kernel/devices/cmos.c index e68cfb60..6b5e2880 100644 --- a/kernel/devices/cmos.c +++ b/kernel/devices/cmos.c @@ -18,7 +18,10 @@ * and regular decimal integers. */ #define from_bcd(val) ((val / 16) * 10 + (val & 0xf)) -enum cmos_values +#define CMOS_ADDRESS 0x70 +#define CMOS_DATA 0x71 + +enum { CMOS_SECOND = 0, CMOS_MINUTE = 2, @@ -34,15 +37,15 @@ cmos_dump( ) { uint16_t index; for (index = 0; index < 128; ++index) { - outportb(0x70, index); - values[index] = inportb(0x71); + outportb(CMOS_ADDRESS, index); + values[index] = inportb(CMOS_DATA); } } int is_update_in_progress(void) { - outportb(0x70, 0x0a); - return inportb(0x71) & 0x80; + outportb(CMOS_ADDRESS, 0x0a); + return inportb(CMOS_DATA) & 0x80; } /** @@ -59,8 +62,8 @@ get_date( uint16_t values[128]; /* CMOS dump */ cmos_dump(values); - *month = from_bcd(values[8]); - *day = from_bcd(values[7]); + *month = from_bcd(values[CMOS_MONTH]); + *day = from_bcd(values[CMOS_DAY]); } /** @@ -79,9 +82,9 @@ get_time( uint16_t values[128]; /* CMOS dump */ cmos_dump(values); - *hours = from_bcd(values[4]); - *minutes = from_bcd(values[2]); - *seconds = from_bcd(values[0]); + *hours = from_bcd(values[CMOS_HOUR]); + *minutes = from_bcd(values[CMOS_MINUTE]); + *seconds = from_bcd(values[CMOS_SECOND]); } uint32_t secs_of_years(int years) { @@ -165,13 +168,15 @@ uint32_t read_cmos(void) { (old_values[CMOS_YEAR] != values[CMOS_YEAR])); /* Math Time */ - uint32_t time = secs_of_years(from_bcd(values[9]) - 1) + - secs_of_month(from_bcd(values[8]) - 1, from_bcd(values[9])) + - (from_bcd(values[7]) - 1) * 86400 + - (from_bcd(values[4])) * 3600 + - (from_bcd(values[2])) * 60 + - from_bcd(values[0]) + - 0; + uint32_t time = + secs_of_years(from_bcd(values[CMOS_YEAR]) - 1) + + secs_of_month(from_bcd(values[CMOS_MONTH]) - 1, + from_bcd(values[CMOS_YEAR])) + + (from_bcd(values[CMOS_DAY]) - 1) * 86400 + + (from_bcd(values[CMOS_HOUR])) * 3600 + + (from_bcd(values[CMOS_MINUTE])) * 60 + + from_bcd(values[CMOS_SECOND]) + 0; + return time; }