4 # FIXME: need to test the frequency test.
8 return [sid_cmd "sid::component::attribute_value $victim epoch-time"]
11 proc mask {value mask} {
12 return [expr $value & $mask]
18 set result [sid_cmd "sid::bus::write_h4_l1 $bus 0x7F8 0x80"]
19 if {$result == "ok"} { return 1 } else { return 0 }
25 set result [sid_cmd "sid::bus::write_h4_l1 $bus 0x7F8 0x0"]
26 if {$result == "ok"} { return 1 } else { return 0 }
32 set result [sid_cmd "sid::bus::write_h4_l1 $bus 0x7F8 0x40"]
33 if {$result == "ok"} { return 1 } else { return 0 }
39 set result [sid_cmd "sid::bus::write_h4_l1 $bus 0x7F8 0x0"]
40 if {$result == "ok"} { return 1 } else { return 0 }
44 set test "sid configuration"
45 sid_config_component_etc_test_with_tracing "ds1742.conf" \
46 "load [sid_find_file librtc.la] rtc_component_library" \
48 "load [sid_find_file libsched.la] sched_component_library
49 new sid-sched-host-accurate sched
50 load [sid_find_file libmemory.la] mem_component_library
51 new hw-memory-ram/rom-basic nvram
52 set sched num-clients 1
55 connect-bus real-victim memory-bus nvram read-write-port
56 connect-pin sched 0-control <- wrapper clock-control
57 connect-pin sched 0-event -> wrapper clock-event
58 relate tester sched sched"
63 if {[sid_start "ds1742.conf"]} { pass $test } else { fail $test ; return }
66 set test "read-write-port bus is present"
67 set result [sid_cmd "sid::component::find_bus $victim read-write-port"]
68 if {$result != ""} { pass $test } else { fail $test }
70 set test "clock pin is present"
71 set result [sid_cmd "sid::component::find_pin $victim clock"]
72 if {$result != ""} { pass $test } else { fail $test }
74 set test "all attributes are present"
75 sid_assert_includes_all "sid::component::attribute_names $victim" \
76 {"epoch-time" "century" "year" "month" "date" "day-of-week" "hour" "minute" "second"}
78 set test "reported time since epoch is sensible"
79 set result [get_epoch]
80 if {$result != "" && [expr abs($result - [clock seconds]) < 5]} {
87 # Set up an array of triggerpoint sensor pins (connected to the victim).
88 # Maintain another array that counts the number of times the triggerpoints are hit.
90 catch {unset watchpins triggercount}
91 foreach watchable {epoch-time oscillating write-mode} {
92 set test "establish a triggerpoint for watchable state variable: $watchable"
93 set watchpins($watchable) [sid_cmd "sid::pin::new"]
94 sid_cmd "set triggercount($watchable) 0"
96 "set hook_driven_h4($watchpins($watchable)) {global triggercount driven_h4_value; incr triggercount($watchable) }"
98 # Some limited URL encoding hacks.
99 # see sid/include/sidwatchutil.h for the rules.
100 regsub -- "-" $watchable "%2D" watchEnc
101 set result [sid_cmd "sid::component::connect_pin $victim watch:${watchEnc}:change $watchpins($watchable)"]
102 if {$result == "ok"} { pass $test } else { fail $test }
106 set test "save state"
107 set saved(time) [get_epoch]
109 [sid_cmd "sid::component::attribute_value $victim state-snapshot"]
110 if {$saved(state) != ""} { pass $test } else { fail $test }
112 foreach test_type { regular resstate } {
113 set test "time is incremented by an advancing clock"
114 set origin [get_epoch]
115 set clock_pin [sid_cmd "sid::component::find_pin $victim clock"]
116 for {set i 0} {$i < 5} {incr i} {
117 sid_cmd "sid::pin::driven_h4 $clock_pin 0"
119 # Time should now be advanced by 5.
120 set result [get_epoch]
121 if {$result != "" && [expr ($result - $origin) == 5]} {
127 set origin [get_epoch]
129 set test "read century attribute"
130 set result [sid_cmd "sid::component::attribute_value $victim century"]
132 set test_century $result
133 scan [clock format $origin -gmt true -format %Y] %d host_century
134 set host_century [expr $host_century / 100]
135 if {$test_century == $host_century} {
138 fail "$test -- got $test_century, expected $host_century"
144 set test "read year attribute"
145 set result [sid_cmd "sid::component::attribute_value $victim year"]
147 set test_year $result
148 scan [clock format $origin -gmt true -format %y] %d host_year
149 if {$test_year == $host_year} {
152 fail "$test -- got $test_year, expected $host_year"
158 set test "read month attribute"
159 set result [sid_cmd "sid::component::attribute_value $victim month"]
161 set test_month $result
162 scan [clock format $origin -gmt true -format %m] %d host_month
163 if {$test_month == $host_month} {
166 fail "$test -- got $test_month, expected $host_month"
172 set test "read date attribute"
173 set result [sid_cmd "sid::component::attribute_value $victim date"]
175 set test_date $result
176 scan [clock format $origin -gmt true -format %d] %d host_date
177 if {$test_date == $host_date} {
180 fail "$test -- got $test_date, expected $host_date"
186 set test "read day-of-week attribute"
187 set result [sid_cmd "sid::component::attribute_value $victim day-of-week"]
189 set test_weekday $result
190 scan [clock format $origin -gmt true -format %w] %d host_weekday
192 if {$test_weekday == $host_weekday} {
195 fail "$test -- got $test_weekday, expected $host_weekday"
201 set test "read hour attribute"
202 set result [sid_cmd "sid::component::attribute_value $victim hour"]
204 set test_hour $result
205 scan [clock format $origin -gmt true -format %H] %d host_hour
206 if {$test_hour == $host_hour} {
209 fail "$test -- got $test_hour, expected $host_hour"
215 set test "read minute attribute"
216 set result [sid_cmd "sid::component::attribute_value $victim minute"]
218 set test_minute $result
219 scan [clock format $origin -gmt true -format %M] %d host_minute
220 if {$test_minute == $host_minute} {
223 fail "$test -- got $test_minute, expected $host_minute"
229 set test "read second attribute"
230 set result [sid_cmd "sid::component::attribute_value $victim second"]
232 set test_second $result
233 scan [clock format $origin -gmt true -format %S] %d host_second
234 if {$test_second == $host_second} {
237 fail "$test -- got $test_second, expected $host_second"
243 set test "fill regular non-volatile memory with test bytes"
245 set bus [sid_cmd "sid::component::find_bus $victim read-write-port"]
249 for {set addr 0} {$addr < [expr $size - 8]} {incr addr} {
250 if {$addr % 2} { set data 0x55 } else { set data 0xAA }
251 set result [sid_cmd "sid::bus::write_h4_l1 $bus $addr $data"]
252 if {$result != "ok"} { set okay 0; break }
254 if {$okay} { pass $test } else { fail $test }
258 set test "validate memory was written correctly"
260 set bus [sid_cmd "sid::component::find_bus $victim read-write-port"]
264 for {set addr 0} {$addr < [expr $size - 8]} {incr addr} {
265 if {$addr % 2} { set data 0x55 } else { set data 0xAA }
266 set result [sid_cmd "sid::bus::read_h4_l1 $bus $addr"]
267 if {[lindex $result 0] != "ok" || [lindex $result 1] != $data} {
272 if {$okay} { pass $test } else { fail $test }
276 # Make sure out of range addresses are caught.
277 set test "out by one address is caught unmapped"
278 set bus [sid_cmd "sid::component::find_bus $victim read-write-port"]
282 set result [sid_cmd "sid::bus::write_h4_l1 $bus $size 0"]
283 if {$result != "unmapped"} { fail $test } else { pass $test }
287 set test "battery is not flat"
288 set result [sid_cmd "sid::bus::read_h4_l1 $bus 0x7FC"]
289 if {[lindex $result 0] == "ok" && [mask [lindex $result 1] 0x80] == 0x80} {
292 fail "$test -- got $result, expected 0x80 to be set"
296 set test "read mode does not alter epoch time"
297 if {[start_read] && [end_read]} {
299 if {$origin == $now} {
302 fail "$test -- got $now, expected $origin"
309 set test "write mode does not alter epoch time"
310 if {[start_write] && [end_write]} {
312 if {$origin == $now} {
315 fail "$test -- got $now, expected $origin"
317 } else { fail $test }
320 set test "read year register"
321 set result [sid_cmd "sid::bus::read_h4_l1 $bus 0x7FF"]
322 scan [clock format $origin -gmt true -format %y] %x year
323 if {[lindex $result 0] == "ok" && [lindex $result 1] == $year} {
330 set test "read month register"
331 set result [sid_cmd "sid::bus::read_h4_l1 $bus 0x7FE"]
332 scan [clock format $origin -gmt true -format %m] %x month
333 if {[lindex $result 0] == "ok" && [mask [lindex $result 1] 0x1F] == $month} {
340 set test "read date register"
341 set result [sid_cmd "sid::bus::read_h4_l1 $bus 0x7FD"]
342 scan [clock format $origin -gmt true -format %d] %x date
343 if {[lindex $result 0] == "ok" && [mask [lindex $result 1] 0x3F] == $date} {
350 set test "read day register"
351 set result [sid_cmd "sid::bus::read_h4_l1 $bus 0x7FC"]
352 set wday [expr [clock format $origin -gmt true -format %w] + 1]
354 if {[lindex $result 0] == "ok" && [mask [lindex $result 1] 0x07] == $wday} {
361 set test "read hour register"
362 set result [sid_cmd "sid::bus::read_h4_l1 $bus 0x7FB"]
363 scan [clock format $origin -gmt true -format %H] %x hour
364 if {[lindex $result 0] == "ok" && [mask [lindex $result 1] 0x3F] == $hour} {
371 set test "read minutes register"
372 set result [sid_cmd "sid::bus::read_h4_l1 $bus 0x7FA"]
373 scan [clock format $origin -gmt true -format %M] %x mins
374 if {[lindex $result 0] == "ok" && [mask [lindex $result 1] 0x7F] == $mins} {
381 set test "read seconds register"
382 set result [sid_cmd "sid::bus::read_h4_l1 $bus 0x7F9"]
383 scan [clock format $origin -gmt true -format %S] %x secs
384 set sec [mask [lindex $result 1] 0x7F]
386 if {[lindex $result 0] == "ok" && [mask [lindex $result 1] 0x7F] == $secs} {
393 set test "read bit stops the clock"
394 set origin [get_epoch]
396 set clock_pin [sid_cmd "sid::component::find_pin $victim clock"]
397 for {set i 0} {$i < 5} {incr i} {
398 sid_cmd "sid::pin::driven_h4 $clock_pin 0"
400 # Time should now be advanced by 5.
405 if {$now == $origin} { pass $test } else { fail $test }
407 } else { fail $test }
410 set test "write bit stops the clock"
411 set origin [get_epoch]
413 set clock_pin [sid_cmd "sid::component::find_pin $victim clock"]
414 for {set i 0} {$i < 5} {incr i} {
415 sid_cmd "sid::pin::driven_h4 $clock_pin 0"
417 # Time should now be advanced by 5.
422 if {$now == $origin} { pass $test } else { fail $test }
424 } else { fail $test }
427 # Disconnect the oscillator.
429 set test "disconnect the oscillator"
430 set origin [get_epoch]
431 set result [sid_cmd "sid::bus::write_h4_l1 $bus 0x7F9 0x80"]
432 if {$result == "ok"} { pass $test } else { fail $test }
434 set clock_pin [sid_cmd "sid::component::find_pin $victim clock"]
435 for {set i 0} {$i < 5} {incr i} {
436 sid_cmd "sid::pin::driven_h4 $clock_pin 0"
438 # Time should now be advanced by 5.
440 set test "read year register with oscillator disconnected"
441 set result [sid_cmd "sid::bus::read_h4_l1 $bus 0x7FF"]
442 scan [clock format $origin -gmt true -format %y] %x year
443 if {[lindex $result 0] == "ok" && [lindex $result 1] == $year} {
450 set test "read month register with oscillator disconnected"
451 set result [sid_cmd "sid::bus::read_h4_l1 $bus 0x7FE"]
452 scan [clock format $origin -gmt true -format %m] %x month
453 if {[lindex $result 0] == "ok" && [mask [lindex $result 1] 0x1F] == $month} {
460 set test "read date register with oscillator disconnected"
461 set result [sid_cmd "sid::bus::read_h4_l1 $bus 0x7FD"]
462 scan [clock format $origin -gmt true -format %d] %x date
463 if {[lindex $result 0] == "ok" && [mask [lindex $result 1] 0x3F] == $date} {
470 set test "read day register with oscillator disconnected"
471 set result [sid_cmd "sid::bus::read_h4_l1 $bus 0x7FC"]
472 set wday [expr [clock format $origin -gmt true -format %w] + 1]
473 if {[lindex $result 0] == "ok" && [mask [lindex $result 1] 0x07] == $wday} {
480 set test "read hour register with oscillator disconnected"
481 set result [sid_cmd "sid::bus::read_h4_l1 $bus 0x7FB"]
482 scan [clock format $origin -gmt true -format %H] %x hour
483 if {[lindex $result 0] == "ok" && [mask [lindex $result 1] 0x3F] == $hour} {
490 set test "read minutes register with oscillator disconnected"
491 set result [sid_cmd "sid::bus::read_h4_l1 $bus 0x7FA"]
492 scan [clock format $origin -gmt true -format %M] %x mins
493 if {[lindex $result 0] == "ok" && [mask [lindex $result 1] 0x7F] == $mins} {
500 set test "read seconds register with oscillator disconnected"
501 set result [sid_cmd "sid::bus::read_h4_l1 $bus 0x7F9"]
502 scan [clock format $origin -gmt true -format %S] %x secs
503 set sec [mask [lindex $result 1] 0x7F]
504 if {[lindex $result 0] == "ok" && $sec == $secs} {
510 # Reconnect the oscillator.
512 set test "reconnect the oscillator"
513 set result [sid_cmd "sid::bus::write_h4_l1 $bus 0x7F9 0"]
514 if {$result == "ok"} { pass $test } else { fail $test }
516 set clock_pin [sid_cmd "sid::component::find_pin $victim clock"]
517 for {set i 0} {$i < 5} {incr i} {
518 sid_cmd "sid::pin::driven_h4 $clock_pin 0"
520 # Time should now be advanced by 5.
522 # Check that epoch time has advanced by 5.
523 set test "reconnecting the oscillator works"
524 set result [get_epoch]
525 if {[expr $result - $origin] == 5} { pass $test } else { fail $test }
527 # Test altering each field of the time/date structure.
528 # These are written to the registers as BCD.
530 set test "modify the year register"
531 set origin [get_epoch]
534 set result [sid_cmd "sid::bus::write_h4_l1 $bus 0x7FF $year"]
535 if {$result != "ok"} {
539 if {[get_epoch] != $origin} { pass $test } else { fail $test }
543 set test "modify the month register"
544 set origin [get_epoch]
546 set result [sid_cmd "sid::bus::read_h4_l1 $bus 0x7FE"]
547 if {[lindex $result 0] != "ok"} {
551 set month [lindex $result 1]
553 if {$month > 12} { set month 1 }
555 set result [sid_cmd "sid::bus::write_h4_l1 $bus 0x7FE $month"]
556 if {$result != "ok"} {
560 if {[get_epoch] != $origin} { pass $test } else { fail $test }
565 set test "modify the date register"
566 set origin [get_epoch]
568 set result [sid_cmd "sid::bus::read_h4_l1 $bus 0x7FD"]
569 if {[lindex $result 0] != "ok"} {
573 set date [lindex $result 1]
575 # Don't bother trying to handle variable number of days/month.
576 if {$date > 28} { set date 1 }
578 set result [sid_cmd "sid::bus::write_h4_l1 $bus 0x7FD $date"]
579 if {$result != "ok"} {
583 if {[get_epoch] != $origin} { pass $test } else { fail $test }
588 set test "modify the day register with an invalid value"
589 set result [sid_cmd "sid::bus::write_h4_l1 $bus 0x7FC 0"]
590 if {$result == "ok"} { pass $test } else { fail $test}
593 set test "modify the day register"
594 set origin [get_epoch]
596 set result [sid_cmd "sid::bus::read_h4_l1 $bus 0x7FC"]
597 if {[lindex $result 0] != "ok"} {
601 set day [lindex $result 1]
602 set data [expr $day & 0xF8]
603 set day [expr $day & 0x07]
604 if {$day > 7} { set day 1 } else { incr day }
605 set day [format %X [expr $data | $day]]
607 set result [sid_cmd "sid::bus::write_h4_l1 $bus 0x7FC $day"]
608 if {$result != "ok"} {
612 if {[get_epoch] == $origin} { pass $test } else { fail $test }
617 set test "modify the hour register"
618 set origin [get_epoch]
620 set result [sid_cmd "sid::bus::read_h4_l1 $bus 0x7FB"]
621 if {[lindex $result 0] != "ok"} {
625 set hour [lindex $result 1]
627 if {$hour > 23} { set hour 0 }
629 set result [sid_cmd "sid::bus::write_h4_l1 $bus 0x7FB $hour"]
630 if {$result != "ok"} {
634 if {[get_epoch] != $origin} { pass $test } else { fail $test }
639 set test "modify the minute register"
640 set origin [get_epoch]
642 set result [sid_cmd "sid::bus::read_h4_l1 $bus 0x7FA"]
643 if {[lindex $result 0] != "ok"} {
647 set minute [lindex $result 1]
649 if {$minute > 59} { set minute 0 }
651 set result [sid_cmd "sid::bus::write_h4_l1 $bus 0x7FA $minute"]
652 if {$result != "ok"} {
656 if {[get_epoch] != $origin} { pass $test } else { fail $test }
661 set test "modify the second register"
662 set origin [get_epoch]
664 set result [sid_cmd "sid::bus::read_h4_l1 $bus 0x7F9"]
665 if {[lindex $result 0] != "ok"} {
669 set seconds [lindex $result 1]
671 if {$seconds > 59} { set seconds 0 }
673 set result [sid_cmd "sid::bus::write_h4_l1 $bus 0x7F9 $seconds"]
674 if {$result != "ok"} {
678 if {[get_epoch] != $origin} { pass $test } else { fail $test }
683 set test "modify the century register"
684 set origin [get_epoch]
686 set result [sid_cmd "sid::bus::read_h4_l1 $bus 0x7F8"]
687 if {[lindex $result 0] != "ok"} {
691 set century [lindex $result 1]
692 set data [expr $century | 0x80]
694 set result [sid_cmd "sid::bus::write_h4_l1 $bus 0x7F8 $data"]
695 if {$result != "ok"} {
699 if {[get_epoch] != $origin} { fail $test } else { pass $test }
703 # FIXME: test restore state.
705 set res_testtype [string compare $test_type "regular"]
706 if { $res_testtype == 0 } {
707 #set test "Restore state"
708 set test "Restore state"
709 set ok [sid_cmd "sid::component::set_attribute_value $victim state-snapshot [list $saved(state)]"]
710 if {$ok == "ok"} then { pass $test } else { fail $test }
715 # This list specifies addresses and bitmasks to locate free, unused
716 # bits which may be used as NVRAM.
718 foreach pair {{0x7FE 0xE0} {0x7FD 0xC0} {0x7FC 0x38} {0x7FB 0xC0} {0x7FA 0x80}} {
719 set hex_addr [lindex $pair 0]
720 set hex_mask [lindex $pair 1]
722 set test "store data in free bits at $hex_addr"
723 set result [sid_cmd "sid::bus::write_h4_l1 $bus $hex_addr 0xFF"]
724 if {$result == "ok"} {
725 set result [sid_cmd "sid::bus::read_h4_l1 $bus $hex_addr"]
726 if {[lindex $result 0] == "ok" && \
727 [mask [lindex $result 1] $hex_mask] == $hex_mask} {
730 fail "$test -- readback error"
733 fail "$test -- write error"
738 set test "epoch-time triggerpoint fired 16 times"
739 if {[sid_cmd "set triggercount(epoch-time)"] == "32"} { pass $test } else { fail $test }
741 set test "oscillating triggerpoint fired twice"
742 if {[sid_cmd "set triggercount(oscillating)"] == "4"} { pass $test } else { fail $test }
744 set test "write-mode triggerpoint fired 37 times"
745 if {[sid_cmd "set triggercount(write-mode)"] == "81"} { pass $test } else { fail $test }
747 catch {unset watchpins triggercount}
750 # FIXME: add tests for the frequency test function.
753 if [sid_stop] then { pass $test } else { fail $test ; return }
755 # zap temp file if tests were successful
757 if {$exit_status == "0"} then { file delete "ds1742.conf" }