Skip to content
Snippets Groups Projects
Commit 7dd73d51 authored by Guido Gunther's avatar Guido Gunther :zzz:
Browse files

Merge tag 'v0.0.15' into pureos/byzantium

librem5-devkit-tools v0.0.15
parents e1e85aba 1fefe889
No related branches found
No related tags found
1 merge request!202Switch ci to byzantium too and release
...@@ -34,7 +34,7 @@ test:download:deb: ...@@ -34,7 +34,7 @@ test:download:deb:
- apt-get -y install $FLASHDEPS - apt-get -y install $FLASHDEPS
- rm -rf output - rm -rf output
script: script:
- scripts/librem5-flash-image --board librem5r3 --variant plain --dist amber-phone --skip-flash --skip-cleanup --dir=download/ - scripts/librem5-flash-image --board librem5r4 --variant plain --dist amber-phone --skip-flash --skip-cleanup --dir=download/
- ls -l download/librem5*.img download/flash_librem5*.lst download/u-boot-librem5*.imx - ls -l download/librem5*.img download/flash_librem5*.lst download/u-boot-librem5*.imx
- mkdir -p output/ - mkdir -p output/
- cp download/flash_*.lst output/ - cp download/flash_*.lst output/
...@@ -54,7 +54,7 @@ test:download:pip: ...@@ -54,7 +54,7 @@ test:download:pip:
- virtualenv --python=python3 test-download - virtualenv --python=python3 test-download
- source test-download/bin/activate - source test-download/bin/activate
- pip install -r requirements.txt - pip install -r requirements.txt
- python3 scripts/librem5-flash-image --board librem5r3 --variant plain --dist amber-phone --skip-flash --skip-cleanup --dir=download/ - python3 scripts/librem5-flash-image --board librem5r4 --variant plain --dist amber-phone --skip-flash --skip-cleanup --dir=download/
- ls -l download/librem5*.img download/flash_librem5*.lst download/u-boot-librem5*.imx - ls -l download/librem5*.img download/flash_librem5*.lst download/u-boot-librem5*.imx
- rm -rf download - rm -rf download
...@@ -4,9 +4,9 @@ all: check ...@@ -4,9 +4,9 @@ all: check
check: check:
flake8 flake8
flake8 scripts/librem5-devkit-flash-image
shellcheck test_scripts/librem5-devkit-check shellcheck test_scripts/librem5-devkit-check
shellcheck usr/share/librem5/l5-shipme shellcheck usr/share/librem5/l5-shipme
$(MAKE) -C scripts/
install: install:
mkdir -p $(DESTDIR)/etc/modules-load.d/ mkdir -p $(DESTDIR)/etc/modules-load.d/
......
librem5-devkit-tools (0.0.15) amber-phone; urgency=medium
[ Guido Günther ]
* gitlab-ci: Use evergreen
* pytest: Don't fail touch test on devkit
* pytests: Check for SCSI disk
* pt/test_panel_brightness: Reduce devkit brightness to 100
* pt/test_panel_brightness: Test max_brightness as well
* librem5-flash-image: Make evergreen the default
* librem5-flash-image: Detect board type via argv[0] (Closes: #30)
* scripts: Run doctests on librem5_flash_image
* librem5-host: Install symlinks for librem5 batches as well
* librem5-flash-image: Add test for default script name
[ Angus Ainslie ]
* pytests/test_panel_brightness.py: make range inclusive
[ Martin Kepplinger ]
* pytests: test_modem: use mmcli -m any
[ David Hamner ]
* librem5-flash-image: Don't fail on default script name
* librem5-flash-image: Wait for device
-- Sebastian Krzyszkowiak <sebastian.krzyszkowiak@puri.sm> Thu, 21 Jan 2021 19:21:12 +0100
librem5-devkit-tools (0.0.14.0pureos0) byzantium; urgency=medium librem5-devkit-tools (0.0.14.0pureos0) byzantium; urgency=medium
* Forward port to byzantium * Forward port to byzantium
......
scripts/librem5-*flash-image /usr/bin/ scripts/librem5*-flash-image /usr/bin/
scripts/librem5-usbnet /usr/bin/ scripts/librem5-usbnet /usr/bin/
...@@ -13,7 +13,7 @@ def test_modem_usb(): ...@@ -13,7 +13,7 @@ def test_modem_usb():
def test_modem_modem_manager(): def test_modem_modem_manager():
"Test if modem manager picked up the modem" "Test if modem manager picked up the modem"
out = subprocess.check_output(["mmcli", "-m", "0"]) out = subprocess.check_output(["mmcli", "-m", "any"])
if boardtype.is_librem5(): if boardtype.is_librem5():
assert(b"manufacturer: QUALCOMM INCORPORATED" in out) assert(b"manufacturer: QUALCOMM INCORPORATED" in out)
else: else:
......
import os import os
from . import boardtype from . import boardtype
from . import sysfs
def test_panel_brightness(): def test_panel_brightness():
"Check if panel brighness range" "Check if panel brighness range"
path = "/sys/class/backlight/backlight-dsi" path = "/sys/class/backlight/backlight-dsi"
if boardtype.is_librem5(): upper = 228 if boardtype.is_librem5() else 100
upper = 228 mb_path = os.path.join(path, 'max_brightness')
else:
upper = 101 sysfs.check_content_in_glob("{}\n".format(upper), mb_path)
f = open(os.path.join(path, 'brightness')) f = open(os.path.join(path, 'brightness'))
assert int(f.read()) in range(0, upper) assert int(f.read()) in range(0, upper + 1)
...@@ -4,8 +4,11 @@ import pytest ...@@ -4,8 +4,11 @@ import pytest
def read_firmware_version(): def read_firmware_version():
with open('/sys/kernel/debug/edt_ft5x06/fw_version') as f: try:
return int(f.read()) with open('/sys/kernel/debug/edt_ft5x06/fw_version') as f:
return int(f.read())
except Exception:
return 0
@pytest.mark.skipif(not boardtype.is_librem5(), reason="Not a phone") @pytest.mark.skipif(not boardtype.is_librem5(), reason="Not a phone")
......
from . import boardtype from . import boardtype
from . import sysfs
import subprocess import subprocess
import pytest import pytest
...@@ -20,3 +21,8 @@ def test_phone_usb_hub(): ...@@ -20,3 +21,8 @@ def test_phone_usb_hub():
def test_usb_media_card(): def test_usb_media_card():
out = subprocess.check_output(["lsusb", "-d", "0424:4041"]) out = subprocess.check_output(["lsusb", "-d", "0424:4041"])
assert(b"media card controller" in out) assert(b"media card controller" in out)
@pytest.mark.skipif(not boardtype.is_librem5(), reason="Not a phone")
def test_usb_scsi():
sysfs.check_content_in_glob("Ultra HS-SD/MMC \n", "/sys/bus/scsi/devices/*/model")
check:
flake8 librem5-devkit-flash-image
python3 -m doctest librem5_flash_image.py
...@@ -4,7 +4,6 @@ import argparse ...@@ -4,7 +4,6 @@ import argparse
import datetime import datetime
import hashlib import hashlib
import itertools import itertools
import jenkins
import logging import logging
import lzma import lzma
import os import os
...@@ -18,6 +17,12 @@ import time ...@@ -18,6 +17,12 @@ import time
import tqdm import tqdm
import yaml import yaml
try:
import jenkins
except ImportError:
logging.error("Cannot load Jenkins\nTry running: sudo apt install python3-jenkins")
exit(1)
try: try:
import coloredlogs import coloredlogs
have_colored_logs = True have_colored_logs = True
...@@ -28,7 +33,9 @@ except ImportError: ...@@ -28,7 +33,9 @@ except ImportError:
from urllib.parse import urljoin from urllib.parse import urljoin
JENKINS = 'https://arm01.puri.sm' JENKINS = 'https://arm01.puri.sm'
BOARD_TYPE = 'librem5r3' BOARD_TYPE = 'librem5r4'
VALID_PHONE_BOARD_TYPES = ['librem5r2', 'librem5r3', 'librem5r4']
VALID_DEVKIT_BOARD_TYPES = ['devkit']
BOARD_VARIANT = 'plain' BOARD_VARIANT = 'plain'
DIST = 'amber-phone' DIST = 'amber-phone'
IMAGE = '{}.img' IMAGE = '{}.img'
...@@ -249,6 +256,29 @@ def write_uuu_script(target, image, uboot, mods): ...@@ -249,6 +256,29 @@ def write_uuu_script(target, image, uboot, mods):
mods=mods)) mods=mods))
def wait_for_librem(librem_msg="default"):
found = False
printed_msg = False
if librem_msg == "default":
librem_msg = """
Turn all Hardware-Kill-Switches off
Remove battery
Hold volume-up
Insert the USB-c cable: (red light blinks, no green light)
Reinsert the battery: (red light is constantly on, the script will continue)\n\nSearching..."""
while not found:
returned_text = subprocess.check_output("lsusb", shell=True, universal_newlines=True)
for line in returned_text.split("\n"):
if "NXP Semiconductors" in line:
found = True
if not found and not printed_msg:
print(librem_msg)
printed_msg = True
time.sleep(1)
def flash_image(uuu_target, debug): def flash_image(uuu_target, debug):
if debug: if debug:
subprocess.check_call(['uuu', '-v', uuu_target]) subprocess.check_call(['uuu', '-v', uuu_target])
...@@ -256,6 +286,47 @@ def flash_image(uuu_target, debug): ...@@ -256,6 +286,47 @@ def flash_image(uuu_target, debug):
subprocess.check_call(['uuu', uuu_target]) subprocess.check_call(['uuu', uuu_target])
def get_board(path):
"""
Get board type from script name.
In case of doubt return the default board.
>>> get_board("/a/b/librem5-flash-image")
'librem5r4'
>>> get_board("/a/b/librem5-devkit-flash-image")
'devkit'
>>> get_board("/a/b/librem5r2-flash-image")
'librem5r2'
>>> get_board("/a/b/librem5r3-flash-image")
'librem5r3'
>>> get_board("/a/b/librem5r4-flash-image")
'librem5r4'
>>> get_board("/a/b/schwobel")
'librem5r4'
"""
name = os.path.split(path)[-1]
parts = name.split('-')
if len(parts) < 3 or len(parts) > 4:
return BOARD_TYPE
if parts[-2:] != ['flash', 'image']:
return BOARD_TYPE
parts = parts[:-2]
if len(parts) == 1:
if parts[0] in VALID_PHONE_BOARD_TYPES:
return parts[0]
else:
return BOARD_TYPE
if parts[0] == 'librem5' and parts[1] in VALID_DEVKIT_BOARD_TYPES:
return parts[1]
# People do odd things so use default in this case
return BOARD_TYPE
def main(): def main():
uuu_mods = '' uuu_mods = ''
parser = argparse.ArgumentParser(description='Flash a Librem 5 or Librem 5 Devkit.') parser = argparse.ArgumentParser(description='Flash a Librem 5 or Librem 5 Devkit.')
...@@ -273,9 +344,9 @@ def main(): ...@@ -273,9 +344,9 @@ def main():
parser.add_argument('--variant', choices=['legacy', 'current', 'next', 'plain'], default=BOARD_VARIANT, parser.add_argument('--variant', choices=['legacy', 'current', 'next', 'plain'], default=BOARD_VARIANT,
help="Variant of the board to download ( legacy, current, next ), " help="Variant of the board to download ( legacy, current, next ), "
"default is '{}'".format(BOARD_VARIANT)) "default is '{}'".format(BOARD_VARIANT))
parser.add_argument('--board', choices=['devkit', 'librem5r2', 'librem5r3', 'librem5r4'], default=BOARD_TYPE, parser.add_argument('--board', choices=VALID_DEVKIT_BOARD_TYPES + VALID_PHONE_BOARD_TYPES, default=None,
help="Type of the board to download ( devkit, librem5r2, librem5r3, librem5r4 ) " help="Type of the board to download ( devkit, librem5r2, librem5r3, librem5r4 ) "
"default is '{}'".format(BOARD_TYPE)) "default is 'auto'")
group = parser.add_argument_group(title='Testing and debugging options') group = parser.add_argument_group(title='Testing and debugging options')
group.add_argument('--debug', action="store_true", default=False, group.add_argument('--debug', action="store_true", default=False,
...@@ -292,9 +363,11 @@ def main(): ...@@ -292,9 +363,11 @@ def main():
else: else:
logging.basicConfig(level=level, format='%(asctime)s %(levelname)s %(message)s') logging.basicConfig(level=level, format='%(asctime)s %(levelname)s %(message)s')
board = args.board if args.board else get_board(sys.argv[0])
# Check available downloads upfront so it's less likely we fail # Check available downloads upfront so it's less likely we fail
# later: # later:
image_ref = find_image(args.image_job, args.board, args.variant, args.dist) image_ref = find_image(args.image_job, board, args.variant, args.dist)
if image_ref: if image_ref:
image_ref['ts'] = datetime.datetime.fromtimestamp(image_ref['timestamp'] / 1000).strftime('%c') image_ref['ts'] = datetime.datetime.fromtimestamp(image_ref['timestamp'] / 1000).strftime('%c')
logging.info("Found disk image Build {id} '{description}' from {ts}".format(**image_ref)) logging.info("Found disk image Build {id} '{description}' from {ts}".format(**image_ref))
...@@ -304,10 +377,10 @@ def main(): ...@@ -304,10 +377,10 @@ def main():
if args.uboot_job: if args.uboot_job:
uboot_ref = find_uboot(args.uboot_job) uboot_ref = find_uboot(args.uboot_job)
uboot_board = args.board uboot_board = board
else: else:
# uboot builds don't carry board revisions (yet?) # uboot builds don't carry board revisions (yet?)
uboot_board = args.board[:-2] if re.match('librem5r[0-9]$', args.board) else args.board uboot_board = board[:-2] if re.match('librem5r[0-9]$', board) else board
uboot_ref = find_uboot(UBOOT_JOB_NAME.format(uboot_board)) uboot_ref = find_uboot(UBOOT_JOB_NAME.format(uboot_board))
if uboot_ref: if uboot_ref:
...@@ -317,7 +390,7 @@ def main(): ...@@ -317,7 +390,7 @@ def main():
logging.error("No matching uboot found") logging.error("No matching uboot found")
return 1 return 1
if args.board in ["librem5r3", 'librem5r4']: if board in ["librem5r3", 'librem5r4']:
uuu_mods = "CFG: SDP: -chip MX8MQ -compatible MX8MQ -vid 0x316d -pid 0x4c05" uuu_mods = "CFG: SDP: -chip MX8MQ -compatible MX8MQ -vid 0x316d -pid 0x4c05"
outdir = args.dir if args.dir is not None else tempfile.mkdtemp(prefix='devkit_image_', dir='.') outdir = args.dir if args.dir is not None else tempfile.mkdtemp(prefix='devkit_image_', dir='.')
...@@ -326,17 +399,21 @@ def main(): ...@@ -326,17 +399,21 @@ def main():
if args.dir == outdir: if args.dir == outdir:
os.makedirs(args.dir, exist_ok=True) os.makedirs(args.dir, exist_ok=True)
image_target = os.path.join(outdir, IMAGE.format(args.board)) image_target = os.path.join(outdir, IMAGE.format(board))
uboot_target = os.path.join(outdir, UBOOT.format(uboot_board)) uboot_target = os.path.join(outdir, UBOOT.format(uboot_board))
uuu_target = os.path.join(outdir, UUU_SCRIPT.format(args.board)) uuu_target = os.path.join(outdir, UUU_SCRIPT.format(board))
download_image(urljoin(image_ref['url'], 'artifact/{}.xz').format(IMAGE.format(args.board)), download_image(urljoin(image_ref['url'], 'artifact/{}.xz').format(IMAGE.format(board)),
image_target, args.download_attempts) image_target, args.download_attempts)
download_uboot(urljoin(uboot_ref['url'], download_uboot(urljoin(uboot_ref['url'],
'artifact/output/uboot-{}/{}'.format(uboot_board, UBOOT.format(uboot_board))), 'artifact/output/uboot-{}/{}'.format(uboot_board, UBOOT.format(uboot_board))),
uboot_target) uboot_target)
write_uuu_script(uuu_target, image_target, uboot_target, uuu_mods) write_uuu_script(uuu_target, image_target, uboot_target, uuu_mods)
if not args.skip_flash: if not args.skip_flash:
if board == "devkit":
wait_for_librem(librem_msg="Please connect your devkit now.\nSearching...")
else:
wait_for_librem()
flash_image(uuu_target, args.debug) flash_image(uuu_target, args.debug)
except VerifyImageException as e: except VerifyImageException as e:
logging.error(e) logging.error(e)
......
librem5-flash-image
\ No newline at end of file
librem5-flash-image
\ No newline at end of file
librem5-flash-image
\ No newline at end of file
librem5-flash-image
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment