OSDN Git Service

Enable to track git://github.com/monaka/binutils.git
[pf3gnuchains/pf3gnuchains3x.git] / sid / component / testsuite / sidcomp.memory / at29.exp
diff --git a/sid/component/testsuite/sidcomp.memory/at29.exp b/sid/component/testsuite/sidcomp.memory/at29.exp
new file mode 100644 (file)
index 0000000..e6cd6aa
--- /dev/null
@@ -0,0 +1,304 @@
+# Initialisation.
+set manufacturer_code 0x1F
+
+set test "sid configuration"
+sid_config_component_test "at29.conf" \
+    "load libmemory.la mem_component_library" \
+    "hw-memory-flash-at29"
+pass $test
+
+set test "sid start"
+if {[sid_start "at29.conf"]} { pass $test } else { fail $test ; return }
+
+
+set test "attribute list"
+sid_assert_includes_all "sid::component::attribute_names $victim" \
+   {size sector-size device-code manufacturer-code image-file}
+
+
+set test "read-write-port bus is present"
+set result [sid_cmd "sid::component::find_bus $victim read-write-port"]
+if {$result != ""} { pass $test } else { fail $test }
+
+
+set test "set size to 512 bytes"
+sid_assert_success "sid::component::set_attribute_value $victim size 200"
+
+
+set test "validate size is 512 bytes"
+set size [sid_cmd "sid::component::attribute_value $victim size"]
+if {$size == "200"} { pass $test } else { fail $test }
+
+
+set test "test for memory leaks"
+set iterations 100
+for {set i 0} {$i < $iterations} {incr i} {
+    # some size between 1 .. 16MB
+    set size [expr {1000000 + (($i * 101) % 16) * 1000000}]
+    sid_cmd "sid::component::set_attribute_value $victim size $size"
+}
+sid_assert_success "sid::component::set_attribute_value $victim size 0"
+
+
+set test "set memory size to 8192 bytes"
+sid_assert_success "sid::component::set_attribute_value $victim size 8192"
+
+# Test various sector sizes.
+
+foreach bad_sectorsize {0 8193} {
+    set test "set an invalid sector size of $bad_sectorsize bytes"
+    set result [sid_cmd \
+      "sid::component::set_attribute_value $victim sector-size $bad_sectorsize"]
+    if {$result == "bad_value"} { pass $test } else { fail $test}
+}
+foreach sectorsize {16 32 128 256 512 1024} {
+    set test "set and validate sector size of $sectorsize bytes"
+    sid_cmd "sid::component::set_attribute_value $victim sector-size $sectorsize"
+    set result [sid_cmd "sid::component::attribute_value $victim sector-size"]
+    if {$result == $sectorsize} { pass $test } else { 
+       fail "$test -- got $result and expected $sectorsize"
+    }
+}
+
+set test "set sector size to 256 bytes"
+sid_assert_success "sid::component::set_attribute_value $victim sector-size 256"
+
+
+set test "validate sector size is 256 bytes"
+sid_assert_success "sid::component::attribute_value $victim sector-size"
+
+
+set test "read memory image from a file"
+set file [open "test.dat" w]
+fconfigure $file -translation binary
+set data 0
+set size [sid_cmd "sid::component::attribute_value $victim size"]
+for {set i 0} {$i < $size} {incr i} {
+    set data [expr {(($data * 19) + 13) % 256}]
+    puts -nonewline $file [binary format "c" $data]
+}
+close $file
+set res [sid_cmd "sid::component::set_attribute_value $victim image-file test.dat"]
+set pin [sid_cmd "sid::component::find_pin $victim image-load"]
+sid_cmd "sid::pin::driven_h4 $pin 0"
+file delete -force $file
+if {$res == "ok" && $pin != ""} then { pass $test } else { fail $test }
+file delete -force $file
+
+
+set test "verify read memory image"
+set data 0
+set bus [sid_cmd "sid::component::find_bus $victim read-write-port"]
+set size [sid_cmd "sid::component::attribute_value $victim size"]
+for {set i 0} {$i < $size} {incr i} {
+    set data [expr {(($data * 19) + 13) % 256}]
+    set addr $i
+    set result [sid_cmd "sid::bus::read_h4_l1 $bus $addr"]
+    if ![sid_bus_ok_p $result] { fail $test; break }
+    set result_data [lindex $result 1]
+    if {$result_data != $data} {
+       fail "$test - mismatch @ $i - $result_data vs $data"
+       break
+    }
+}
+if {$i == $size} { pass $test } else { fail "$test $i $size" }
+
+
+foreach hex_addr {0x0 0x100 0x1E0 0x20F 0x222 0x29A 0x4BC 0x551 0x555 0x6B0 0x1010 0x10FF} {
+    set test "unpermitted write to address $hex_addr has no effect"
+    set hex_data 0xAA
+
+    set result [sid_cmd "sid::bus::read_h4_l1 $bus $hex_addr"]
+    if {[sid_bus_ok_p $result] && [lindex $result 1] == $hex_data} {
+       unresolved "magic byte already in address $hex_addr"
+       continue
+    }
+
+    set result [sid_cmd "sid::bus::write_h4_l1 $bus $hex_addr $hex_data"]
+    if ![sid_bus_ok_p $result] {
+       fail "$test (bus error)"
+    } else {
+       set result [sid_cmd "sid::bus::read_h4_l1 $bus $hex_addr"]
+       if {[sid_bus_ok_p $result] && [lindex $result 1] != $hex_data} {
+           pass $test
+       } else {
+           fail "$test -- mismatch @ $hex_addr, $hex_data vs [lindex $result 1]"
+       }
+    }
+}
+
+
+set test "writing magic bytes to disable software data protection"
+set okay 1
+foreach pair {{0xAA 0x5555} {0x55 0xAAAA} {0xA0 0x5555}} {
+    set hex_data [lindex $pair 0]
+    set hex_addr [lindex $pair 1]
+    set result [sid_cmd "sid::bus::write_h4_l1 $bus $hex_addr $hex_data"]
+    if ![sid_bus_ok_p $result] {
+       set okay 0
+       break
+    }
+}
+if {$okay} { pass $test } else { fail "$test (bus error)" }
+
+
+set test "program the first sector"
+set size [sid_cmd "sid::component::attribute_value $victim size"]
+set sector_size [sid_cmd "sid::component::attribute_value $victim sector-size"]
+set okay 1
+for {set addr 0} {$addr < $sector_size} {incr addr} {
+    set result [sid_cmd "sid::bus::write_h4_l1 $bus $addr 0x66"]
+    if ![sid_bus_ok_p $result] {
+       set okay 0
+       break
+    }
+}
+
+
+set test "validate the first sector"
+set okay 1
+for {set addr 0} {$addr < $sector_size} {incr addr} {
+    set result [sid_cmd "sid::bus::read_h4_l1 $bus $addr"]
+    if {![sid_bus_ok_p $result] || [lindex $result 1] != 0x66} {
+       set okay 0
+       warning "results: $result"
+       break
+    }
+}
+if {$okay} { pass $test } else { fail $test }
+
+
+set test "illegitimately program the second sector"
+set size [sid_cmd "sid::component::attribute_value $victim size"]
+set sector_size [sid_cmd "sid::component::attribute_value $victim sector-size"]
+set okay 1
+for {set addr $sector_size} {$addr < [expr $sector_size + 16]} {incr addr} {
+    set result [sid_cmd "sid::bus::write_h4_l1 $bus $addr 0x66"]
+    if ![sid_bus_ok_p $result] {
+       set okay 0
+       break
+    }
+}
+if {$okay} { pass $test } else { fail $test }
+
+
+set test "validate the second sector -- writes should have no effect"
+set okay 1
+for {set addr $sector_size} {$addr < [expr $sector_size + 16]} {incr addr} {
+    set result [sid_cmd "sid::bus::read_h4_l1 $bus $addr"]
+    if {![sid_bus_ok_p $result] || [lindex $result 1] == 0x66} {
+       set okay 0
+       break
+    }
+}
+if {$okay} { pass $test } else { fail $test }
+
+
+set test "writing magic bytes to disable software data protection (2)"
+set okay 1
+foreach pair {{0xAA 0x5555} {0x55 0xAAAA} {0xA0 0x5555}} {
+    set hex_data [lindex $pair 0]
+    set hex_addr [lindex $pair 1]
+    set result [sid_cmd "sid::bus::write_h4_l1 $bus $hex_addr $hex_data"]
+    if ![sid_bus_ok_p $result] {
+       set okay 0
+       break
+    }
+}
+if {$okay} { pass $test } else { fail "$test (bus error)" }
+
+
+set test "program the third sector"
+set size [sid_cmd "sid::component::attribute_value $victim size"]
+set sector_size [sid_cmd "sid::component::attribute_value $victim sector-size"]
+set okay 1
+for {set addr 0} {$addr < $sector_size} {incr addr} {
+    set addr [expr [expr 2 * $sector_size] + $addr]
+    set result [sid_cmd "sid::bus::write_h4_l1 $bus $addr 0x66"]
+    if ![sid_bus_ok_p $result] {
+       set okay 0
+       break
+    }
+}
+
+
+set test "validate the third sector"
+set okay 1
+for {set addr 0} {$addr < $sector_size} {incr addr} {
+    set addr [expr [expr 2 * $sector_size] + $addr]
+    set result [sid_cmd "sid::bus::read_h4_l1 $bus $addr"]
+    if {![sid_bus_ok_p $result] || [lindex $result 1] != 0x66} {
+       set okay 0
+       warning "results: $result"
+       break
+    }
+}
+if {$okay} { pass $test } else { fail $test }
+
+
+set test "read manufacturer code without issuing id command"
+set result [sid_cmd "sid::bus::read_h4_l1 $bus 0"]
+if {[sid_bus_ok_p $result] && [lindex $result 1] != 0x1F} { pass $test } else { fail $test }
+
+
+set test "writing magic bytes to enter identification mode"
+set okay 1
+foreach pair {{0xAA 0x5555} {0x55 0xAAAA} {0x90 0x5555}} {
+    set hex_data [lindex $pair 0]
+    set hex_addr [lindex $pair 1]
+    set result [sid_cmd "sid::bus::write_h4_l1 $bus $hex_addr $hex_data"]
+    if ![sid_bus_ok_p $result] {
+       set okay 0
+       break
+    }
+}
+if {$okay} { pass $test } else { fail "$test (bus error)" }
+
+
+set test "read manufacturer code"
+set result [sid_cmd "sid::bus::read_h4_l1 $bus 0"]
+if {[sid_bus_ok_p $result] && [lindex $result 1] == 0x1F} { pass $test } else { fail $test }
+
+
+set test "read device id code for a low-voltage flash (id=0x3B)"
+sid_cmd "sid::component::set_attribute_value $victim device-code 0x3B"
+set result [sid_cmd "sid::component::attribute_value $victim device-code"]
+if {$result != 0x3B} {
+    fail $test
+} else {
+    set result [sid_cmd "sid::bus::read_h4_l1 $bus 1"]
+    if {[sid_bus_ok_p $result] && [lindex $result 1] == 0x3B} { 
+       pass $test 
+    } else { 
+       fail $test
+    }
+}    
+
+
+set test "return to normal operating mode"
+set okay 1
+foreach pair {{0xAA 0x5555} {0x55 0xAAAA} {0xF0 0x5555}} {
+    set hex_data [lindex $pair 0]
+    set hex_addr [lindex $pair 1]
+    set result [sid_cmd "sid::bus::write_h4_l1 $bus $hex_addr $hex_data"]
+    if ![sid_bus_ok_p $result] {
+       set okay 0
+       break
+    }
+}
+if {$okay} { pass $test } else { fail "$test (bus error)" }
+
+
+set test "check for normal operating mode"
+set result [sid_cmd "sid::bus::read_h4_l1 $bus 0"]
+if {[sid_bus_ok_p $result] && [lindex $result 1] != 0x1F} { pass $test } else { fail $test }
+
+
+set test "sid stop"
+if [sid_stop] then { pass $test } else { fail $test ; return }
+
+
+# zap temp file if tests were successful 
+global exit_status
+if {$exit_status == "0"} then { file delete "at29.conf" }