|
26 | 26 | #include <zephyr/logging/log.h>
|
27 | 27 | LOG_MODULE_REGISTER(swdp, CONFIG_DP_DRIVER_LOG_LEVEL);
|
28 | 28 |
|
29 |
| -#define CLOCK_DELAY(swclk_freq, port_write_cycles) \ |
30 |
| - ((CPU_CLOCK / 2 / swclk_freq) - port_write_cycles) |
| 29 | +#define MAX_SWJ_CLOCK(delay_cycles, port_write_cycles) \ |
| 30 | + ((CPU_CLOCK / 2U) / (port_write_cycles + delay_cycles)) |
31 | 31 |
|
32 | 32 | /*
|
33 | 33 | * Default SWCLK frequency in Hz.
|
34 | 34 | * sw_clock can be used to overwrite this default value.
|
35 | 35 | */
|
36 | 36 | #define SWDP_DEFAULT_SWCLK_FREQUENCY 1000000U
|
37 | 37 |
|
| 38 | +#define DELAY_FAST_CYCLES 2U |
38 | 39 | #define DELAY_SLOW_CYCLES 3U
|
39 | 40 |
|
40 | 41 | struct sw_config {
|
@@ -528,14 +529,19 @@ static int sw_set_clock(const struct device *dev, const uint32_t clock)
|
528 | 529 | struct sw_cfg_data *sw_data = dev->data;
|
529 | 530 | uint32_t delay;
|
530 | 531 |
|
531 |
| - sw_data->fast_clock = false; |
532 |
| - delay = ((CPU_CLOCK / 2U) + (clock - 1U)) / clock; |
533 |
| - |
534 |
| - if (delay > config->port_write_cycles) { |
535 |
| - delay -= config->port_write_cycles; |
536 |
| - delay = (delay + (DELAY_SLOW_CYCLES - 1U)) / DELAY_SLOW_CYCLES; |
537 |
| - } else { |
| 532 | + if (clock >= MAX_SWJ_CLOCK(DELAY_FAST_CYCLES, config->port_write_cycles)) { |
| 533 | + sw_data->fast_clock = true; |
538 | 534 | delay = 1U;
|
| 535 | + } else { |
| 536 | + sw_data->fast_clock = false; |
| 537 | + |
| 538 | + delay = ((CPU_CLOCK / 2U) + (clock - 1U)) / clock; |
| 539 | + if (delay > config->port_write_cycles) { |
| 540 | + delay -= config->port_write_cycles; |
| 541 | + delay = (delay + (DELAY_SLOW_CYCLES - 1U)) / DELAY_SLOW_CYCLES; |
| 542 | + } else { |
| 543 | + delay = 1U; |
| 544 | + } |
539 | 545 | }
|
540 | 546 |
|
541 | 547 | sw_data->clock_delay = delay;
|
@@ -684,8 +690,7 @@ static int sw_gpio_init(const struct device *dev)
|
684 | 690 | sw_data->turnaround = 1U;
|
685 | 691 | sw_data->data_phase = false;
|
686 | 692 | sw_data->fast_clock = false;
|
687 |
| - sw_data->clock_delay = CLOCK_DELAY(SWDP_DEFAULT_SWCLK_FREQUENCY, |
688 |
| - config->port_write_cycles); |
| 693 | + sw_set_clock(dev, SWDP_DEFAULT_SWCLK_FREQUENCY); |
689 | 694 |
|
690 | 695 | return 0;
|
691 | 696 | }
|
|
0 commit comments