summaryrefslogtreecommitdiff
path: root/test/flash_test_util.py
blob: 5942ca7e2f611687652c935eb9f56c4f489a4300 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# Utility functions for flash related test
#

import random
import re
import struct

# Fixed random seed.
random.seed(1234)

def hex_to_byte(text):
    return ''.join(["%c" % chr(int(text[i:i+2], 16))
                    for i in range(0, len(text), 2)])

def byte_to_hex(byte_arr):
    return ''.join(["%02x" % ord(c) for c in byte_arr])

def offset_size_pair(offset, size):
    return byte_to_hex(struct.pack("II", offset, size))

def get_flash_info(helper):
    helper.ec_command("hostcmd 0x10 0 00")
    resp = helper.wait_output("Response: (?P<r>.{32,32})", use_re=True)["r"]
    return struct.unpack("IIII", hex_to_byte(resp))

def get_flash_size(helper):
    return get_flash_info(helper)[0]

def get_ro_size(helper):
    helper.ec_command("rosize")
    return int(helper.wait_output(
        "RO image size = (?P<ro>0x[0-9a-f]+)", use_re=True)["ro"], 16)

def xor_sum(size, seed, mult, add):
    ret = 0
    for i in xrange(size):
        ret ^= (seed & 0xff)
        seed = seed * mult + add
    return ret

def test_erase(helper, offset, size):
    helper.ec_command("hostcmd 0x13 0 %s" % offset_size_pair(offset, size))
    helper.wait_output("Flash erase at %x size %x" % (offset, size))

def _get_read_ref(helper, offset, size):
    ret = []
    retsub = []
    assert size % 4 == 0
    while size > 0:
        helper.ec_command("rw %d" % offset)
        h = helper.wait_output("read.*=\s+0x(?P<h>[0-9a-f]+)", use_re=True)["h"]
        # Change endianess here
        retsub.append(re.sub('(..)(..)(..)(..)', r'\4\3\2\1', h))
        if len(retsub) == 8:
            ret.append(''.join(retsub))
            retsub = []
        size = size - 4
        offset = offset + 4
    if retsub:
        ret.append(''.join(retsub))
    return ret

def test_read(helper, offset, size):
    ref = _get_read_ref(helper, offset, size)
    helper.ec_command("hostcmd 0x11 0 %s" % offset_size_pair(offset, size))
    for line in ref:
        helper.wait_output(line)

def _gen_data(size, seed, mult, add):
    data = []
    for i in xrange(size):
        data.append("%02x" % (seed & 255))
        seed = (seed * mult + add) & 4294967295;
    return ''.join(data)

def test_write(helper, offset, size, expect_fail=False):
    assert size <= 16
    seed = random.randint(2, 10000)
    mult = random.randint(2, 10000)
    add  = random.randint(2, 10000)
    data = _gen_data(size, seed, mult, add)
    payload = byte_to_hex(struct.pack("II", offset, size))
    helper.ec_command("hostcmd 0x12 0 %s%s" %
                      (offset_size_pair(offset, size), data))
    if expect_fail:
        helper.wait_output("Command returned \d+", use_re=True)
    else:
        expected_sum = xor_sum(size, seed, mult, add)
        helper.wait_output("Flash write at %x size %x XOR %x" %
                           (offset, size, expected_sum))