forked from mfulz_github/qmk_firmware
Add node.js libusb GenericHID test script.
This commit is contained in:
parent
e7a8fd6033
commit
9d6303cead
|
@ -0,0 +1,143 @@
|
||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
// LUFA Library
|
||||||
|
// Copyright (C) Dean Camera, 2013.
|
||||||
|
//
|
||||||
|
// dean [at] fourwalledcubicle [dot] com
|
||||||
|
// www.lufa-lib.org
|
||||||
|
|
||||||
|
// LUFA Generic HID device demo host test script. This script will send a
|
||||||
|
// continuous stream of generic reports to the device, to show a variable LED
|
||||||
|
// pattern on the target board. Send and received report data is printed to
|
||||||
|
// the terminal.
|
||||||
|
//
|
||||||
|
// You have to install the usb and async modules prior to executing this script:
|
||||||
|
// apt-get install libusb-1.0-0-dev
|
||||||
|
// npm install usb async sprintf
|
||||||
|
|
||||||
|
var usb = require('usb');
|
||||||
|
var async = require('async');
|
||||||
|
var sprintf = require('sprintf');
|
||||||
|
|
||||||
|
var deviceVid = 0x03EB;
|
||||||
|
var devicePid = 0x204F;
|
||||||
|
var reportLength = 8;
|
||||||
|
|
||||||
|
function getAndInitHidDeviceAndInterface()
|
||||||
|
{
|
||||||
|
device = usb.findByIds(deviceVid, devicePid);
|
||||||
|
if (!device) {
|
||||||
|
console.log('No device found');
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
device.open();
|
||||||
|
|
||||||
|
var hidInterface = device.interface(0);
|
||||||
|
if (hidInterface.isKernelDriverActive()) {
|
||||||
|
hidInterface.detachKernelDriver();
|
||||||
|
}
|
||||||
|
hidInterface.claim();
|
||||||
|
|
||||||
|
async.series([
|
||||||
|
function(callback) {
|
||||||
|
setConfiguration(0, function(error, data) {
|
||||||
|
callback();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
|
||||||
|
return {hidDevice:device, hidInterface:hidInterface};
|
||||||
|
}
|
||||||
|
|
||||||
|
function read(hidInterface, callback)
|
||||||
|
{
|
||||||
|
endpoint = hidInterface.endpoints[0];
|
||||||
|
endpoint.transfer(reportLength, function(error, data) {
|
||||||
|
if (error) {
|
||||||
|
console.log(error)
|
||||||
|
} else {
|
||||||
|
console.log("Received LED Pattern:", data.slice(0, 4));
|
||||||
|
}
|
||||||
|
callback();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function write(hidDevice, message, callback)
|
||||||
|
{
|
||||||
|
hidDevice.controlTransfer( // Send a Set Report control request
|
||||||
|
parseInt('00100001', 2), // bmRequestType (constant for this control request)
|
||||||
|
0x09, // bmRequest (constant for this control request)
|
||||||
|
0x0809, // wValue (MSB is report type, LSB is report number)
|
||||||
|
0, // wIndex (interface number)
|
||||||
|
message, // message to be sent
|
||||||
|
function(error, data) { // callback to be executed upon finishing the transfer
|
||||||
|
console.log("Sent LED Pattern:", message.slice(1, 5))
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function setConfiguration(configurationNumber, callback)
|
||||||
|
{
|
||||||
|
device.controlTransfer( // Send a Set Configuration control request
|
||||||
|
parseInt('00000000', 2), // bmRequestType
|
||||||
|
0x09, // bmRequest
|
||||||
|
0, // wValue (Configuration value)
|
||||||
|
0, // wIndex
|
||||||
|
new Buffer(0), // message to be sent
|
||||||
|
callback // callback to be executed upon finishing the transfer
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// @TODO: Fix this function because apparently it doesn't work for some reason.
|
||||||
|
function getStringDescriptor(stringId, languageId, callback)
|
||||||
|
{
|
||||||
|
var STRING_DESCRIPTOR_TYPE = 0x03;
|
||||||
|
var wValue = (STRING_DESCRIPTOR_TYPE << 8) | stringId;
|
||||||
|
|
||||||
|
device.controlTransfer( // Send a Get Descriptor control request
|
||||||
|
parseInt('10000000', 2), // bmRequestType
|
||||||
|
0x06, // bmRequest
|
||||||
|
wValue, // wValue
|
||||||
|
languageId, // wIndex
|
||||||
|
64, // response length
|
||||||
|
callback // callback to be executed upon finishing the transfer
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function setNextPattern()
|
||||||
|
{
|
||||||
|
var pattern = [
|
||||||
|
hidInterface.interface,
|
||||||
|
(p >> 3) & 1,
|
||||||
|
(p >> 2) & 1,
|
||||||
|
(p >> 1) & 1,
|
||||||
|
(p >> 0) & 1
|
||||||
|
];
|
||||||
|
|
||||||
|
async.series([
|
||||||
|
function(callback) {
|
||||||
|
write(hidDevice, new Buffer(pattern), callback);
|
||||||
|
},
|
||||||
|
function(callback) {
|
||||||
|
read(hidInterface, callback);
|
||||||
|
},
|
||||||
|
function(callback) {
|
||||||
|
p = (p + 1) % 16
|
||||||
|
setTimeout(setNextPattern, 200);
|
||||||
|
callback();
|
||||||
|
}]);
|
||||||
|
}
|
||||||
|
|
||||||
|
var hidDeviceAndInterface = getAndInitHidDeviceAndInterface();
|
||||||
|
var hidDevice = hidDeviceAndInterface.hidDevice
|
||||||
|
var hidInterface = hidDeviceAndInterface.hidInterface;
|
||||||
|
|
||||||
|
console.log(sprintf("Connected to device 0x%04X/0x%04X - %s [%s]",
|
||||||
|
hidDevice.deviceDescriptor.idVendor,
|
||||||
|
hidDevice.deviceDescriptor.idProduct,
|
||||||
|
hidDevice.deviceDescriptor.iProduct,
|
||||||
|
hidDevice.deviceDescriptor.iManufacturer));
|
||||||
|
|
||||||
|
p = 0
|
||||||
|
setNextPattern();
|
Loading…
Reference in New Issue