Files
esp-cryptoauthlib/esp_cryptoauth_utility/helper_scripts/serial.py
T
2021-12-22 12:07:32 -08:00

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)