@johntalton/ftdi 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +89 -0
  3. package/lib/consts.d.ts +33 -0
  4. package/lib/consts.d.ts.map +1 -0
  5. package/lib/consts.js +42 -0
  6. package/lib/consts.js.map +1 -0
  7. package/lib/eeprom.d.ts +129 -0
  8. package/lib/eeprom.d.ts.map +1 -0
  9. package/lib/eeprom.js +495 -0
  10. package/lib/eeprom.js.map +1 -0
  11. package/lib/ft232h.d.ts +37 -0
  12. package/lib/ft232h.d.ts.map +1 -0
  13. package/lib/ft232h.js +204 -0
  14. package/lib/ft232h.js.map +1 -0
  15. package/lib/ftdi.d.ts +37 -0
  16. package/lib/ftdi.d.ts.map +1 -0
  17. package/lib/ftdi.js +204 -0
  18. package/lib/ftdi.js.map +1 -0
  19. package/lib/i2c/i2c-template.d.ts +10 -0
  20. package/lib/i2c/i2c-template.d.ts.map +1 -0
  21. package/lib/i2c/i2c-template.js +122 -0
  22. package/lib/i2c/i2c-template.js.map +1 -0
  23. package/lib/i2c/i2c.d.ts +29 -0
  24. package/lib/i2c/i2c.d.ts.map +1 -0
  25. package/lib/i2c/i2c.js +169 -0
  26. package/lib/i2c/i2c.js.map +1 -0
  27. package/lib/i2c/index.d.ts +5 -0
  28. package/lib/i2c/index.d.ts.map +1 -0
  29. package/lib/i2c/index.js +5 -0
  30. package/lib/i2c/index.js.map +1 -0
  31. package/lib/i2c/range.d.ts +2 -0
  32. package/lib/i2c/range.d.ts.map +1 -0
  33. package/lib/i2c/range.js +6 -0
  34. package/lib/i2c/range.js.map +1 -0
  35. package/lib/index.d.ts +9 -0
  36. package/lib/index.d.ts.map +1 -0
  37. package/lib/index.js +9 -0
  38. package/lib/index.js.map +1 -0
  39. package/lib/mpsse/clock.d.ts +16 -0
  40. package/lib/mpsse/clock.d.ts.map +1 -0
  41. package/lib/mpsse/clock.js +34 -0
  42. package/lib/mpsse/clock.js.map +1 -0
  43. package/lib/mpsse/command.d.ts +66 -0
  44. package/lib/mpsse/command.d.ts.map +1 -0
  45. package/lib/mpsse/command.js +89 -0
  46. package/lib/mpsse/command.js.map +1 -0
  47. package/lib/mpsse/index.d.ts +7 -0
  48. package/lib/mpsse/index.d.ts.map +1 -0
  49. package/lib/mpsse/index.js +7 -0
  50. package/lib/mpsse/index.js.map +1 -0
  51. package/lib/mpsse/mpsse-template.d.ts +19 -0
  52. package/lib/mpsse/mpsse-template.d.ts.map +1 -0
  53. package/lib/mpsse/mpsse-template.js +81 -0
  54. package/lib/mpsse/mpsse-template.js.map +1 -0
  55. package/lib/mpsse/mpsse.d.ts +18 -0
  56. package/lib/mpsse/mpsse.d.ts.map +1 -0
  57. package/lib/mpsse/mpsse.js +77 -0
  58. package/lib/mpsse/mpsse.js.map +1 -0
  59. package/lib/status.d.ts +39 -0
  60. package/lib/status.d.ts.map +1 -0
  61. package/lib/status.js +62 -0
  62. package/lib/status.js.map +1 -0
  63. package/lib/util.d.ts +26 -0
  64. package/lib/util.d.ts.map +1 -0
  65. package/lib/util.js +57 -0
  66. package/lib/util.js.map +1 -0
  67. package/package.json +38 -0
  68. package/src/consts.ts +57 -0
  69. package/src/eeprom.ts +663 -0
  70. package/src/ftdi.ts +215 -0
  71. package/src/i2c/i2c-template.ts +156 -0
  72. package/src/i2c/i2c.ts +210 -0
  73. package/src/i2c/index.ts +4 -0
  74. package/src/i2c/range.ts +6 -0
  75. package/src/index.ts +8 -0
  76. package/src/mpsse/clock.ts +36 -0
  77. package/src/mpsse/command.ts +113 -0
  78. package/src/mpsse/index.ts +6 -0
  79. package/src/mpsse/mpsse-template.ts +96 -0
  80. package/src/mpsse/mpsse.ts +95 -0
  81. package/src/status.ts +94 -0
  82. package/src/util.ts +72 -0
