parent
66c51530db
commit
dd4a6243c5
@ -1,24 +0,0 @@
|
|||||||
#!/usr/bin/env perl
|
|
||||||
|
|
||||||
use warnings;
|
|
||||||
use strict;
|
|
||||||
|
|
||||||
#
|
|
||||||
# Scan all USB devices to find the Model 01's modem device number.
|
|
||||||
#
|
|
||||||
my @output = qx(/usr/sbin/usbconfig show_ifdrv);
|
|
||||||
my $serial_port_number;
|
|
||||||
|
|
||||||
foreach my $line (@output) {
|
|
||||||
chomp $line;
|
|
||||||
|
|
||||||
next unless $line =~ m/umodem(\d+):.*Keyboardio Model 01/;
|
|
||||||
$serial_port_number = $1;
|
|
||||||
}
|
|
||||||
|
|
||||||
die "Can't find Model 01" unless defined($serial_port_number);
|
|
||||||
|
|
||||||
my $serial_port_name = "/dev/cuaU$serial_port_number";
|
|
||||||
die "Missing serial port at $serial_port_name" unless -e $serial_port_name;
|
|
||||||
print "$serial_port_name\n";
|
|
||||||
exit 0;
|
|
@ -1,92 +0,0 @@
|
|||||||
#!/usr/bin/env perl
|
|
||||||
# find-device-port-linux-udev - Kaleidoscope helper tool
|
|
||||||
# Copyright (C) 2017-2018 Keyboard.io, Inc.
|
|
||||||
#
|
|
||||||
# This program is free software: you can redistribute it and/or modify it under
|
|
||||||
# the terms of the GNU General Public License as published by the Free Software
|
|
||||||
# Foundation, version 3.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
||||||
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License along with
|
|
||||||
# this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
use warnings;
|
|
||||||
use strict;
|
|
||||||
|
|
||||||
use FindBin qw{$Bin};
|
|
||||||
|
|
||||||
die "Usage: $0 VID PID [-v]\n" unless @ARGV >= 2;
|
|
||||||
|
|
||||||
my $vid = shift @ARGV;
|
|
||||||
my $pid = shift @ARGV;
|
|
||||||
my $verbose = shift @ARGV if (@ARGV);
|
|
||||||
my $prefix = '/dev/serial/by-id/';
|
|
||||||
my @paths = `ls $prefix`;
|
|
||||||
my %devices;
|
|
||||||
my @log;
|
|
||||||
|
|
||||||
sub debug {
|
|
||||||
if ($verbose) {
|
|
||||||
print STDERR @_;
|
|
||||||
} else {
|
|
||||||
push @log, @_;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub print_warning {
|
|
||||||
print STDERR @_;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
debug "Looking for USB device with vid=$vid and pid=$pid\n";
|
|
||||||
|
|
||||||
for my $path (@paths) {
|
|
||||||
chomp($path);
|
|
||||||
debug "Examining $path\n";
|
|
||||||
debug " not symlink\n" unless -l $prefix . $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 ( hex $devices{$path}{'ID_VENDOR_ID'} != hex $vid ) {
|
|
||||||
debug " ID_VENDOR_ID $devices{$path}{'ID_VENDOR_ID'} != $vid\n";
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
if ( hex $devices{$path}{'ID_MODEL_ID'} != hex $pid ) {
|
|
||||||
debug " ID_MODEL_ID $devices{$path}{'ID_MODEL_ID'} != $pid\n";
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
|
|
||||||
debug " Found keyboard!\n";
|
|
||||||
|
|
||||||
if ( $devices{$path}{'ID_MM_DEVICE_IGNORE'} ) {
|
|
||||||
debug " ID_MM_DEVICE_IGNORE is set - good!\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( $devices{$path}{'ID_MM_CANDIDATE'}) {
|
|
||||||
my $rules = "$Bin/../etc/60-kaleidoscope.rules";
|
|
||||||
print_warning <<EOWARN
|
|
||||||
|
|
||||||
WARNING: your udev rules are currently configured to suggest
|
|
||||||
that your keyboard is suitable for use by ModemManager. This
|
|
||||||
means that there is a risk of ModemManager interfering. To avoid
|
|
||||||
this, copy
|
|
||||||
|
|
||||||
$rules
|
|
||||||
|
|
||||||
to /etc/udev/rules.d
|
|
||||||
EOWARN
|
|
||||||
}
|
|
||||||
|
|
||||||
print $devices{$path}{DEVNAME};
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
#debug("ERROR: I couldn't find a USB device matching the keyboard's USB Vendor and Device IDs\n");
|
|
||||||
#print_warning(join("\n",@log));
|
|
@ -1,113 +0,0 @@
|
|||||||
#!/usr/bin/env perl
|
|
||||||
|
|
||||||
# Based on listArduinos.pl from https://github.com/todbot/usbSearch (License: MIT)
|
|
||||||
# Original (C) 2012, Tod E. Kurt, http://todbot.com/blog/
|
|
||||||
# This version by Michael Richters <gedankenexperimenter@gmail.com> and Jesse Vincent <jesse@keyboard.io>
|
|
||||||
|
|
||||||
use warnings;
|
|
||||||
use strict;
|
|
||||||
|
|
||||||
my $vid = shift @ARGV;
|
|
||||||
my $pid = shift @ARGV;
|
|
||||||
|
|
||||||
if (!defined $vid || !defined $pid) {
|
|
||||||
die "$0 has two required parameters, VID and PID";
|
|
||||||
}
|
|
||||||
|
|
||||||
# ioreg might be more machine-readable than system_profiler, but I haven't been able to
|
|
||||||
# get it to produce useful output
|
|
||||||
my @output = qx(/usr/sbin/system_profiler SPUSBDataType 2> /dev/null);
|
|
||||||
|
|
||||||
my $serial = "";
|
|
||||||
my $location = "";
|
|
||||||
|
|
||||||
my $output = join('', @output);
|
|
||||||
|
|
||||||
my @stanzas = split(/\n\n/, $output);
|
|
||||||
foreach my $stanza (@stanzas) {
|
|
||||||
if ($stanza =~ /Product ID: ${pid}/ && $stanza =~ /Vendor ID: ${vid}/) {
|
|
||||||
if ($stanza =~ /Serial Number: (.*?)$/m) {
|
|
||||||
$serial = $1;
|
|
||||||
}
|
|
||||||
if ($stanza =~ /Location ID: (.*?)$/m) {
|
|
||||||
$location = $1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($serial) {
|
|
||||||
try_for_raw_serialnum($serial);
|
|
||||||
}
|
|
||||||
if ($location) {
|
|
||||||
try_for_location_id($location);
|
|
||||||
}
|
|
||||||
if ($serial) {
|
|
||||||
try_for_sn_prefix($serial);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub try_for_raw_serialnum {
|
|
||||||
my $sn = shift;
|
|
||||||
|
|
||||||
my $serial_port_name = "/dev/cu.usbmodem" . $sn;
|
|
||||||
exit_with_port_if_exists($serial_port_name);
|
|
||||||
|
|
||||||
# High Sierra sometimes has a mismatch between the serial number and the device
|
|
||||||
# filename. I'm not sure why, but system_profiler has a serial number ending in "E",
|
|
||||||
# whereas the device filename ends in "1". In fact, when I change HID.getShortName()
|
|
||||||
# to return "kbio02", the final character is replaced with a "1".
|
|
||||||
|
|
||||||
if ($serial_port_name =~ /\d$/) {
|
|
||||||
chop $serial_port_name;
|
|
||||||
exit_with_port_if_exists($serial_port_name . "1");
|
|
||||||
} else {
|
|
||||||
# If the serial port name doesn't end with a digit, try -appending- rather than replacing
|
|
||||||
# the last character of the port name
|
|
||||||
exit_with_port_if_exists($serial_port_name . "1");
|
|
||||||
|
|
||||||
# and if that didn't work, try replacing the last character with a "1" anyway.
|
|
||||||
# Jason Koh reports that he saw this behavior as required on Catalina in May 2020.
|
|
||||||
|
|
||||||
chop $serial_port_name;
|
|
||||||
exit_with_port_if_exists($serial_port_name . "1");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
sub try_for_location_id {
|
|
||||||
my $location_id = shift;
|
|
||||||
|
|
||||||
# macOS truncates the string of "0"s from the right of the location id.
|
|
||||||
# Here, also, the final character is an appended "1", so if macOS ever stops doing that,
|
|
||||||
# this will need an update, as well.
|
|
||||||
if ($location_id =~ /0x(\d+?)0*\b/) {
|
|
||||||
my $loc = $1;
|
|
||||||
exit_with_port_if_exists("/dev/cu.usbmodem" . $loc . "1");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub try_for_sn_prefix {
|
|
||||||
my $sn = shift;
|
|
||||||
# If macOS has appended 'E', take it off to maximise our chances of a match.
|
|
||||||
$sn =~ s/E$//;
|
|
||||||
|
|
||||||
# If none of the above tests succeeds, just list the directory and see if there are any
|
|
||||||
# files that have the device shortname that we expect:
|
|
||||||
foreach my $line (qx(ls /dev/cu.usbmodem*)) {
|
|
||||||
if ($line =~ /${sn}/) {
|
|
||||||
chomp $line;
|
|
||||||
print $line;
|
|
||||||
exit 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub exit_with_port_if_exists {
|
|
||||||
my $serial_port_name = shift;
|
|
||||||
|
|
||||||
if (-e $serial_port_name) {
|
|
||||||
print $serial_port_name;
|
|
||||||
exit 0;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,41 +0,0 @@
|
|||||||
# Usage:
|
|
||||||
#
|
|
||||||
# > find-device-port-cygwin.ps1 '1209' '2300' -Format COM
|
|
||||||
# COM7
|
|
||||||
# > find-device-port-cygwin.ps1 '1209' '2300' -Format WSL
|
|
||||||
# /dev/ttyS7
|
|
||||||
# > find-device-port-cygwin.ps1 '1209' '2300' -Format Cygwin
|
|
||||||
# /dev/ttyS6
|
|
||||||
Param(
|
|
||||||
[string]$VendorID,
|
|
||||||
[string]$ProductID, # Careful; $PID is a different builtin
|
|
||||||
[ValidateSet('COM','Cygwin','WSL')][string]$Format
|
|
||||||
)
|
|
||||||
|
|
||||||
$DeviceParametersRegKey = @(Get-ChildItem -ErrorAction SilentlyContinue -Recurse 'HKLM:\SYSTEM\CurrentControlSet\Enum' |
|
|
||||||
Where-Object Name -match "VID_$VendorID&PID_$ProductID" |
|
|
||||||
Where-Object Property -eq PortName)
|
|
||||||
|
|
||||||
if ($DeviceParametersRegKey.Count -eq 0) {
|
|
||||||
throw "Could not find any devices matching VID $VendorID and PID $ProductID which were mapped to a COM port"
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($DeviceParametersRegKey.Count -ge 2) {
|
|
||||||
throw "More than one devices matching VID $VendorID and PID $ProductID were found mapped to a COM port"
|
|
||||||
}
|
|
||||||
|
|
||||||
# This will be of form 'COM6'
|
|
||||||
$COMPortName = ($DeviceParametersRegKey | Get-ItemProperty).PortName
|
|
||||||
$COMPortNumber = [int]$COMPortName.Substring(3)
|
|
||||||
|
|
||||||
if ($Format -eq 'COM') {
|
|
||||||
$Output = $COMPortName
|
|
||||||
} elseif ($Format -eq 'WSL') {
|
|
||||||
$Output = "/dev/ttyS$COMPortNumber"
|
|
||||||
} elseif ($Format -eq 'Cygwin') {
|
|
||||||
$CygwinPortNumber = $COMPortNumber - 1
|
|
||||||
$Output = "/dev/ttyS$CygwinPortNumber"
|
|
||||||
}
|
|
||||||
|
|
||||||
# "-NoNewline" below is important to prevent bash from seeing an extra trailing '\r'
|
|
||||||
Write-Host -NoNewline $Output
|
|
Loading…
Reference in new issue