mirror of
https://github.com/m5stack/esp-cryptoauthlib.git
synced 2026-05-20 10:49:07 -07:00
109 lines
3.5 KiB
Python
109 lines
3.5 KiB
Python
#!/usr/bin/env python
|
|
# Copyright 2020 Espressif Systems (Shanghai) Co., Ltd.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
import os
|
|
from sys import exit
|
|
import time
|
|
import subprocess
|
|
import collections
|
|
import sys
|
|
try:
|
|
import esptool
|
|
except ImportError: # cheat and use IDF's copy of esptool if available
|
|
idf_path = os.getenv("IDF_PATH")
|
|
if not idf_path or not os.path.exists(idf_path):
|
|
raise
|
|
sys.path.insert(0, os.path.join(idf_path, "components", "esptool_py", "esptool"))
|
|
import esptool
|
|
|
|
|
|
class cmd_interpreter:
|
|
"""
|
|
This class is for is the command line interaction with the secure_cert_mfg firmware for manufacturing.
|
|
It executes the specified commands and returns its result.
|
|
It is a stateless, thus does not maintain the current state of the firmware.
|
|
"""
|
|
|
|
def wait_for_init(self, port):
|
|
print("Wait for init")
|
|
port.timeout = 1.5
|
|
port.baudrate = 115200
|
|
start_time = time.time()
|
|
p_timeout = 20
|
|
while True:
|
|
line = port.readline()
|
|
if b'Initialising Command line: >>' in line:
|
|
print("- CLI Initialised")
|
|
return True
|
|
elif (time.time() - start_time) > p_timeout:
|
|
print("connection timed out")
|
|
return False
|
|
|
|
def exec_cmd(self, port, command, args=None):
|
|
ret = ""
|
|
status = None
|
|
port.timeout = 3
|
|
port.baudrate = 115200
|
|
port.write(command.encode() + b'\r')
|
|
if args:
|
|
time.sleep(0.1)
|
|
if type(args) is str:
|
|
args = args.encode()
|
|
port.write(args)
|
|
port.write(b'\0')
|
|
|
|
while True:
|
|
port.timeout = 1.5
|
|
line = (port.readline()).decode()
|
|
print(line)
|
|
if 'Status: Success' in line:
|
|
status = True
|
|
elif 'Status: Failure' in line:
|
|
status = False
|
|
if status is True or status is False:
|
|
while True:
|
|
line = (port.readline()).decode()
|
|
if ">>" in line:
|
|
if status is True:
|
|
print(line)
|
|
break
|
|
else:
|
|
ret += line
|
|
return [{"Status": status}, {"Return": ret}]
|
|
|
|
|
|
def _exec_shell_cmd(self, command):
|
|
result = subprocess.Popen((command).split(), stdout=subprocess.PIPE)
|
|
out, err = result.communicate()
|
|
return out
|
|
|
|
|
|
def load_app_stub(bin_path, esp):
|
|
esp.connect()
|
|
abs_bin_path = os.path.dirname(os.path.abspath(__file__)) + '/../' + bin_path
|
|
if (os.path.exists(abs_bin_path) is False):
|
|
print("Stub not found")
|
|
exit(0)
|
|
arg_tuple = collections.namedtuple('ram_image', ['filename'])
|
|
args = arg_tuple(abs_bin_path)
|
|
esp.change_baud(baud=921600)
|
|
esptool.load_ram(esp, args)
|
|
|
|
|
|
def esp_cmd_check_ok(retval, cmd_str):
|
|
if retval[0]['Status'] is not True:
|
|
print((cmd_str + "failed to execute"))
|
|
print((retval[1]['Return']))
|
|
exit(0)
|