# HG changeset patch # User Paul Boddie # Date 1694866581 -7200 # Node ID 384d97264cbc350d8ecdd12ea7d5695c1973c858 # Parent d7a233d7a908d5e52ae5654a0e9102b85fd743d7 Introduced a source abstraction wrapping a source selector and clock inputs. diff -r d7a233d7a908 -r 384d97264cbc pkg/devices/lib/cpm/src/x1600.cc --- a/pkg/devices/lib/cpm/src/x1600.cc Sat Sep 16 01:12:18 2023 +0200 +++ b/pkg/devices/lib/cpm/src/x1600.cc Sat Sep 16 14:16:21 2023 +0200 @@ -112,7 +112,7 @@ // Undefined fields. -Field Source_undefined, Gate_undefined, Change_enable_undefined, Busy_undefined, Divider_undefined; +Field Gate_undefined, Change_enable_undefined, Busy_undefined, Divider_undefined; @@ -121,21 +121,61 @@ class Mux { int _num_inputs; - enum Clock_identifiers *_inputs; + enum Clock_identifiers *_inputs, _input; public: - explicit Mux(int num_inputs = 0, enum Clock_identifiers inputs[] = NULL) + explicit Mux(int num_inputs, enum Clock_identifiers inputs[]) : _num_inputs(num_inputs), _inputs(inputs) { } + explicit Mux(enum Clock_identifiers input) + : _num_inputs(1), _inputs(&_input) + { + _input = input; + } + + explicit Mux() + : _num_inputs(0), _inputs(NULL) + { + } + int get_number() { return _num_inputs; } enum Clock_identifiers get_input(int num); }; +class Source +{ + Mux _inputs; + Field _source; + +public: + explicit Source(Mux inputs, Field source) + : _inputs(inputs), _source(source) + { + } + + explicit Source(Mux inputs) + : _inputs(inputs) + { + } + + explicit Source() + { + } + + int get_number() { return _inputs.get_number(); } + enum Clock_identifiers get_input(int num) { return _inputs.get_input(num); } + + // Clock source. + + uint8_t get_source(Cpm_regs ®s); + void set_source(Cpm_regs ®s, uint8_t source); +}; + // Undefined sources. -Mux Mux_undefined; +Source Source_undefined; @@ -143,13 +183,11 @@ class Clock_base { - Mux _inputs; - Field _source; + Source _source; public: - explicit Clock_base(Mux inputs, - Field source = Source_undefined) - : _inputs(inputs), _source(source) + explicit Clock_base(Source source) + : _source(source) { } @@ -188,11 +226,11 @@ Field _multiplier, _input_division, _output_division0, _output_division1; public: - explicit Pll(Mux inputs, + explicit Pll(Source source, Field enable, Field stable, Field bypass, Field multiplier, Field input_division, Field output_division0, Field output_division1) - : Clock_base(inputs), + : Clock_base(source), _enable(enable), _stable(stable), _bypass(bypass), _multiplier(multiplier), _input_division(input_division), _output_division0(output_division0), _output_division1(output_division1) @@ -245,13 +283,12 @@ void wait_busy(Cpm_regs ®s); public: - explicit Clock(Mux inputs = Mux_undefined, - Field source = Source_undefined, + explicit Clock(Source source = Source_undefined, Field gate = Gate_undefined, Field change_enable = Change_enable_undefined, Field busy = Busy_undefined, Field divider = Divider_undefined) - : Clock_base(inputs, source), + : Clock_base(source), _gate(gate), _change_enable(change_enable), _busy(busy), _divider(divider) { } @@ -417,7 +454,11 @@ #define Clocks(...) ((enum Clock_identifiers []) {__VA_ARGS__}) -Mux mux_external(1, Clocks(Clock_external)); +Mux mux_external(Clock_external); + +Mux mux_pclock(Clock_pclock); + +Mux mux_ahb2_apb(Clock_ahb2_apb); Mux mux_core(3, Clocks(Clock_none, Clock_main, Clock_pll_M)); @@ -425,79 +466,67 @@ Mux mux_dev(3, Clocks(Clock_main, Clock_pll_M, Clock_pll_E)); -Mux mux_pclock(1, Clocks(Clock_pclock)); - -Mux mux_ahb2_apb(1, Clocks(Clock_ahb2_apb)); - Mux mux_i2s(2, Clocks(Clock_main, Clock_pll_E)); // Clock instances. -Clock clock_ahb2_apb(mux_core, Clock_source_hclock2); +Clock clock_ahb2_apb(Source(mux_core, Clock_source_hclock2)); Clock clock_aic_bitclk; Clock clock_aic_pclk; -Clock clock_can0(mux_bus, - Clock_source_can0, +Clock clock_can0(Source(mux_bus, Clock_source_can0), Clock_gate_can0, Clock_change_enable_can0, Clock_busy_can0, Clock_divider_can0); -Clock clock_can1(mux_bus, - Clock_source_can1, +Clock clock_can1(Source(mux_bus, Clock_source_can1), Clock_gate_can1, Clock_change_enable_can1, Clock_busy_can1, Clock_divider_can1); -Clock clock_cdbus(mux_dev, - Clock_source_cdbus, +Clock clock_cdbus(Source(mux_dev, Clock_source_cdbus), Clock_gate_cdbus, Clock_change_enable_cdbus, Clock_busy_cdbus, Clock_divider_cdbus); -Clock clock_cim(mux_dev, - Clock_source_cim, +Clock clock_cim(Source(mux_dev, Clock_source_cim), Clock_gate_cim, Clock_change_enable_cim, Clock_busy_cim, Clock_divider_cim); -Clock clock_cpu(mux_core, - Clock_source_cpu, +Clock clock_cpu(Source(mux_core, Clock_source_cpu), Gate_undefined, Clock_change_enable_cpu, Clock_busy_cpu, Clock_divider_cpu); -Clock clock_ddr(mux_core, - Clock_source_ddr, +Clock clock_ddr(Source(mux_core, Clock_source_ddr), Clock_gate_ddr, Clock_change_enable_ddr, Clock_busy_ddr, Clock_divider_ddr); -Clock clock_dma(mux_pclock, Source_undefined, Clock_gate_dma); +Clock clock_dma(Source(mux_pclock), Clock_gate_dma); Clock clock_emac; Clock clock_external; -Clock clock_hclock0(mux_core, - Clock_source_hclock0, +Clock clock_hclock0(Source(mux_core, Clock_source_hclock0), Clock_gate_ahb0, Clock_change_enable_ahb0, Busy_undefined, Clock_divider_hclock0); -Clock clock_hclock2(mux_ahb2_apb, - Source_undefined, +Clock clock_hclock2(Source(mux_ahb2_apb), Clock_gate_apb0, Clock_change_enable_ahb2, Busy_undefined, @@ -505,27 +534,19 @@ Clock clock_hdmi; -Clock clock_i2c(mux_pclock, - Source_undefined, - Clock_gate_i2c0); +Clock clock_i2c(Source(mux_pclock), Clock_gate_i2c0); -Clock clock_i2c0(mux_pclock, - Source_undefined, - Clock_gate_i2c0); +Clock clock_i2c0(Source(mux_pclock), Clock_gate_i2c0); -Clock clock_i2c1(mux_pclock, - Source_undefined, - Clock_gate_i2c1); +Clock clock_i2c1(Source(mux_pclock), Clock_gate_i2c1); Clock clock_i2s; -Clock clock_i2s0_rx(mux_i2s, - Clock_source_i2s, +Clock clock_i2s0_rx(Source(mux_i2s, Clock_source_i2s), Clock_gate_i2s0_rx, Clock_change_enable_i2s); -Clock clock_i2s0_tx(mux_i2s, - Clock_source_i2s, +Clock clock_i2s0_tx(Source(mux_i2s, Clock_source_i2s), Clock_gate_i2s0_tx, Clock_change_enable_i2s); @@ -533,40 +554,34 @@ Clock clock_lcd; -Clock clock_lcd_pixel(mux_dev, - Clock_source_lcd, +Clock clock_lcd_pixel(Source(mux_dev, Clock_source_lcd), Clock_gate_lcd_pixel, Clock_change_enable_lcd, Clock_busy_lcd, Clock_divider_lcd); -Clock clock_mac(mux_dev, - Clock_source_mac, +Clock clock_mac(Source(mux_dev, Clock_source_mac), Clock_gate_gmac0, Clock_change_enable_mac, Clock_busy_mac, Clock_divider_mac); -Clock clock_main(mux_core, - Clock_source_main, +Clock clock_main(Source(mux_core, Clock_source_main), Clock_gate_main); -Clock clock_msc(mux_dev, - Clock_source_msc0, +Clock clock_msc(Source(mux_dev, Clock_source_msc0), Clock_gate_msc0, Clock_change_enable_msc0, Clock_busy_msc0, Clock_divider_msc0); -Clock clock_msc0(mux_dev, - Clock_source_msc0, +Clock clock_msc0(Source(mux_dev, Clock_source_msc0), Clock_gate_msc0, Clock_change_enable_msc0, Clock_busy_msc0, Clock_divider_msc0); -Clock clock_msc1(mux_dev, - Clock_source_msc1, +Clock clock_msc1(Source(mux_dev, Clock_source_msc1), Clock_gate_msc1, Clock_change_enable_msc1, Clock_busy_msc1, @@ -574,37 +589,34 @@ Clock clock_none; -Clock clock_pclock(mux_ahb2_apb, - Source_undefined, +Clock clock_pclock(Source(mux_ahb2_apb), Clock_gate_apb0, Change_enable_undefined, Busy_undefined, Clock_divider_pclock); -Pll clock_pll_A(mux_external, +Pll clock_pll_A(Source(mux_external), Pll_enable_A, Pll_stable_A, Pll_bypass_A, Pll_multiplier_A, Pll_input_division_A, Pll_output_division0_A, Pll_output_division1_A); -Pll clock_pll_E(mux_external, +Pll clock_pll_E(Source(mux_external), Pll_enable_E, Pll_stable_E, Pll_bypass_E, Pll_multiplier_E, Pll_input_division_E, Pll_output_division0_E, Pll_output_division1_E); -Pll clock_pll_M(mux_external, +Pll clock_pll_M(Source(mux_external), Pll_enable_M, Pll_stable_M, Pll_bypass_M, Pll_multiplier_M, Pll_input_division_M, Pll_output_division0_M, Pll_output_division1_M); -Clock clock_pwm(mux_dev, - Clock_source_pwm, +Clock clock_pwm(Source(mux_dev, Clock_source_pwm), Clock_gate_pwm, Clock_change_enable_pwm, Clock_busy_pwm, Clock_divider_pwm); -Clock clock_pwm0(mux_dev, - Clock_source_pwm, +Clock clock_pwm0(Source(mux_dev, Clock_source_pwm), Clock_gate_pwm, Clock_change_enable_pwm, Clock_busy_pwm, @@ -614,8 +626,7 @@ Clock clock_scc; -Clock clock_sfc(mux_dev, - Clock_source_sfc, +Clock clock_sfc(Source(mux_dev, Clock_source_sfc), Clock_gate_sfc, Clock_change_enable_sfc, Clock_busy_sfc, @@ -631,22 +642,21 @@ Clock clock_smb4; -Clock clock_ssi(mux_dev, - Clock_source_ssi, +Clock clock_ssi(Source(mux_dev, Clock_source_ssi), Clock_gate_ssi0, Clock_change_enable_ssi, Clock_busy_ssi, Clock_divider_ssi); -Clock clock_timer(mux_pclock, Source_undefined, Clock_gate_timer); +Clock clock_timer(Source(mux_pclock), Clock_gate_timer); -Clock clock_uart0(mux_external, Source_undefined, Clock_gate_uart0); +Clock clock_uart0(Source(mux_external), Clock_gate_uart0); -Clock clock_uart1(mux_external, Source_undefined, Clock_gate_uart1); +Clock clock_uart1(Source(mux_external), Clock_gate_uart1); -Clock clock_uart2(mux_external, Source_undefined, Clock_gate_uart2); +Clock clock_uart2(Source(mux_external), Clock_gate_uart2); -Clock clock_uart3(mux_external, Source_undefined, Clock_gate_uart3); +Clock clock_uart3(Source(mux_external), Clock_gate_uart3); Clock clock_udc; @@ -771,6 +781,26 @@ return Clock_undefined; } +// Clock sources. + +uint8_t +Source::get_source(Cpm_regs ®s) +{ + if (_source.is_defined()) + return _source.get_field(regs); + else + return 0; +} + +void +Source::set_source(Cpm_regs ®s, uint8_t source) +{ + if (!_source.is_defined()) + return; + + _source.set_field(regs, source); +} + // Clock control. @@ -815,19 +845,13 @@ uint8_t Clock_base::get_source(Cpm_regs ®s) { - if (_source.is_defined()) - return _source.get_field(regs); - else - return 0; + return _source.get_source(regs); } void Clock_base::set_source(Cpm_regs ®s, uint8_t source) { - if (!_source.is_defined()) - return; - - _source.set_field(regs, source); + _source.set_source(regs, source); } // Clock source frequencies. @@ -837,18 +861,18 @@ { // Return the external clock frequency without any input clock. - if (_inputs.get_number() == 0) + if (_source.get_number() == 0) return regs.exclk_freq; // Clocks with one source yield that input frequency. - else if (_inputs.get_number() == 1) - return clocks[_inputs.get_input(0)]->get_frequency(regs); + else if (_source.get_number() == 1) + return clocks[_source.get_input(0)]->get_frequency(regs); // With multiple sources, obtain the selected source for the clock. uint8_t source = get_source(regs); - enum Clock_identifiers input = _inputs.get_input(source); + enum Clock_identifiers input = _source.get_input(source); // Return the frequency of the source.