@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.
- package/LICENSE +21 -0
- package/README.md +89 -0
- package/lib/consts.d.ts +33 -0
- package/lib/consts.d.ts.map +1 -0
- package/lib/consts.js +42 -0
- package/lib/consts.js.map +1 -0
- package/lib/eeprom.d.ts +129 -0
- package/lib/eeprom.d.ts.map +1 -0
- package/lib/eeprom.js +495 -0
- package/lib/eeprom.js.map +1 -0
- package/lib/ft232h.d.ts +37 -0
- package/lib/ft232h.d.ts.map +1 -0
- package/lib/ft232h.js +204 -0
- package/lib/ft232h.js.map +1 -0
- package/lib/ftdi.d.ts +37 -0
- package/lib/ftdi.d.ts.map +1 -0
- package/lib/ftdi.js +204 -0
- package/lib/ftdi.js.map +1 -0
- package/lib/i2c/i2c-template.d.ts +10 -0
- package/lib/i2c/i2c-template.d.ts.map +1 -0
- package/lib/i2c/i2c-template.js +122 -0
- package/lib/i2c/i2c-template.js.map +1 -0
- package/lib/i2c/i2c.d.ts +29 -0
- package/lib/i2c/i2c.d.ts.map +1 -0
- package/lib/i2c/i2c.js +169 -0
- package/lib/i2c/i2c.js.map +1 -0
- package/lib/i2c/index.d.ts +5 -0
- package/lib/i2c/index.d.ts.map +1 -0
- package/lib/i2c/index.js +5 -0
- package/lib/i2c/index.js.map +1 -0
- package/lib/i2c/range.d.ts +2 -0
- package/lib/i2c/range.d.ts.map +1 -0
- package/lib/i2c/range.js +6 -0
- package/lib/i2c/range.js.map +1 -0
- package/lib/index.d.ts +9 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +9 -0
- package/lib/index.js.map +1 -0
- package/lib/mpsse/clock.d.ts +16 -0
- package/lib/mpsse/clock.d.ts.map +1 -0
- package/lib/mpsse/clock.js +34 -0
- package/lib/mpsse/clock.js.map +1 -0
- package/lib/mpsse/command.d.ts +66 -0
- package/lib/mpsse/command.d.ts.map +1 -0
- package/lib/mpsse/command.js +89 -0
- package/lib/mpsse/command.js.map +1 -0
- package/lib/mpsse/index.d.ts +7 -0
- package/lib/mpsse/index.d.ts.map +1 -0
- package/lib/mpsse/index.js +7 -0
- package/lib/mpsse/index.js.map +1 -0
- package/lib/mpsse/mpsse-template.d.ts +19 -0
- package/lib/mpsse/mpsse-template.d.ts.map +1 -0
- package/lib/mpsse/mpsse-template.js +81 -0
- package/lib/mpsse/mpsse-template.js.map +1 -0
- package/lib/mpsse/mpsse.d.ts +18 -0
- package/lib/mpsse/mpsse.d.ts.map +1 -0
- package/lib/mpsse/mpsse.js +77 -0
- package/lib/mpsse/mpsse.js.map +1 -0
- package/lib/status.d.ts +39 -0
- package/lib/status.d.ts.map +1 -0
- package/lib/status.js +62 -0
- package/lib/status.js.map +1 -0
- package/lib/util.d.ts +26 -0
- package/lib/util.d.ts.map +1 -0
- package/lib/util.js +57 -0
- package/lib/util.js.map +1 -0
- package/package.json +38 -0
- package/src/consts.ts +57 -0
- package/src/eeprom.ts +663 -0
- package/src/ftdi.ts +215 -0
- package/src/i2c/i2c-template.ts +156 -0
- package/src/i2c/i2c.ts +210 -0
- package/src/i2c/index.ts +4 -0
- package/src/i2c/range.ts +6 -0
- package/src/index.ts +8 -0
- package/src/mpsse/clock.ts +36 -0
- package/src/mpsse/command.ts +113 -0
- package/src/mpsse/index.ts +6 -0
- package/src/mpsse/mpsse-template.ts +96 -0
- package/src/mpsse/mpsse.ts +95 -0
- package/src/status.ts +94 -0
- 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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"}
|
package/lib/status.d.ts
ADDED
|
@@ -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
|
package/lib/util.js.map
ADDED
|
@@ -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
|
+
}
|