afd0701bf7
This patch makes it so that UART(0) can by dynamically attached to and detached from the REPL by using the uos.dupterm function. Since WebREPL uses dupterm slot 0 the UART uses dupterm slot 1 (a slot which is newly introduced by this patch). UART(0) must now be attached manually in boot.py (or otherwise) and inisetup.py is changed to provide code to do this. For example, to attach use: import uos, machine uart = machine.UART(0, 115200) uos.dupterm(uart, 1) and to detach use: uos.dupterm(None, 1) When attached, all incoming chars on UART(0) go straight to stdin so uart.read() will always return None. Use sys.stdin.read() if it's needed to read characters from the UART(0) while it's also used for the REPL (or detach, read, then reattach). When detached the UART(0) can be used for other purposes. If there are no objects in any of the dupterm slots when the REPL is started (on hard or soft reset) then UART(0) is automatically attached. Without this, the only way to recover a board without a REPL would be to completely erase and reflash (which would install the default boot.py which attaches the REPL).
55 lines
1.4 KiB
Python
55 lines
1.4 KiB
Python
import uos
|
|
import network
|
|
from flashbdev import bdev
|
|
|
|
def wifi():
|
|
import ubinascii
|
|
ap_if = network.WLAN(network.AP_IF)
|
|
essid = b"MicroPython-%s" % ubinascii.hexlify(ap_if.config("mac")[-3:])
|
|
ap_if.config(essid=essid, authmode=network.AUTH_WPA_WPA2_PSK, password=b"micropythoN")
|
|
|
|
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("""\
|
|
The FAT filesystem starting at sector %d with size %d sectors 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).
|
|
""" % (bdev.START_SEC, bdev.blocks))
|
|
time.sleep(3)
|
|
|
|
def setup():
|
|
check_bootsec()
|
|
print("Performing initial setup")
|
|
wifi()
|
|
uos.VfsFat.mkfs(bdev)
|
|
vfs = uos.VfsFat(bdev)
|
|
uos.mount(vfs, '/')
|
|
with open("boot.py", "w") as f:
|
|
f.write("""\
|
|
# This file is executed on every boot (including wake-boot from deepsleep)
|
|
#import esp
|
|
#esp.osdebug(None)
|
|
import uos, machine
|
|
uos.dupterm(machine.UART(0, 115200), 1)
|
|
import gc
|
|
#import webrepl
|
|
#webrepl.start()
|
|
gc.collect()
|
|
""")
|
|
return vfs
|