e521cdb5a3ce6bc93833adba5ce1cb48fabc604b
[pub/USBasp.git] / Demos / Device / LowLevel / CCID / HostTestApp / test_generic_ccid_libusb.js
1 #!/usr/bin/env node
2
3 // LUFA Library
4 // Copyright (C) Dean Camera, 2018.
5 //
6 // dean [at] fourwalledcubicle [dot] com
7 //
8 // www.lufa-lib.org
9
10 // Copyright 2018 Filipe Rodrigues (filipepazrodrigues [at] gmail [dot] com)
11 //
12 // LUFA Generic CCID device demo host test script. This script test multiple
13 // kinds of CCID messages and shows the result to the console
14 //
15 // You have to install the usb and async modules prior to executing this script:
16 // apt-get install libusb-1.0-0-dev
17 // npm install usb async sprintf
18
19 var usb = require('usb');
20 var async = require('async');
21 var sprintf = require('sprintf');
22
23 var deviceVid = 0x03EB;
24 var devicePid = 0x206E;
25
26 var CCID_PC_to_RDR_IccPowerOn = 0x62;
27 var CCID_PC_to_RDR_IccPowerOff = 0x63;
28 var CCID_PC_to_RDR_GetSlotStatus = 0x65;
29 var CCID_PC_to_RDR_XfrBlock = 0x6f;
30
31 function getAndInitCcidDeviceAndInterface()
32 {
33 device = usb.findByIds(deviceVid, devicePid);
34 if (!device) {
35 console.log('No device found');
36 process.exit(1);
37 }
38 device.open();
39
40 var ccidInterface = device.interface(0);
41 if (ccidInterface.isKernelDriverActive()) {
42 ccidInterface.detachKernelDriver();
43 }
44 ccidInterface.claim();
45
46 return {ccidDevice:device, ccidInterface:ccidInterface};
47 }
48
49 function read(ccidInterface, responseSize, callback)
50 {
51 inEndpoint = ccidInterface.endpoints[0];
52 inEndpoint.transfer(responseSize, function(error, data) {
53 if (error) {
54 console.log(error)
55 } else {
56 console.log("Received data:", data);
57 }
58 callback();
59 });
60 }
61
62 function write(ccidInterface, message, callback)
63 {
64 outEndpoint = ccidInterface.endpoints[1]
65 outEndpoint.transfer( // Send a Set Report control request
66 message, // message to be sent
67 function(error) { // callback to be executed upon finishing the transfer
68 callback();
69 }
70 );
71 }
72
73 //CCID functions
74
75 function IccPowerOnMessage(slot, seq)
76 {
77 return [
78 CCID_PC_to_RDR_IccPowerOn, //message type
79 0, 0, 0, 0, //length
80 slot,
81 seq,
82 0, //power select: automatic
83 0, 0 //RFU
84 ];
85 }
86
87 function IccPowerOffMessage(slot, seq)
88 {
89 return [
90 CCID_PC_to_RDR_IccPowerOff, //message type
91 0, 0, 0, 0, //length
92 slot,
93 seq,
94 0, 0, 0 //RFU
95 ];
96 }
97
98 function GetSlotStatusMessage(slot, seq)
99 {
100 return [
101 CCID_PC_to_RDR_GetSlotStatus, //message type
102 0, 0, 0, 0, //length
103 slot,
104 seq,
105 0, 0, 0 //RFU
106 ];
107 }
108
109 function XfrBlockMessage(slot, seq, apdu)
110 {
111 return [
112 CCID_PC_to_RDR_XfrBlock, //message type
113 apdu.length, 0, 0, 0, //length: only for < 0xFF
114 slot,
115 seq,
116 0, //BWI
117 0, 0 //level parameter
118 ].concat(apdu);
119
120 }
121
122 function startTest()
123 {
124 async.series([
125 function(callback) {
126 write(ccidInterface, new Buffer(IccPowerOnMessage(0, 1)), callback);
127 },
128 function(callback) {
129 read(ccidInterface, 10 + 17, callback);
130 },
131 function(callback) {
132 write(ccidInterface, new Buffer(IccPowerOffMessage(0, 2)), callback);
133 },
134 function(callback) {
135 read(ccidInterface, 10, callback);
136 },
137 function(callback) {
138 write(ccidInterface, new Buffer(GetSlotStatusMessage(0, 3)), callback);
139 },
140 function(callback) {
141 read(ccidInterface, 10, callback);
142 },
143 function(callback) {
144 write(ccidInterface, new Buffer(XfrBlockMessage(0, 4, [0x0, 0xFD, 0x0, 0x0, 0x0])), callback);
145 },
146 function(callback) {
147 read(ccidInterface, 10 + 2, callback);
148 }
149 ]);
150 }
151
152 var ccidDeviceAndInterface = getAndInitCcidDeviceAndInterface();
153 var ccidDevice = ccidDeviceAndInterface.ccidDevice
154 var ccidInterface = ccidDeviceAndInterface.ccidInterface;
155
156 console.log(sprintf("Connected to device 0x%04X/0x%04X - %s [%s]",
157 ccidDevice.deviceDescriptor.idVendor,
158 ccidDevice.deviceDescriptor.idProduct,
159 ccidDevice.deviceDescriptor.iProduct,
160 ccidDevice.deviceDescriptor.iManufacturer));
161
162 startTest();