|
1 | 1 | import { RP2040 } from '../rp2040.js';
|
2 | 2 | import { BasePeripheral, Peripheral } from './peripheral.js';
|
3 | 3 |
|
| 4 | +const CLK_GPOUT0_CTRL = 0x00; |
| 5 | +const CLK_GPOUT0_DIV = 0x04; |
| 6 | +const CLK_GPOUT0_SELECTED = 0x8; |
| 7 | +const CLK_GPOUT1_CTRL = 0x0c; |
| 8 | +const CLK_GPOUT1_DIV = 0x10; |
| 9 | +const CLK_GPOUT1_SELECTED = 0x14; |
| 10 | +const CLK_GPOUT2_CTRL = 0x18; |
| 11 | +const CLK_GPOUT2_DIV = 0x01c; |
| 12 | +const CLK_GPOUT2_SELECTED = 0x20; |
| 13 | +const CLK_GPOUT3_CTRL = 0x24; |
| 14 | +const CLK_GPOUT3_DIV = 0x28; |
| 15 | +const CLK_GPOUT3_SELECTED = 0x2c; |
4 | 16 | const CLK_REF_CTRL = 0x30;
|
| 17 | +const CLK_REF_DIV = 0x34; |
5 | 18 | const CLK_REF_SELECTED = 0x38;
|
6 | 19 | const CLK_SYS_CTRL = 0x3c;
|
| 20 | +const CLK_SYS_DIV = 0x40; |
7 | 21 | const CLK_SYS_SELECTED = 0x44;
|
| 22 | +const CLK_PERI_CTRL = 0x48; |
| 23 | +const CLK_PERI_DIV = 0x4c; |
| 24 | +const CLK_PERI_SELECTED = 0x50; |
| 25 | +const CLK_USB_CTRL = 0x54; |
| 26 | +const CLK_USB_DIV = 0x58; |
| 27 | +const CLK_USB_SELECTED = 0x5c; |
| 28 | +const CLK_ADC_CTRL = 0x60; |
| 29 | +const CLK_ADC_DIV = 0x64; |
| 30 | +const CLK_ADC_SELECTED = 0x68; |
| 31 | +const CLK_RTC_CTRL = 0x6c; |
| 32 | +const CLK_RTC_DIV = 0x70; |
| 33 | +const CLK_RTC_SELECTED = 0x74; |
| 34 | +const CLK_SYS_RESUS_CTRL = 0x78; |
| 35 | +const CLK_SYS_RESUS_STATUS = 0x7c; |
8 | 36 |
|
9 | 37 | export class RPClocks extends BasePeripheral implements Peripheral {
|
| 38 | + gpout0Ctrl = 0; |
| 39 | + gpout0Div = 0x100; |
| 40 | + gpout1Ctrl = 0; |
| 41 | + gpout1Div = 0x100; |
| 42 | + gpout2Ctrl = 0; |
| 43 | + gpout2Div = 0x100; |
| 44 | + gpout3Ctrl = 0; |
| 45 | + gpout3Div = 0x100; |
10 | 46 | refCtrl = 0;
|
| 47 | + refDiv = 0x100; |
| 48 | + periCtrl = 0; |
| 49 | + periDiv = 0x100; |
| 50 | + usbCtrl = 0; |
| 51 | + usbDiv = 0x100; |
11 | 52 | sysCtrl = 0;
|
| 53 | + sysDiv = 0x100; |
| 54 | + adcCtrl = 0; |
| 55 | + adcDiv = 0x100; |
| 56 | + rtcCtrl = 0; |
| 57 | + rtcDiv = 0x100; |
12 | 58 | constructor(rp2040: RP2040, name: string) {
|
13 | 59 | super(rp2040, name);
|
14 | 60 | }
|
15 | 61 |
|
16 | 62 | readUint32(offset: number) {
|
17 | 63 | switch (offset) {
|
| 64 | + case CLK_GPOUT0_CTRL: |
| 65 | + return this.gpout0Ctrl & 0b100110001110111100000; |
| 66 | + case CLK_GPOUT0_DIV: |
| 67 | + return this.gpout0Div; |
| 68 | + case CLK_GPOUT0_SELECTED: |
| 69 | + return 1; |
| 70 | + case CLK_GPOUT1_CTRL: |
| 71 | + return this.gpout1Ctrl & 0b100110001110111100000; |
| 72 | + case CLK_GPOUT1_DIV: |
| 73 | + return this.gpout1Div; |
| 74 | + case CLK_GPOUT1_SELECTED: |
| 75 | + return 1; |
| 76 | + case CLK_GPOUT2_CTRL: |
| 77 | + return this.gpout2Ctrl & 0b100110001110111100000; |
| 78 | + case CLK_GPOUT2_DIV: |
| 79 | + return this.gpout2Div; |
| 80 | + case CLK_GPOUT2_SELECTED: |
| 81 | + return 1; |
| 82 | + case CLK_GPOUT3_CTRL: |
| 83 | + return this.gpout3Ctrl & 0b100110001110111100000; |
| 84 | + case CLK_GPOUT3_DIV: |
| 85 | + return this.gpout3Div; |
| 86 | + case CLK_GPOUT3_SELECTED: |
| 87 | + return 1; |
18 | 88 | case CLK_REF_CTRL:
|
19 |
| - return this.refCtrl; |
| 89 | + return this.refCtrl & 0b000001100011; |
| 90 | + case CLK_REF_DIV: |
| 91 | + return this.refDiv & 0x30; // b8..9 = int divisor. no frac divisor present |
20 | 92 | case CLK_REF_SELECTED:
|
21 | 93 | return 1 << (this.refCtrl & 0x03);
|
22 | 94 | case CLK_SYS_CTRL:
|
23 |
| - return this.sysCtrl; |
| 95 | + return this.sysCtrl & 0b000011100001; |
| 96 | + case CLK_SYS_DIV: |
| 97 | + return this.sysDiv; |
24 | 98 | case CLK_SYS_SELECTED:
|
25 | 99 | return 1 << (this.sysCtrl & 0x01);
|
| 100 | + case CLK_PERI_CTRL: |
| 101 | + return this.periCtrl & 0b110011100000; |
| 102 | + case CLK_PERI_DIV: |
| 103 | + return this.periDiv; |
| 104 | + case CLK_PERI_SELECTED: |
| 105 | + return 1; |
| 106 | + case CLK_USB_CTRL: |
| 107 | + return this.usbCtrl & 0b100110000110011100000; |
| 108 | + case CLK_USB_DIV: |
| 109 | + return this.usbDiv; |
| 110 | + case CLK_USB_SELECTED: |
| 111 | + return 1; |
| 112 | + case CLK_ADC_CTRL: |
| 113 | + return this.adcCtrl & 0b100110000110011100000; |
| 114 | + case CLK_ADC_DIV: |
| 115 | + return this.adcDiv & 0x30; |
| 116 | + case CLK_ADC_SELECTED: |
| 117 | + return 1; |
| 118 | + case CLK_RTC_CTRL: |
| 119 | + return this.rtcCtrl & 0b100110000110011100000; |
| 120 | + case CLK_RTC_DIV: |
| 121 | + return this.rtcDiv & 0x30; |
| 122 | + case CLK_RTC_SELECTED: |
| 123 | + return 1; |
| 124 | + case CLK_SYS_RESUS_CTRL: |
| 125 | + return 0xff; |
| 126 | + case CLK_SYS_RESUS_STATUS: |
| 127 | + return 0; /* clock resus not implemented */ |
26 | 128 | }
|
27 | 129 | return super.readUint32(offset);
|
28 | 130 | }
|
29 | 131 |
|
30 | 132 | writeUint32(offset: number, value: number): void {
|
31 | 133 | switch (offset) {
|
| 134 | + case CLK_GPOUT0_CTRL: |
| 135 | + this.gpout0Ctrl = value; |
| 136 | + break; |
| 137 | + case CLK_GPOUT0_DIV: |
| 138 | + this.gpout0Div = value; |
| 139 | + break; |
| 140 | + case CLK_GPOUT1_CTRL: |
| 141 | + this.gpout1Ctrl = value; |
| 142 | + break; |
| 143 | + case CLK_GPOUT1_DIV: |
| 144 | + this.gpout1Div = value; |
| 145 | + break; |
| 146 | + case CLK_GPOUT2_CTRL: |
| 147 | + this.gpout2Ctrl = value; |
| 148 | + break; |
| 149 | + case CLK_GPOUT2_DIV: |
| 150 | + this.gpout2Div = value; |
| 151 | + break; |
| 152 | + case CLK_GPOUT3_CTRL: |
| 153 | + this.gpout3Ctrl = value; |
| 154 | + break; |
| 155 | + case CLK_GPOUT3_DIV: |
| 156 | + this.gpout3Div = value; |
| 157 | + break; |
32 | 158 | case CLK_REF_CTRL:
|
33 | 159 | this.refCtrl = value;
|
34 | 160 | break;
|
| 161 | + case CLK_REF_DIV: |
| 162 | + this.refDiv = value; |
| 163 | + break; |
35 | 164 | case CLK_SYS_CTRL:
|
36 | 165 | this.sysCtrl = value;
|
37 | 166 | break;
|
| 167 | + case CLK_SYS_DIV: |
| 168 | + this.sysDiv = value; |
| 169 | + break; |
| 170 | + case CLK_PERI_CTRL: |
| 171 | + this.periCtrl = value; |
| 172 | + break; |
| 173 | + case CLK_PERI_DIV: |
| 174 | + this.periDiv = value; |
| 175 | + break; |
| 176 | + case CLK_USB_CTRL: |
| 177 | + this.usbCtrl = value; |
| 178 | + break; |
| 179 | + case CLK_USB_DIV: |
| 180 | + this.usbDiv = value; |
| 181 | + break; |
| 182 | + case CLK_ADC_CTRL: |
| 183 | + this.adcCtrl = value; |
| 184 | + break; |
| 185 | + case CLK_ADC_DIV: |
| 186 | + this.adcDiv = value; |
| 187 | + break; |
| 188 | + case CLK_RTC_CTRL: |
| 189 | + this.rtcCtrl = value; |
| 190 | + break; |
| 191 | + case CLK_RTC_DIV: |
| 192 | + this.rtcDiv = value; |
| 193 | + break; |
| 194 | + case CLK_SYS_RESUS_CTRL: |
| 195 | + return; /* clock resus not implemented */ |
38 | 196 | default:
|
39 | 197 | super.writeUint32(offset, value);
|
40 | 198 | break;
|
|
0 commit comments