@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
package/lib/i2c/i2c.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** biome-ignore-all lint/style/noNestedTernary: preserve const assign */
|
|
2
|
+
/** biome-ignore-all lint/performance/noAwaitInLoops: simplify impl */
|
|
3
|
+
/** biome-ignore-all lint/style/useConsistentArrayType: <explanation> */
|
|
4
|
+
import type { I2CAddress, I2CBufferSource, I2CBus, I2CCommand, I2CReadResult, I2CWriteResult } from '@johntalton/and-other-delights';
|
|
5
|
+
import type { FTDIDevice } from '../ftdi.ts';
|
|
6
|
+
export declare function checkAck(data: Uint8Array<ArrayBuffer>): boolean;
|
|
7
|
+
export declare function sendAndReadACK(device: FTDIDevice, transaction: Uint8Array<ArrayBuffer>): Promise<boolean>;
|
|
8
|
+
export declare function readData(device: FTDIDevice, length: number, targetBuffer?: I2CBufferSource): Promise<I2CBufferSource>;
|
|
9
|
+
export declare function writeData(device: FTDIDevice, length: number, buffer: I2CBufferSource): Promise<void>;
|
|
10
|
+
export interface FT232HBusOptions {
|
|
11
|
+
enableClockDivideBy5?: boolean;
|
|
12
|
+
targetClockHz?: number;
|
|
13
|
+
}
|
|
14
|
+
export declare class FT232HBus implements I2CBus {
|
|
15
|
+
#private;
|
|
16
|
+
readonly name = "FT232H";
|
|
17
|
+
readonly supportsScan = true;
|
|
18
|
+
readonly supportsMultiByteDataAddress = false;
|
|
19
|
+
static init(device: FTDIDevice, options?: FT232HBusOptions): Promise<void>;
|
|
20
|
+
constructor(device: FTDIDevice);
|
|
21
|
+
close(): void;
|
|
22
|
+
scan(): Promise<I2CAddress[]>;
|
|
23
|
+
sendByte(_address: I2CAddress, _byteValue: number): Promise<void>;
|
|
24
|
+
readI2cBlock(address: I2CAddress, cmd: I2CCommand, length: number, targetBuffer?: I2CBufferSource): Promise<I2CReadResult>;
|
|
25
|
+
writeI2cBlock(address: I2CAddress, cmd: I2CCommand, length: number, buffer: I2CBufferSource): Promise<I2CWriteResult>;
|
|
26
|
+
i2cRead(address: I2CAddress, length: number, targetBuffer?: I2CBufferSource): Promise<I2CReadResult>;
|
|
27
|
+
i2cWrite(address: I2CAddress, length: number, buffer: I2CBufferSource): Promise<I2CWriteResult>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=i2c.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i2c.d.ts","sourceRoot":"","sources":["../../src/i2c/i2c.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,sEAAsE;AACtE,wEAAwE;AACxE,OAAO,KAAK,EACX,UAAU,EACV,eAAe,EACf,MAAM,EACN,UAAU,EACV,aAAa,EACb,cAAc,EACd,MAAM,gCAAgC,CAAA;AACvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAO5C,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,OAAO,CAS/D;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAI/G;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAwB3H;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAY1G;AAED,MAAM,WAAW,gBAAgB;IAChC,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,qBAAa,SAAU,YAAW,MAAM;;IACvC,QAAQ,CAAC,IAAI,YAAW;IACxB,QAAQ,CAAC,YAAY,QAAO;IAC5B,QAAQ,CAAC,4BAA4B,SAAQ;IAI7C,OAAa,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ/E;IAED,YAAY,MAAM,EAAE,UAAU,EAE7B;IAGD,KAAK,IAAI,IAAI,CAEZ;IAEK,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAelC;IAGK,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtE;IAEK,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,CAuB/H;IAEK,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAqB1H;IAEK,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,CAezG;IAEK,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAepG;CACD"}
|
package/lib/i2c/i2c.js
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { CLOCK_DEFAULT_STANDARD_MODE_100_kHz } from '../mpsse/clock.js';
|
|
2
|
+
import { DeviceStatus } from '../status.js';
|
|
3
|
+
import { DEFAULT_DATA_READ_SIZE, Util } from '../util.js';
|
|
4
|
+
import { I2CTemplate } from './i2c-template.js';
|
|
5
|
+
import { range } from './range.js';
|
|
6
|
+
export function checkAck(data) {
|
|
7
|
+
if (data.byteLength !== 1) {
|
|
8
|
+
console.log('more ack', data);
|
|
9
|
+
// throw new Error('not just an ack')
|
|
10
|
+
}
|
|
11
|
+
const [byte] = data;
|
|
12
|
+
if (byte === undefined) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
return (byte & 0b0000_0001) === 0;
|
|
16
|
+
}
|
|
17
|
+
export async function sendAndReadACK(device, transaction) {
|
|
18
|
+
await device.sendData(transaction);
|
|
19
|
+
const response = await Util.pollData(device);
|
|
20
|
+
return checkAck(response);
|
|
21
|
+
}
|
|
22
|
+
export async function readData(device, length, targetBuffer) {
|
|
23
|
+
const buffer = (targetBuffer === undefined) ?
|
|
24
|
+
new Uint8Array(length) :
|
|
25
|
+
(ArrayBuffer.isView(targetBuffer) ?
|
|
26
|
+
new Uint8Array(targetBuffer.buffer, targetBuffer.byteOffset, length) :
|
|
27
|
+
new Uint8Array(targetBuffer, 0, length));
|
|
28
|
+
// c0 low - RX-LED-emulation
|
|
29
|
+
// await device.mpsse.setGpioHigh(0b0000_0000, 0b0000_0001)
|
|
30
|
+
for (let offset = 0; offset < length; offset += 1) {
|
|
31
|
+
const ack = offset + 1 < length; // is last byte
|
|
32
|
+
const readByteTransaction = I2CTemplate.readData(ack);
|
|
33
|
+
await device.sendData(readByteTransaction);
|
|
34
|
+
const byteReadResponse = await Util.pollData(device);
|
|
35
|
+
buffer.set(new Uint8Array(byteReadResponse.buffer, byteReadResponse.byteOffset, 1), offset);
|
|
36
|
+
}
|
|
37
|
+
// c0 high - RX-LED-emulation
|
|
38
|
+
// await device.mpsse.setGpioHigh(0b0000_0001, 0b0000_0001)
|
|
39
|
+
return buffer;
|
|
40
|
+
}
|
|
41
|
+
export async function writeData(device, length, buffer) {
|
|
42
|
+
const u8 = ArrayBuffer.isView(buffer) ?
|
|
43
|
+
new Uint8Array(buffer.buffer, buffer.byteOffset, length) :
|
|
44
|
+
new Uint8Array(buffer, 0, length);
|
|
45
|
+
for (let i = 0; i < length; i += 1) {
|
|
46
|
+
const data = u8[i];
|
|
47
|
+
if (data === undefined) {
|
|
48
|
+
throw new Error('data byte undefined');
|
|
49
|
+
}
|
|
50
|
+
const writeAck = await sendAndReadACK(device, I2CTemplate.writeByte(data));
|
|
51
|
+
if (!writeAck) {
|
|
52
|
+
throw new Error('write data nack');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export class FT232HBus {
|
|
57
|
+
name = 'FT232H';
|
|
58
|
+
supportsScan = true;
|
|
59
|
+
supportsMultiByteDataAddress = false;
|
|
60
|
+
#device;
|
|
61
|
+
static async init(device, options) {
|
|
62
|
+
const transaction = I2CTemplate.initI2C(options?.targetClockHz ?? CLOCK_DEFAULT_STANDARD_MODE_100_kHz, options?.enableClockDivideBy5 ?? false);
|
|
63
|
+
await device.sendData(transaction);
|
|
64
|
+
// todo this is direct read, not pollData
|
|
65
|
+
const result = await device.readData(DEFAULT_DATA_READ_SIZE);
|
|
66
|
+
const status = DeviceStatus.parse(result);
|
|
67
|
+
console.log('init status', status);
|
|
68
|
+
}
|
|
69
|
+
constructor(device) {
|
|
70
|
+
this.#device = device;
|
|
71
|
+
}
|
|
72
|
+
// biome-ignore lint/nursery/useThisInClassMethods: close is a noop
|
|
73
|
+
close() {
|
|
74
|
+
// noop
|
|
75
|
+
}
|
|
76
|
+
async scan() {
|
|
77
|
+
const result = [];
|
|
78
|
+
const I2C_RANGE_START = 0x08;
|
|
79
|
+
const I2C_RANGE_END = 0x77;
|
|
80
|
+
for (const addr of range(I2C_RANGE_START, I2C_RANGE_END)) {
|
|
81
|
+
//
|
|
82
|
+
const startAck = await sendAndReadACK(this.#device, I2CTemplate.startWithAddress(addr, true));
|
|
83
|
+
if (startAck) {
|
|
84
|
+
result.push(addr);
|
|
85
|
+
}
|
|
86
|
+
// todo reset or send stop?
|
|
87
|
+
}
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
// biome-ignore lint/nursery/useThisInClassMethods: no impl
|
|
91
|
+
async sendByte(_address, _byteValue) {
|
|
92
|
+
throw new Error('Method not implemented.');
|
|
93
|
+
}
|
|
94
|
+
async readI2cBlock(address, cmd, length, targetBuffer) {
|
|
95
|
+
//
|
|
96
|
+
const startAck = await sendAndReadACK(this.#device, I2CTemplate.startWithAddress(address, true));
|
|
97
|
+
if (!startAck) {
|
|
98
|
+
throw new Error('start with address nack');
|
|
99
|
+
}
|
|
100
|
+
//
|
|
101
|
+
const cmdBuffer = Uint8Array.from(Array.isArray(cmd) ? cmd : [cmd]);
|
|
102
|
+
await writeData(this.#device, cmdBuffer.byteLength, cmdBuffer);
|
|
103
|
+
//
|
|
104
|
+
const repeatStartAck = await sendAndReadACK(this.#device, I2CTemplate.repeatStartWithAddress(address));
|
|
105
|
+
if (!repeatStartAck) {
|
|
106
|
+
throw new Error('repeat start nack');
|
|
107
|
+
}
|
|
108
|
+
//
|
|
109
|
+
const buffer = await readData(this.#device, length, targetBuffer);
|
|
110
|
+
//
|
|
111
|
+
await this.#device.sendData(I2CTemplate.stop());
|
|
112
|
+
return {
|
|
113
|
+
bytesRead: length,
|
|
114
|
+
buffer
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
async writeI2cBlock(address, cmd, length, buffer) {
|
|
118
|
+
if (Array.isArray(cmd)) {
|
|
119
|
+
throw new Error('single command byte only');
|
|
120
|
+
}
|
|
121
|
+
//
|
|
122
|
+
const startAck = await sendAndReadACK(this.#device, I2CTemplate.startWithAddress(address, true));
|
|
123
|
+
if (!startAck) {
|
|
124
|
+
throw new Error('start with address nack');
|
|
125
|
+
}
|
|
126
|
+
//
|
|
127
|
+
const cmdBuffer = Uint8Array.from(Array.isArray(cmd) ? cmd : [cmd]);
|
|
128
|
+
await writeData(this.#device, cmdBuffer.byteLength, cmdBuffer);
|
|
129
|
+
//
|
|
130
|
+
await writeData(this.#device, length, buffer);
|
|
131
|
+
//
|
|
132
|
+
await this.#device.sendData(I2CTemplate.stop());
|
|
133
|
+
return {
|
|
134
|
+
bytesWritten: length,
|
|
135
|
+
buffer
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
async i2cRead(address, length, targetBuffer) {
|
|
139
|
+
//
|
|
140
|
+
const startAck = await sendAndReadACK(this.#device, I2CTemplate.startWithAddress(address));
|
|
141
|
+
if (!startAck) {
|
|
142
|
+
throw new Error('start with address nack');
|
|
143
|
+
}
|
|
144
|
+
//
|
|
145
|
+
const buffer = await readData(this.#device, length, targetBuffer);
|
|
146
|
+
//
|
|
147
|
+
await this.#device.sendData(I2CTemplate.stop());
|
|
148
|
+
return {
|
|
149
|
+
bytesRead: length,
|
|
150
|
+
buffer
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
async i2cWrite(address, length, buffer) {
|
|
154
|
+
//
|
|
155
|
+
const startAck = await sendAndReadACK(this.#device, I2CTemplate.startWithAddress(address, true));
|
|
156
|
+
if (!startAck) {
|
|
157
|
+
throw new Error('start with address nack');
|
|
158
|
+
}
|
|
159
|
+
//
|
|
160
|
+
await writeData(this.#device, length, buffer);
|
|
161
|
+
//
|
|
162
|
+
await this.#device.sendData(I2CTemplate.stop());
|
|
163
|
+
return {
|
|
164
|
+
bytesWritten: length,
|
|
165
|
+
buffer
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=i2c.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i2c.js","sourceRoot":"","sources":["../../src/i2c/i2c.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/i2c/index.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,8DAA8D;AAC9D,cAAc,UAAU,CAAA;AACxB,cAAc,mBAAmB,CAAA"}
|
package/lib/i2c/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/i2c/index.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,8DAA8D;AAC9D,cAAc,UAAU,CAAA;AACxB,cAAc,mBAAmB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"range.d.ts","sourceRoot":"","sources":["../../src/i2c/range.ts"],"names":[],"mappings":"AACA,wBAAiB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,SAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAI9E"}
|
package/lib/i2c/range.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"range.js","sourceRoot":"","sources":["../../src/i2c/range.ts"],"names":[],"mappings":"AACA,MAAM,SAAS,CAAC,CAAC,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,IAAI,GAAG,CAAC;IAC1D,KAAI,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;QACxC,MAAM,CAAC,CAAA;IACR,CAAC;AACF,CAAC"}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** biome-ignore-all lint/performance/noBarrelFile: barrel */
|
|
2
|
+
/** biome-ignore-all lint/performance/noReExportAll: barrel */
|
|
3
|
+
export * from './consts.ts';
|
|
4
|
+
export * from './eeprom.ts';
|
|
5
|
+
export * from './ftdi.ts';
|
|
6
|
+
export * from './mpsse/index.ts';
|
|
7
|
+
export * from './status.ts';
|
|
8
|
+
export * from './util.ts';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,8DAA8D;AAC9D,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,kBAAkB,CAAA;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** biome-ignore-all lint/performance/noBarrelFile: barrel */
|
|
2
|
+
/** biome-ignore-all lint/performance/noReExportAll: barrel */
|
|
3
|
+
export * from './consts.js';
|
|
4
|
+
export * from './eeprom.js';
|
|
5
|
+
export * from './ftdi.js';
|
|
6
|
+
export * from './mpsse/index.js';
|
|
7
|
+
export * from './status.js';
|
|
8
|
+
export * from './util.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,8DAA8D;AAC9D,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,kBAAkB,CAAA;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const CLOCK_BASE_12 = 12000000;
|
|
2
|
+
export declare const CLOCK_BASE_60 = 60000000;
|
|
3
|
+
export declare const DIVISOR_MIN = 0;
|
|
4
|
+
export declare const DIVISOR_MAX = 65535;
|
|
5
|
+
export declare const CLOCK_DEFAULT_STANDARD_MODE_100_kHz: number;
|
|
6
|
+
export declare const CLOCK_DEFAULT_FAST_MODE_400_kHz: number;
|
|
7
|
+
export declare const CLOCK_DEFAULT_FAST_MODE_PLUS_1_MHz: number;
|
|
8
|
+
export declare const CLOCK_DEFAULT_HIGH_SPEED_MODE_3_4_MHz: number;
|
|
9
|
+
export declare const CLOCK_DEFAULT_ULTRA_FAST_MODE_5_MHz: number;
|
|
10
|
+
export type ClockBase = typeof CLOCK_BASE_12 | typeof CLOCK_BASE_60;
|
|
11
|
+
export declare class Clock {
|
|
12
|
+
static clockHz(divisor: number, base: ClockBase): number;
|
|
13
|
+
static clockDivisor(hertz: number, base: ClockBase): number;
|
|
14
|
+
static hertzToHuman(hertz: number): string;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=clock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clock.d.ts","sourceRoot":"","sources":["../../src/mpsse/clock.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,aAAa,WAAa,CAAA;AACvC,eAAO,MAAM,aAAa,WAAa,CAAA;AAEvC,eAAO,MAAM,WAAW,IAAI,CAAA;AAC5B,eAAO,MAAM,WAAW,QAAU,CAAA;AAGlC,eAAO,MAAM,mCAAmC,QAAa,CAAA;AAC7D,eAAO,MAAM,+BAA+B,QAAa,CAAA;AACzD,eAAO,MAAM,kCAAkC,QAAkB,CAAA;AACjE,eAAO,MAAM,qCAAqC,QAAoB,CAAA;AACtE,eAAO,MAAM,mCAAmC,QAAkB,CAAA;AAGlE,MAAM,MAAM,SAAS,GAAG,OAAO,aAAa,GAAG,OAAO,aAAa,CAAA;AAEnE,qBAAa,KAAK;IACjB,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,CAEvD;IAED,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,CAM1D;IAED,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIzC;CACD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export const CLOCK_BASE_12 = 12_000_000; // 91 Hz - 6 MHz
|
|
2
|
+
export const CLOCK_BASE_60 = 60_000_000; // 457 Hz - 30 MHz
|
|
3
|
+
export const DIVISOR_MIN = 0;
|
|
4
|
+
export const DIVISOR_MAX = 0xFF_FF;
|
|
5
|
+
export const CLOCK_DEFAULT_STANDARD_MODE_100_kHz = 100 * 1000;
|
|
6
|
+
export const CLOCK_DEFAULT_FAST_MODE_400_kHz = 400 * 1000;
|
|
7
|
+
export const CLOCK_DEFAULT_FAST_MODE_PLUS_1_MHz = 1 * 1000 * 1000;
|
|
8
|
+
export const CLOCK_DEFAULT_HIGH_SPEED_MODE_3_4_MHz = 3.4 * 1000 * 1000;
|
|
9
|
+
export const CLOCK_DEFAULT_ULTRA_FAST_MODE_5_MHz = 5 * 1000 * 1000;
|
|
10
|
+
export class Clock {
|
|
11
|
+
static clockHz(divisor, base) {
|
|
12
|
+
return (base / ((1 + divisor) * 2));
|
|
13
|
+
}
|
|
14
|
+
static clockDivisor(hertz, base) {
|
|
15
|
+
const raw = Math.trunc(base / (hertz * 2)) - 1;
|
|
16
|
+
if (raw < DIVISOR_MIN) {
|
|
17
|
+
return DIVISOR_MIN;
|
|
18
|
+
}
|
|
19
|
+
if (raw > DIVISOR_MAX) {
|
|
20
|
+
return DIVISOR_MAX;
|
|
21
|
+
}
|
|
22
|
+
return raw;
|
|
23
|
+
}
|
|
24
|
+
static hertzToHuman(hertz) {
|
|
25
|
+
if (hertz >= (1000 * 1000)) {
|
|
26
|
+
return `${hertz / (1000 * 1000)} MHz`;
|
|
27
|
+
}
|
|
28
|
+
if (hertz >= (1000)) {
|
|
29
|
+
return `${hertz / (1000)} kHz`;
|
|
30
|
+
}
|
|
31
|
+
return `${hertz} Hz`;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=clock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clock.js","sourceRoot":"","sources":["../../src/mpsse/clock.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAA,CAAE,gBAAgB;AACzD,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAA,CAAE,kBAAkB;AAE3D,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAA;AAC5B,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAA;AAGlC,MAAM,CAAC,MAAM,mCAAmC,GAAG,GAAG,GAAG,IAAI,CAAA;AAC7D,MAAM,CAAC,MAAM,+BAA+B,GAAG,GAAG,GAAG,IAAI,CAAA;AACzD,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAA;AACjE,MAAM,CAAC,MAAM,qCAAqC,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAA;AACtE,MAAM,CAAC,MAAM,mCAAmC,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAA;AAKlE,MAAM,OAAO,KAAK;IACjB,MAAM,CAAC,OAAO,CAAC,OAAe,EAAE,IAAe;QAC9C,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IACpC,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,KAAa,EAAE,IAAe;QACjD,MAAM,GAAG,GAAI,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QAE/C,IAAG,GAAG,GAAG,WAAW,EAAE,CAAC;YAAC,OAAO,WAAW,CAAA;QAAC,CAAC;QAC5C,IAAG,GAAG,GAAG,WAAW,EAAE,CAAC;YAAC,OAAO,WAAW,CAAA;QAAC,CAAC;QAC5C,OAAO,GAAG,CAAA;IACX,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,KAAa;QAChC,IAAG,KAAK,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YAAC,OAAO,GAAG,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAA;QAAA,CAAC;QACnE,IAAG,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAAC,OAAO,GAAG,KAAK,GAAG,CAAC,IAAI,CAAC,MAAM,CAAA;QAAA,CAAC;QACrD,OAAO,GAAG,KAAK,KAAK,CAAA;IACrB,CAAC;CACD"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
export declare const BAD_COMMAND = 175;
|
|
2
|
+
export declare const BAD_COMMAND_RESPONSE = 250;
|
|
3
|
+
export declare const SHIFT_COMMANDS_DEFINITION: {
|
|
4
|
+
WRITE_NEGATIVE_EDGE: number;
|
|
5
|
+
BIT_MODE: number;
|
|
6
|
+
READ_NEGATIVE_EDGE: number;
|
|
7
|
+
LSB_FIRST: number;
|
|
8
|
+
WRITE_TDI: number;
|
|
9
|
+
READ_TDO: number;
|
|
10
|
+
WRITE_TMS: number;
|
|
11
|
+
};
|
|
12
|
+
export type ShiftCommand = number;
|
|
13
|
+
export declare const SHIFT_COMMAND: {
|
|
14
|
+
OUT_MSB_BYTES_POSITIVE_VE: number;
|
|
15
|
+
OUT_MSB_BYTES_NEGATIVE_VE: number;
|
|
16
|
+
OUT_MSB_BITS_POSITIVE_VE: number;
|
|
17
|
+
OUT_MSB_BITS_NEGATIVE_VE: number;
|
|
18
|
+
IN_MSB_BYTES_POSITIVE_VE: number;
|
|
19
|
+
IN_MSB_BYTES_NEGATIVE_VE: number;
|
|
20
|
+
IN_MSB_BITS_POSITIVE_VE: number;
|
|
21
|
+
IN_MSB_BITS_NEGATIVE_VE: number;
|
|
22
|
+
IN_OUT_MSB_BYTES_OUT_NEGATIVE_IN_POSITIVE_VE: number;
|
|
23
|
+
IN_OUT_MSB_BYTES_OUT_POSITIVE_IN_NEGATIVE_VE: number;
|
|
24
|
+
IN_OUT_MSB_BITS_OUT_NEGATIVE_IN_POSITIVE_VE: number;
|
|
25
|
+
IN_OUT_MSB_BITS_OUT_POSITIVE_IN_NEGATIVE_VE: number;
|
|
26
|
+
OUT_LSB_BYTES_POSITIVE_VE: number;
|
|
27
|
+
OUT_LSB_BYTES_NEGATIVE_VE: number;
|
|
28
|
+
OUT_LSB_BITS_POSITIVE_VE: number;
|
|
29
|
+
OUT_LSB_BITS_NEGATIVE_VE: number;
|
|
30
|
+
IN_LSB_BYTES_POSITIVE_VE: number;
|
|
31
|
+
IN_LSB_BYTES_NEGATIVE_VE: number;
|
|
32
|
+
IN_LSB_BITS_POSITIVE_VE: number;
|
|
33
|
+
IN_LSB_BITS_NEGATIVE_VE: number;
|
|
34
|
+
IN_OUT_LSB_BYTES_OUT_NEGATIVE_IN_POSITIVE_VE: number;
|
|
35
|
+
IN_OUT_LSB_BYTES_OUT_POSITIVE_IN_NEGATIVE_VE: number;
|
|
36
|
+
IN_OUT_LSB_BITS_OUT_NEGATIVE_IN_POSITIVE_VE: number;
|
|
37
|
+
IN_OUT_LSB_BITS_OUT_POSITIVE_IN_NEGATIVE_VE: number;
|
|
38
|
+
};
|
|
39
|
+
export declare const PIN_STATE_COMMANDS: {
|
|
40
|
+
SET_DATA_BITS_LOW_BYTE: number;
|
|
41
|
+
SET_DATA_BITS_HIGH_BYTE: number;
|
|
42
|
+
READ_DATA_BITS_LOW_BYTE: number;
|
|
43
|
+
READ_DATA_BITS_HIGH_BYTE: number;
|
|
44
|
+
};
|
|
45
|
+
export declare const LOOPBACK_COMMANDS: {
|
|
46
|
+
ENABLED: number;
|
|
47
|
+
DISABLE: number;
|
|
48
|
+
};
|
|
49
|
+
export declare const CLOCK_DIVISOR_COMMANDS: {
|
|
50
|
+
SET_CLK_DIVISOR: number;
|
|
51
|
+
};
|
|
52
|
+
export declare const HOST_AND_MPSSE_MODE_COMMANDS: {
|
|
53
|
+
SEND_IMMEDIATE: number;
|
|
54
|
+
};
|
|
55
|
+
export declare const H_COMMANDS: {
|
|
56
|
+
DISABLE_CLOCK_DIVIDE_BY_FIVE: number;
|
|
57
|
+
ENABLE_CLOCK_DIVIDE_BY_FIVE: number;
|
|
58
|
+
ENABLE_THREE_PHASE_CLOCKING: number;
|
|
59
|
+
DISABLE_THREE_PHASE_CLOCKING: number;
|
|
60
|
+
ENABLE_ADAPTIVE_CLOCKING: number;
|
|
61
|
+
DISABLE_ADAPTIVE_CLOCKING: number;
|
|
62
|
+
};
|
|
63
|
+
export declare const FT232H_ONLY_COMMANDS: {
|
|
64
|
+
SET_IO_ONLY_DRIVE_LOW: number;
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/mpsse/command.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,MAAO,CAAA;AAC/B,eAAO,MAAM,oBAAoB,MAAO,CAAA;AAGxC,eAAO,MAAM,yBAAyB;IACrC,mBAAmB;IACnB,QAAQ;IACR,kBAAkB;IAClB,SAAS;IACT,SAAS;IACT,QAAQ;IACR,SAAS;CACT,CAAA;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,CAAA;AAEjC,eAAO,MAAM,aAAa;IACzB,yBAAyB;IACzB,yBAAyB;IACzB,wBAAwB;IACxB,wBAAwB;IAExB,wBAAwB;IACxB,wBAAwB;IACxB,uBAAuB;IACvB,uBAAuB;IAEvB,4CAA4C;IAC5C,4CAA4C;IAC5C,2CAA2C;IAC3C,2CAA2C;IAG3C,yBAAyB;IACzB,yBAAyB;IACzB,wBAAwB;IACxB,wBAAwB;IAExB,wBAAwB;IACxB,wBAAwB;IACxB,uBAAuB;IACvB,uBAAuB;IAEvB,4CAA4C;IAC5C,4CAA4C;IAC5C,2CAA2C;IAC3C,2CAA2C;CAE3C,CAAA;AAYD,eAAO,MAAM,kBAAkB;IAC9B,sBAAsB;IACtB,uBAAuB;IAEvB,uBAAuB;IACvB,wBAAwB;CACxB,CAAA;AAED,eAAO,MAAM,iBAAiB;IAC7B,OAAO;IACP,OAAO;CACP,CAAA;AAED,eAAO,MAAM,sBAAsB;IAClC,eAAe;CACf,CAAA;AAED,eAAO,MAAM,4BAA4B;IACxC,cAAc;CAGd,CAAA;AASD,eAAO,MAAM,UAAU;IACtB,4BAA4B;IAC5B,2BAA2B;IAE3B,2BAA2B;IAC3B,4BAA4B;IAQ5B,wBAAwB;IACxB,yBAAyB;CAIzB,CAAA;AAED,eAAO,MAAM,oBAAoB;IAChC,qBAAqB;CACrB,CAAA"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
export const BAD_COMMAND = 0xAF; // suggested bad command
|
|
2
|
+
export const BAD_COMMAND_RESPONSE = 0xFA; // first response byte when any bad command sent
|
|
3
|
+
// Shifting commands IN MPSSE Mode
|
|
4
|
+
export const SHIFT_COMMANDS_DEFINITION = {
|
|
5
|
+
WRITE_NEGATIVE_EDGE: 0b0000_0001, // -ve CLK on write
|
|
6
|
+
BIT_MODE: 0b0000_0010, // bit mode = 1 else byte mode
|
|
7
|
+
READ_NEGATIVE_EDGE: 0b0000_0100, // -ve CLK on read
|
|
8
|
+
LSB_FIRST: 0b0000_1000, // LSB first = 1 else MSB first
|
|
9
|
+
WRITE_TDI: 0b0001_0000, // Do write TDI
|
|
10
|
+
READ_TDO: 0b0010_0000, // Do read TDO
|
|
11
|
+
WRITE_TMS: 0b0100_0000 // Do writeTMS
|
|
12
|
+
};
|
|
13
|
+
export const SHIFT_COMMAND = {
|
|
14
|
+
OUT_MSB_BYTES_POSITIVE_VE: 0x10, // WRITE_TDI
|
|
15
|
+
OUT_MSB_BYTES_NEGATIVE_VE: 0x11, // WRITE_TDI | WRITE_NEGATIVE_EDGE
|
|
16
|
+
OUT_MSB_BITS_POSITIVE_VE: 0x12, // WRITE_TDI | BIT_MODE
|
|
17
|
+
OUT_MSB_BITS_NEGATIVE_VE: 0x13, // WRITE_TDI | BIT_MODE | WRITE_NEGATIVE_EDGE
|
|
18
|
+
IN_MSB_BYTES_POSITIVE_VE: 0x20, // READ_TDO
|
|
19
|
+
IN_MSB_BYTES_NEGATIVE_VE: 0x24, // READ_TDO | READ_NEGATIVE_EDGE
|
|
20
|
+
IN_MSB_BITS_POSITIVE_VE: 0x22, // READ_TDO | BIT_MODE
|
|
21
|
+
IN_MSB_BITS_NEGATIVE_VE: 0x26, // READ_TDO | BIT_MODE | READ_NEGATIVE_EDGE
|
|
22
|
+
IN_OUT_MSB_BYTES_OUT_NEGATIVE_IN_POSITIVE_VE: 0x31,
|
|
23
|
+
IN_OUT_MSB_BYTES_OUT_POSITIVE_IN_NEGATIVE_VE: 0x34,
|
|
24
|
+
IN_OUT_MSB_BITS_OUT_NEGATIVE_IN_POSITIVE_VE: 0x33,
|
|
25
|
+
IN_OUT_MSB_BITS_OUT_POSITIVE_IN_NEGATIVE_VE: 0x36,
|
|
26
|
+
//
|
|
27
|
+
OUT_LSB_BYTES_POSITIVE_VE: 0x18, // LSB_FIRST | WRITE_TDI
|
|
28
|
+
OUT_LSB_BYTES_NEGATIVE_VE: 0x19, // LSB_FIRST | WRITE_TDI | WRITE_NEGATIVE_EDGE
|
|
29
|
+
OUT_LSB_BITS_POSITIVE_VE: 0x1A, // LSB_FIRST | WRITE_TDI | BIT_MODE
|
|
30
|
+
OUT_LSB_BITS_NEGATIVE_VE: 0x1B, // LSB_FIRST | WRITE_TDI | BIT_MODE | WRITE_NEGATIVE_EDGE
|
|
31
|
+
IN_LSB_BYTES_POSITIVE_VE: 0x28, // LSB_FIRST | READ_TDI
|
|
32
|
+
IN_LSB_BYTES_NEGATIVE_VE: 0x2C, // LSB_FIRST | READ_TDI | READ_NEGATIVE_EDGE
|
|
33
|
+
IN_LSB_BITS_POSITIVE_VE: 0x2A, // LSB_FIRST | READ_TDI | BIT_MODE
|
|
34
|
+
IN_LSB_BITS_NEGATIVE_VE: 0x2E, // LSB_FIRST | READ_TDI | BIT_MODE | READ_NEGATIVE_EDGE
|
|
35
|
+
IN_OUT_LSB_BYTES_OUT_NEGATIVE_IN_POSITIVE_VE: 0x39,
|
|
36
|
+
IN_OUT_LSB_BYTES_OUT_POSITIVE_IN_NEGATIVE_VE: 0x3C,
|
|
37
|
+
IN_OUT_LSB_BITS_OUT_NEGATIVE_IN_POSITIVE_VE: 0x3B,
|
|
38
|
+
IN_OUT_LSB_BITS_OUT_POSITIVE_IN_NEGATIVE_VE: 0x3E,
|
|
39
|
+
};
|
|
40
|
+
// export const LSB_FIRST_TMS_COMMANDS = {
|
|
41
|
+
// CLOCK_DATA_NO_READ_POSITIVE_VE: 0x4A,
|
|
42
|
+
// CLOCK_DATA_NO_READ_NEGATIVE_VE: 0x4B,
|
|
43
|
+
// CLOCK_DATA_WITH_READ_ON_POSITIVE_VE_READ_POSITIVE_VE: 0x6A,
|
|
44
|
+
// CLOCK_DATA_WITH_READ_ON_NEGATIVE_VE_READ_POSITIVE_VE: 0x6B,
|
|
45
|
+
// CLOCK_DATA_WITH_READ_ON_POSITIVE_VE_READ_NEGATIVE_VE: 0x6E,
|
|
46
|
+
// CLOCK_DATA_WITH_READ_ON_NEGATIVE_VE_READ_NEGATIVE_VE: 0x6F
|
|
47
|
+
// }
|
|
48
|
+
export const PIN_STATE_COMMANDS = {
|
|
49
|
+
SET_DATA_BITS_LOW_BYTE: 0x80,
|
|
50
|
+
SET_DATA_BITS_HIGH_BYTE: 0x82,
|
|
51
|
+
READ_DATA_BITS_LOW_BYTE: 0x81,
|
|
52
|
+
READ_DATA_BITS_HIGH_BYTE: 0x83
|
|
53
|
+
};
|
|
54
|
+
export const LOOPBACK_COMMANDS = {
|
|
55
|
+
ENABLED: 0x84,
|
|
56
|
+
DISABLE: 0x85
|
|
57
|
+
};
|
|
58
|
+
export const CLOCK_DIVISOR_COMMANDS = {
|
|
59
|
+
SET_CLK_DIVISOR: 0x86
|
|
60
|
+
};
|
|
61
|
+
export const HOST_AND_MPSSE_MODE_COMMANDS = {
|
|
62
|
+
SEND_IMMEDIATE: 0x87,
|
|
63
|
+
// WAIT_IO_HIGH: 0x88,
|
|
64
|
+
// WAIT_IO_LOW: 0x89
|
|
65
|
+
};
|
|
66
|
+
// export const HOST_EMULATION_MODE_COMMANDS = {
|
|
67
|
+
// READ_SHORT_ADDRESS: 0x90,
|
|
68
|
+
// READ_EXTENDED_ADDRESS: 0x91,
|
|
69
|
+
// WRITE_SHORT_ADDRESS: 0x92,
|
|
70
|
+
// WRITE_EXTENDED_ADDRESS: 0x93
|
|
71
|
+
// }
|
|
72
|
+
export const H_COMMANDS = {
|
|
73
|
+
DISABLE_CLOCK_DIVIDE_BY_FIVE: 0x8A,
|
|
74
|
+
ENABLE_CLOCK_DIVIDE_BY_FIVE: 0x8B,
|
|
75
|
+
ENABLE_THREE_PHASE_CLOCKING: 0x8C,
|
|
76
|
+
DISABLE_THREE_PHASE_CLOCKING: 0x8D,
|
|
77
|
+
// CLOCK_N_BITS_NO_TRANSFER: 0x8E,
|
|
78
|
+
// CLOCK_N_EIGHT_BITS_NO_TRANSFER: 0x8F,
|
|
79
|
+
// CLOCK_WAIT_IO_HIGH: 0x94,
|
|
80
|
+
// CLOCK_WAIT_IO_LOW: 0x95,
|
|
81
|
+
ENABLE_ADAPTIVE_CLOCKING: 0x96,
|
|
82
|
+
DISABLE_ADAPTIVE_CLOCKING: 0x97,
|
|
83
|
+
// CLOCK_N_BITS_NO_TRANSFER_OR_UNTIL_HIGH: 0x9C,
|
|
84
|
+
// CLOCK_N_EIGHT_BITS_NO_TRANSFER_OR_UNTIL_LOW: 0x9D
|
|
85
|
+
};
|
|
86
|
+
export const FT232H_ONLY_COMMANDS = {
|
|
87
|
+
SET_IO_ONLY_DRIVE_LOW: 0x9E
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/mpsse/command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** biome-ignore-all lint/performance/noBarrelFile: barrel */
|
|
2
|
+
/** biome-ignore-all lint/performance/noReExportAll: barrel */
|
|
3
|
+
export * from './clock.ts';
|
|
4
|
+
export * from './command.ts';
|
|
5
|
+
export * from './mpsse.ts';
|
|
6
|
+
export * from './mpsse-template.ts';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mpsse/index.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,8DAA8D;AAC9D,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,qBAAqB,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** biome-ignore-all lint/performance/noBarrelFile: barrel */
|
|
2
|
+
/** biome-ignore-all lint/performance/noReExportAll: barrel */
|
|
3
|
+
export * from './clock.js';
|
|
4
|
+
export * from './command.js';
|
|
5
|
+
export * from './mpsse.js';
|
|
6
|
+
export * from './mpsse-template.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mpsse/index.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,8DAA8D;AAC9D,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,qBAAqB,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** biome-ignore-all lint/style/useConsistentArrayType: <explanation> */
|
|
2
|
+
import { type ShiftCommand } from './command.ts';
|
|
3
|
+
export declare class MPSSETemplate {
|
|
4
|
+
static shiftOutByte(command: ShiftCommand, length: number, data: number): Array<number>;
|
|
5
|
+
static shiftInByte(command: ShiftCommand, length: number): Array<number>;
|
|
6
|
+
static shiftOutBits(command: ShiftCommand, length: number, data: number): Array<number>;
|
|
7
|
+
static shiftInBits(command: ShiftCommand, length: number): Array<number>;
|
|
8
|
+
static gpioSetHigh(pins: number, directions: number): Array<number>;
|
|
9
|
+
static gpioSetLow(pins: number, directions: number): Array<number>;
|
|
10
|
+
static gpioGetHigh(): Array<number>;
|
|
11
|
+
static gpioGetLow(): Array<number>;
|
|
12
|
+
static setClockDivisor(divider: number): Array<number>;
|
|
13
|
+
static enableLoopback(enable?: boolean): Array<number>;
|
|
14
|
+
static enableClockDivideBy5(enable?: boolean): Array<number>;
|
|
15
|
+
static enableThreePhaseClocking(enable?: boolean): Array<number>;
|
|
16
|
+
static enableAdaptiveClocking(enable?: boolean): Array<number>;
|
|
17
|
+
static setDriveOnlyZero(pinsLow: number, pinsHigh: number): Array<number>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=mpsse-template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mpsse-template.d.ts","sourceRoot":"","sources":["../../src/mpsse/mpsse-template.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,OAAO,EAMN,KAAK,YAAY,EACjB,MAAM,cAAc,CAAA;AAGrB,qBAAa,aAAa;IACzB,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAItF;IAED,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAIvE;IAED,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAEtF;IAED,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAEvE;IAED,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAMlE;IAED,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAMjE;IAED,MAAM,CAAC,WAAW,IAAI,KAAK,CAAC,MAAM,CAAC,CAElC;IAED,MAAM,CAAC,UAAU,IAAI,KAAK,CAAC,MAAM,CAAC,CAEjC;IAED,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CASrD;IAED,MAAM,CAAC,cAAc,CAAC,MAAM,UAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAGlD;IAED,MAAM,CAAC,oBAAoB,CAAC,MAAM,UAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAGxD;IAED,MAAM,CAAC,wBAAwB,CAAC,MAAM,UAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAG5D;IAED,MAAM,CAAC,sBAAsB,CAAC,MAAM,UAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAG1D;IAED,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAMxE;CACD"}
|