Files
Linux_Drivers/u-boot-2021.10/drivers/cvi_usb/utask/test/utask_memcpy.py
sam.xiang 3a4bcfca2f [uboot] porting cvitek asic chips:
1. add cvitek folders to u-boot-2021.10
	2. add cv183x/cv182x part
	3. add cv181x/cv180x part

Change-Id: I6dc2e5ff509dbab16bd60bfb3fd61852da5e01f6
2023-03-10 20:31:12 +08:00

687 lines
23 KiB
Python
Executable File

#!/usr/bin/env python2
import os
import re
import usb.core
import usb.util
import sys
import time
import platform
from array import array
import random
# Define
SUCCESS = 0
FAIL = 1
HEADER_SIZE = 8
CVI_USB_NONE = 0
CVI_USB_INFO = 1
CVI_USB_VERBOSE = 2
CVI_USB_JUMP = 3
CVI_USB_BREAK = 4
CVI_USB_KEEP_DL = 5
CVI_USB_PRG_CMD = 6
CVI_USB_RESET_ARM = 7
CVI_USB_TEST_THERMAL_SENSOR = 8
CVI_USB_TEST_EMMC = 9
# Global variables
header = array('B')
data = array('B')
ret = array('B')
bulk_command = array('B')
ser_cmd = array('B')
pkt_cnt = 0
filesize = 0
ioTime = 0
rom_vidpid = 'VID:PID=0559:1000'
prg_vidpid = 'VID:PID=30B1:1000'
verify_vidpid = 'VID:PID='
emmc_timeout = 0
# Table of CRC constants - implements x^16+x^12+x^5+1
crc16_tab = [
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,
]
def crc16_ccitt(HexData):
cksum = int("0", 16)
for i in range(len(HexData)):
cksum = crc16_tab[((cksum >> 8) ^ HexData[i]) & 0xff] ^ ((cksum << 8) & 0xff00)
return cksum
def close_device(device):
progress_symbol = ['---', ' \\', ' \\', ' |', ' |', ' |', ' |', ' /', ' /']
Found = -1
i = 0
while Found == -1:
i = i + 1
sys.stdout.write("Waiting for re-connect: %s \r" % (progress_symbol[i%len(progress_symbol)]))
sys.stdout.flush()
if device is not None:
try:
active = device.is_kernel_driver_active(1)
if active is False:
try:
device.attach_kernel_driver(1)
print("attach kernel driver\n")
return
except usb.USBError as e:
time.sleep(0.05)
continue
else:
break
except usb.USBError as e:
if '[Errno 19]' in str(e):
# device is no longer connected
return
else:
print("get active err %s\n" %(e))
time.sleep(0.05)
continue
else:
print("close a non-open device. \n")
break
def get_vid(vid_pid):
vid = vid_pid.replace('VID:PID=', "")
vid = vid.split(':', 1)[0]
return int(vid, 16)
def get_pid(vid_pid):
pid = vid_pid.replace('VID:PID=', "")
pid = pid.split(':', 1)[1]
return int(pid, 16)
def serial_query(vid_pid_list, timeout=0):
global device
global epOut
global epIn
progress_symbol = ['---', ' \\', ' \\', ' |', ' |', ' |', ' |', ' /', ' /']
found = -1
device = None
i = 0
query_time = time.time()
while(found == -1):
i = i + 1
sys.stdout.write("Waiting for CV1835 USB port: %s \r" % (progress_symbol[i%len(progress_symbol)]))
sys.stdout.flush()
for vid_pid in vid_pid_list:
device = usb.core.find(idVendor=get_vid(vid_pid), idProduct=get_pid(vid_pid))
if device is not None:
found = 1
break
if device is None:
if timeout != 0 and ((time.time() - query_time) > timeout):
sys.stdout.write("Query device timeout! \n" )
sys.stdout.flush()
sys.exit(-1)
time.sleep(0.05)
else:
break
i = 0
found = -1
while(found == -1):
i = i + 1
try:
cfg = device.get_active_configuration()
except (NotImplementedError, usb.USBError):
sys.stdout.write("Waiting for LibUSB hooked: %s \r" % (progress_symbol[i%len(progress_symbol)]))
sys.stdout.flush()
time.sleep(0.05)
continue
except usb.USBError as e:
continue
found = 1
# detach the linux kernel driver.
osName = platform.system()
if osName == 'Linux':
if device.is_kernel_driver_active(1) is True:
device.detach_kernel_driver(1)
elif osName == 'Windows':
# Set line state
device.ctrl_transfer(0x21, 0x22, 0, 0, 0)
# Set line code
lineCode = [0x00, 0x10, 0x0E, 0x00, 0x00, 0x00, 0x08]
assert device.ctrl_transfer(0x21, 0x20, 0, 0, lineCode) == len(lineCode)
else:
sys.stdout.write("Cannot support OS %s\n" %(osName))
sys.stdout.flush()
sys.exit(-1)
intf = cfg[(1,0)]
epOut = usb.util.find_descriptor(
intf,
# match the first OUT endpoint
custom_match = \
lambda e: \
usb.util.endpoint_direction(e.bEndpointAddress) == \
usb.util.ENDPOINT_OUT)
epIn = usb.util.find_descriptor(
intf,
# match the first OUT endpoint
custom_match = \
lambda e: \
usb.util.endpoint_direction(e.bEndpointAddress) == \
usb.util.ENDPOINT_IN)
return device
def serial_write(command, recv_ack, delay_ms):
global ret
global pkt_cnt
global filesize
global ioTime
start_time = time.time()
try:
#time.sleep(0.001 * delay_ms)
#if pkt_cnt < 2 and filesize != 128:
# time.sleep(0.3)
epOut.write(command)
except usb.USBError as e:
print ("Write data timeout %s\n" %e)
ioTime = ioTime + (time.time() - start_time)
if recv_ack == 1:
cmd_crc = crc16_ccitt(command)
# print ("cmd_crc %x" % cmd_crc)
start_time = time.time()
try:
ret = epIn.read(16);
except usb.USBError as e:
print ("Read ACK timeout")
ioTime = ioTime + (time.time() - start_time)
ret_crc = (ret[2])*256 + (ret[3])
#print ("ret_crc %x" % ret_crc)
if ret_crc == cmd_crc:
pkt_cnt += 1
# sys.stdout.write("Packet count: %d \r" % pkt_cnt)
sys.stdout.write("[Working] %d%% \r" % ((pkt_cnt * (512 - HEADER_SIZE) * 100) / filesize))
sys.stdout.flush()
return SUCCESS
else:
print ("ACK_CRC_ERROR")
return FAIL
else:
return SUCCESS
def usb_send_file(filename, dest_addr, delay_ms):
global header
global data
global bulk_command
global pkt_cnt
global filesize
global ioTime
ioTime = 0
start_time = time.time()
complete_cnt = 0
pkt_cnt = 0
filesize = 0
while (complete_cnt < 1): # For stress test
complete_cnt = complete_cnt + 1
last_pos = 0
tx_len = 512
content_file = open(filename, 'rb')
content_size = os.path.getsize(filename)
filesize = content_size
print ("%s is %d bytes" % (filename, content_size))
print ("Send to address 0x%x" % dest_addr)
while (content_size > 0):
del header[:]
del data[:]
del bulk_command[:]
content_file.seek(last_pos)
if (content_size < tx_len - HEADER_SIZE):
data.fromfile(content_file, content_size)
tx_len = content_size + HEADER_SIZE
else:
data.fromfile(content_file, tx_len - HEADER_SIZE)
last_pos = content_file.tell()
#if filename == 'cvi_dl_magic.bin':
# header.append(CVI_USB_KEEP_DL)
#else:
header.append(CVI_USB_NONE)
header.append((tx_len >> 8) & 0xFF)
header.append((tx_len & 0xFF))
header.append((dest_addr >> 32) & 0xFF)
header.append((dest_addr >> 24) & 0xFF)
header.append((dest_addr >> 16) & 0xFF)
header.append((dest_addr >> 8) & 0xFF)
header.append(dest_addr & 0xFF)
bulk_command = header + data
send_ok = serial_write(bulk_command, 1, delay_ms)
if send_ok == 0:
dest_addr += tx_len - HEADER_SIZE
content_size -= tx_len - HEADER_SIZE
else:
last_pos -= tx_len - HEADER_SIZE
# print ("complete_cnt %d" % complete_cnt)
print ("--- %s Seconds ---" % round(time.time() - start_time, 2 ))
print ("--- %s Seconds ---" % str(ioTime))
return
def _usb_send_req(command, recv_ack, delay_ms):
global pkt_cnt
global filesize
global ioTime
start_time = time.time()
try:
#time.sleep(0.001 * delay_ms)
#if pkt_cnt < 2 and filesize != 128:
# time.sleep(0.3)
epOut.write(command, timeout=0)
except usb.USBError as e:
print ("Write data timeout: %s\n", e)
ioTime = ioTime + (time.time() - start_time)
if recv_ack == 1:
cmd_crc = crc16_ccitt(command)
# print ("cmd_crc %x" % cmd_crc)
start_time = time.time()
try:
rsp = epIn.read(16, timeout=0);
except usb.USBError as e:
print ("Read ACK timeout: %s\n", e)
ioTime = ioTime + (time.time() - start_time)
ret_crc = (rsp[2])*256 + (rsp[3])
#print ("ret_crc %x" % ret_crc)
if ret_crc == cmd_crc:
return rsp
else:
print ("ACK_CRC_ERROR")
return None
else:
return None
def usb_send_req_data(token, address, reqLen, ack, data=None):
global ser_cmd
del ser_cmd[:]
ser_cmd.append(token) # command
ser_cmd.append(0) # high byte of packet size
ser_cmd.append(reqLen) # low byte of packet size
ser_cmd.append((address >> 32) & 0xFF) # 5 bytes for destination address
ser_cmd.append((address >> 24) & 0xFF)
ser_cmd.append((address >> 16) & 0xFF)
ser_cmd.append((address >> 8) & 0xFF)
ser_cmd.append((address & 0xFF))
if data is not None:
ser_cmd = ser_cmd + data
else:
print("data is empty!\n")
return
if ack != 0:
return _usb_send_req(ser_cmd, 1, 0)
else:
return serial_write(ser_cmd, 0, 0)
def usb_send_req(token, address, reqLen, ack):
del ser_cmd[:]
ser_cmd.append(token) # command
ser_cmd.append(0) # high byte of packet size
ser_cmd.append(reqLen) # low byte of packet size
ser_cmd.append((address >> 32) & 0xFF) # 5 bytes for destination address
ser_cmd.append((address >> 24) & 0xFF)
ser_cmd.append((address >> 16) & 0xFF)
ser_cmd.append((address >> 8) & 0xFF)
ser_cmd.append((address & 0xFF))
if ack != 0:
return _usb_send_req(ser_cmd, 1, 0)
else:
return serial_write(ser_cmd, 0, 0)
#========================================================================
# New protocol of prg.bin
#========================================================================
USB_MSG_S2D_SIZE = 16
USB_MSG_D2S_SIZE = 16
CVI_USB_RUNTIME = 0x80
CVI_USB_S2D = 0x81
CVI_USB_D2S = 0x82
USB_BULK_MAX_SIZE = 0x400000
MSG_TOKEN_OFFSET = 0
RSP_CRC16_HI_OFFSET = 2
RSP_CRC16_LO_OFFSET = 3
RSP_TOKEN_OFFSET = 6
def protocol_msg_send(message, length, response):
global ioTime
start_time = time.time()
try:
#time.sleep(0.001 * delay_ms)
#if pkt_cnt < 2 and filesize != 128:
# time.sleep(0.3)
epOut.write(message, timeout=0)
except usb.USBError as e:
print ("Write data fail!")
return FAIL
ioTime = ioTime + (time.time() - start_time)
if response == 1:
start_time = time.time()
try:
ret = epIn.read(16);
except usb.USBError as e:
print ("message response fail %s\n" %e)
ioTime = ioTime + (time.time() - start_time)
cmd_crc = crc16_ccitt(message)
# print ("cmd_crc %x" % cmd_crc)
ret_crc = (ret[RSP_CRC16_HI_OFFSET])*256 + (ret[RSP_CRC16_LO_OFFSET])
#print ("ret_crc %x" % ret_crc)
if ret_crc == cmd_crc:
if message[MSG_TOKEN_OFFSET] != ret[RSP_TOKEN_OFFSET]:
sys.stdout.write("Token: exp 0x%x get 0x%x\n" % (message[MSG_TOKEN_OFFSET], ret[RSP_TOKEN_OFFSET]))
sys.stdout.flush()
else:
# sys.stdout.write("Packet count: %d \r" % pkt_cnt)
#sys.stdout.write("[Working] %d%% \r" % ((pkt_cnt * (512 - HEADER_SIZE) * 100) / filesize))
#sys.stdout.flush()
return SUCCESS
else:
sys.stdout.write("ACK_CRC_ERROR\n")
sys.stdout.flush()
return FAIL
else:
return SUCCESS
def protocol_msg_fill_header(message, token, addr, reqLen, dataSize):
message.append(token) # command
message.append((reqLen >> 8) & 0xFF) # high byte of packet size
message.append(reqLen & 0xFF) # low byte of packet size
message.append((addr >> 32) & 0xFF) # 5 bytes for destination address
message.append((addr >> 24) & 0xFF)
message.append((addr >> 16) & 0xFF)
message.append((addr >> 8) & 0xFF)
message.append((addr & 0xFF))
if dataSize != 0:
message.append((dataSize & 0xFF))
message.append((dataSize >> 8 & 0xFF))
message.append((dataSize >> 16 & 0xFF))
message.append((dataSize >> 24 & 0xFF))
message.append((dataSize >> 32 & 0xFF))
message.append((dataSize >> 40 & 0xFF))
message.append((dataSize >> 48 & 0xFF))
message.append((dataSize >> 56 & 0xFF))
return
def protocol_usb_write(dataBuf):
try:
epOut.write(dataBuf, timeout=0)
except usb.USBError as e:
print ("Write data Fail %s" %e)
return FAIL
return SUCCESS
def protocol_usb_read(length):
try:
return epIn.read(length, timeout=0)
except usb.USBError as e:
print ("Read data Fail %s" %e)
return None
def protocol_msg_s2d_once(addr, dataBuf, length):
msg = []
protocol_msg_fill_header(msg, CVI_USB_S2D, addr, USB_MSG_S2D_SIZE, length)
if protocol_msg_send(msg, USB_MSG_S2D_SIZE, 1) == FAIL:
return FAIL
else:
return protocol_usb_write(dataBuf)
def protocol_msg_d2s_once(addr, length):
msg = []
protocol_msg_fill_header(msg, CVI_USB_D2S, addr, USB_MSG_D2S_SIZE, length)
if protocol_msg_send(msg, USB_MSG_D2S_SIZE, 0) == FAIL:
return FAIL
else:
return protocol_usb_read(length)
def protocol_msg_s2d(addr, dataBuf, length):
left = length
start = 0
stop = 0
tmpBuf = []
while (left > 0):
len_once = 0
if left <= USB_BULK_MAX_SIZE:
len_once = left
else:
len_once = USB_BULK_MAX_SIZE
stop = start + len_once
tmpBuf = dataBuf[start:stop]
if protocol_msg_s2d_once(addr, tmpBuf, len_once) == FAIL:
print("s2d failed at address:0x%x offset:0x%x len:%d\n" %(addr, start, len_once))
return FAIL
else:
addr = addr + len_once
start = start + len_once
left = left - len_once
return SUCCESS
def protocol_msg_d2s(addr, length):
left = length
tmpBuf = array('B', [])
while (left > 0):
len_once = 0
if left <= USB_BULK_MAX_SIZE:
len_once = left
else:
len_once = USB_BULK_MAX_SIZE
oriLen = len(tmpBuf)
tmpBuf = tmpBuf + protocol_msg_d2s_once(addr, len_once)
newLen = len(tmpBuf)
if (newLen-oriLen) != len_once:
print("d2s size mismatch at address:0x%x oriLen=%d newLen=%d len_once=%d" %(addr, oriLen, newLen, len_once))
return None
else:
addr = addr + len_once
left = left - len_once
return tmpBuf
def protocol_send_file(filename, dest_addr):
global ioTime
complete_cnt = 0
while (complete_cnt < 1): # For stress test
tmp_addr = dest_addr
ioTime = 0
start_time = time.time()
complete_cnt = complete_cnt + 1
last_pos = 0
tx_len = USB_BULK_MAX_SIZE
content_file = open(filename, 'rb')
content_size = os.path.getsize(filename)
file_size = content_size
print ("%s is %d bytes" % (filename, content_size))
print ("Send to address 0x%x" % tmp_addr)
while (content_size > 0):
#data = []
del data[:]
content_file.seek(last_pos)
if (content_size < tx_len):
data.fromfile(content_file, content_size)
tx_len = content_size
else:
data.fromfile(content_file, tx_len)
last_pos = content_file.tell()
send_ok = protocol_msg_s2d_once(tmp_addr, data, tx_len)
if send_ok == 0:
tmp_addr += tx_len
content_size -= tx_len
sys.stdout.write("[Working] %d%% \r" % (((file_size - content_size) * 100) / file_size))
sys.stdout.flush()
else:
last_pos -= tx_len
# print ("complete_cnt %d" % complete_cnt)
print ("--- %s Seconds ---" % round(time.time() - start_time, 2 ))
print ("--- %s Seconds ---" % str(ioTime))
return
#==============================================================
# Main()
#===============================================================
def wait_for_reconnect(cnt_seconed):
progress_symbol = ['---', ' \\', ' \\', ' |', ' |', ' |', ' |', ' /', ' /']
while cnt_seconed > 0:
cnt_seconed = cnt_seconed - 1
sys.stdout.write("Waiting for re-connect: %s \r" % (progress_symbol[cnt_seconed%len(progress_symbol)]))
sys.stdout.flush()
time.sleep(1)
def vidpid_string(vid_str, pid_str):
global verify_vidpid
vid_str = vid_str.replace("0x", "")
pid_str = pid_str.replace("0x", "")
while len(vid_str) < 4:
vid_str = '0' + vid_str
while len(pid_str) < 4:
pid_str = '0' + pid_str
verify_vidpid = verify_vidpid + vid_str + ':' + pid_str
def usb_emmc_dl_veirfy():
print("veirfy id = %s" %verify_vidpid)
vidpid_list = [verify_vidpid]
serial_query(vidpid_list, emmc_timeout)
def show_usage():
sys.stdout.write("usage- python [script] vvid=[vid] vpid=[pid]\n")
sys.stdout.write(" [script] : %s \n" %__file__)
sys.stdout.write(" [vvid] : reconnect vid if emmc dl complete check enable \n")
sys.stdout.write(" [vpid] : reconnect pid if emmc dl complete check enable \n")
sys.stdout.write(" [timeout]: verify timeout (second) from emmc programming to kerel start \n")
sys.stdout.write(" 0 means wait forever (default) \n")
sys.stdout.flush()
def parse_arg():
global emmc_timeout
vid = ''
pid = ''
for i in range(1, len(sys.argv)):
if 'vvid' in sys.argv[i]:
vid = sys.argv[i]
vid = vid.replace('vvid=', '')
if 'vpid' in sys.argv[i]:
pid = sys.argv[i]
pid = pid.replace('vpid=', '')
if 'timeout' in sys.argv[i]:
s = sys.argv[i]
s = s.replace('timeout=', "")
emmc_timeout = int(s)
print("emmc timeout = %d s" %emmc_timeout)
if 'usage' in sys.argv[i]:
show_usage()
sys.exit(0)
if len(vid) != 0 and len(pid) != 0:
vidpid_string(vid, pid)
else:
if len(vid) != 0:
sys.stdout.write("pid is not appointed! \n")
sys.stdout.flush()
show_usage()
sys.exit(-1)
if len(pid) != 0:
sys.stdout.write("vid is not appointed! \n")
sys.stdout.flush()
show_usage()
sys.exit(-1)
if __name__ == '__main__':
target_address = 0x110000000
pattern_size = 16*1024*1024
step = 64
test_cnt = 100
copy_size = 13
# device enumeration
vidpid_list = [prg_vidpid]
serial_query(vidpid_list)
# generate random list for write
data_w = array('B',[random.randint(0, 255) for _ in range(pattern_size)])
data_r = array('B',[])
while test_cnt > 0:
del data_r
total_time = time.time()
# send data
if protocol_msg_s2d(target_address, data_w, copy_size) == FAIL:
usb_send_req(CVI_USB_BREAK, 0, 8, 0)
sys.exit(-1)
# read data
data_r = protocol_msg_d2s(target_address, copy_size)
total_time = round(time.time() - total_time, 5 )
# data verification
if len(data_r) != copy_size:
print("expect %d but receive %d\n" %(copy_size, len(data_r)))
usb_send_req(CVI_USB_BREAK, 0, 8, 0)
sys.exit(-2)
if data_w[:copy_size] != data_r:
print("data mismatched!\n")
usb_send_req(CVI_USB_BREAK, 0, 8, 0)
sys.exit(-3)
test_cnt = test_cnt - 1
copy_size = (copy_size + step) % pattern_size
print ("Test Success!")
print ("--- %s Seconds ---\n" % total_time)
# leave cvi_usb
usb_send_req(CVI_USB_BREAK, 0, 8, 0)