Skip to contentSkip to conversation

hw/ds1338.c: Fix handling of HOURS register.

PATCH In review Antoine Mathys 3 participants 5 messages Dec 2, 2012 – Dec 4, 2012

lore
Share & tools
lore
#0 lore raw

PATCH 1/4 hw/ds1338.c: Fix handling of HOURS register.

Per the datasheet, the mapping between 12 and 24 hours modes is:

    0      <->  12   PM
    1-12   <->  1-12 AM
    13-23  <->  1-11 PM
---
 hw/ds1338.c |   23 +++++++++++++++--------
 1 file changed, 15 insertions(+), 8 deletions(-)
hw/ds1338.c +15 -8
index b576d56..1274b22 100644
@@ -50,9 +50,14 @@ static void capture_current_time(DS1338State *s)
     s->nvram[0] = to_bcd(now.tm_sec);
     s->nvram[1] = to_bcd(now.tm_min);
     if (s->nvram[2] & 0x40) {
-        s->nvram[2] = (to_bcd((now.tm_hour % 12)) + 1) | 0x40;
-        if (now.tm_hour >= 12) {
-            s->nvram[2] |= 0x20;
+        int tmp = now.tm_hour;
+        if (tmp == 0) {
+            tmp = 24;
+        }
+        if (tmp <= 12) {
+            s->nvram[2] = 0x40 | to_bcd(tmp);
+        } else {
+            s->nvram[2] = 0x60 | to_bcd(tmp - 12);
         }
     } else {
         s->nvram[2] = to_bcd(now.tm_hour);
@@ -127,15 +132,17 @@ static int ds1338_send(I2CSlave *i2c, uint8_t data)
             break;
         case 2:
             if (data & 0x40) {
+                int tmp = from_bcd(data & 0x1f);
                 if (data & 0x20) {
-                    data = from_bcd(data & 0x4f) + 11;
-                } else {
-                    data = from_bcd(data & 0x1f) - 1;
+                    tmp += 12;
+                }
+                if (tmp == 24) {
+                    tmp = 0;
                 }
+                now.tm_hour = tmp;
             } else {
-                data = from_bcd(data);
+                now.tm_hour = from_bcd(data & 0x3f);
             }
-            now.tm_hour = data;
             break;
         case 3:
             now.tm_wday = from_bcd(data & 7) - 1;
Signature · 1 line
1.7.10.4
#1 lore raw
Quoted 6 lines · Antoine Mathys

Per the datasheet, the mapping between 12 and 24 hours modes is:

    0      <->  12   PM
    1-12   <->  1-12 AM
    13-23  <->  1-11 PM

This looks good as far as the logic goes, but I think we could use some symbolic constants for the 12-hour and PM bits rather than all the literal 0x20 0x40 0x60.

thanks
-- PMM

#2 lore raw

Am 04.12.2012 18:42, schrieb Peter Maydell:

Quoted 11 lines · Antoine Mathys
Quoted 6 lines

Per the datasheet, the mapping between 12 and 24 hours modes is:

    0      <->  12   PM
    1-12   <->  1-12 AM
    13-23  <->  1-11 PM

This looks good as far as the logic goes, but I think we could use some symbolic constants for the 12-hour and PM bits rather than all the literal 0x20 0x40 0x60.

What about adding qtests like we have for the x86 RTC? Is I2C as problematic as PCI there?

Andreas

P.S. Antoine, please make sure you thread your patches to a cover letter so that they stay together on the list.

Signature · 2 lines
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg
#3 lore raw
In reply to Peter Maydell
Quoted 1 line · Peter Maydell

This looks good as far as the logic goes, but I think we could use some symbolic constants for the 12-hour and PM bits rather than all the literal 0x20 0x40 0x60. thanks -- PMM

I refrained from using symbolic constants for three reasons:
1. You need to refer to the datasheet anyway to understand what is going on.
2. The code is short and it is easy to keep track of a few constants.
3. Symbolic names, which can be quite long, tend to make the code harder rather than easier to read

It is largely a matter of preference though and I'm not opposed to the idea. I would appreciate naming suggestions though.

I propose not to have symbolic constants for the registers and to use CH, OSF, MODE12, PM for the various bits, provided such short names are acceptable. I'd really hate something like REG_HOURS_MODE12.

#4 lore raw
Quoted 10 lines · Antoine Mathys
Quoted 3 lines · Peter Maydell

This looks good as far as the logic goes, but I think we could use some symbolic constants for the 12-hour and PM bits rather than all the literal 0x20 0x40 0x60. thanks -- PMM

I refrained from using symbolic constants for three reasons:
1. You need to refer to the datasheet anyway to understand what is going on.
2. The code is short and it is easy to keep track of a few constants.
3. Symbolic names, which can be quite long, tend to make the code harder rather than easier to read

...I had the datasheet open and I still had to bounce back and forth several times to work out which bits you were working with, so I think we definitely disagree on this point...

Quoted 6 lines

It is largely a matter of preference though and I'm not opposed to the idea. I would appreciate naming suggestions though.

I propose not to have symbolic constants for the registers and to use CH, OSF, MODE12, PM for the various bits, provided such short names are acceptable. I'd really hate something like REG_HOURS_MODE12.

Your suggestions are definitely way too short; I'd go for something in the middle like CTRL_OSF and HOURS_12HR, HOURS_PM.

-- PMM