Both directions of the 12-hour conversion carry a fixup for midnight and noon, and neither had been exercised.
Signed-off-by: Emmanuel Blot <[email protected]> --- tests/qtest/ds1339-test.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/tests/qtest/ds1339-test.c b/tests/qtest/ds1339-test.c index 7eec163049..3259fa1df3 100644 --- a/tests/qtest/ds1339-test.c +++ b/tests/qtest/ds1339-test.c @@ -14,6 +14,7 @@ /* DS1339 register map */ #define DS1339_SECONDS 0x00 +#define DS1339_HOURS 0x02 #define DS1339_DATE 0x04 #define DS1339_MONTH 0x05 #define DS1339_YEAR 0x06 @@ -26,6 +27,9 @@ #define DS1339_STATUS_OSF 0x80 +#define DS1339_HOURS_12 0x40 +#define DS1339_HOURS_PM 0x20 + /* The clock and calendar come up on the host time. */ static void test_time(void *obj, void *data, QGuestAllocator *alloc) { @@ -170,6 +174,46 @@ static void test_eosc_restart(void *obj, void *data, QGuestAllocator *alloc) g_assert_cmphex(resp[6], ==, 0x31); } +/* Midnight and noon are the hours the 12-hour encoding special-cases. */ +static void test_hour_mode_12(void *obj, void *data, QGuestAllocator *alloc) +{ + QI2CDevice *i2cdev = (QI2CDevice *)obj; + const uint8_t tod[3] = { + 0x59, 0x59, DS1339_HOURS_12 | DS1339_HOURS_PM | 0x11 /* 11:59:59 PM */ + }; + unsigned idx; + + i2c_set8(i2cdev, DS1339_HOURS, DS1339_HOURS_12 | 0x12); + g_assert_cmphex(i2c_get8(i2cdev, DS1339_HOURS), ==, + DS1339_HOURS_12 | 0x12); /* 12 AM is midnight */ + + i2c_set8(i2cdev, DS1339_HOURS, DS1339_HOURS_12 | DS1339_HOURS_PM | 0x12); + g_assert_cmphex(i2c_get8(i2cdev, DS1339_HOURS), ==, + DS1339_HOURS_12 | DS1339_HOURS_PM | 0x12); /* 12 PM noon */ + + i2c_set8(i2cdev, DS1339_HOURS, DS1339_HOURS_12 | DS1339_HOURS_PM | 0x01); + g_assert_cmphex(i2c_get8(i2cdev, DS1339_HOURS), ==, + DS1339_HOURS_12 | DS1339_HOURS_PM | 0x01); + + i2c_set8(i2cdev, DS1339_HOURS, DS1339_HOURS_12 | 0x11); + g_assert_cmphex(i2c_get8(i2cdev, DS1339_HOURS), ==, + DS1339_HOURS_12 | 0x11); + + i2c_set8(i2cdev, DS1339_HOURS, 0x13); + g_assert_cmphex(i2c_get8(i2cdev, DS1339_HOURS), ==, 0x13); + + /* An elapsed midnight moves 11 PM on to 12 AM, not to 00 or 13. */ + i2c_write_block(i2cdev, DS1339_SECONDS, tod, sizeof(tod)); + for (idx = 0; idx < 50; idx++) { + if (i2c_get8(i2cdev, DS1339_HOURS) != tod[2]) { + break; + } + g_usleep(100 * 1000); + } + g_assert_cmphex(i2c_get8(i2cdev, DS1339_HOURS), ==, + DS1339_HOURS_12 | 0x12); +} + /* Program 23:59:59 on the last day of a month and run the clock past it. */ static void check_month_rollover(QI2CDevice *i2cdev, uint8_t date, uint8_t month, uint8_t year, @@ -370,6 +414,7 @@ static void ds1339_register_nodes(void) qos_add_test("eosc-restart", "ds1339", test_eosc_restart, NULL); qos_add_test("stopped-reserved-bits", "ds1339", test_stopped_reserved_bits, NULL); + qos_add_test("hour-mode-12", "ds1339", test_hour_mode_12, NULL); qos_add_test("month-28-days", "ds1339", test_month_28_days, NULL); qos_add_test("month-29-days", "ds1339", test_month_29_days, NULL); qos_add_test("month-30-days", "ds1339", test_month_30_days, NULL); -- 2.50.1
