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