micropython_eeprom/flash/wemos_flash.py

99 wiersze
2.3 KiB
Python

# wemos_flash.py Test flash chips with ESP8266 host
# Released under the MIT License (MIT). See LICENSE.
# Copyright (c) 2020 Peter Hinch
import uos
from machine import SPI, Pin
from flash_spi import FLASH
cspins = (Pin(5, Pin.OUT, value=1), Pin(14, Pin.OUT, value=1))
spi = SPI(-1, baudrate=20_000_000, sck=Pin(4), miso=Pin(0), mosi=Pin(2))
def get_flash():
flash = FLASH(spi, cspins)
print("Instantiated Flash")
return flash
directory = "/fl_ext"
a = bytearray(range(256)) # Data to write
b = bytearray(256) # Data to read back
files = {} # n:length
errors = 0
def fname(n):
return "{}/{:05d}".format(directory, n + 1) # Names start 00001
def fcreate(n): # Create a binary file of random length
length = int.from_bytes(uos.urandom(2), "little") + 1 # 1-65536 bytes
linit = length
with open(fname(n), "wb") as f:
while length:
nw = min(length, 256)
f.write(a[:nw])
length -= nw
files[n] = length
return linit
def fcheck(n):
length = files[n]
with open(fname(n), "rb") as f:
while length:
nr = f.readinto(b)
if not nr:
return False
if a[:nr] != b[:nr]:
return False
length -= nr
return True
def check_all():
global errors
for n in files:
if fcheck(n):
print("File {:d} OK".format(n))
else:
print("Error in file", n)
errors += 1
print("Total errors:", errors)
def remove_all():
for n in files:
uos.remove(fname(n))
def flash_test(format=False):
eep = get_flash()
if format:
uos.VfsLfs2.mkfs(eep)
try:
uos.mount(eep, "/fl_ext")
except OSError: # Already mounted
pass
for n in range(128):
length = fcreate(n)
print("Created", n, length)
print("Created files", files)
check_all()
for _ in range(100):
for x in range(5): # Rewrite 5 files with new lengths
n = int.from_bytes(uos.urandom(1), "little") & 0x7F
length = fcreate(n)
print("Rewrote", n, length)
check_all()
remove_all()
msg = """Run wemos_flash.flash_test(True) to format new array, otherwise
wemos_flash.flash_test()
Runs prolonged test of filesystem."""
print(msg)