Files
homeclaw/web-ui/vendor/rp2040js/peripherals/rtc.js
T
kim 209f3a3aef v3.0.6: RP2040 에뮬레이터 개선 — USB CDC, vendor화, 부팅 감지
- USB CDC 경로 복원: #define Serial Serial1 우회 제거
- rp2040js/avr8js/codemirror/xterm/monaco-editor vendor화
- /vendor 정적 라우팅 추가 (Express 5 catch-all 우회)
- 부팅 완료 타임아웃 감지 (Serial 출력 없어도 8초 후 RAF 전환)
- 리셋 시 Simulator 재생성으로 주변 장치 상태 초기화
- 시리얼 패널의 내부 메시지를 console.log로 이동
2026-06-19 15:49:36 +09:00

113 lines
4.3 KiB
JavaScript

import { BasePeripheral } from './peripheral.js';
const RTC_SETUP0 = 0x04;
const RTC_SETUP1 = 0x08;
const RTC_CTRL = 0x0c;
const IRQ_SETUP_0 = 0x10;
const RTC_RTC1 = 0x18;
const RTC_RTC0 = 0x1c;
const RTC_ENABLE_BITS = 0x01;
const RTC_ACTIVE_BITS = 0x2;
const RTC_LOAD_BITS = 0x10;
const SETUP_0_YEAR_SHIFT = 12;
const SETUP_0_YEAR_MASK = 0xfff;
const SETUP_0_MONTH_SHIFT = 8;
const SETUP_0_MONTH_MASK = 0xf;
const SETUP_0_DAY_SHIFT = 0;
const SETUP_0_DAY_MASK = 0x1f;
const SETUP_1_DOTW_SHIFT = 24;
const SETUP_1_DOTW_MASK = 0x7;
const SETUP_1_HOUR_SHIFT = 16;
const SETUP_1_HOUR_MASK = 0x1f;
const SETUP_1_MIN_SHIFT = 8;
const SETUP_1_MIN_MASK = 0x3f;
const SETUP_1_SEC_SHIFT = 0;
const SETUP_1_SEC_MASK = 0x3f;
const RTC_0_YEAR_SHIFT = 12;
const RTC_0_YEAR_MASK = 0xfff;
const RTC_0_MONTH_SHIFT = 8;
const RTC_0_MONTH_MASK = 0xf;
const RTC_0_DAY_SHIFT = 0;
const RTC_0_DAY_MASK = 0x1f;
const RTC_1_DOTW_SHIFT = 24;
const RTC_1_DOTW_MASK = 0x7;
const RTC_1_HOUR_SHIFT = 16;
const RTC_1_HOUR_MASK = 0x1f;
const RTC_1_MIN_SHIFT = 8;
const RTC_1_MIN_MASK = 0x3f;
const RTC_1_SEC_SHIFT = 0;
const RTC_1_SEC_MASK = 0x3f;
export class RP2040RTC extends BasePeripheral {
constructor() {
super(...arguments);
this.setup0 = 0;
this.setup1 = 0;
this.ctrl = 0;
this.baseline = new Date(2021, 0, 1);
this.baselineNanos = 0;
}
readUint32(offset) {
const date = new Date(this.baseline.getTime() + (this.rp2040.clock.nanos - this.baselineNanos) / 1000000);
switch (offset) {
case RTC_SETUP0:
return this.setup0;
case RTC_SETUP1:
return this.setup1;
case RTC_CTRL:
return this.ctrl;
case IRQ_SETUP_0:
return 0;
case RTC_RTC1:
return (((date.getFullYear() & RTC_0_YEAR_MASK) << RTC_0_YEAR_SHIFT) |
(((date.getMonth() + 1) & RTC_0_MONTH_MASK) << RTC_0_MONTH_SHIFT) |
((date.getDate() & RTC_0_DAY_MASK) << RTC_0_DAY_SHIFT));
case RTC_RTC0:
return (((date.getDay() & RTC_1_DOTW_MASK) << RTC_1_DOTW_SHIFT) |
((date.getHours() & RTC_1_HOUR_MASK) << RTC_1_HOUR_SHIFT) |
((date.getMinutes() & RTC_1_MIN_MASK) << RTC_1_MIN_SHIFT) |
((date.getSeconds() & RTC_1_SEC_MASK) << RTC_1_SEC_SHIFT));
default:
break;
}
return super.readUint32(offset);
}
writeUint32(offset, value) {
switch (offset) {
case RTC_SETUP0:
this.setup0 = value;
break;
case RTC_SETUP1:
this.setup1 = value;
break;
case RTC_CTRL:
// Though RTC_LOAD_BITS is type SC and should be cleared on next cycle, pico-sdk write
// RTC_LOAD_BITS & RTC_ENABLE_BITS seperatly.
// https://github.com/raspberrypi/pico-sdk/blob/master/src/rp2_common/hardware_rtc/rtc.c#L76-L80
if (value & RTC_LOAD_BITS) {
this.ctrl |= RTC_LOAD_BITS;
}
if (value & RTC_ENABLE_BITS) {
this.ctrl |= RTC_ENABLE_BITS;
this.ctrl |= RTC_ACTIVE_BITS;
if (this.ctrl & RTC_LOAD_BITS) {
const year = (this.setup0 >> SETUP_0_YEAR_SHIFT) & SETUP_0_YEAR_MASK;
const month = (this.setup0 >> SETUP_0_MONTH_SHIFT) & SETUP_0_MONTH_MASK;
const day = (this.setup0 >> SETUP_0_DAY_SHIFT) & SETUP_0_DAY_MASK;
const hour = (this.setup1 >> SETUP_1_HOUR_SHIFT) & SETUP_1_HOUR_MASK;
const min = (this.setup1 >> SETUP_1_MIN_SHIFT) & SETUP_1_MIN_MASK;
const sec = (this.setup1 >> SETUP_1_SEC_SHIFT) & SETUP_1_SEC_MASK;
this.baseline = new Date(year, month - 1, day, hour, min, sec);
this.baselineNanos = this.rp2040.clock.nanos;
this.ctrl &= ~RTC_LOAD_BITS;
}
}
else {
this.ctrl &= ~RTC_ENABLE_BITS;
this.ctrl &= ~RTC_ACTIVE_BITS;
}
break;
default:
super.writeUint32(offset, value);
}
}
}