rp2040js 0.19.1 → 0.19.3

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.
@@ -28,6 +28,10 @@ export declare class RPI2C extends BasePeripheral implements Peripheral {
28
28
  rxThreshold: number;
29
29
  txThreshold: number;
30
30
  control: number;
31
+ ssClockHighPeriod: number;
32
+ ssClockLowPeriod: number;
33
+ fsClockHighPeriod: number;
34
+ fsClockLowPeriod: number;
31
35
  targetAddress: number;
32
36
  slaveAddress: number;
33
37
  abortSource: number;
@@ -35,6 +39,8 @@ export declare class RPI2C extends BasePeripheral implements Peripheral {
35
39
  intEnable: number;
36
40
  get intStatus(): number;
37
41
  get speed(): I2CSpeed;
42
+ get sclLowPeriod(): number;
43
+ get sclHighPeriod(): number;
38
44
  get masterBits(): 7 | 10;
39
45
  constructor(rp2040: RP2040, name: string, irq: number);
40
46
  checkInterrupts(): void;
@@ -142,6 +142,12 @@ class RPI2C extends peripheral_js_1.BasePeripheral {
142
142
  get speed() {
143
143
  return ((this.control >> SPEED_SHIFT) & SPEED_MASK);
144
144
  }
145
+ get sclLowPeriod() {
146
+ return this.speed === I2CSpeed.Standard ? this.ssClockLowPeriod : this.fsClockLowPeriod;
147
+ }
148
+ get sclHighPeriod() {
149
+ return this.speed === I2CSpeed.Standard ? this.ssClockHighPeriod : this.fsClockHighPeriod;
150
+ }
145
151
  get masterBits() {
146
152
  return this.control & IC_10BITADDR_MASTER ? 10 : 7;
147
153
  }
@@ -165,6 +171,10 @@ class RPI2C extends peripheral_js_1.BasePeripheral {
165
171
  this.rxThreshold = 0;
166
172
  this.txThreshold = 0;
167
173
  this.control = IC_SLAVE_DISABLE | IC_RESTART_EN | (I2CSpeed.FastMode << SPEED_SHIFT) | MASTER_MODE;
174
+ this.ssClockHighPeriod = 0x0028;
175
+ this.ssClockLowPeriod = 0x002f;
176
+ this.fsClockHighPeriod = 0x0006;
177
+ this.fsClockLowPeriod = 0x000d;
168
178
  this.targetAddress = 0x55;
169
179
  this.slaveAddress = 0x55;
170
180
  this.abortSource = 0;
@@ -323,6 +333,14 @@ class RPI2C extends peripheral_js_1.BasePeripheral {
323
333
  }
324
334
  this.clearInterrupts(R_RX_FULL);
325
335
  return this.rxFIFO.pull();
336
+ case IC_SS_SCL_HCNT:
337
+ return this.ssClockHighPeriod;
338
+ case IC_SS_SCL_LCNT:
339
+ return this.ssClockLowPeriod;
340
+ case IC_FS_SCL_HCNT:
341
+ return this.fsClockHighPeriod;
342
+ case IC_FS_SCL_LCNT:
343
+ return this.fsClockLowPeriod;
326
344
  case IC_INTR_STAT:
327
345
  return this.intStatus;
328
346
  case IC_INTR_MASK:
@@ -419,6 +437,18 @@ class RPI2C extends peripheral_js_1.BasePeripheral {
419
437
  this.nextCommand();
420
438
  }
421
439
  return;
440
+ case IC_SS_SCL_HCNT:
441
+ this.ssClockHighPeriod = value & 0xffff;
442
+ return;
443
+ case IC_SS_SCL_LCNT:
444
+ this.ssClockLowPeriod = value & 0xffff;
445
+ return;
446
+ case IC_FS_SCL_HCNT:
447
+ this.fsClockHighPeriod = value & 0xffff;
448
+ return;
449
+ case IC_FS_SCL_LCNT:
450
+ this.fsClockLowPeriod = value & 0xffff;
451
+ return;
422
452
  case IC_RX_TL:
423
453
  this.rxThreshold = value & 0xff;
424
454
  if (this.rxThreshold > this.rxFIFO.size) {
@@ -2,9 +2,9 @@ import { BasePeripheral, Peripheral } from './peripheral.js';
2
2
  export declare class RP2040RTC extends BasePeripheral implements Peripheral {
3
3
  setup0: number;
4
4
  setup1: number;
5
- rtc1: number;
6
- rtc0: number;
7
5
  ctrl: number;
6
+ baseline: Date;
7
+ baselineMicros: number;
8
8
  readUint32(offset: number): number;
9
9
  writeUint32(offset: number, value: number): void;
10
10
  }
@@ -11,16 +11,45 @@ const RTC_RTC0 = 0x1c;
11
11
  const RTC_ENABLE_BITS = 0x01;
12
12
  const RTC_ACTIVE_BITS = 0x2;
13
13
  const RTC_LOAD_BITS = 0x10;
14
+ const SETUP_0_YEAR_SHIFT = 12;
15
+ const SETUP_0_YEAR_MASK = 0xfff;
16
+ const SETUP_0_MONTH_SHIFT = 8;
17
+ const SETUP_0_MONTH_MASK = 0xf;
18
+ const SETUP_0_DAY_SHIFT = 0;
19
+ const SETUP_0_DAY_MASK = 0x1f;
20
+ const SETUP_1_DOTW_SHIFT = 24;
21
+ const SETUP_1_DOTW_MASK = 0x7;
22
+ const SETUP_1_HOUR_SHIFT = 16;
23
+ const SETUP_1_HOUR_MASK = 0x1f;
24
+ const SETUP_1_MIN_SHIFT = 8;
25
+ const SETUP_1_MIN_MASK = 0x3f;
26
+ const SETUP_1_SEC_SHIFT = 0;
27
+ const SETUP_1_SEC_MASK = 0x3f;
28
+ const RTC_0_YEAR_SHIFT = 12;
29
+ const RTC_0_YEAR_MASK = 0xfff;
30
+ const RTC_0_MONTH_SHIFT = 8;
31
+ const RTC_0_MONTH_MASK = 0xf;
32
+ const RTC_0_DAY_SHIFT = 0;
33
+ const RTC_0_DAY_MASK = 0x1f;
34
+ const RTC_1_DOTW_SHIFT = 24;
35
+ const RTC_1_DOTW_MASK = 0x7;
36
+ const RTC_1_HOUR_SHIFT = 16;
37
+ const RTC_1_HOUR_MASK = 0x1f;
38
+ const RTC_1_MIN_SHIFT = 8;
39
+ const RTC_1_MIN_MASK = 0x3f;
40
+ const RTC_1_SEC_SHIFT = 0;
41
+ const RTC_1_SEC_MASK = 0x3f;
14
42
  class RP2040RTC extends peripheral_js_1.BasePeripheral {
15
43
  constructor() {
16
44
  super(...arguments);
17
45
  this.setup0 = 0;
18
46
  this.setup1 = 0;
19
- this.rtc1 = 0;
20
- this.rtc0 = 0;
21
47
  this.ctrl = 0;
48
+ this.baseline = new Date(2021, 0, 1);
49
+ this.baselineMicros = 0;
22
50
  }
23
51
  readUint32(offset) {
52
+ const date = new Date(this.baseline.getTime() + (this.rp2040.clock.micros - this.baselineMicros) / 1000);
24
53
  switch (offset) {
25
54
  case RTC_SETUP0:
26
55
  return this.setup0;
@@ -31,9 +60,16 @@ class RP2040RTC extends peripheral_js_1.BasePeripheral {
31
60
  case IRQ_SETUP_0:
32
61
  return 0;
33
62
  case RTC_RTC1:
34
- return this.rtc1;
63
+ return (((date.getFullYear() & RTC_0_YEAR_MASK) << RTC_0_YEAR_SHIFT) |
64
+ (((date.getMonth() + 1) & RTC_0_MONTH_MASK) << RTC_0_MONTH_SHIFT) |
65
+ ((date.getDate() & RTC_0_DAY_MASK) << RTC_0_DAY_SHIFT));
35
66
  case RTC_RTC0:
36
- return this.rtc0;
67
+ return (((date.getDay() & RTC_1_DOTW_MASK) << RTC_1_DOTW_SHIFT) |
68
+ ((date.getHours() & RTC_1_HOUR_MASK) << RTC_1_HOUR_SHIFT) |
69
+ ((date.getMinutes() & RTC_1_MIN_MASK) << RTC_1_MIN_SHIFT) |
70
+ ((date.getSeconds() & RTC_1_SEC_MASK) << RTC_1_SEC_SHIFT));
71
+ default:
72
+ break;
37
73
  }
38
74
  return super.readUint32(offset);
39
75
  }
@@ -56,8 +92,14 @@ class RP2040RTC extends peripheral_js_1.BasePeripheral {
56
92
  this.ctrl |= RTC_ENABLE_BITS;
57
93
  this.ctrl |= RTC_ACTIVE_BITS;
58
94
  if (this.ctrl & RTC_LOAD_BITS) {
59
- this.rtc1 = this.setup0;
60
- this.rtc0 = this.setup1;
95
+ const year = (this.setup0 >> SETUP_0_YEAR_SHIFT) & SETUP_0_YEAR_MASK;
96
+ const month = (this.setup0 >> SETUP_0_MONTH_SHIFT) & SETUP_0_MONTH_MASK;
97
+ const day = (this.setup0 >> SETUP_0_DAY_SHIFT) & SETUP_0_DAY_MASK;
98
+ const hour = (this.setup1 >> SETUP_1_HOUR_SHIFT) & SETUP_1_HOUR_MASK;
99
+ const min = (this.setup1 >> SETUP_1_MIN_SHIFT) & SETUP_1_MIN_MASK;
100
+ const sec = (this.setup1 >> SETUP_1_SEC_SHIFT) & SETUP_1_SEC_MASK;
101
+ this.baseline = new Date(year, month - 1, day, hour, min, sec);
102
+ this.baselineMicros = this.rp2040.clock.micros;
61
103
  this.ctrl &= ~RTC_LOAD_BITS;
62
104
  }
63
105
  }
@@ -28,6 +28,10 @@ export declare class RPI2C extends BasePeripheral implements Peripheral {
28
28
  rxThreshold: number;
29
29
  txThreshold: number;
30
30
  control: number;
31
+ ssClockHighPeriod: number;
32
+ ssClockLowPeriod: number;
33
+ fsClockHighPeriod: number;
34
+ fsClockLowPeriod: number;
31
35
  targetAddress: number;
32
36
  slaveAddress: number;
33
37
  abortSource: number;
@@ -35,6 +39,8 @@ export declare class RPI2C extends BasePeripheral implements Peripheral {
35
39
  intEnable: number;
36
40
  get intStatus(): number;
37
41
  get speed(): I2CSpeed;
42
+ get sclLowPeriod(): number;
43
+ get sclHighPeriod(): number;
38
44
  get masterBits(): 7 | 10;
39
45
  constructor(rp2040: RP2040, name: string, irq: number);
40
46
  checkInterrupts(): void;
@@ -139,6 +139,12 @@ export class RPI2C extends BasePeripheral {
139
139
  get speed() {
140
140
  return ((this.control >> SPEED_SHIFT) & SPEED_MASK);
141
141
  }
142
+ get sclLowPeriod() {
143
+ return this.speed === I2CSpeed.Standard ? this.ssClockLowPeriod : this.fsClockLowPeriod;
144
+ }
145
+ get sclHighPeriod() {
146
+ return this.speed === I2CSpeed.Standard ? this.ssClockHighPeriod : this.fsClockHighPeriod;
147
+ }
142
148
  get masterBits() {
143
149
  return this.control & IC_10BITADDR_MASTER ? 10 : 7;
144
150
  }
@@ -162,6 +168,10 @@ export class RPI2C extends BasePeripheral {
162
168
  this.rxThreshold = 0;
163
169
  this.txThreshold = 0;
164
170
  this.control = IC_SLAVE_DISABLE | IC_RESTART_EN | (I2CSpeed.FastMode << SPEED_SHIFT) | MASTER_MODE;
171
+ this.ssClockHighPeriod = 0x0028;
172
+ this.ssClockLowPeriod = 0x002f;
173
+ this.fsClockHighPeriod = 0x0006;
174
+ this.fsClockLowPeriod = 0x000d;
165
175
  this.targetAddress = 0x55;
166
176
  this.slaveAddress = 0x55;
167
177
  this.abortSource = 0;
@@ -320,6 +330,14 @@ export class RPI2C extends BasePeripheral {
320
330
  }
321
331
  this.clearInterrupts(R_RX_FULL);
322
332
  return this.rxFIFO.pull();
333
+ case IC_SS_SCL_HCNT:
334
+ return this.ssClockHighPeriod;
335
+ case IC_SS_SCL_LCNT:
336
+ return this.ssClockLowPeriod;
337
+ case IC_FS_SCL_HCNT:
338
+ return this.fsClockHighPeriod;
339
+ case IC_FS_SCL_LCNT:
340
+ return this.fsClockLowPeriod;
323
341
  case IC_INTR_STAT:
324
342
  return this.intStatus;
325
343
  case IC_INTR_MASK:
@@ -416,6 +434,18 @@ export class RPI2C extends BasePeripheral {
416
434
  this.nextCommand();
417
435
  }
418
436
  return;
437
+ case IC_SS_SCL_HCNT:
438
+ this.ssClockHighPeriod = value & 0xffff;
439
+ return;
440
+ case IC_SS_SCL_LCNT:
441
+ this.ssClockLowPeriod = value & 0xffff;
442
+ return;
443
+ case IC_FS_SCL_HCNT:
444
+ this.fsClockHighPeriod = value & 0xffff;
445
+ return;
446
+ case IC_FS_SCL_LCNT:
447
+ this.fsClockLowPeriod = value & 0xffff;
448
+ return;
419
449
  case IC_RX_TL:
420
450
  this.rxThreshold = value & 0xff;
421
451
  if (this.rxThreshold > this.rxFIFO.size) {
@@ -2,9 +2,9 @@ import { BasePeripheral, Peripheral } from './peripheral.js';
2
2
  export declare class RP2040RTC extends BasePeripheral implements Peripheral {
3
3
  setup0: number;
4
4
  setup1: number;
5
- rtc1: number;
6
- rtc0: number;
7
5
  ctrl: number;
6
+ baseline: Date;
7
+ baselineMicros: number;
8
8
  readUint32(offset: number): number;
9
9
  writeUint32(offset: number, value: number): void;
10
10
  }
@@ -8,16 +8,45 @@ const RTC_RTC0 = 0x1c;
8
8
  const RTC_ENABLE_BITS = 0x01;
9
9
  const RTC_ACTIVE_BITS = 0x2;
10
10
  const RTC_LOAD_BITS = 0x10;
11
+ const SETUP_0_YEAR_SHIFT = 12;
12
+ const SETUP_0_YEAR_MASK = 0xfff;
13
+ const SETUP_0_MONTH_SHIFT = 8;
14
+ const SETUP_0_MONTH_MASK = 0xf;
15
+ const SETUP_0_DAY_SHIFT = 0;
16
+ const SETUP_0_DAY_MASK = 0x1f;
17
+ const SETUP_1_DOTW_SHIFT = 24;
18
+ const SETUP_1_DOTW_MASK = 0x7;
19
+ const SETUP_1_HOUR_SHIFT = 16;
20
+ const SETUP_1_HOUR_MASK = 0x1f;
21
+ const SETUP_1_MIN_SHIFT = 8;
22
+ const SETUP_1_MIN_MASK = 0x3f;
23
+ const SETUP_1_SEC_SHIFT = 0;
24
+ const SETUP_1_SEC_MASK = 0x3f;
25
+ const RTC_0_YEAR_SHIFT = 12;
26
+ const RTC_0_YEAR_MASK = 0xfff;
27
+ const RTC_0_MONTH_SHIFT = 8;
28
+ const RTC_0_MONTH_MASK = 0xf;
29
+ const RTC_0_DAY_SHIFT = 0;
30
+ const RTC_0_DAY_MASK = 0x1f;
31
+ const RTC_1_DOTW_SHIFT = 24;
32
+ const RTC_1_DOTW_MASK = 0x7;
33
+ const RTC_1_HOUR_SHIFT = 16;
34
+ const RTC_1_HOUR_MASK = 0x1f;
35
+ const RTC_1_MIN_SHIFT = 8;
36
+ const RTC_1_MIN_MASK = 0x3f;
37
+ const RTC_1_SEC_SHIFT = 0;
38
+ const RTC_1_SEC_MASK = 0x3f;
11
39
  export class RP2040RTC extends BasePeripheral {
12
40
  constructor() {
13
41
  super(...arguments);
14
42
  this.setup0 = 0;
15
43
  this.setup1 = 0;
16
- this.rtc1 = 0;
17
- this.rtc0 = 0;
18
44
  this.ctrl = 0;
45
+ this.baseline = new Date(2021, 0, 1);
46
+ this.baselineMicros = 0;
19
47
  }
20
48
  readUint32(offset) {
49
+ const date = new Date(this.baseline.getTime() + (this.rp2040.clock.micros - this.baselineMicros) / 1000);
21
50
  switch (offset) {
22
51
  case RTC_SETUP0:
23
52
  return this.setup0;
@@ -28,9 +57,16 @@ export class RP2040RTC extends BasePeripheral {
28
57
  case IRQ_SETUP_0:
29
58
  return 0;
30
59
  case RTC_RTC1:
31
- return this.rtc1;
60
+ return (((date.getFullYear() & RTC_0_YEAR_MASK) << RTC_0_YEAR_SHIFT) |
61
+ (((date.getMonth() + 1) & RTC_0_MONTH_MASK) << RTC_0_MONTH_SHIFT) |
62
+ ((date.getDate() & RTC_0_DAY_MASK) << RTC_0_DAY_SHIFT));
32
63
  case RTC_RTC0:
33
- return this.rtc0;
64
+ return (((date.getDay() & RTC_1_DOTW_MASK) << RTC_1_DOTW_SHIFT) |
65
+ ((date.getHours() & RTC_1_HOUR_MASK) << RTC_1_HOUR_SHIFT) |
66
+ ((date.getMinutes() & RTC_1_MIN_MASK) << RTC_1_MIN_SHIFT) |
67
+ ((date.getSeconds() & RTC_1_SEC_MASK) << RTC_1_SEC_SHIFT));
68
+ default:
69
+ break;
34
70
  }
35
71
  return super.readUint32(offset);
36
72
  }
@@ -53,8 +89,14 @@ export class RP2040RTC extends BasePeripheral {
53
89
  this.ctrl |= RTC_ENABLE_BITS;
54
90
  this.ctrl |= RTC_ACTIVE_BITS;
55
91
  if (this.ctrl & RTC_LOAD_BITS) {
56
- this.rtc1 = this.setup0;
57
- this.rtc0 = this.setup1;
92
+ const year = (this.setup0 >> SETUP_0_YEAR_SHIFT) & SETUP_0_YEAR_MASK;
93
+ const month = (this.setup0 >> SETUP_0_MONTH_SHIFT) & SETUP_0_MONTH_MASK;
94
+ const day = (this.setup0 >> SETUP_0_DAY_SHIFT) & SETUP_0_DAY_MASK;
95
+ const hour = (this.setup1 >> SETUP_1_HOUR_SHIFT) & SETUP_1_HOUR_MASK;
96
+ const min = (this.setup1 >> SETUP_1_MIN_SHIFT) & SETUP_1_MIN_MASK;
97
+ const sec = (this.setup1 >> SETUP_1_SEC_SHIFT) & SETUP_1_SEC_MASK;
98
+ this.baseline = new Date(year, month - 1, day, hour, min, sec);
99
+ this.baselineMicros = this.rp2040.clock.micros;
58
100
  this.ctrl &= ~RTC_LOAD_BITS;
59
101
  }
60
102
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rp2040js",
3
- "version": "0.19.1",
3
+ "version": "0.19.3",
4
4
  "description": "Raspberry Pi Pico (RP2040) Emulator",
5
5
  "repository": "https://github.com/wokwi/rp2040js",
6
6
  "keywords": [