@@ -0,0 +1,81 @@
1
+ /** biome-ignore-all lint/style/useConsistentArrayType: <explanation> */
2
+ import { CLOCK_DIVISOR_COMMANDS, FT232H_ONLY_COMMANDS, H_COMMANDS, LOOPBACK_COMMANDS, PIN_STATE_COMMANDS } from './command.js';
3
+ export class MPSSETemplate {
4
+ static shiftOutByte(command, length, data) {
5
+ const lengthL = (length - 1) & 0x0F;
6
+ const lengthH = ((length - 1) & 0xF0) >> 8;
7
+ return [command, lengthL, lengthH, data];
8
+ }
9
+ static shiftInByte(command, length) {
10
+ const lengthL = (length - 1) & 0x0F;
11
+ const lengthH = ((length - 1) & 0xF0) >> 8;
12
+ return [command, lengthL, lengthH];
13
+ }
14
+ static shiftOutBits(command, length, data) {
15
+ return [command, length - 1, data];
16
+ }
17
+ static shiftInBits(command, length) {
18
+ return [command, length - 1];
19
+ }
20
+ static gpioSetHigh(pins, directions) {
21
+ return [
22
+ PIN_STATE_COMMANDS.SET_DATA_BITS_HIGH_BYTE,
23
+ pins,
24
+ directions
25
+ ];
26
+ }
27
+ static gpioSetLow(pins, directions) {
28
+ return [
29
+ PIN_STATE_COMMANDS.SET_DATA_BITS_LOW_BYTE,
30
+ pins,
31
+ directions
32
+ ];
33
+ }
34
+ static gpioGetHigh() {
35
+ return [PIN_STATE_COMMANDS.READ_DATA_BITS_HIGH_BYTE];
36
+ }
37
+ static gpioGetLow() {
38
+ return [PIN_STATE_COMMANDS.READ_DATA_BITS_LOW_BYTE];
39
+ }
40
+ static setClockDivisor(divider) {
41
+ const divisorL = divider & 0xFF;
42
+ const divisorH = (divider >> 8) & 0xFF;
43
+ return [
44
+ CLOCK_DIVISOR_COMMANDS.SET_CLK_DIVISOR,
45
+ divisorL,
46
+ divisorH
47
+ ];
48
+ }
49
+ static enableLoopback(enable = true) {
50
+ if (enable) {
51
+ return [LOOPBACK_COMMANDS.ENABLED];
52
+ }
53
+ return [LOOPBACK_COMMANDS.DISABLE];
54
+ }
55
+ static enableClockDivideBy5(enable = true) {
56
+ if (enable) {
57
+ return [H_COMMANDS.ENABLE_CLOCK_DIVIDE_BY_FIVE];
58
+ }
59
+ return [H_COMMANDS.DISABLE_CLOCK_DIVIDE_BY_FIVE];
60
+ }
61
+ static enableThreePhaseClocking(enable = true) {
62
+ if (enable) {
63
+ return [H_COMMANDS.ENABLE_THREE_PHASE_CLOCKING];
64
+ }
65
+ return [H_COMMANDS.DISABLE_THREE_PHASE_CLOCKING];
66
+ }
67
+ static enableAdaptiveClocking(enable = true) {
68
+ if (enable) {
69
+ return [H_COMMANDS.ENABLE_ADAPTIVE_CLOCKING];
70
+ }
71
+ return [H_COMMANDS.DISABLE_ADAPTIVE_CLOCKING];
72
+ }
73
+ static setDriveOnlyZero(pinsLow, pinsHigh) {
74
+ return [
75
+ FT232H_ONLY_COMMANDS.SET_IO_ONLY_DRIVE_LOW,
76
+ pinsLow,
77
+ pinsHigh
78
+ ];
79
+ }
80
+ }
81
+ //# sourceMappingURL=mpsse-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mpsse-template.js","sourceRoot":"","sources":["../../src/mpsse/mpsse-template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /** biome-ignore-all lint/style/useConsistentArrayType: <explanation> */
2
+ import type { FTDIDevice } from '../ftdi.ts';
3
+ export declare class MPSSE {
4
+ #private;
5
+ constructor(device: FTDIDevice);
6
+ executeCommands(commands: Array<number> | number): Promise<void>;
7
+ validateMPSSE(command?: number): Promise<boolean>;
8
+ setGpioHigh(pins: number, directions: number): Promise<void>;
9
+ setGpioLow(pins: number, directions: number): Promise<void>;
10
+ getGpioHigh(): Promise<void>;
11
+ getGpioLow(): Promise<void>;
12
+ setClockDivisor(divider: number): Promise<void>;
13
+ enableClockDivideBy5(enable?: boolean): Promise<void>;
14
+ enableThreePhaseClocking(enable?: boolean): Promise<void>;
15
+ enableAdaptiveClocking(enable?: boolean): Promise<void>;
16
+ setDriveOnlyZero(pinsLow: number, pinsHigh: number): Promise<void>;
17
+ }
18
+ //# sourceMappingURL=mpsse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mpsse.d.ts","sourceRoot":"","sources":["../../src/mpsse/mpsse.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAK5C,qBAAa,KAAK;;IAGjB,YAAY,MAAM,EAAE,UAAU,EAE7B;IAEK,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,GAAC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAInE;IAEK,aAAa,CAAC,OAAO,SAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAS3D;IAEK,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGjE;IAEK,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhE;IAEK,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAGjC;IAEK,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAGhC;IAGK,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGpD;IAOK,oBAAoB,CAAC,MAAM,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAGvD;IAEK,wBAAwB,CAAC,MAAM,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3D;IAQK,sBAAsB,CAAC,MAAM,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzD;IAQK,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGvE;CACD"}
@@ -0,0 +1,77 @@
1
+ import { Util } from '../util.js';
2
+ import { BAD_COMMAND, BAD_COMMAND_RESPONSE } from './command.js';
3
+ import { MPSSETemplate } from './mpsse-template.js';
4
+ export class MPSSE {
5
+ #device;
6
+ constructor(device) {
7
+ this.#device = device;
8
+ }
9
+ async executeCommands(commands) {
10
+ const cmdList = Array.isArray(commands) ? commands : [commands];
11
+ const flatCmdList = cmdList.flat();
12
+ await this.#device.sendData(Uint8Array.from(flatCmdList));
13
+ }
14
+ async validateMPSSE(command = BAD_COMMAND) {
15
+ await this.executeCommands(command);
16
+ const response = await Util.pollData(this.#device).catch(() => undefined);
17
+ if (response === undefined) {
18
+ return false;
19
+ }
20
+ const [first, second] = response;
21
+ if (first !== BAD_COMMAND_RESPONSE) {
22
+ return false;
23
+ }
24
+ if (second !== command) {
25
+ return false;
26
+ }
27
+ return true;
28
+ }
29
+ async setGpioHigh(pins, directions) {
30
+ const command = MPSSETemplate.gpioSetHigh(pins, directions);
31
+ return this.executeCommands(command);
32
+ }
33
+ async setGpioLow(pins, directions) {
34
+ const command = MPSSETemplate.gpioSetLow(pins, directions);
35
+ return this.executeCommands(command);
36
+ }
37
+ async getGpioHigh() {
38
+ const command = MPSSETemplate.gpioGetHigh();
39
+ return this.executeCommands(command);
40
+ }
41
+ async getGpioLow() {
42
+ const command = MPSSETemplate.gpioGetLow();
43
+ return this.executeCommands(command);
44
+ }
45
+ async setClockDivisor(divider) {
46
+ const command = MPSSETemplate.setClockDivisor(divider);
47
+ return this.executeCommands(command);
48
+ }
49
+ // async waitIOHigh(): Promise<void> {s
50
+ // async waitIOLow(): Promise<void> {
51
+ // }
52
+ async enableClockDivideBy5(enable = true) {
53
+ const command = MPSSETemplate.enableClockDivideBy5(enable);
54
+ return this.executeCommands(command);
55
+ }
56
+ async enableThreePhaseClocking(enable = true) {
57
+ const command = MPSSETemplate.enableThreePhaseClocking(enable);
58
+ return this.executeCommands(command);
59
+ }
60
+ // async clcokWaitIOHigh(): Promise<void> {
61
+ // }
62
+ // async clockWaitIOLow(): Promise<void> {
63
+ // }
64
+ async enableAdaptiveClocking(enable = true) {
65
+ const command = MPSSETemplate.enableAdaptiveClocking(enable);
66
+ return this.executeCommands(command);
67
+ }
68
+ // async clockBitsNoTransferOrUntilHigh(): Promise<void> {
69
+ // }
70
+ // async clockByteNoTransferOrUntilLow(): Promise<void> {
71
+ // }
72
+ async setDriveOnlyZero(pinsLow, pinsHigh) {
73
+ const command = MPSSETemplate.setDriveOnlyZero(pinsLow, pinsHigh);
74
+ return this.executeCommands(command);
75
+ }
76
+ }
77
+ //# sourceMappingURL=mpsse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mpsse.js","sourceRoot":"","sources":["../../src/mpsse/mpsse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ export declare const STATUS_PREFIX_LENGTH = 2;
2
+ export declare const MODEM_STATUS_CLEAR_TO_SEND = 16;
3
+ export declare const MODEM_STATUS_DATA_SET_READY = 32;
4
+ export declare const MODEM_STATUS_RING_INDICATOR = 64;
5
+ export declare const MODEM_STATUS_DATA_CARRIER_DETECT = 128;
6
+ export declare const LINE_STATUS_DATA_READY = 1;
7
+ export declare const LINE_STATUS_OVERRUN_ERROR = 2;
8
+ export declare const LINE_STATUS_PARITY_ERROR = 4;
9
+ export declare const LINE_STATUS_FRAMING_ERROR = 8;
10
+ export declare const LINE_STATUS_BREAK_INTERRUPT = 16;
11
+ export declare const LINE_STATUS_TX_HOLDING_EMPTY = 32;
12
+ export declare const LINE_STATUS_TX_EMPTY = 64;
13
+ export declare const LINE_STATUS_RECEIVER_ERROR = 128;
14
+ export interface DeviceModemStatus {
15
+ data: number;
16
+ isClearToSend: boolean;
17
+ isDataSetReady: boolean;
18
+ isRing: boolean;
19
+ isCarrierDetect: boolean;
20
+ }
21
+ export interface DeviceLineStatus {
22
+ data: number;
23
+ isDataReady: boolean;
24
+ isOverrunError: boolean;
25
+ isParityError: boolean;
26
+ isFramingError: boolean;
27
+ isInterrupt: boolean;
28
+ isTXHoldingEmpty: boolean;
29
+ isTXEmpty: boolean;
30
+ isReceiverError: boolean;
31
+ }
32
+ export interface DeviceStatusInfo {
33
+ modem: DeviceModemStatus;
34
+ line: DeviceLineStatus;
35
+ }
36
+ export declare class DeviceStatus {
37
+ static parse(data: BufferSource): DeviceStatusInfo | undefined;
38
+ }
39
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,oBAAoB,IAAI,CAAA;AAErC,eAAO,MAAM,0BAA0B,KAAO,CAAA;AAC9C,eAAO,MAAM,2BAA2B,KAAO,CAAA;AAC/C,eAAO,MAAM,2BAA2B,KAAO,CAAA;AAC/C,eAAO,MAAM,gCAAgC,MAAO,CAAA;AAGpD,eAAO,MAAM,sBAAsB,IAAO,CAAA;AAC1C,eAAO,MAAM,yBAAyB,IAAO,CAAA;AAC7C,eAAO,MAAM,wBAAwB,IAAO,CAAA;AAC5C,eAAO,MAAM,yBAAyB,IAAO,CAAA;AAC7C,eAAO,MAAM,2BAA2B,KAAO,CAAA;AAC/C,eAAO,MAAM,4BAA4B,KAAO,CAAA;AAChD,eAAO,MAAM,oBAAoB,KAAO,CAAA;AACxC,eAAO,MAAM,0BAA0B,MAAO,CAAA;AAG9C,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE,OAAO,CAAA;IACtB,cAAc,EAAE,OAAO,CAAA;IACvB,MAAM,EAAE,OAAO,CAAA;IACf,eAAe,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,OAAO,CAAA;IACpB,cAAc,EAAE,OAAO,CAAA;IACvB,aAAa,EAAE,OAAO,CAAA;IACtB,cAAc,EAAE,OAAO,CAAA;IACvB,WAAW,EAAE,OAAO,CAAA;IACpB,gBAAgB,EAAE,OAAO,CAAA;IACzB,SAAS,EAAE,OAAO,CAAA;IAClB,eAAe,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,WAAW,gBAAgB;IAChC,KAAK,EAAE,iBAAiB,CAAC;IACzB,IAAI,EAAE,gBAAgB,CAAA;CACtB;AAGD,qBAAa,YAAY;IACxB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,gBAAgB,GAAC,SAAS,CA8C3D;CACD"}
package/lib/status.js ADDED
@@ -0,0 +1,62 @@
1
+ export const STATUS_PREFIX_LENGTH = 2;
2
+ export const MODEM_STATUS_CLEAR_TO_SEND = 0x10;
3
+ export const MODEM_STATUS_DATA_SET_READY = 0x20;
4
+ export const MODEM_STATUS_RING_INDICATOR = 0x40;
5
+ export const MODEM_STATUS_DATA_CARRIER_DETECT = 0x80;
6
+ export const LINE_STATUS_DATA_READY = 0x01;
7
+ export const LINE_STATUS_OVERRUN_ERROR = 0x02;
8
+ export const LINE_STATUS_PARITY_ERROR = 0x04;
9
+ export const LINE_STATUS_FRAMING_ERROR = 0x08;
10
+ export const LINE_STATUS_BREAK_INTERRUPT = 0x10;
11
+ export const LINE_STATUS_TX_HOLDING_EMPTY = 0x20;
12
+ export const LINE_STATUS_TX_EMPTY = 0x40;
13
+ export const LINE_STATUS_RECEIVER_ERROR = 0x80;
14
+ export class DeviceStatus {
15
+ static parse(data) {
16
+ const u8 = ArrayBuffer.isView(data) ?
17
+ new Uint8Array(data.buffer, data.byteOffset, STATUS_PREFIX_LENGTH) :
18
+ new Uint16Array(data, 0, STATUS_PREFIX_LENGTH);
19
+ const [modemStatus, lineStatus] = u8;
20
+ if (modemStatus === undefined) {
21
+ return undefined;
22
+ }
23
+ if (lineStatus === undefined) {
24
+ return undefined;
25
+ }
26
+ //
27
+ const isClearToSend = (modemStatus & MODEM_STATUS_CLEAR_TO_SEND) !== 0;
28
+ const isDataSetReady = (modemStatus & MODEM_STATUS_DATA_SET_READY) !== 0;
29
+ const isRing = (modemStatus & MODEM_STATUS_RING_INDICATOR) !== 0;
30
+ const isCarrierDetect = (modemStatus & MODEM_STATUS_DATA_CARRIER_DETECT) !== 0;
31
+ //
32
+ const isDataReady = (lineStatus & LINE_STATUS_DATA_READY) !== 0;
33
+ const isOverrunError = (lineStatus & LINE_STATUS_OVERRUN_ERROR) !== 0;
34
+ const isParityError = (lineStatus & LINE_STATUS_PARITY_ERROR) !== 0;
35
+ const isFramingError = (lineStatus & LINE_STATUS_FRAMING_ERROR) !== 0;
36
+ const isInterrupt = (lineStatus & LINE_STATUS_BREAK_INTERRUPT) !== 0;
37
+ const isTXHoldingEmpty = (lineStatus & LINE_STATUS_TX_HOLDING_EMPTY) !== 0;
38
+ const isTXEmpty = (lineStatus & LINE_STATUS_TX_EMPTY) !== 0;
39
+ const isReceiverError = (lineStatus & LINE_STATUS_RECEIVER_ERROR) !== 0;
40
+ return {
41
+ modem: {
42
+ data: modemStatus,
43
+ isClearToSend,
44
+ isDataSetReady,
45
+ isRing,
46
+ isCarrierDetect,
47
+ },
48
+ line: {
49
+ data: lineStatus,
50
+ isDataReady,
51
+ isOverrunError,
52
+ isParityError,
53
+ isFramingError,
54
+ isInterrupt,
55
+ isTXHoldingEmpty,
56
+ isTXEmpty,
57
+ isReceiverError
58
+ }
59
+ };
60
+ }
61
+ }
62
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"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"}
package/lib/util.d.ts ADDED
@@ -0,0 +1,26 @@
1
+ /** biome-ignore-all lint/performance/noAwaitInLoops: <explanation> */
2
+ /** biome-ignore-all lint/style/useConsistentArrayType: <explanation> */
3
+ import type { FTDIDevice } from "./ftdi.ts";
4
+ export interface ChipInfo {
5
+ major: number;
6
+ minor: number;
7
+ name: string;
8
+ mpsse?: boolean;
9
+ cbus?: boolean;
10
+ driveZero?: boolean;
11
+ eepromSize?: number;
12
+ }
13
+ export declare const USB_MAJOR_TYPE_BM = 4;
14
+ export declare const USB_MAJOR_TYPE_2232C = 5;
15
+ export declare const USB_MAJOR_TYPE_R = 6;
16
+ export declare const USB_MAJOR_TYPE_2232H = 7;
17
+ export declare const USB_MAJOR_TYPE_4232H = 8;
18
+ export declare const USB_MAJOR_TYPE_232H = 9;
19
+ export declare const CHIP_INFO: Array<ChipInfo>;
20
+ export declare const DEFAULT_DATA_READ_SIZE = 64;
21
+ export declare const DEFAULT_MAX_POLL_ATTEMPTS = 5;
22
+ export declare class Util {
23
+ static chip(major: number, minor: number): ChipInfo | undefined;
24
+ static pollData(device: FTDIDevice, attempts?: number): Promise<Uint8Array<ArrayBuffer>>;
25
+ }
26
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,wEAAwE;AACxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAG3C,MAAM,WAAW,QAAQ;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IAEZ,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,SAAS,CAAC,EAAE,OAAO,CAAA;IAEnB,UAAU,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,eAAO,MAAM,iBAAiB,IAAI,CAAA;AAClC,eAAO,MAAM,oBAAoB,IAAI,CAAA;AACrC,eAAO,MAAM,gBAAgB,IAAI,CAAA;AACjC,eAAO,MAAM,oBAAoB,IAAI,CAAA;AACrC,eAAO,MAAM,oBAAoB,IAAI,CAAA;AACrC,eAAO,MAAM,mBAAmB,IAAI,CAAA;AAEpC,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,QAAQ,CAsBrC,CAAA;AAGD,eAAO,MAAM,sBAAsB,KAAK,CAAA;AACxC,eAAO,MAAM,yBAAyB,IAAI,CAAA;AAE1C,qBAAa,IAAI;IAChB,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAI9D;IAED,OAAa,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,SAA4B,GAAG,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAWhH;CACD"}
package/lib/util.js ADDED
@@ -0,0 +1,57 @@
1
+ import { STATUS_PREFIX_LENGTH } from "./status.js";
2
+ export const USB_MAJOR_TYPE_BM = 4;
3
+ export const USB_MAJOR_TYPE_2232C = 5;
4
+ export const USB_MAJOR_TYPE_R = 6;
5
+ export const USB_MAJOR_TYPE_2232H = 7;
6
+ export const USB_MAJOR_TYPE_4232H = 8;
7
+ export const USB_MAJOR_TYPE_232H = 9;
8
+ export const CHIP_INFO = [
9
+ // FT8U232AM FT8U245AM // AM Series 1st gen
10
+ // FT245BM FT232BL FT232BQ FT245BL // BM Series 2nd gen
11
+ // FT2232C FT2232D
12
+ // FT4222H // Hi-Speed Quad SPI/I2C Bridge
13
+ // FT600Q / FT601Q / FT602Q
14
+ { major: 0x02, minor: 0, name: 'FT232AM' }, // 1st gen
15
+ { major: 0x04, minor: 0, name: 'FT232BM', eepromSize: 64 }, // 2nd gen
16
+ { major: 0x05, minor: 0, name: 'FT2232C', mpsse: true },
17
+ { major: 0x06, minor: 0, name: 'FT232R', eepromSize: 64, cbus: true },
18
+ { major: 0x07, minor: 0, name: 'FT2232H', mpsse: true }, // Dual Channel UART/FIFO/MPSSE
19
+ { major: 0x08, minor: 0, name: 'FT4232H', mpsse: true }, // Quad Channel UART/FIFO/MPSSE
20
+ { major: 0x09, minor: 0, name: 'FT232H', eepromSize: 128, mpsse: true, driveZero: true, cbus: true }, // Single Channel UART/FIFO/MPSSE
21
+ { major: 0x10, minor: 0, name: 'FT-X', cbus: true },
22
+ { major: 0x20, minor: 0, name: 'FT2233HP' }, // Dual Channel Type-C + Power Delivery
23
+ { major: 0x28, minor: 0, name: 'FT2233HP' },
24
+ { major: 0x29, minor: 0, name: 'FT4233HP' }, // Quad Channel Type-C + Power Delivery
25
+ { major: 0x30, minor: 0, name: 'FT2232HP' }, // Dual Channel Type-C + Power Delivery
26
+ { major: 0x31, minor: 0, name: 'FT4232HP', mpsse: true }, // Quad Channel Type-C + Power Delivery
27
+ { major: 0x32, minor: 0, name: 'FT233HP' }, // Single Channel Type-C + Power Delivery
28
+ { major: 0x33, minor: 0, name: 'FT232HP' }, // Single Channel Type-C + Power Delivery
29
+ { major: 0x36, minor: 0, name: 'FT4232HA', mpsse: true }, // Automotive Grade Quad UART
30
+ ];
31
+ export const DEFAULT_DATA_READ_SIZE = 64;
32
+ export const DEFAULT_MAX_POLL_ATTEMPTS = 5;
33
+ export class Util {
34
+ static chip(major, minor) {
35
+ const info = CHIP_INFO.find(ci => ci.major === major && ci.minor === minor);
36
+ if (info === undefined) {
37
+ return undefined;
38
+ }
39
+ return info;
40
+ }
41
+ static async pollData(device, attempts = DEFAULT_MAX_POLL_ATTEMPTS) {
42
+ for (let i = 0; i < attempts; i += 1) {
43
+ const response = await device.readData(DEFAULT_DATA_READ_SIZE);
44
+ if (response.byteLength === STATUS_PREFIX_LENGTH) {
45
+ continue;
46
+ }
47
+ if (response === undefined) {
48
+ throw new Error('no response');
49
+ }
50
+ // const status = DeviceStatus.parse(response)
51
+ // console.log('attempts', i)
52
+ return new Uint8Array(response.buffer, STATUS_PREFIX_LENGTH);
53
+ }
54
+ throw new Error('no valid data acquired');
55
+ }
56
+ }
57
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@johntalton/ftdi",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "license": "MIT",
6
+ "exports": {
7
+ ".": "./lib/index.js",
8
+ "./i2c": "./lib/i2c/index.js",
9
+ "./mpsse": "./lib/mpsse/index.js",
10
+ "./eeprom": "./lib/eeprom.js"
11
+ },
12
+ "files": [
13
+ "lib/**/*.js",
14
+ "lib/**/*.js.map",
15
+ "lib/**/*.d.ts",
16
+ "lib/**/*.d.ts.map",
17
+ "src/**/*.ts"
18
+ ],
19
+ "repository": {
20
+ "url": "git+https://github.com/johntalton/ftdi.git"
21
+ },
22
+ "scripts": {
23
+ "build": "tsc -p .",
24
+ "build:watch": "tsc -p . -w",
25
+ "lint": "biome check",
26
+ "test": "node --test test/**/*.test.js",
27
+ "coverage": "c8 --src src --check-coverage --statements 95 --branches 95 --functions 95 --lines 95 -r lcovonly -r text node --test test/**/*.test.js"
28
+ },
29
+ "devDependencies": {
30
+ "@biomejs/biome": "^2.5.0",
31
+ "@types/w3c-web-usb": "^1.0.14",
32
+ "c8": "^12.0.0",
33
+ "typescript": "^7.0.2"
34
+ },
35
+ "dependencies": {
36
+ "@johntalton/and-other-delights": "^8.6.6"
37
+ }
38
+ }
package/src/consts.ts ADDED
@@ -0,0 +1,57 @@
1
+
2
+ export const DEFAULT_FT4232H_PRODUCT_ID = 0x60_11
3
+ export const DEFAULT_FT2232H_PRODUCT_ID = 0x60_10
4
+ export const DEFAULT_FT232H_PRODUCT_ID = 0x60_14
5
+ export const DEFAULT_FT232R_PRODUCT_ID = 0x60_01
6
+ export const DEFAULT_FTDI_VENDOR_ID = 0x04_03
7
+
8
+
9
+ //
10
+ export const _REQUESTS = {
11
+ RESET: 0,
12
+ SET_MODEM_CTRL: 1,
13
+ // SET_FLOW_CTRL: 2,
14
+ // SET_BAUDRATE: 3,
15
+ // SET_DATA: 4,
16
+ POLL_MODEM_STATUS: 0x05,
17
+ SET_EVENT_CHAR: 0x06,
18
+ SET_ERROR_CHAR: 0x07,
19
+ SET_LATENCY_TIMER: 0x09,
20
+ GET_LATENCY_TIMER: 0x0A,
21
+ SET_BITMODE: 0x0B,
22
+ READ_PINS: 0x0C,
23
+ READ_EEPROM: 0x90,
24
+ WRITE_EEPROM: 0x91,
25
+ // ERASE_EEPROM: 0x92,
26
+ } as const
27
+
28
+ export type RequestKeys = keyof typeof _REQUESTS
29
+ export type RequestType = typeof _REQUESTS[keyof typeof _REQUESTS]
30
+ export const REQUESTS: Record<RequestKeys, RequestType> = _REQUESTS
31
+
32
+
33
+ export type BitMode = number
34
+
35
+ // specified in 16bit-little-endian
36
+ export const BIT_MODE: Record<string, BitMode> = {
37
+ RESET: 0x00_00, // bitbang OFF / regular serial/FIFO
38
+ // BITBANG: 0x01, // async bitbang (classic)
39
+ MPSSE: 0x02_00, // MPSSE mode
40
+ // SYNCBB: 0x04, // synchronous bitbang
41
+ // MCU: 0x08, // MCU Host Bus Emulation
42
+ // OPTO: 0x10, // Opto-Isolated Serial Interface Mode
43
+ // CBUS: 0x20, // Bitbang on CBUS
44
+ // SYNCFF: 0x40, // Single Channel Synchronous FIFO mode,
45
+ // FT1284: 0x80, // FT1284
46
+ }
47
+
48
+ export const RESET_USB = {
49
+ RESET: 0,
50
+ RX: 1,
51
+ TX: 2
52
+ }
53
+
54
+ export interface ModemControl {
55
+ DataTerminalReady?: boolean
56
+ RequestToSend?: boolean
57
+ }