1.1 --- a/pkg/devices/lib/cpm/src/x1600.cc Sat Sep 16 01:12:18 2023 +0200
1.2 +++ b/pkg/devices/lib/cpm/src/x1600.cc Sat Sep 16 14:16:21 2023 +0200
1.3 @@ -112,7 +112,7 @@
1.4
1.5 // Undefined fields.
1.6
1.7 -Field Source_undefined, Gate_undefined, Change_enable_undefined, Busy_undefined, Divider_undefined;
1.8 +Field Gate_undefined, Change_enable_undefined, Busy_undefined, Divider_undefined;
1.9
1.10
1.11
1.12 @@ -121,21 +121,61 @@
1.13 class Mux
1.14 {
1.15 int _num_inputs;
1.16 - enum Clock_identifiers *_inputs;
1.17 + enum Clock_identifiers *_inputs, _input;
1.18
1.19 public:
1.20 - explicit Mux(int num_inputs = 0, enum Clock_identifiers inputs[] = NULL)
1.21 + explicit Mux(int num_inputs, enum Clock_identifiers inputs[])
1.22 : _num_inputs(num_inputs), _inputs(inputs)
1.23 {
1.24 }
1.25
1.26 + explicit Mux(enum Clock_identifiers input)
1.27 + : _num_inputs(1), _inputs(&_input)
1.28 + {
1.29 + _input = input;
1.30 + }
1.31 +
1.32 + explicit Mux()
1.33 + : _num_inputs(0), _inputs(NULL)
1.34 + {
1.35 + }
1.36 +
1.37 int get_number() { return _num_inputs; }
1.38 enum Clock_identifiers get_input(int num);
1.39 };
1.40
1.41 +class Source
1.42 +{
1.43 + Mux _inputs;
1.44 + Field _source;
1.45 +
1.46 +public:
1.47 + explicit Source(Mux inputs, Field source)
1.48 + : _inputs(inputs), _source(source)
1.49 + {
1.50 + }
1.51 +
1.52 + explicit Source(Mux inputs)
1.53 + : _inputs(inputs)
1.54 + {
1.55 + }
1.56 +
1.57 + explicit Source()
1.58 + {
1.59 + }
1.60 +
1.61 + int get_number() { return _inputs.get_number(); }
1.62 + enum Clock_identifiers get_input(int num) { return _inputs.get_input(num); }
1.63 +
1.64 + // Clock source.
1.65 +
1.66 + uint8_t get_source(Cpm_regs ®s);
1.67 + void set_source(Cpm_regs ®s, uint8_t source);
1.68 +};
1.69 +
1.70 // Undefined sources.
1.71
1.72 -Mux Mux_undefined;
1.73 +Source Source_undefined;
1.74
1.75
1.76
1.77 @@ -143,13 +183,11 @@
1.78
1.79 class Clock_base
1.80 {
1.81 - Mux _inputs;
1.82 - Field _source;
1.83 + Source _source;
1.84
1.85 public:
1.86 - explicit Clock_base(Mux inputs,
1.87 - Field source = Source_undefined)
1.88 - : _inputs(inputs), _source(source)
1.89 + explicit Clock_base(Source source)
1.90 + : _source(source)
1.91 {
1.92 }
1.93
1.94 @@ -188,11 +226,11 @@
1.95 Field _multiplier, _input_division, _output_division0, _output_division1;
1.96
1.97 public:
1.98 - explicit Pll(Mux inputs,
1.99 + explicit Pll(Source source,
1.100 Field enable, Field stable, Field bypass,
1.101 Field multiplier, Field input_division,
1.102 Field output_division0, Field output_division1)
1.103 - : Clock_base(inputs),
1.104 + : Clock_base(source),
1.105 _enable(enable), _stable(stable), _bypass(bypass),
1.106 _multiplier(multiplier), _input_division(input_division),
1.107 _output_division0(output_division0), _output_division1(output_division1)
1.108 @@ -245,13 +283,12 @@
1.109 void wait_busy(Cpm_regs ®s);
1.110
1.111 public:
1.112 - explicit Clock(Mux inputs = Mux_undefined,
1.113 - Field source = Source_undefined,
1.114 + explicit Clock(Source source = Source_undefined,
1.115 Field gate = Gate_undefined,
1.116 Field change_enable = Change_enable_undefined,
1.117 Field busy = Busy_undefined,
1.118 Field divider = Divider_undefined)
1.119 - : Clock_base(inputs, source),
1.120 + : Clock_base(source),
1.121 _gate(gate), _change_enable(change_enable), _busy(busy), _divider(divider)
1.122 {
1.123 }
1.124 @@ -417,7 +454,11 @@
1.125
1.126 #define Clocks(...) ((enum Clock_identifiers []) {__VA_ARGS__})
1.127
1.128 -Mux mux_external(1, Clocks(Clock_external));
1.129 +Mux mux_external(Clock_external);
1.130 +
1.131 +Mux mux_pclock(Clock_pclock);
1.132 +
1.133 +Mux mux_ahb2_apb(Clock_ahb2_apb);
1.134
1.135 Mux mux_core(3, Clocks(Clock_none, Clock_main, Clock_pll_M));
1.136
1.137 @@ -425,79 +466,67 @@
1.138
1.139 Mux mux_dev(3, Clocks(Clock_main, Clock_pll_M, Clock_pll_E));
1.140
1.141 -Mux mux_pclock(1, Clocks(Clock_pclock));
1.142 -
1.143 -Mux mux_ahb2_apb(1, Clocks(Clock_ahb2_apb));
1.144 -
1.145 Mux mux_i2s(2, Clocks(Clock_main, Clock_pll_E));
1.146
1.147
1.148
1.149 // Clock instances.
1.150
1.151 -Clock clock_ahb2_apb(mux_core, Clock_source_hclock2);
1.152 +Clock clock_ahb2_apb(Source(mux_core, Clock_source_hclock2));
1.153
1.154 Clock clock_aic_bitclk;
1.155
1.156 Clock clock_aic_pclk;
1.157
1.158 -Clock clock_can0(mux_bus,
1.159 - Clock_source_can0,
1.160 +Clock clock_can0(Source(mux_bus, Clock_source_can0),
1.161 Clock_gate_can0,
1.162 Clock_change_enable_can0,
1.163 Clock_busy_can0,
1.164 Clock_divider_can0);
1.165
1.166 -Clock clock_can1(mux_bus,
1.167 - Clock_source_can1,
1.168 +Clock clock_can1(Source(mux_bus, Clock_source_can1),
1.169 Clock_gate_can1,
1.170 Clock_change_enable_can1,
1.171 Clock_busy_can1,
1.172 Clock_divider_can1);
1.173
1.174 -Clock clock_cdbus(mux_dev,
1.175 - Clock_source_cdbus,
1.176 +Clock clock_cdbus(Source(mux_dev, Clock_source_cdbus),
1.177 Clock_gate_cdbus,
1.178 Clock_change_enable_cdbus,
1.179 Clock_busy_cdbus,
1.180 Clock_divider_cdbus);
1.181
1.182 -Clock clock_cim(mux_dev,
1.183 - Clock_source_cim,
1.184 +Clock clock_cim(Source(mux_dev, Clock_source_cim),
1.185 Clock_gate_cim,
1.186 Clock_change_enable_cim,
1.187 Clock_busy_cim,
1.188 Clock_divider_cim);
1.189
1.190 -Clock clock_cpu(mux_core,
1.191 - Clock_source_cpu,
1.192 +Clock clock_cpu(Source(mux_core, Clock_source_cpu),
1.193 Gate_undefined,
1.194 Clock_change_enable_cpu,
1.195 Clock_busy_cpu,
1.196 Clock_divider_cpu);
1.197
1.198 -Clock clock_ddr(mux_core,
1.199 - Clock_source_ddr,
1.200 +Clock clock_ddr(Source(mux_core, Clock_source_ddr),
1.201 Clock_gate_ddr,
1.202 Clock_change_enable_ddr,
1.203 Clock_busy_ddr,
1.204 Clock_divider_ddr);
1.205
1.206 -Clock clock_dma(mux_pclock, Source_undefined, Clock_gate_dma);
1.207 +Clock clock_dma(Source(mux_pclock), Clock_gate_dma);
1.208
1.209 Clock clock_emac;
1.210
1.211 Clock clock_external;
1.212
1.213 -Clock clock_hclock0(mux_core,
1.214 - Clock_source_hclock0,
1.215 +Clock clock_hclock0(Source(mux_core, Clock_source_hclock0),
1.216 Clock_gate_ahb0,
1.217 Clock_change_enable_ahb0,
1.218 Busy_undefined,
1.219 Clock_divider_hclock0);
1.220
1.221 -Clock clock_hclock2(mux_ahb2_apb,
1.222 - Source_undefined,
1.223 +Clock clock_hclock2(Source(mux_ahb2_apb),
1.224 Clock_gate_apb0,
1.225 Clock_change_enable_ahb2,
1.226 Busy_undefined,
1.227 @@ -505,27 +534,19 @@
1.228
1.229 Clock clock_hdmi;
1.230
1.231 -Clock clock_i2c(mux_pclock,
1.232 - Source_undefined,
1.233 - Clock_gate_i2c0);
1.234 +Clock clock_i2c(Source(mux_pclock), Clock_gate_i2c0);
1.235
1.236 -Clock clock_i2c0(mux_pclock,
1.237 - Source_undefined,
1.238 - Clock_gate_i2c0);
1.239 +Clock clock_i2c0(Source(mux_pclock), Clock_gate_i2c0);
1.240
1.241 -Clock clock_i2c1(mux_pclock,
1.242 - Source_undefined,
1.243 - Clock_gate_i2c1);
1.244 +Clock clock_i2c1(Source(mux_pclock), Clock_gate_i2c1);
1.245
1.246 Clock clock_i2s;
1.247
1.248 -Clock clock_i2s0_rx(mux_i2s,
1.249 - Clock_source_i2s,
1.250 +Clock clock_i2s0_rx(Source(mux_i2s, Clock_source_i2s),
1.251 Clock_gate_i2s0_rx,
1.252 Clock_change_enable_i2s);
1.253
1.254 -Clock clock_i2s0_tx(mux_i2s,
1.255 - Clock_source_i2s,
1.256 +Clock clock_i2s0_tx(Source(mux_i2s, Clock_source_i2s),
1.257 Clock_gate_i2s0_tx,
1.258 Clock_change_enable_i2s);
1.259
1.260 @@ -533,40 +554,34 @@
1.261
1.262 Clock clock_lcd;
1.263
1.264 -Clock clock_lcd_pixel(mux_dev,
1.265 - Clock_source_lcd,
1.266 +Clock clock_lcd_pixel(Source(mux_dev, Clock_source_lcd),
1.267 Clock_gate_lcd_pixel,
1.268 Clock_change_enable_lcd,
1.269 Clock_busy_lcd,
1.270 Clock_divider_lcd);
1.271
1.272 -Clock clock_mac(mux_dev,
1.273 - Clock_source_mac,
1.274 +Clock clock_mac(Source(mux_dev, Clock_source_mac),
1.275 Clock_gate_gmac0,
1.276 Clock_change_enable_mac,
1.277 Clock_busy_mac,
1.278 Clock_divider_mac);
1.279
1.280 -Clock clock_main(mux_core,
1.281 - Clock_source_main,
1.282 +Clock clock_main(Source(mux_core, Clock_source_main),
1.283 Clock_gate_main);
1.284
1.285 -Clock clock_msc(mux_dev,
1.286 - Clock_source_msc0,
1.287 +Clock clock_msc(Source(mux_dev, Clock_source_msc0),
1.288 Clock_gate_msc0,
1.289 Clock_change_enable_msc0,
1.290 Clock_busy_msc0,
1.291 Clock_divider_msc0);
1.292
1.293 -Clock clock_msc0(mux_dev,
1.294 - Clock_source_msc0,
1.295 +Clock clock_msc0(Source(mux_dev, Clock_source_msc0),
1.296 Clock_gate_msc0,
1.297 Clock_change_enable_msc0,
1.298 Clock_busy_msc0,
1.299 Clock_divider_msc0);
1.300
1.301 -Clock clock_msc1(mux_dev,
1.302 - Clock_source_msc1,
1.303 +Clock clock_msc1(Source(mux_dev, Clock_source_msc1),
1.304 Clock_gate_msc1,
1.305 Clock_change_enable_msc1,
1.306 Clock_busy_msc1,
1.307 @@ -574,37 +589,34 @@
1.308
1.309 Clock clock_none;
1.310
1.311 -Clock clock_pclock(mux_ahb2_apb,
1.312 - Source_undefined,
1.313 +Clock clock_pclock(Source(mux_ahb2_apb),
1.314 Clock_gate_apb0,
1.315 Change_enable_undefined,
1.316 Busy_undefined,
1.317 Clock_divider_pclock);
1.318
1.319 -Pll clock_pll_A(mux_external,
1.320 +Pll clock_pll_A(Source(mux_external),
1.321 Pll_enable_A, Pll_stable_A, Pll_bypass_A,
1.322 Pll_multiplier_A, Pll_input_division_A,
1.323 Pll_output_division0_A, Pll_output_division1_A);
1.324
1.325 -Pll clock_pll_E(mux_external,
1.326 +Pll clock_pll_E(Source(mux_external),
1.327 Pll_enable_E, Pll_stable_E, Pll_bypass_E,
1.328 Pll_multiplier_E, Pll_input_division_E,
1.329 Pll_output_division0_E, Pll_output_division1_E);
1.330
1.331 -Pll clock_pll_M(mux_external,
1.332 +Pll clock_pll_M(Source(mux_external),
1.333 Pll_enable_M, Pll_stable_M, Pll_bypass_M,
1.334 Pll_multiplier_M, Pll_input_division_M,
1.335 Pll_output_division0_M, Pll_output_division1_M);
1.336
1.337 -Clock clock_pwm(mux_dev,
1.338 - Clock_source_pwm,
1.339 +Clock clock_pwm(Source(mux_dev, Clock_source_pwm),
1.340 Clock_gate_pwm,
1.341 Clock_change_enable_pwm,
1.342 Clock_busy_pwm,
1.343 Clock_divider_pwm);
1.344
1.345 -Clock clock_pwm0(mux_dev,
1.346 - Clock_source_pwm,
1.347 +Clock clock_pwm0(Source(mux_dev, Clock_source_pwm),
1.348 Clock_gate_pwm,
1.349 Clock_change_enable_pwm,
1.350 Clock_busy_pwm,
1.351 @@ -614,8 +626,7 @@
1.352
1.353 Clock clock_scc;
1.354
1.355 -Clock clock_sfc(mux_dev,
1.356 - Clock_source_sfc,
1.357 +Clock clock_sfc(Source(mux_dev, Clock_source_sfc),
1.358 Clock_gate_sfc,
1.359 Clock_change_enable_sfc,
1.360 Clock_busy_sfc,
1.361 @@ -631,22 +642,21 @@
1.362
1.363 Clock clock_smb4;
1.364
1.365 -Clock clock_ssi(mux_dev,
1.366 - Clock_source_ssi,
1.367 +Clock clock_ssi(Source(mux_dev, Clock_source_ssi),
1.368 Clock_gate_ssi0,
1.369 Clock_change_enable_ssi,
1.370 Clock_busy_ssi,
1.371 Clock_divider_ssi);
1.372
1.373 -Clock clock_timer(mux_pclock, Source_undefined, Clock_gate_timer);
1.374 +Clock clock_timer(Source(mux_pclock), Clock_gate_timer);
1.375
1.376 -Clock clock_uart0(mux_external, Source_undefined, Clock_gate_uart0);
1.377 +Clock clock_uart0(Source(mux_external), Clock_gate_uart0);
1.378
1.379 -Clock clock_uart1(mux_external, Source_undefined, Clock_gate_uart1);
1.380 +Clock clock_uart1(Source(mux_external), Clock_gate_uart1);
1.381
1.382 -Clock clock_uart2(mux_external, Source_undefined, Clock_gate_uart2);
1.383 +Clock clock_uart2(Source(mux_external), Clock_gate_uart2);
1.384
1.385 -Clock clock_uart3(mux_external, Source_undefined, Clock_gate_uart3);
1.386 +Clock clock_uart3(Source(mux_external), Clock_gate_uart3);
1.387
1.388 Clock clock_udc;
1.389
1.390 @@ -771,6 +781,26 @@
1.391 return Clock_undefined;
1.392 }
1.393
1.394 +// Clock sources.
1.395 +
1.396 +uint8_t
1.397 +Source::get_source(Cpm_regs ®s)
1.398 +{
1.399 + if (_source.is_defined())
1.400 + return _source.get_field(regs);
1.401 + else
1.402 + return 0;
1.403 +}
1.404 +
1.405 +void
1.406 +Source::set_source(Cpm_regs ®s, uint8_t source)
1.407 +{
1.408 + if (!_source.is_defined())
1.409 + return;
1.410 +
1.411 + _source.set_field(regs, source);
1.412 +}
1.413 +
1.414
1.415
1.416 // Clock control.
1.417 @@ -815,19 +845,13 @@
1.418 uint8_t
1.419 Clock_base::get_source(Cpm_regs ®s)
1.420 {
1.421 - if (_source.is_defined())
1.422 - return _source.get_field(regs);
1.423 - else
1.424 - return 0;
1.425 + return _source.get_source(regs);
1.426 }
1.427
1.428 void
1.429 Clock_base::set_source(Cpm_regs ®s, uint8_t source)
1.430 {
1.431 - if (!_source.is_defined())
1.432 - return;
1.433 -
1.434 - _source.set_field(regs, source);
1.435 + _source.set_source(regs, source);
1.436 }
1.437
1.438 // Clock source frequencies.
1.439 @@ -837,18 +861,18 @@
1.440 {
1.441 // Return the external clock frequency without any input clock.
1.442
1.443 - if (_inputs.get_number() == 0)
1.444 + if (_source.get_number() == 0)
1.445 return regs.exclk_freq;
1.446
1.447 // Clocks with one source yield that input frequency.
1.448
1.449 - else if (_inputs.get_number() == 1)
1.450 - return clocks[_inputs.get_input(0)]->get_frequency(regs);
1.451 + else if (_source.get_number() == 1)
1.452 + return clocks[_source.get_input(0)]->get_frequency(regs);
1.453
1.454 // With multiple sources, obtain the selected source for the clock.
1.455
1.456 uint8_t source = get_source(regs);
1.457 - enum Clock_identifiers input = _inputs.get_input(source);
1.458 + enum Clock_identifiers input = _source.get_input(source);
1.459
1.460 // Return the frequency of the source.
1.461