-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathindex.js
1927 lines (1826 loc) · 71.9 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
'use strict'
let _ftdiAddon
try {
_ftdiAddon = require('bindings')('N-FTD2XX')
} catch (e) {
console.log(e)
}
const FTDI_DRIVER_LOADED = _ftdiAddon !== undefined
// Flags for FT_OpenEx
const FT_OPEN_BY_SERIAL_NUMBER = 0x00000001
const FT_OPEN_BY_DESCRIPTION = 0x00000002
const FT_OPEN_BY_LOCATION = 0x00000004
/**
* Status values for FTDI devices
* @enum {number}
*/
const FT_STATUS = {
/**
* Status OK
*/
FT_OK: 0,
/**
* The device handle is invalid
*/
FT_INVALID_HANDLE: 1,
/**
* Device not found
*/
FT_DEVICE_NOT_FOUND: 2,
/**
* Device is not open
*/
FT_DEVICE_NOT_OPENED: 3,
/**
* IO error
*/
FT_IO_ERROR: 4,
/**
* Insufficient resources
*/
FT_INSUFFICIENT_RESOURCES: 5,
/**
* A parameter was invalid
*/
FT_INVALID_PARAMETER: 6,
/**
* The requested baud rate is invalid
*/
FT_INVALID_BAUD_RATE: 7,
/**
* Device not opened for erase
*/
FT_DEVICE_NOT_OPENED_FOR_ERASE: 8,
/**
* Device not poened for write
*/
FT_DEVICE_NOT_OPENED_FOR_WRITE: 9,
/**
* Failed to write to device
*/
FT_FAILED_TO_WRITE_DEVICE: 10,
/**
* Failed to read the device EEPROM
*/
FT_EEPROM_READ_FAILED: 11,
/**
* Failed to write the device EEPROM
*/
FT_EEPROM_WRITE_FAILED: 12,
/**
* Failed to erase the device EEPROM
*/
FT_EEPROM_ERASE_FAILED: 13,
/**
* An EEPROM is not fitted to the device
*/
FT_EEPROM_NOT_PRESENT: 14,
/**
* Device EEPROM is blank
*/
FT_EEPROM_NOT_PROGRAMMED: 15,
/**
* Invalid arguments
*/
FT_INVALID_ARGS: 16,
/**
* An other error has occurred
*/
FT_OTHER_ERROR: 17
}
Object.freeze(FT_STATUS)
/**
* Device type identifiers for FT_GetDeviceInfoDetail and FT_GetDeviceInfo
* @enum {number}
*/
const FT_DEVICE = {
/**
* FT232B or FT245B device
*/
FT_DEVICE_BM: 0,
/**
* FT8U232AM or FT8U245AM device
*/
FT_DEVICE_AM: 1,
/**
* FT8U100AX device
*/
FT_DEVICE_100AX: 2,
/**
* Unknown device
*/
FT_DEVICE_UNKNOWN: 3,
/**
* FT2232 device
*/
FT_DEVICE_2232: 4,
/**
* FT232R or FT245R device
*/
FT_DEVICE_232R: 5,
/**
* FT2232H device
*/
FT_DEVICE_2232H: 6,
/**
* FT4232H device
*/
FT_DEVICE_4232H: 7,
/**
* FT232H device
*/
FT_DEVICE_232H: 8,
/**
* FT X-Series device
*/
FT_DEVICE_X_SERIES: 9,
/**
* FT4222 hi-speed device Mode 0 - 2 interfaces
*/
FT_DEVICE_4222H_0: 10,
/**
* FT4222 hi-speed device Mode 1 or 2 - 4 interfaces
*/
FT_DEVICE_4222H_1_2: 11,
/**
* FT4222 hi-speed device Mode 3 - 1 interface
*/
FT_DEVICE_4222H_3: 12,
/**
* OTP programmer board for the FT4222
*/
FT_DEVICE_4222_PROG: 13
}
Object.freeze(FT_STATUS)
/**
* Flags that provide information on the FTDI device state
* @enum {number}
*/
const FT_FLAGS = {
/**
* Indicates that the device is open
*/
FT_FLAGS_OPENED: 0x00000001,
/**
* Indicates that the device is enumerated as a hi-speed USB device
*/
FT_FLAGS_HISPEED: 0x00000002
}
Object.freeze(FT_FLAGS)
/**
* Permitted data bits for FTDI devices
* @enum {number}
*/
const FT_DATA_BITS = {
/**
* 8 data bits
*/
FT_BITS_8: 0x08,
/**
* 7 data bits
*/
FT_BITS_7: 0x07
}
Object.freeze(FT_FLAGS)
/**
* Permitted stop bits for FTDI devices
* @enum {number}
*/
const FT_STOP_BITS = {
/**
* 1 stop bit
*/
FT_STOP_BITS_1: 0x00,
/**
* 2 stop bits
*/
FT_STOP_BITS_2: 0x02
}
Object.freeze(FT_STOP_BITS)
/**
* Permitted parity values for FTDI devices
* @enum {number}
*/
const FT_PARITY = {
/**
* No parity
*/
FT_PARITY_NONE: 0x00,
/**
* Odd parity
*/
FT_PARITY_ODD: 0x01,
/**
* Even parity
*/
FT_PARITY_EVEN: 0x02,
/**
* Mark parity
*/
FT_PARITY_MARK: 0x03,
/**
* Space parity
*/
FT_PARITY_SPACE: 0x04
}
Object.freeze(FT_PARITY)
/**
* Permitted flow control values for FTDI devices
* @enum {number}
*/
const FT_FLOW_CONTROL = {
/**
* No flow control
*/
FT_FLOW_NONE: 0x0000,
/**
* RTS/CTS flow control
*/
FT_FLOW_RTS_CTS: 0x0100,
/**
* DTR/DSR flow control
*/
FT_FLOW_DTR_DSR: 0x0200,
/**
* Xon/Xoff flow control
*/
FT_FLOW_XON_XOFF: 0x0400
}
Object.freeze(FT_FLOW_CONTROL)
/**
* Purge buffer constant definitions
* @enum {number}
*/
const FT_PURGE = {
/**
* Purge Rx buffer
*/
FT_PURGE_RX: 0x01,
/**
* Purge Tx buffer
*/
FT_PURGE_TX: 0x02
}
Object.freeze(FT_PURGE)
/**
* Valid values for drive current options on FT2232H, FT4232H and FT232H devices
* @enum {number}
*/
const FT_DRIVE_CURRENT = {
/**
* 4mA drive current
*/
FT_DRIVE_CURRENT_4MA: 4,
/**
* 8mA drive current
*/
FT_DRIVE_CURRENT_8MA: 8,
/**
* 12mA drive current
*/
FT_DRIVE_CURRENT_12MA: 12,
/**
* 16mA drive current
*/
FT_DRIVE_CURRENT_16MA: 16
}
Object.freeze(FT_DRIVE_CURRENT)
/**
* Available functions for the FT232H CBUS pins. Controlled by FT232H EEPROM settings
* @enum {number}
*/
const FT_232H_CBUS_OPTIONS = {
/**
* FT232H CBUS EEPROM options - Tristate
*/
FT_CBUS_TRISTATE: 0x00,
/**
* FT232H CBUS EEPROM options - Rx LED
*/
FT_CBUS_RXLED: 0x01,
/**
* FT232H CBUS EEPROM options - Tx LED
*/
FT_CBUS_TXLED: 0x02,
/**
* FT232H CBUS EEPROM options - Tx and Rx LED
*/
FT_CBUS_TXRXLED: 0x03,
/**
* FT232H CBUS EEPROM options - Power Enable#
*/
FT_CBUS_PWREN: 0x04,
/**
* FT232H CBUS EEPROM options - Sleep
*/
FT_CBUS_SLEEP: 0x05,
/**
* FT232H CBUS EEPROM options - Drive pin to logic 0
*/
FT_CBUS_DRIVE_0: 0x06,
/**
* FT232H CBUS EEPROM options - Drive pin to logic 1
*/
FT_CBUS_DRIVE_1: 0x07,
/**
* FT232H CBUS EEPROM options - IO Mode
*/
FT_CBUS_IOMODE: 0x08,
/**
* FT232H CBUS EEPROM options - Tx Data Enable
*/
FT_CBUS_TXDEN: 0x09,
/**
* FT232H CBUS EEPROM options - 30MHz clock
*/
FT_CBUS_CLK30: 0x0A,
/**
* FT232H CBUS EEPROM options - 15MHz clock
*/
FT_CBUS_CLK15: 0x0B,
/**
* FT232H CBUS EEPROM options - 7.5MHz clock
*/
FT_CBUS_CLK7_5: 0x0C
}
Object.freeze(FT_232H_CBUS_OPTIONS)
/**
* Error states not supported by FTD2XX
* @enum {number}
*/
const FT_ERROR = {
FT_NO_ERROR: 0,
FT_INCORRECT_DEVICE: 1,
FT_INVALID_BITMODE: 2,
FT_BUFFER_SIZE: 3
}
Object.freeze(FT_232H_CBUS_OPTIONS)
/**
* Permitted bit mode values for FTDI devices. For use with SetBitMode
* @enum {number}
*/
const FT_BIT_MODES = {
/**
* Reset bit mode
*/
FT_BIT_MODE_RESET: 0x00,
/**
* Asynchronous bit-bang mode
*/
FT_BIT_MODE_ASYNC_BITBANG: 0x01,
/**
* MPSSE bit mode - only available on FT2232, FT2232H, FT4232H and FT232H
*/
FT_BIT_MODE_MPSSE: 0x02,
/**
* Synchronous bit-bang mode
*/
FT_BIT_MODE_SYNC_BITBANG: 0x04,
/**
* MCU host bus emulation mode - only available on FT2232, FT2232H, FT4232H and FT232H
*/
FT_BIT_MODE_MCU_HOST: 0x08,
/**
* Fast opto-isolated serial mode - only available on FT2232, FT2232H, FT4232H and FT232H
*/
FT_BIT_MODE_FAST_SERIAL: 0x10,
/**
* CBUS bit-bang mode - only available on FT232R and FT232H
*/
FT_BIT_MODE_CBUS_BITBANG: 0x20,
/**
* Single channel synchronous 245 FIFO mode - only available on FT2232H channel A and FT232H
*/
FT_BIT_MODE_SYNC_FIFO: 0x40
}
Object.freeze(FT_BIT_MODES)
/**
* Available functions for the FT232R CBUS pins. Controlled by FT232R EEPROM settings
* @enum {number}
*/
const FT_CBUS_OPTIONS = {
/**
* FT232R CBUS EEPROM options - Tx Data Enable
*/
FT_CBUS_TXDEN: 0x00,
/**
* FT232R CBUS EEPROM options - Power On
*/
FT_CBUS_PWRON: 0x01,
/**
* FT232R CBUS EEPROM options - Rx LED
*/
FT_CBUS_RXLED: 0x02,
/**
* FT232R CBUS EEPROM options - Tx LED
*/
FT_CBUS_TXLED: 0x03,
/**
* FT232R CBUS EEPROM options - Tx and Rx LED
*/
FT_CBUS_TXRXLED: 0x04,
/**
* FT232R CBUS EEPROM options - Sleep
*/
FT_CBUS_SLEEP: 0x05,
/**
* FT232R CBUS EEPROM options - 48MHz clock
*/
FT_CBUS_CLK48: 0x06,
/**
* FT232R CBUS EEPROM options - 24MHz clock
*/
FT_CBUS_CLK24: 0x07,
/**
* FT232R CBUS EEPROM options - 12MHz clock
*/
FT_CBUS_CLK12: 0x08,
/**
* FT232R CBUS EEPROM options - 6MHz clock
*/
FT_CBUS_CLK6: 0x09,
/**
* FT232R CBUS EEPROM options - IO mode
*/
FT_CBUS_IOMODE: 0x0A,
/**
* FT232R CBUS EEPROM options - Bit-bang write strobe
*/
FT_CBUS_BITBANG_WR: 0x0B,
/**
* FT232R CBUS EEPROM options - Bit-bang read strobe
*/
FT_CBUS_BITBANG_RD: 0x0C
}
Object.freeze(FT_CBUS_OPTIONS)
/**
* @typedef {object} FT_PROGRAM_DATA
* @property {number} signature1 Header - must be 0x0000000
* @property {number} signature2 Header - must be 0xffffffff
* @property {number} version Header - FT_PROGRAM_DATA version: 0 = original (FT232B), 1 = FT2232 extensions,
* 2 = FT232R extensions, 3 = FT2232H extensions, 4 = FT4232H extensions, 5 = FT232H extensions
* @property {number} vendorId
* @property {number} productId
* @property {string} manufacturer
* @property {string} manufacturerId
* @property {string} description
* @property {string} serialNumber
* @property {number} maxPower 0 < MaxPower <= 500
* @property {number} pnp 0 = disabled, 1 = enabled
* @property {boolean} selfPowered 0 = bus powered, 1 = self powered
* @property {boolean} remoteWakeup 0 = not capable, 1 = capable
* @property {boolean} pullDownEnableH non-zero if pull down enabled
* @property {boolean} serNumEnableH non-zero if serial number to be used
* @property {boolean} acSlowSlewH non-zero if AC pins have slow slew
* @property {boolean} acSchmittInputH non-zero if AC pins are Schmitt input
* @property {FT_DRIVE_CURRENT} acDriveCurrentH valid values are 4mA, 8mA, 12mA, 16mA
* @property {boolean} adSlowSlewH non-zero if AD pins have slow slew
* @property {boolean} adSchmittInputH non-zero if AD pins are Schmitt input
* @property {FT_DRIVE_CURRENT} adDriveCurrentH valid values are 4mA, 8mA, 12mA, 16mA
* @property {number} cbus0H Cbus Mux control
* @property {number} cbus1H Cbus Mux control
* @property {number} cbus2H Cbus Mux control
* @property {number} cbus3H Cbus Mux control
* @property {number} cbus4H Cbus Mux control
* @property {number} cbus5H Cbus Mux control
* @property {number} cbus6H Cbus Mux control
* @property {number} cbus7H Cbus Mux control
* @property {number} cbus8H Cbus Mux control
* @property {number} cbus9H Cbus Mux control
* @property {boolean} isFifoH non-zero if interface is 245 FIFO
* @property {boolean} isFifoTarH non-zero if interface is 245 FIFO CPU target
* @property {boolean} isFastSerH non-zero if interface is Fast serial
* @property {boolean} isFT1248H non-zero if interface is FT1248
* @property {boolean} ft1248CpolH FT1248 clock polarity - clock idle high (1) or clock idle low (0)
* @property {boolean} ft1248LsbH FT1248 data is LSB (1) or MSB (0)
* @property {boolean} ft1248FlowControlH FT1248 flow control enable
* @property {boolean} isVCPH if interface is to use VCP drivers
* @property {boolean} powerSaveEnableH non-zero if using ACBUS7 to save power for self-powered
*/
/**
* Common EEPROM elements for all devices. Inherited to specific device type EEPROMs
* @property {number} vendorId=0x0403 Vendor ID as supplied by the USB Implementers Forum
* @property {number} productId=0x6001 Product ID
* @property {string} manufacturer="FTDI" Manufacturer name string
* @property {string} manufacturerId="FT" Manufacturer name abbreviation to be used as a prefix for automatically
* generated serial numbers
* @property {string} description="USB-Serial Converter" Device description string
* @property {string} serialNumber="" Device serial number string
* @property {number} maxPower=0x0090 Maximum power the device needs
* @property {boolean} selfPowered=false Indicates if the device has its own power supply (self-powered) or
* gets power from the USB port (bus-powered)
* @property {boolean} remoteWakeup=false Determines if the device can wake the host PC from
* suspend by toggling the RI line
*/
class FT_EEPROM_DATA {
constructor () {
this.vendorId = 0x0403
this.productId = 0x6001
this.manufacturer = 'FTDI'
this.manufacturerId = 'FT'
this.description = 'USB-Serial Converter'
this.serialNumber = ''
this.maxPower = 0x0090
this.selfPowered = false
this.remoteWakeup = false
}
}
/**
* EEPROM structure specific to FT232H devices
* @property {boolean} pullDownEnable=false Determines if IOs are pulled down when the device is in suspend
* @property {boolean} serNumEnable=true Determines if the serial number is enabled
* @property {boolean} acSlowSlew=false Determines if AC pins have a slow slew rate
* @property {boolean} acSchmittInput=false Determines if the AC pins have a Schmitt input
* @property {FT_DRIVE_CURRENT} acDriveCurrent=FT_DRIVE_CURRENT.FT_DRIVE_CURRENT_4MA Determines the AC pins drive
* current in mA. Valid values are FT_DRIVE_CURRENT_4MA, FT_DRIVE_CURRENT_8MA, FT_DRIVE_CURRENT_12MA or
* FT_DRIVE_CURRENT_16MA
* @property {boolean} adSlowSlew=false Determines if AD pins have a slow slew rate
* @property {boolean} adSchmittInput=false Determines if the AD pins have a Schmitt input
* @property {FT_DRIVE_CURRENT} adDriveCurrent=FT_DRIVE_CURRENT.FT_DRIVE_CURRENT_4MA Determines the AD pins drive
* current in mA. Valid values are FT_DRIVE_CURRENT_4MA, FT_DRIVE_CURRENT_8MA, FT_DRIVE_CURRENT_12MA or
* FT_DRIVE_CURRENT_16MA
* @property {FT_232H_CBUS_OPTIONS} cbus0=FT_232H_CBUS_OPTIONS.FT_CBUS_TRISTATE Sets the function of the CBUS0 pin for
* FT232H devices. Valid values are FT_CBUS_TRISTATE, FT_CBUS_RXLED, FT_CBUS_TXLED, FT_CBUS_TXRXLED, FT_CBUS_PWREN,
* FT_CBUS_SLEEP, FT_CBUS_DRIVE_0, FT_CBUS_DRIVE_1, FT_CBUS_TXDEN, FT_CBUS_CLK30, FT_CBUS_CLK15, FT_CBUS_CLK7_5
* @property {FT_232H_CBUS_OPTIONS} cbus1=FT_232H_CBUS_OPTIONS.FT_CBUS_TRISTATE Sets the function of the CBUS1 pin for
* FT232H devices. Valid values are FT_CBUS_TRISTATE, FT_CBUS_RXLED, FT_CBUS_TXLED, FT_CBUS_TXRXLED, FT_CBUS_PWREN
* FT_CBUS_SLEEP, FT_CBUS_DRIVE_0, FT_CBUS_DRIVE_1, FT_CBUS_TXDEN, FT_CBUS_CLK30, FT_CBUS_CLK15, FT_CBUS_CLK7_5
* @property {FT_232H_CBUS_OPTIONS} cbus2=FT_232H_CBUS_OPTIONS.FT_CBUS_TRISTATE Sets the function of the CBUS2 pin for
* FT232H devices. Valid values are FT_CBUS_TRISTATE, FT_CBUS_RXLED, FT_CBUS_TXLED, FT_CBUS_TXRXLED, FT_CBUS_PWREN,
* FT_CBUS_SLEEP, FT_CBUS_DRIVE_0, FT_CBUS_DRIVE_1, FT_CBUS_TXDEN
* @property {FT_232H_CBUS_OPTIONS} cbus3=FT_232H_CBUS_OPTIONS.FT_CBUS_TRISTATE Sets the function of the CBUS3 pin for
* FT232H devices. Valid values are FT_CBUS_TRISTATE, FT_CBUS_RXLED, FT_CBUS_TXLED, FT_CBUS_TXRXLED, FT_CBUS_PWREN,
* FT_CBUS_SLEEP, FT_CBUS_DRIVE_0, FT_CBUS_DRIVE_1, FT_CBUS_TXDEN
* @property {FT_232H_CBUS_OPTIONS} cbus4=FT_232H_CBUS_OPTIONS.FT_CBUS_TRISTATE Sets the function of the CBUS4 pin for
* FT232H devices. Valid values are FT_CBUS_TRISTATE, FT_CBUS_RXLED, FT_CBUS_TXLED, FT_CBUS_TXRXLED, FT_CBUS_PWREN,
* FT_CBUS_SLEEP, FT_CBUS_DRIVE_0, FT_CBUS_DRIVE_1, FT_CBUS_TXDEN
* @property {FT_232H_CBUS_OPTIONS} cbus5=FT_232H_CBUS_OPTIONS.FT_CBUS_TRISTATE Sets the function of the CBUS5 pin for
* FT232H devices. Valid values are FT_CBUS_TRISTATE, FT_CBUS_RXLED, FT_CBUS_TXLED, FT_CBUS_TXRXLED, FT_CBUS_PWREN,
* FT_CBUS_SLEEP, FT_CBUS_DRIVE_0, FT_CBUS_DRIVE_1, FT_CBUS_IOMODE, FT_CBUS_TXDEN, FT_CBUS_CLK30, FT_CBUS_CLK15,
* FT_CBUS_CLK7_5
* @property {FT_232H_CBUS_OPTIONS} cbus6=FT_232H_CBUS_OPTIONS.FT_CBUS_TRISTATE Sets the function of the CBUS6 pin for
* FT232H devices. Valid values are FT_CBUS_TRISTATE, FT_CBUS_RXLED, FT_CBUS_TXLED, FT_CBUS_TXRXLED, FT_CBUS_PWREN,
* FT_CBUS_SLEEP, FT_CBUS_DRIVE_0, FT_CBUS_DRIVE_1, FT_CBUS_IOMODE, FT_CBUS_TXDEN, FT_CBUS_CLK30, FT_CBUS_CLK15,
* FT_CBUS_CLK7_5
* @property {FT_232H_CBUS_OPTIONS} cbus7=FT_232H_CBUS_OPTIONS.FT_CBUS_TRISTATE Sets the function of the CBUS7 pin for
* FT232H devices. Valid values are FT_CBUS_TRISTATE
* @property {FT_232H_CBUS_OPTIONS} cbus8=FT_232H_CBUS_OPTIONS.FT_CBUS_TRISTATE Sets the function of the CBUS8 pin for
* FT232H devices. Valid values are FT_CBUS_TRISTATE, FT_CBUS_RXLED, FT_CBUS_TXLED, FT_CBUS_TXRXLED, FT_CBUS_PWREN,
* FT_CBUS_SLEEP, FT_CBUS_DRIVE_0, FT_CBUS_DRIVE_1, FT_CBUS_IOMODE, FT_CBUS_TXDEN, FT_CBUS_CLK30, FT_CBUS_CLK15,
* FT_CBUS_CLK7_5
* @property {FT_232H_CBUS_OPTIONS} cbus9=FT_232H_CBUS_OPTIONS.FT_CBUS_TRISTATE Sets the function of the CBUS9 pin for
* FT232H devices. Valid values are FT_CBUS_TRISTATE, FT_CBUS_RXLED, FT_CBUS_TXLED, FT_CBUS_TXRXLED, FT_CBUS_PWREN,
* FT_CBUS_SLEEP, FT_CBUS_DRIVE_0, FT_CBUS_DRIVE_1, FT_CBUS_IOMODE, FT_CBUS_TXDEN, FT_CBUS_CLK30, FT_CBUS_CLK15,
* FT_CBUS_CLK7_5
* @property {boolean} isFifo=false Determines if the device is in FIFO mode
* @property {boolean} isFifoTar=false Determines if the device is in FIFO target mode
* @property {boolean} isFastSer=false Determines if the device is in fast serial mode
* @property {boolean} isFT1248=false Determines if the device is in FT1248 mode
* @property {boolean} ft1248Cpol=false Determines FT1248 mode clock polarity
* @property {boolean} ft1248Lsb=false Determines if data is ent MSB (0) or LSB (1) in FT1248 mode
* @property {boolean} ft1248FlowControl=false Determines if FT1248 mode uses flow control
* @property {boolean} isVCP=true Determines if the VCP driver is loaded
* @property {boolean} powerSaveEnable=false For self-powered designs, keeps the FT232H in low power state until
* ACBUS7 is high
*/
class FT232H_EEPROM_STRUCTURE extends FT_EEPROM_DATA {
constructor () {
super()
this.pullDownEnable = false
this.serNumEnable = true
this.acSlowSlew = false
this.acSchmittInput = false
this.acDriveCurrent = FT_DRIVE_CURRENT.FT_DRIVE_CURRENT_4MA
this.adSlowSlew = false
this.adSchmittInput = false
this.adDriveCurrent = FT_DRIVE_CURRENT.FT_DRIVE_CURRENT_4MA
this.cbus0 = FT_232H_CBUS_OPTIONS.FT_CBUS_TRISTATE
this.cbus1 = FT_232H_CBUS_OPTIONS.FT_CBUS_TRISTATE
this.cbus2 = FT_232H_CBUS_OPTIONS.FT_CBUS_TRISTATE
this.cbus3 = FT_232H_CBUS_OPTIONS.FT_CBUS_TRISTATE
this.cbus4 = FT_232H_CBUS_OPTIONS.FT_CBUS_TRISTATE
this.cbus5 = FT_232H_CBUS_OPTIONS.FT_CBUS_TRISTATE
this.cbus6 = FT_232H_CBUS_OPTIONS.FT_CBUS_TRISTATE
this.cbus7 = FT_232H_CBUS_OPTIONS.FT_CBUS_TRISTATE
this.cbus8 = FT_232H_CBUS_OPTIONS.FT_CBUS_TRISTATE
this.cbus9 = FT_232H_CBUS_OPTIONS.FT_CBUS_TRISTATE
this.isFifo = false
this.isFifoTar = false
this.isFastSer = false
this.isFT1248 = false
this.ft1248Cpol = false
this.ft1248Lsb = false
this.ft1248FlowControl = false
this.isVCP = true
this.powerSaveEnable = false
}
}
/**
* EEPROM class for FT232R and FT245R
* @property {boolean} useExtOsc=false Disables the FT232R internal clock source. If the device has external oscillator enabled it must have an external oscillator fitted to function
* @property {boolean} highDriveIOs=false Enables high current IOs
* @property {number} endpointSize=64 Sets the endpoint size. This should always be set to 64
* @property {boolean} pullDownEnable=false Determines if IOs are pulled down when the device is in suspend
* @property {boolean} serNumEnable=true Determines if the serial number is enabled
* @property {boolean} invertTXD=false Inverts the sense of the TXD line
* @property {boolean} invertRXD=false Inverts the sense of the RXD line
* @property {boolean} invertRTS=false Inverts the sense of the RTS line
* @property {boolean} invertCTS=false Inverts the sense of the CTS line
* @property {boolean} invertDTR=false Inverts the sense of the DTR line
* @property {boolean} invertDSR=false Inverts the sense of the DSR line
* @property {boolean} invertDCD=false Inverts the sense of the DCD line
* @property {boolean} invertRI=false Inverts the sense of the RI line
* @property {number} cbus0=FT_CBUS_OPTIONS.FT_CBUS_SLEEP Sets the function of the CBUS0 pin for FT232R devices.
* Valid values are FT_CBUS_TXDEN, FT_CBUS_PWRON , FT_CBUS_RXLED, FT_CBUS_TXLED,
* FT_CBUS_TXRXLED, FT_CBUS_SLEEP, FT_CBUS_CLK48, FT_CBUS_CLK24, FT_CBUS_CLK12,
* FT_CBUS_CLK6, FT_CBUS_IOMODE, FT_CBUS_BITBANG_WR, FT_CBUS_BITBANG_RD
* @property {number} cbus1=FT_CBUS_OPTIONS.FT_CBUS_SLEEP Sets the function of the CBUS1 pin for FT232R devices.
* Valid values are FT_CBUS_TXDEN, FT_CBUS_PWRON , FT_CBUS_RXLED, FT_CBUS_TXLED,
* FT_CBUS_TXRXLED, FT_CBUS_SLEEP, FT_CBUS_CLK48, FT_CBUS_CLK24, FT_CBUS_CLK12,
* FT_CBUS_CLK6, FT_CBUS_IOMODE, FT_CBUS_BITBANG_WR, FT_CBUS_BITBANG_RD
* @property {number} cbus2=FT_CBUS_OPTIONS.FT_CBUS_SLEEP Sets the function of the CBUS2 pin for FT232R devices.
* Valid values are FT_CBUS_TXDEN, FT_CBUS_PWRON , FT_CBUS_RXLED, FT_CBUS_TXLED,
* FT_CBUS_TXRXLED, FT_CBUS_SLEEP, FT_CBUS_CLK48, FT_CBUS_CLK24, FT_CBUS_CLK12,
* FT_CBUS_CLK6, FT_CBUS_IOMODE, FT_CBUS_BITBANG_WR, FT_CBUS_BITBANG_RD
* @property {number} cbus3=FT_CBUS_OPTIONS.FT_CBUS_SLEEP Sets the function of the CBUS3 pin for FT232R devices.
* Valid values are FT_CBUS_TXDEN, FT_CBUS_PWRON , FT_CBUS_RXLED, FT_CBUS_TXLED,
* FT_CBUS_TXRXLED, FT_CBUS_SLEEP, FT_CBUS_CLK48, FT_CBUS_CLK24, FT_CBUS_CLK12,
* FT_CBUS_CLK6, FT_CBUS_IOMODE, FT_CBUS_BITBANG_WR, FT_CBUS_BITBANG_RD
* @property {number} cbus4=FT_CBUS_OPTIONS.FT_CBUS_SLEEP Sets the function of the CBUS4 pin for FT232R devices.
* Valid values are FT_CBUS_TXDEN, FT_CBUS_PWRON , FT_CBUS_RXLED, FT_CBUS_TXLED,
* FT_CBUS_TXRXLED, FT_CBUS_SLEEP, FT_CBUS_CLK48, FT_CBUS_CLK24, FT_CBUS_CLK12,
* FT_CBUS_CLK6
* @property {boolean} rIsD2XX=false Determines if the VCP driver is loaded
*/
class FT232R_EEPROM_STRUCTURE extends FT_EEPROM_DATA {
constructor () {
super()
this.useExtOsc = false
this.highDriveIOs = false
this.endpointSize = 64
this.pullDownEnable = false
this.serNumEnable = true
this.invertTXD = false
this.invertRXD = false
this.invertRTS = false
this.invertCTS = false
this.invertDTR = false
this.invertDSR = false
this.invertDCD = false
this.invertRI = false
this.cbus0 = FT_CBUS_OPTIONS.FT_CBUS_SLEEP
this.cbus1 = FT_CBUS_OPTIONS.FT_CBUS_SLEEP
this.cbus2 = FT_CBUS_OPTIONS.FT_CBUS_SLEEP
this.cbus3 = FT_CBUS_OPTIONS.FT_CBUS_SLEEP
this.cbus4 = FT_CBUS_OPTIONS.FT_CBUS_SLEEP
this.rIsD2XX = false
}
}
class FtEeUtils {
/**
* @param {FT_PROGRAM_DATA} eeData
* @returns {FT232H_EEPROM_STRUCTURE}
*/
static createEe232h (eeData) {
const ee232h = new FT232H_EEPROM_STRUCTURE()
ee232h.manufacturer = eeData.manufacturer
ee232h.manufacturerId = eeData.manufacturerId
ee232h.description = eeData.description
ee232h.serialNumber = eeData.serialNumber
ee232h.vendorId = eeData.vendorId
ee232h.productId = eeData.productId
ee232h.maxPower = eeData.maxPower
ee232h.selfPowered = eeData.selfPowered
ee232h.remoteWakeup = eeData.remoteWakeup
ee232h.pullDownEnable = eeData.pullDownEnableH
ee232h.serNumEnable = eeData.serNumEnableH
ee232h.acSlowSlew = eeData.acSlowSlewH
ee232h.acSchmittInput = eeData.acSchmittInputH
ee232h.acDriveCurrent = eeData.acDriveCurrentH
ee232h.adSlowSlew = eeData.adSlowSlewH
ee232h.adSchmittInput = eeData.adSchmittInputH
ee232h.adDriveCurrent = eeData.adDriveCurrentH
ee232h.cbus0 = eeData.cbus0H
ee232h.cbus1 = eeData.cbus1H
ee232h.cbus2 = eeData.cbus2H
ee232h.cbus3 = eeData.cbus3H
ee232h.cbus4 = eeData.cbus4H
ee232h.cbus5 = eeData.cbus5H
ee232h.cbus6 = eeData.cbus6H
ee232h.cbus7 = eeData.cbus7H
ee232h.cbus8 = eeData.cbus8H
ee232h.cbus9 = eeData.cbus9H
ee232h.isFifo = eeData.isFifoH
ee232h.isFifoTar = eeData.isFifoTarH
ee232h.isFastSer = eeData.isFastSerH
ee232h.ft1248Cpol = eeData.ft1248CpolH
ee232h.ft1248Lsb = eeData.ft1248LsbH
ee232h.ft1248FlowControl = eeData.ft1248FlowControlH
ee232h.isVCP = eeData.isVCPH
ee232h.powerSaveEnable = eeData.powerSaveEnableH
return ee232h
}
/**
* @param {FT_PROGRAM_DATA} eeData
* @returns {FT232R_EEPROM_STRUCTURE}
*/
static createEe232r (eeData) {
const ee232r = new FT232R_EEPROM_STRUCTURE()
ee232r.manufacturer = eeData.manufacturer
ee232r.manufacturerId = eeData.manufacturerId
ee232r.description = eeData.description
ee232r.serialNumber = eeData.serialNumber
ee232r.vendorId = eeData.vendorId
ee232r.productId = eeData.productId
ee232r.maxPower = eeData.maxPower
ee232r.selfPowered = eeData.selfPowered
ee232r.remoteWakeup = eeData.remoteWakeup
ee232r.useExtOsc = eeData.useExtOsc
ee232r.highDriveIOs = eeData.highDriveIOs
ee232r.endpointSize = eeData.endpointSize
ee232r.pullDownEnable = eeData.pullDownEnableR
ee232r.serNumEnable = eeData.serNumEnableR
ee232r.invertTXD = eeData.invertTXD
ee232r.invertRXD = eeData.invertRXD
ee232r.invertRTS = eeData.invertRTS
ee232r.invertCTS = eeData.invertCTS
ee232r.invertDTR = eeData.invertDTR
ee232r.invertDSR = eeData.invertDSR
ee232r.invertDCD = eeData.invertDCD
ee232r.invertRI = eeData.invertRI
ee232r.cbus0 = eeData.cbus0
ee232r.cbus1 = eeData.cbus1
ee232r.cbus2 = eeData.cbus2
ee232r.cbus3 = eeData.cbus3
ee232r.cbus4 = eeData.cbus4
ee232r.rIsD2XX = eeData.rIsD2XX
return ee232r
}
/**
* @param {FT232H_EEPROM_STRUCTURE} ee232h
* @returns {FT_PROGRAM_DATA}
*/
static createEeDataFromEe232h (ee232h) {
/** * @type {FT_PROGRAM_DATA} */
const eeData = new _ftdiAddon.FT_PROGRAM_DATA()
eeData.signature1 = 0x00000000
eeData.signature2 = 0xFFFFFFFF
eeData.version = 5
eeData.manufacturer = ee232h.manufacturer.substr(0, 32)
eeData.manufacturerId = ee232h.manufacturerId.substr(0, 16)
eeData.description = ee232h.description.substr(0, 32)
eeData.serialNumber = ee232h.serialNumber.substr(0, 16)
eeData.vendorId = ee232h.vendorId
eeData.productId = ee232h.productId
eeData.maxPower = ee232h.maxPower
eeData.selfPowered = ee232h.selfPowered
eeData.remoteWakeup = ee232h.remoteWakeup
eeData.pullDownEnableH = ee232h.pullDownEnable
eeData.serNumEnableH = ee232h.serNumEnable
eeData.acSlowSlewH = ee232h.acSlowSlew
eeData.acSchmittInputH = ee232h.acSchmittInput
eeData.acDriveCurrentH = ee232h.acDriveCurrent
eeData.adSlowSlewH = ee232h.adSlowSlew
eeData.adSchmittInputH = ee232h.adSchmittInput
eeData.adDriveCurrentH = ee232h.adDriveCurrent
eeData.cbus0H = ee232h.cbus0
eeData.cbus1H = ee232h.cbus1
eeData.cbus2H = ee232h.cbus2
eeData.cbus3H = ee232h.cbus3
eeData.cbus4H = ee232h.cbus4
eeData.cbus5H = ee232h.cbus5
eeData.cbus6H = ee232h.cbus6
eeData.cbus7H = ee232h.cbus7
eeData.cbus8H = ee232h.cbus8
eeData.cbus9H = ee232h.cbus9
eeData.isFifoH = ee232h.isFifo
eeData.isFifoTarH = ee232h.isFifoTar
eeData.isFastSerH = ee232h.isFastSer
eeData.isFT1248H = ee232h.isFT1248
eeData.ft1248CpolH = ee232h.ft1248Cpol
eeData.ft1248LsbH = ee232h.ft1248Lsb
eeData.ft1248FlowControlH = ee232h.ft1248FlowControl
eeData.isVCPH = ee232h.isVCP
eeData.powerSaveEnableH = ee232h.powerSaveEnable
return eeData
}
/**
* @param {FT232R_EEPROM_STRUCTURE} ee232r
* @returns {FT_PROGRAM_DATA}
*/
static createEeDataFromEe232r (ee232r) {
/** * @type {FT_PROGRAM_DATA} */
const eeData = new _ftdiAddon.FT_PROGRAM_DATA()
eeData.signature1 = 0x00000000
eeData.signature2 = 0xFFFFFFFF
eeData.version = 2
eeData.manufacturer = ee232r.manufacturer.substr(0, 32)
eeData.manufacturerId = ee232r.manufacturerId.substr(0, 16)
eeData.description = ee232r.description.substr(0, 32)
eeData.serialNumber = ee232r.serialNumber.substr(0, 16)
eeData.vendorId = ee232r.vendorId
eeData.productId = ee232r.productId
eeData.maxPower = ee232r.maxPower
eeData.selfPowered = ee232r.selfPowered
eeData.remoteWakeup = ee232r.remoteWakeup
eeData.pullDownEnableR = ee232r.pullDownEnable
eeData.serNumEnableR = ee232r.serNumEnable
eeData.useExtOsc = ee232r.useExtOsc
eeData.highDriveIOs = ee232r.highDriveIOs
eeData.endpointSize = 64
eeData.invertTXD = ee232r.invertTXD
eeData.invertRXD = ee232r.invertRXD
eeData.invertRTS = ee232r.invertRTS
eeData.invertCTS = ee232r.invertCTS
eeData.invertDTR = ee232r.invertDTR
eeData.invertDSR = ee232r.invertDSR
eeData.invertDCD = ee232r.invertDCD
eeData.invertRI = ee232r.invertRI
eeData.cbus0 = ee232r.cbus0
eeData.cbus1 = ee232r.cbus1
eeData.cbus2 = ee232r.cbus2
eeData.cbus3 = ee232r.cbus3
eeData.cbus4 = ee232r.cbus4
eeData.rIsD2XX = ee232r.rIsD2XX
return eeData
}
}
class FtException extends Error {
}
/**
* Method to check ftStatus and ftErrorCondition values for error conditions and throw exceptions accordingly
* @param {FT_STATUS} ftStatus
* @param {FT_ERROR} ftErrorCondition
* @ignore
*/
function errorHandler (ftStatus, ftErrorCondition) {
if (ftStatus !== FT_STATUS.FT_OK) {
// Check FT_STATUS values returned from FTD2XX DLL calls
switch (ftStatus) {
case FT_STATUS.FT_DEVICE_NOT_FOUND:
throw new FtException('FTDI device not found')
case FT_STATUS.FT_DEVICE_NOT_OPENED:
throw new FtException('FTDI device not opened')
case FT_STATUS.FT_DEVICE_NOT_OPENED_FOR_ERASE:
throw new FtException('FTDI device not opened for erase')
case FT_STATUS.FT_DEVICE_NOT_OPENED_FOR_WRITE:
throw new FtException('FTDI device not opened for write')
case FT_STATUS.FT_EEPROM_ERASE_FAILED:
throw new FtException('Failed to erase FTDI device EEPROM')
case FT_STATUS.FT_EEPROM_NOT_PRESENT:
throw new FtException('No EEPROM fitted to FTDI device')
case FT_STATUS.FT_EEPROM_NOT_PROGRAMMED:
throw new FtException('FTDI device EEPROM not programmed')
case FT_STATUS.FT_EEPROM_READ_FAILED:
throw new FtException('Failed to read FTDI device EEPROM')
case FT_STATUS.FT_EEPROM_WRITE_FAILED:
throw new FtException('Failed to write FTDI device EEPROM')
case FT_STATUS.FT_FAILED_TO_WRITE_DEVICE:
throw new FtException('Failed to write to FTDI device')
case FT_STATUS.FT_INSUFFICIENT_RESOURCES:
throw new FtException('Insufficient resources')
case FT_STATUS.FT_INVALID_ARGS:
throw new FtException('Invalid arguments for FTD2XX function call')
case FT_STATUS.FT_INVALID_BAUD_RATE:
throw new FtException('Invalid Baud rate for FTDI device')
case FT_STATUS.FT_INVALID_HANDLE:
throw new FtException('Invalid handle for FTDI device')
case FT_STATUS.FT_INVALID_PARAMETER:
throw new FtException('Invalid parameter for FTD2XX function call')
case FT_STATUS.FT_IO_ERROR:
throw new FtException('FTDI device IO error')
case FT_STATUS.FT_OTHER_ERROR:
throw new FtException('An unexpected error has occurred when trying to communicate with the FTDI device')
}
} else if (ftErrorCondition !== FT_ERROR.FT_NO_ERROR) {
// Check for other error conditions not handled by FTD2XX DLL
switch (ftErrorCondition) {
case FT_ERROR.FT_INCORRECT_DEVICE:
throw new FtException('The current device type does not match the EEPROM structure')
case FT_ERROR.FT_INVALID_BITMODE:
throw new FtException('The requested bit mode is not valid for the current device')
case FT_ERROR.FT_BUFFER_SIZE:
throw new FtException('The supplied buffer is not big enough')
}
}
}
/**
* Class wrapper for FTD2XX.DLL
*/
class FTDI {
constructor () {
/**
* @type {object}
* @private
*/
this._ftHandle = null
}
_setUpFtdiDeviceSync () {
// Initialise port data characteristics
const wordLength = FT_DATA_BITS.FT_BITS_8
const stopBits = FT_STOP_BITS.FT_STOP_BITS_1
const parity = FT_PARITY.FT_PARITY_NONE
let ftStatus = _ftdiAddon.setDataCharacteristicsSync(this._ftHandle, wordLength, stopBits, parity)
if (ftStatus !== FT_STATUS.FT_OK) return ftStatus
const flowControl = FT_FLOW_CONTROL.FT_FLOW_NONE
const xon = 0x11
const xoff = 0x13
ftStatus = _ftdiAddon.setFlowControlSync(this._ftHandle, flowControl, xon, xoff)
if (ftStatus !== FT_STATUS.FT_OK) return ftStatus
// Initialise Baud rate
const baudRate = 9600
return _ftdiAddon.setBaudRateSync(this._ftHandle, baudRate)
}
async _setUpFtdiDevice () {
// Initialise port data characteristics
const wordLength = FT_DATA_BITS.FT_BITS_8
const stopBits = FT_STOP_BITS.FT_STOP_BITS_1
const parity = FT_PARITY.FT_PARITY_NONE
let ftStatus = await _ftdiAddon.setDataCharacteristics(this._ftHandle, wordLength, stopBits, parity)
if (ftStatus !== FT_STATUS.FT_OK) return ftStatus
const flowControl = FT_FLOW_CONTROL.FT_FLOW_NONE
const xon = 0x11
const xoff = 0x13
ftStatus = await _ftdiAddon.setFlowControl(this._ftHandle, flowControl, xon, xoff)
if (ftStatus !== FT_STATUS.FT_OK) return ftStatus
// Initialise Baud rate
const baudRate = 9600
return _ftdiAddon.setBaudRate(this._ftHandle, baudRate)
}
_openAndSetupSync (openFuncSync) {
let { ftStatus, ftHandle } = openFuncSync()
if (ftStatus === FT_STATUS.FT_OK && ftHandle) {
this._ftHandle = ftHandle
ftStatus = this._setUpFtdiDeviceSync()
} else {
this._ftHandle = null
}
return ftStatus
}
async _openAndSetup (openFunc) {
let { ftStatus, ftHandle } = await openFunc()
if (ftStatus === FT_STATUS.FT_OK && ftHandle) {
this._ftHandle = ftHandle
ftStatus = await this._setUpFtdiDevice()
} else {
this._ftHandle = null
}
return ftStatus