initial commit
This commit is contained in:
commit
8d9fc3f9b1
121
blkenvflash
Normal file
121
blkenvflash
Normal file
|
|
@ -0,0 +1,121 @@
|
|||
#!/usr/bin/python3
|
||||
|
||||
# == BLKENVFLASH == written by Rene K. Mueller <spiritdude@gmail.com>
|
||||
#
|
||||
# Description:
|
||||
# Writes an image (.img) or to the SD card direct from existing .env.txt for LuckFox Pico Pro/Max
|
||||
#
|
||||
# % ./blkenvflash disk.img
|
||||
# -- inquery with `lsblk` which device is your SD card resides --
|
||||
# % sudo dd if=disk.img of=/dev/sdX bs=1M; sync
|
||||
#
|
||||
# -- or do in one step --
|
||||
# % sudo ./blkenflash /dev/sdX
|
||||
#
|
||||
# License: MIT
|
||||
#
|
||||
# History:
|
||||
# 2024/06/18: after the hint by A. Schuetz https://github.com/LuckfoxTECH/luckfox-pico/issues/129 was able to make script functional
|
||||
# 2024/06/10: start
|
||||
|
||||
import os, sys, re, subprocess, shutil
|
||||
import atexit
|
||||
|
||||
VERSION = '0.0.1'
|
||||
|
||||
me = sys.argv.pop(0)
|
||||
path = os.path.dirname(me)
|
||||
me = os.path.basename(me)
|
||||
|
||||
step = 'sdcard' # -- hard-codec to do one sdcard writing
|
||||
|
||||
if len(sys.argv) != 1:
|
||||
print(f'''USAGE {me} <file or device>
|
||||
examples:
|
||||
% ./{me} disk.img
|
||||
% lsblk -- and check output on which /dev/sdX your SD card resides --
|
||||
% sudo dd if=disk.img of=/dev/sdX bs=1M; sync
|
||||
|
||||
-- or in one step --
|
||||
% sudo ./{me} /dev/sdX
|
||||
''')
|
||||
sys.exit(-1)
|
||||
|
||||
dev = sys.argv.pop(0)
|
||||
|
||||
print(f"== {me} {VERSION} ==")
|
||||
print(f"writing to {dev}")
|
||||
|
||||
|
||||
# -- a few helpers to en/decode nice numbers
|
||||
def true_size(s):
|
||||
u = { 'B': 1, 'K': 1024, 'M': 1024*1024, 'G': 1024*1024*1024 }
|
||||
if m := re.search('(\d+)([BKMG])',s):
|
||||
return int(m.group(1)) * u[m.group(2)]
|
||||
return 0
|
||||
|
||||
def nice_size(n):
|
||||
u = { 'B': 1, 'K': 1024, 'M': 1024*1024, 'G': 1024*1024*1024 }
|
||||
for k,v in reversed(u.items()):
|
||||
if n >= v and n % v == 0:
|
||||
return f"{n//v:,}{k}"
|
||||
return f"{n:,}B"
|
||||
|
||||
def cleanup():
|
||||
if os.path.exists(".env.txt.orig"):
|
||||
os.rename(".env.txt.orig",".env.txt")
|
||||
print("done.")
|
||||
|
||||
atexit.register(cleanup)
|
||||
|
||||
with open(".env.txt") as fh:
|
||||
env2 = [ ]
|
||||
for l in fh.readlines():
|
||||
if m := re.search('(blkdevparts|sd_parts)=(\w+)',l):
|
||||
_type = m.group(1)
|
||||
_dev = m.group(2)
|
||||
l = re.sub('blkdevparts=\w+:','',l)
|
||||
p = l.split(',')
|
||||
c_off = 0
|
||||
if step=='sdcard' and _dev == 'mmcblk1':
|
||||
for e in p:
|
||||
#print(e)
|
||||
if (m := re.search('(\d+[KMG])@(\d+[KMG])\((\w+)\)',e)) or (m := re.search('(\d+[KMG])\((\w+)\)',e)):
|
||||
if len(m.groups())==3:
|
||||
size = true_size(m.group(1))
|
||||
off = true_size(m.group(2))
|
||||
name = m.group(3)
|
||||
else:
|
||||
size = true_size(m.group(1))
|
||||
name = m.group(2)
|
||||
off = 0
|
||||
print(f" {_dev}: {name}.img size:{size:,}/{nice_size(size)} (offset:{off:,}/{nice_size(off)})",end='')
|
||||
if os.path.exists(f"{name}.img"):
|
||||
size_ = os.path.getsize(f"{name}.img") # -- actual size
|
||||
print(f" imgsize:{size_:,} ({nice_size(size_)})")
|
||||
if step=='sdcard':
|
||||
# -- it seems the explicit `off` seems not taking effect?
|
||||
cmd = ['dd',f"if={name}.img",f"of={dev}","bs=1k",f"seek={c_off//1024}"]
|
||||
try:
|
||||
res = subprocess.run(cmd,stdout=subprocess.DEVNULL,stderr=subprocess.DEVNULL,check=True)
|
||||
except subprocess.CalledProcessError as e:
|
||||
print(f"ERROR: {e}",e.stderr)
|
||||
sys.exit(-1)
|
||||
c_off += size
|
||||
else:
|
||||
print()
|
||||
print(f"ERROR: '{name}.img' not found")
|
||||
sys.exit(-1)
|
||||
|
||||
if _dev == 'mmcblk0':
|
||||
env2.append(l)
|
||||
|
||||
if step=='emmc': # -- untested, not needed as 'upgrade_tool' does this already
|
||||
shutil.copy(".env.txt",".env.txt.orig")
|
||||
with open(".env.txt","w") as fh:
|
||||
fh.write("\n".join(env2))
|
||||
|
||||
# -- prepare upgrade_tool call to write to eMMC
|
||||
print(f"{path}/upgrade_tool")
|
||||
subprocess.run([f'{path}/upgrade_tool','uf','update.img'])
|
||||
|
||||
Loading…
Reference in New Issue
Block a user