esp8266: Add Python modules for initial configuration.

Main entry point is _boot.py which checks whether FAT FS in flash mountable,
and if so, mounts it. Otherwise, it checks if flash is empty, and if so,
performs initial module setup: makes FAT FS, configures default AP name,
etc. As a last option, if flash is not empty, and could not be mounted,
it means filesystem corruption, and warning message with instructions is
printed in an infinite loop.
This commit is contained in:
Paul Sokolovsky 2016-04-12 00:37:04 +03:00
parent 2f5935269b
commit 40f5ecd3a8
3 changed files with 72 additions and 0 deletions

12
esp8266/scripts/_boot.py Normal file
View File

@ -0,0 +1,12 @@
import uos
import builtins
from flashbdev import bdev
try:
vfs = uos.VfsFat(bdev, "/")
except OSError:
import inisetup
inisetup.check_bootsec()
uos.VfsFat.mkfs(bdev)
vfs = uos.VfsFat(bdev, "/")
inisetup.wifi()

View File

@ -0,0 +1,29 @@
import esp
class FlashBdev:
SEC_SIZE = 4096
START_SEC = 0xa0000 // SEC_SIZE
NUM_BLK = 64
def __init__(self, blocks=NUM_BLK):
self.blocks = blocks
def readblocks(self, n, buf):
print("readblocks(%s, %x(%d))" % (n, id(buf), len(buf)))
esp.flash_read((n + self.START_SEC) * self.SEC_SIZE, buf)
def writeblocks(self, n, buf):
print("writeblocks(%s, %x(%d))" % (n, id(buf), len(buf)))
assert len(buf) <= self.SEC_SIZE, len(buf)
esp.flash_erase(n + self.START_SEC)
esp.flash_write((n + self.START_SEC) * self.SEC_SIZE, buf)
def ioctl(self, op, arg):
print("ioctl(%d, %r)" % (op, arg))
if op == 4: # BP_IOCTL_SEC_COUNT
return self.blocks
if op == 5: # BP_IOCTL_SEC_SIZE
return self.SEC_SIZE
bdev = FlashBdev()

View File

@ -0,0 +1,31 @@
import uos
import network
from flashbdev import bdev
def wifi():
import ubinascii
ap_if = network.WLAN(network.AP_IF)
ap_if.config(essid=b"MicroPython %s" % ubinascii.hexlify(ap_if.mac()[-3:]))
def check_bootsec():
buf = bytearray(bdev.SEC_SIZE)
bdev.readblocks(0, buf)
empty = True
for b in buf:
if b != 0xff:
empty = False
break
if empty:
return True
fs_corrupted()
def fs_corrupted():
import time
while 1:
print("""\
FAT filesystem appears to be corrupted. If you had important data there, you
may want to make a flash snapshot to try to recover it. Otherwise, perform
factory reprogramming of MicroPython firmware (completely erase flash, followed
by firmware programming).
""")
time.sleep(3)