diff --git a/bin/find-device-port-linux-udev b/bin/find-device-port-linux-udev new file mode 100644 index 00000000..3be11b4d --- /dev/null +++ b/bin/find-device-port-linux-udev @@ -0,0 +1,30 @@ +#!/usr/bin/env perl + +use warnings; +use strict; +my $vid = shift; +my $pid = shift; +my $prefix = '/dev/serial/by-id/'; +my @paths= `ls $prefix`; +my %devices; + +for my $path (@paths) { + chomp($path); + next unless -l $prefix. $path; + my @data = `udevadm info -q property --name=${prefix}${path}`; + for my $line (@data) { + chomp ($line); + my ($key,$val) = split(/=/,$line,2); + $devices{$path}{$key} = $val; + } + if (($devices{$path}{'ID_VENDOR_ID'} == $vid) && + ($devices{$path}{'ID_MODEL_ID'} == $pid) ) { + + if ($devices{$path}{'ID_MM_CANDIDATE'}) { + warn "Yikes. ModemManager wants to pwn your keyboard"; + } + + print $devices{$path}{DEVNAME}; + exit(0); + } +} diff --git a/bin/kaleidoscope-builder b/bin/kaleidoscope-builder index b63ae8da..8dc4a86e 100755 --- a/bin/kaleidoscope-builder +++ b/bin/kaleidoscope-builder @@ -2,13 +2,33 @@ set -e +###### +###### Build and output configuration +###### + +build_version () { + GIT_VERSION="$(cd $(find_sketch); git describe --abbrev=4 --dirty --always)" + LIB_VERSION="$(cd $(find_sketch); (grep version= ../../library.properties 2>/dev/null || echo version=0.0.0) | cut -d= -f2)-g${GIT_VERSION}" + + BUILD_PATH="${BUILD_PATH:-$(mktemp -d 2>/dev/null || mktemp -d -t 'build')}" + OUTPUT_DIR="${OUTPUT_DIR:-output/${LIBRARY}}" + OUTPUT_PATH="${OUTPUT_PATH:-${SOURCEDIR}/${OUTPUT_DIR}}" +} + +build_filenames () { + OUTPUT_FILE_PREFIX="${SKETCH}-${LIB_VERSION}" + HEX_FILE_PATH="${OUTPUT_PATH}/${OUTPUT_FILE_PREFIX}.hex" + HEX_FILE_WITH_BOOTLOADER_PATH="${OUTPUT_PATH}/${OUTPUT_FILE_PREFIX}-with-bootloader.hex" + ELF_FILE_PATH="${OUTPUT_PATH}/${OUTPUT_FILE_PREFIX}.elf" +} + firmware_size () { if [ "${BOARD}" = "virtual" ]; then echo "[Size not computed for virtual build]" return fi - ## This is a terrible hack, please don't hurt me. - algernon + ## This is a terrible hack, please don't hurt me. - algernon MAX_PROG_SIZE=28672 @@ -56,13 +76,11 @@ flash () { sleep 3s find_bootloader_ports flash_over_usb || flash_over_usb - } flash_over_usb () { sleep 1s ${AVRDUDE} -q -q -C ${AVRDUDE_CONF} -p${MCU} -cavr109 -D -P ${DEVICE_PORT_BOOTLOADER} -b57600 "-Uflash:w:${HEX_FILE_PATH}:i" - } flash_from_bootloader() { @@ -71,14 +89,12 @@ flash_from_bootloader() { flash_over_usb || flash_over_usb } - program() { prepare_to_flash flash_with_programmer } flash_with_programmer() { - ${AVRDUDE} -v \ -C ${AVRDUDE_CONF} \ -p${MCU} \ @@ -127,7 +143,7 @@ compile () { ARDUINO_PACKAGES="" if [ -d ${ARDUINO_PACKAGE_PATH} ]; then - ARDUINO_PACKAGES="-hardware \"${ARDUINO_PACKAGE_PATH}\"" + ARDUINO_PACKAGES="-hardware \"${ARDUINO_PACKAGE_PATH}\"" fi ${ARDUINO_BUILDER} \ @@ -212,7 +228,13 @@ clean () { rm -rf "${OUTPUT_PATH}" } -reset_device () { +reset_device() { + find_device_port + check_device_port + reset_device_cmd +} + +check_device_port () { if [ -z $DEVICE_PORT ]; then echo "Couldn't autodetect the keyboard's serial port." echo "If you see this message and your keyboard is connected to your computer," @@ -221,8 +243,6 @@ reset_device () { echo "Please report this issue at https://github.com/keyboardio/Kaleidoscope"; exit 0; fi - - ${RESET_DEVICE} } usage () { @@ -297,9 +317,13 @@ if [ -e "${SOURCEDIR}/kaleidoscope-builder.conf" ]; then . "${SOURCEDIR}/kaleidoscope-builder.conf" fi - . ${ROOT}/etc/kaleidoscope-builder.conf +if [ ! -z "${VERBOSE}" ] && [ "${VERBOSE}" -gt 0 ]; then + ARDUINO_VERBOSE="-verbose" +else + ARDUINO_VERBOSE="-quiet" +fi cmds="" diff --git a/etc/kaleidoscope-builder.conf b/etc/kaleidoscope-builder.conf index 9ac994cf..696be6c8 100644 --- a/etc/kaleidoscope-builder.conf +++ b/etc/kaleidoscope-builder.conf @@ -1,24 +1,13 @@ ## NEEDS: LIBRARY, SKETCH, ROOT, SOURCEDIR ## Should be included when the current directory is the dir of the Sketch. -case "$0" in - */settings.sh) - echo "This file must be included, never run directly!" >&2 - exit 1 - ;; -esac - SKETCH="${SKETCH:-${DEFAULT_SKETCH}}" LIBRARY="${LIBRARY:-${SKETCH}}" - - ######## ######## Keyboard hardware definitions ######## - - BOARD="${BOARD:-model01}" MCU="${MCU:-atmega32u4}" if [ "${BOARD}" = "virtual" ]; then @@ -27,51 +16,73 @@ else FQBN="${FQBN:-keyboardio:avr:${BOARD}}" fi - ######## ######## Host OS specific commands ######## - ## Platform-specific overrides # Shamelessly stolen from git's Makefile uname_S=$(uname -s 2>/dev/null || echo not) +find_device_vid_pid() { + VPIDS=$(${ARDUINO_BUILDER} \ + -hardware "${ARDUINO_PATH}/hardware" \ + -hardware "${BOARD_HARDWARE_PATH}" \ + ${ARDUINO_TOOLS_PARAM} \ + -tools "${ARDUINO_PATH}/tools-builder" \ + -fqbn "${FQBN}" \ + -dump-prefs | grep "\.[vp]id=") + VID=${VID:-$(echo "${VPIDS}" | grep build.vid= | cut -dx -f2)} + SKETCH_PID=${SKETCH_PID:-$(echo "${VPIDS}" | grep build.pid= | cut -dx -f2)} + BOOTLOADER_PID=${BOOTLOADER_PID:-$(echo "${VPIDS}" | grep bootloader.pid= | cut -dx -f2)} +} - -DEVICE_PORT="$(ls /dev/ttyACM* 2>/dev/null || echo '')" -RESET_DEVICE="stty -F ${DEVICE_PORT} 1200 hupcl" -MD5="md5sum" +find_device_port() { + find_device_vid_pid + DIR=$(dirname "$(readlink -f "$0")") + DEVICE_PORT_PROBER="${DIR}/find-device-port-linux-udev" + DEVICE_PORT="$(perl ${DEVICE_PORT_PROBER} ${VID} ${SKETCH_PID})" +} +reset_device_cmd() { + stty -F ${DEVICE_PORT} 1200 hupcl +} -if [ "${uname_S}" = "Darwin" ]; then - DEVICE_PORT="$(ls /dev/cu.usbmodemkbio* 2> /dev/null || echo '')" - DEVICE_PORT="${DEVICE_PORT:-$(ls /dev/cu.usbmodemCkbio* 2> /dev/null || echo '')}" - DEVICE_PORT="${DEVICE_PORT:-$(ls /dev/cu.usbmodemHID* 2> /dev/null || echo '')}" - DEVICE_PORT="${DEVICE_PORT:-$(ls /dev/cu.usbmodemCHID* 2> /dev/null || echo '')}" - DEVICE_PORT="${DEVICE_PORT:-$(ls /dev/cu.usbmodem14* 2> /dev/null || echo '')}" - RESET_DEVICE="/bin/stty -f ${DEVICE_PORT} 1200" +find_bootloader_ports() { + find_device_vid_pid + DIR=$(dirname "$(readlink -f "$0")") + DEVICE_PORT_PROBER="${DIR}/find-device-port-linux-udev" + DEVICE_PORT_BOOTLOADER="$(perl ${DEVICE_PORT_PROBER} ${VID} ${BOOTLOADER_PID})" +} +MD5="md5sum" - ARDUINO_PATH="${ARDUINO_PATH:-/Applications/Arduino.app/Contents/Java/}" - ARDUINO_PACKAGE_PATH="${ARDUINO_PACKAGE_PATH:-${HOME}/Library/Arduino15/packages}" - ARDUINO_LOCAL_LIB_PATH="${ARDUINO_LOCAL_LIB_PATH:-${HOME}/Documents/Arduino}" +if [ "${uname_S}" = "Darwin" ]; then - MD5="md5" + find_device_port() { + DEVICE_PORT="$(ls /dev/cu.usbmodemkbio* 2> /dev/null || echo '')" + DEVICE_PORT="${DEVICE_PORT:-$(ls /dev/cu.usbmodemCkbio* 2> /dev/null || echo '')}" + DEVICE_PORT="${DEVICE_PORT:-$(ls /dev/cu.usbmodemHID* 2> /dev/null || echo '')}" + DEVICE_PORT="${DEVICE_PORT:-$(ls /dev/cu.usbmodemCHID* 2> /dev/null || echo '')}" + DEVICE_PORT="${DEVICE_PORT:-$(ls /dev/cu.usbmodem14* 2> /dev/null || echo '')}" + } -fi + reset_device_cmd() { + /bin/stty -f ${DEVICE_PORT} 1200 + } -find_bootloader_ports() { + ARDUINO_PATH="${ARDUINO_PATH:-/Applications/Arduino.app/Contents/Java/}" + ARDUINO_PACKAGE_PATH="${ARDUINO_PACKAGE_PATH:-${HOME}/Library/Arduino15/packages}" + ARDUINO_LOCAL_LIB_PATH="${ARDUINO_LOCAL_LIB_PATH:-${HOME}/Documents/Arduino}" -DEVICE_PORT_BOOTLOADER="$(ls /dev/ttyACM* 2>/dev/null || echo '')" -if [ "${uname_S}" = "Darwin" ]; then - DEVICE_PORT_BOOTLOADER="$(ls /dev/cu.usbmodemkbio* 2> /dev/null || echo '')" - DEVICE_PORT_BOOTLOADER="${DEVICE_PORT_BOOTLOADER:-$(ls /dev/cu.usbmodem14* 2> /dev/null || echo '')}" -fi + MD5="md5" + find_bootloader_ports() { + DEVICE_PORT_BOOTLOADER="$(ls /dev/cu.usbmodemkbio* 2> /dev/null || echo '')" + DEVICE_PORT_BOOTLOADER="${DEVICE_PORT_BOOTLOADER:-$(ls /dev/cu.usbmodem14* 2> /dev/null || echo '')}" + } -} - +fi ###### ###### Arduino tools configuration @@ -95,52 +106,17 @@ AVR_OBJDUMP="${AVR_OBJDUMP:-${ARDUINO_TOOLS_PATH}/avr/bin/avr-objdump}" AVRDUDE="${AVRDUDE:-${ARDUINO_TOOLS_PATH}/avr/bin/avrdude}" AVRDUDE_CONF="${AVRDUDE_CONF:-${ARDUINO_TOOLS_PATH}/avr/etc/avrdude.conf}" - ###### ###### Source files and dependencies ###### - BOARD_HARDWARE_PATH="${BOARD_HARDWARE_PATH:-${ARDUINO_LOCAL_LIB_PATH}/hardware}" BOOTLOADER_PATH="${BOOTLOADER_PATH:-${BOARD_HARDWARE_PATH}/keyboardio/avr/bootloaders/caterina/Caterina.hex}" - -###### -###### Build and output configuration -###### - -build_version () { - GIT_VERSION="$(cd $(find_sketch); git describe --abbrev=4 --dirty --always)" - LIB_VERSION="$(cd $(find_sketch); (grep version= ../../library.properties 2>/dev/null || echo version=0.0.0) | cut -d= -f2)-g${GIT_VERSION}" - - BUILD_PATH="${BUILD_PATH:-$(mktemp -d 2>/dev/null || mktemp -d -t 'build')}" - OUTPUT_DIR="${OUTPUT_DIR:-output/${LIBRARY}}" - OUTPUT_PATH="${OUTPUT_PATH:-${SOURCEDIR}/${OUTPUT_DIR}}" -} - -build_filenames () { - OUTPUT_FILE_PREFIX="${SKETCH}-${LIB_VERSION}" - HEX_FILE_PATH="${OUTPUT_PATH}/${OUTPUT_FILE_PREFIX}.hex" - HEX_FILE_WITH_BOOTLOADER_PATH="${OUTPUT_PATH}/${OUTPUT_FILE_PREFIX}-with-bootloader.hex" - ELF_FILE_PATH="${OUTPUT_PATH}/${OUTPUT_FILE_PREFIX}.elf" -} - - - - - -ARDUINO_TOOLS_PARAM="-tools ${ARDUINO_TOOLS_PATH}" -if [ -z "${ARDUINO_TOOLS_PATH}" ]; then - ARDUINO_TOOLS_PARAM="" +if [ ! -z "${ARDUINO_TOOLS_PATH}" ]; then + ARDUINO_TOOLS_PARAM="-tools ${ARDUINO_TOOLS_PATH}" fi if [ ! -z "${AVR_GCC_PREFIX}" ]; then ARDUINO_AVR_GCC_PREFIX_PARAM="-prefs \"runtime.tools.avr-gcc.path=${AVR_GCC_PREFIX}\"" fi - -if [ ! -z "${VERBOSE}" ] && [ "${VERBOSE}" -gt 0 ]; then - ARDUINO_VERBOSE="-verbose" -else - ARDUINO_VERBOSE="-quiet" -fi -