| #!/bin/bash |
| # Copyright 2018 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| # |
| # This opens various servo consoles using cu, from outside the chroot, |
| # automatically getting the correct console from dut-control. This |
| # also tees the output to a secondary logfile. |
| # |
| # The recommended way to use this is to setup an alias, e.g. add this in |
| # your .bashrc (outside the chroot): |
| # alias dut-console="~/chromiumos/src/platform/dev/contrib/dut-console" |
| # And then simply run: |
| # dut-console ec |
| # |
| # The script also allows to connect to different servod port, e.g. |
| # dut-control cpu 9999 |
| |
| set -e |
| |
| # Script is stored in $CROS_SDK/src/platform/dev/contrib |
| CROS_SDK="$(readlink -f "$(dirname "$0")/../../../..")" |
| PYTHONPATH="${CROS_SDK}/chroot/usr/lib64/python2.7/site-packages" |
| |
| kdmx_pid= |
| |
| cleanup() { |
| trap - INT TERM ERR EXIT |
| |
| if [[ -n "${kdmx_pid}" ]]; then |
| kill "${kdmx_pid}" 2>/dev/null |
| fi |
| } |
| |
| get_pty() { |
| local pty_name="$1" |
| local port="$2" |
| local args=() |
| |
| if [[ -n "${port}" ]]; then |
| args+=( --port "${port}" ) |
| fi |
| |
| PYTHONPATH="${PYTHONPATH}" \ |
| python "${PYTHONPATH}/servo/dut_control.py" "${pty_name}" "${args[@]}" | \ |
| cut -d : -f 2 |
| } |
| |
| find_cu() { |
| if ! hash cu; then |
| echo "Please install cu first:" >&2 |
| echo "sudo apt-get install cu" >&2 |
| exit 1 |
| fi |
| } |
| |
| usage() { |
| cat <<EOF |
| dut-control type [port] |
| |
| Opens CPU/EC servo console using "cu", outputs to both terminal, and an output |
| file named "log-\${type}[-\${port}]" in the current directory. |
| |
| type One of cpu, cpudbg, ec, cr50, fpmcu, servo, servo_v4 |
| [port] servod port (optional, uses default if not specified) |
| EOF |
| exit 2 |
| } |
| |
| main() { |
| local type="$1" |
| local port="$2" |
| local kdmx |
| local pty |
| local pty_name |
| local outlog |
| |
| find_cu |
| |
| trap cleanup INT TERM ERR EXIT |
| |
| case "${type}" in |
| cpu) |
| pty_name=cpu_uart_pty |
| ;; |
| cpudbg) |
| pty_name=cpu_uart_pty |
| kdmx='y' |
| ;; |
| ec) |
| pty_name=ec_uart_pty |
| ;; |
| cr50) |
| pty_name=cr50_uart_pty |
| ;; |
| fpmcu) |
| pty_name=fpmcu_uart_pty |
| ;; |
| servo) |
| pty_name=servo_console_pty |
| ;; |
| servo_v4) |
| pty_name=servo_v4_console_pty |
| ;; |
| *) |
| usage |
| ;; |
| esac |
| |
| pty="$(get_pty "${pty_name}" "${port}")" |
| |
| if [[ ! -e "${pty}" ]]; then |
| echo "Cannot find pty ${pty_name}." >&2 |
| exit 1 |
| fi |
| |
| outlog="log-${type}" |
| |
| if [[ -n "${port}" ]]; then |
| outlog="${outlog}-${port}" |
| fi |
| |
| if [[ "${kdmx}" == 'y' ]]; then |
| if ! hash kdmx; then |
| echo "Please build and put kdmx in your PATH first." >&2 |
| echo "See https://www.chromium.org/chromium-os/how-tos-and-troubleshooting/kernel-faq" >&2 |
| exit 1 |
| fi |
| |
| # Note that we hardcode kdmx pty file location in the /tmp directory of the |
| # chroot. This should be ok as there is normally only one user, and only |
| # a single instance of dut-console/kdmx can run per console/servod instance. |
| local spath_in="/tmp/kdmx_${type}" |
| if [[ -n "${port}" ]]; then |
| spath_in="${spath_in}_${port}" |
| fi |
| local spath="${CROS_SDK}/chroot${spath_in}" |
| local spath_pty="${spath}_trm" |
| local spath_log="${spath}_log" |
| |
| # Make sure we do not use a stale pty file |
| rm -f "${spath_pty}" |
| |
| echo "Muxing ${pty_name}:${pty} with kdmx..." |
| kdmx -n -p "${pty}" -s "${spath}" > "${spath_log}" 2>&1 & |
| kdmx_pid="$!" |
| # Give kdmx enough time to start and create pty file |
| sleep 0.5 |
| |
| pty="$(cat "${spath_pty}" 2>/dev/null || true)" |
| if [[ -z "${pty}" ]]; then |
| echo "kdmx failed to start:" >&2 |
| cat "${spath_log}" >&2 |
| exit 1 |
| fi |
| echo "You can now use kdbg inside the chroot with a command like:" |
| echo '${CROSS_ARCH}-gdb \ |
| /build/${BOARD}/usr/lib/debug/boot/vmlinux \ |
| -ex "target remote $(cat '"${spath_in}"'_gdb)' |
| fi |
| |
| echo "Opening ${pty_name}:${pty}..." |
| echo "Log in ${outlog}, type ~.<enter> to exit." |
| |
| stdbuf -oL cu --nostop -l "${pty}" | tee "${outlog}" |
| } |
| |
| main "$@" |